在工业自动化领域,数据模型的灵活性和可扩展性至关重要。LiteDB 作为一个轻量级的文档数据库,为复杂的工业数据建模提供了理想的解决方案。
C#// 设备基础信息类
public class DeviceInfo
{
// 唯一标识
public int Id { get; set; }
// 设备基本属性
public string DeviceName { get; set; }
public string DeviceModel { get; set; }
public string Manufacturer { get; set; }
// 设备状态信息
public DeviceStatus CurrentStatus { get; set; }
// 性能指标
public PerformanceMetrics Performance { get; set; }
// 历史告警记录
public List<AlarmRecord> AlarmHistory { get; set; }
}
// 设备状态枚举
public enum DeviceStatus
{
Running,
Stopped,
Maintenance,
Error
}
// 性能指标
public class PerformanceMetrics
{
public double OperationEfficiency { get; set; }
public double EnergyConsumption { get; set; }
public int TotalRunningHours { get; set; }
}
// 告警记录
public class AlarmRecord
{
public DateTime Timestamp { get; set; }
public string AlarmType { get; set; }
public string Description { get; set; }
public AlarmSeverity Severity { get; set; }
}
public enum AlarmSeverity
{
Low,
Medium,
High,
Critical
}
C#public class DeviceRepository
{
private LiteDatabase _database;
private ILiteCollection<DeviceInfo> _deviceCollection;
public DeviceRepository(string databasePath)
{
// 初始化数据库连接
_database = new LiteDatabase(databasePath);
_deviceCollection = _database.GetCollection<DeviceInfo>("devices");
}
// 插入设备信息
public void InsertDevice(DeviceInfo device)
{
_deviceCollection.Insert(device);
}
// 根据状态查询设备
public List<DeviceInfo> GetDevicesByStatus(DeviceStatus status)
{
return _deviceCollection
.Find(d => d.CurrentStatus == status)
.ToList();
}
// 更新设备性能指标
public void UpdateDevicePerformance(int deviceId, PerformanceMetrics metrics)
{
var device = _deviceCollection.FindById(deviceId);
if (device != null)
{
device.Performance = metrics;
_deviceCollection.Update(device);
}
}
// 添加告警记录
public void AddAlarmRecord(int deviceId, AlarmRecord alarm)
{
var device = _deviceCollection.FindById(deviceId);
if (device != null)
{
device.AlarmHistory ??= new List<AlarmRecord>();
device.AlarmHistory.Add(alarm);
_deviceCollection.Update(device);
}
}
}
C#namespace App02
{
internal class Program
{
static void Main(string[] args)
{
// 数据库路径(建议使用相对或绝对路径)
string databasePath = "DeviceDatabase.db";
// 创建仓储实例
DeviceRepository repository = new DeviceRepository(databasePath);
// 创建测试设备
DeviceInfo device1 = new DeviceInfo
{
DeviceName = "机器人001",
DeviceModel = "RX-78-2",
Manufacturer = "Gundam Corp",
CurrentStatus = DeviceStatus.Running,
Performance = new PerformanceMetrics
{
OperationEfficiency = 95.5,
EnergyConsumption = 250.75,
TotalRunningHours = 1200
},
AlarmHistory = new List<AlarmRecord>()
};
DeviceInfo device2 = new DeviceInfo
{
DeviceName = "机器人002",
DeviceModel = "MK-II",
Manufacturer = "Gundam Tech",
CurrentStatus = DeviceStatus.Maintenance,
Performance = new PerformanceMetrics
{
OperationEfficiency = 80.0,
EnergyConsumption = 300.25,
TotalRunningHours = 800
},
AlarmHistory = new List<AlarmRecord>()
};
// 插入设备
repository.InsertDevice(device1);
repository.InsertDevice(device2);
// 添加告警记录
repository.AddAlarmRecord(device1.Id, new AlarmRecord
{
Timestamp = DateTime.Now,
AlarmType = "性能下降",
Description = "温度异常",
Severity = AlarmSeverity.Medium
});
// 查询运行中的设备
var runningDevices = repository.GetDevicesByStatus(DeviceStatus.Running);
Console.WriteLine("运行中的设备:");
foreach (var device in runningDevices)
{
Console.WriteLine($"设备名称: {device.DeviceName}");
Console.WriteLine($"运行效率: {device.Performance.OperationEfficiency}%");
}
// 更新设备性能
repository.UpdateDevicePerformance(device2.Id, new PerformanceMetrics
{
OperationEfficiency = 85.5,
EnergyConsumption = 280.0,
TotalRunningHours = 900
});
Console.WriteLine("演示完成,请检查数据库文件");
}
}
}
C#namespace App02.Tests
{
public class DeviceRepositoryTests
{
private readonly DeviceRepository _repository;
private readonly string _testDbPath;
public DeviceRepositoryTests()
{
// 使用临时数据库路径
_testDbPath = Path.Combine(Path.GetTempPath(), $"test_{Guid.NewGuid()}.db");
_repository = new DeviceRepository(_testDbPath);
}
[Fact]
public void TestDeviceInsertion()
{
// 创建测试设备
var testDevice = new DeviceInfo
{
DeviceName = "工业机器人 #001",
DeviceModel = "RX-250",
Manufacturer = "RobotCorp",
CurrentStatus = DeviceStatus.Running,
Performance = new PerformanceMetrics
{
OperationEfficiency = 95.5,
EnergyConsumption = 2.3,
TotalRunningHours = 1200
}
};
// 插入设备
_repository.InsertDevice(testDevice);
// 验证插入
var retrievedDevices = _repository.GetDevicesByStatus(DeviceStatus.Running);
Assert.Single(retrievedDevices);
Assert.Equal("工业机器人 #002", retrievedDevices[0].DeviceName);
}
[Fact]
public void TestDevicePerformanceUpdate()
{
// 创建并插入初始设备
var testDevice = new DeviceInfo
{
DeviceName = "工业打印机 #002",
CurrentStatus = DeviceStatus.Running
};
_repository.InsertDevice(testDevice);
// 获取设备ID
var deviceId = _repository.GetDevicesByStatus(DeviceStatus.Running).First().Id;
// 更新性能指标
var newMetrics = new PerformanceMetrics
{
OperationEfficiency = 88.7,
EnergyConsumption = 1.9,
TotalRunningHours = 850
};
_repository.UpdateDevicePerformance(deviceId, newMetrics);
// 验证更新
var updatedDevices = _repository.GetDevicesByStatus(DeviceStatus.Running);
Assert.Equal(88.7, updatedDevices[0].Performance.OperationEfficiency);
}
[Fact]
public void TestAlarmRecordAddition()
{
// 创建并插入初始设备
var testDevice = new DeviceInfo
{
DeviceName = "CNC机床 #003",
CurrentStatus = DeviceStatus.Error
};
_repository.InsertDevice(testDevice);
// 获取设备ID
var deviceId = _repository.GetDevicesByStatus(DeviceStatus.Error).First().Id;
// 添加告警记录
var alarmRecord = new AlarmRecord
{
Timestamp = DateTime.Now,
AlarmType = "过热",
Description = "设备温度超过安全阈值",
Severity = AlarmSeverity.High
};
_repository.AddAlarmRecord(deviceId, alarmRecord);
// 验证告警记录
var updatedDevices = _repository.GetDevicesByStatus(DeviceStatus.Error);
Assert.Single(updatedDevices[0].AlarmHistory);
Assert.Equal("过热", updatedDevices[0].AlarmHistory[0].AlarmType);
}
}
}
要运行这些测试,您需要:
DeviceInfo
、DeviceStatus
等)LiteDB 为工业自动化领域的数据建模提供了极大的灵活性和便利性,通过面向文档的设计,可以轻松应对复杂多变的工业数据场景。
本文作者:rick
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!