编辑
2025-02-03
C# 应用
00
请注意,本文编写于 92 天前,最后修改于 92 天前,其中某些信息可能已经过时。

目录

面向文档的数据结构概述
文档模型的核心优势
工业自动化数据建模实例
设备状态监控模型
LiteDB 存储与查询示例
调用
测试类
TestDeviceInsertion 测试方法
注意事项
结语

面向文档的数据结构概述

在工业自动化领域,数据模型的灵活性和可扩展性至关重要。LiteDB 作为一个轻量级的文档数据库,为复杂的工业数据建模提供了理想的解决方案。

文档模型的核心优势

  1. 灵活架构:无需预定义严格的架构
  2. 嵌套对象支持:可以轻松存储复杂的层次结构
  3. 动态字段:可以随时添加或移除字段
  4. 高性能:针对文档型数据的快速读写

工业自动化数据建模实例

设备状态监控模型

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 }

LiteDB 存储与查询示例

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("演示完成,请检查数据库文件"); } } }

image.png

测试类

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); } } }

要运行这些测试,您需要:

  • 安装 LiteDB NuGet 包
  • 安装 xUnit 测试框架
  • 确保已实现之前文章中定义的所有类(DeviceInfoDeviceStatus等)

TestDeviceInsertion 测试方法

image.png

注意事项

  1. 保持文档结构相对一致
  2. 合理使用索引
  3. 避免过深的嵌套结构
  4. 定期维护数据库
  5. 使用事务处理复杂操作
  6. 定期压缩数据库

结语

LiteDB 为工业自动化领域的数据建模提供了极大的灵活性和便利性,通过面向文档的设计,可以轻松应对复杂多变的工业数据场景。

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!