我处理设备网络访问的正确方法是什么

What is the proper way for me to handle network access for a device

我目前正在开发一个 blazor 服务器项目,它将显示来自 modbus tcp/ip 设备的信息。我有一个名为“DeviceModel”的 class,它模拟了一个 Modbus 设备。下面显示了一个简化的示例。

public string DeviceName {get;set;}
public string IpAddress {get;set;}
public string Port {get;set;}
public int[] Registers {get;set;}
public string Alarm1 {get;set;}

设备模型 class 还包含从寄存器解析信息的方法。例如,下面的代码片段将检查 Registers 数组中某个索引处的值。根据该值,它将 Alarm1 属性 设置为 ON 或 OFF。

public void CheckAlarm1(){
int status = Registers[4];
Alarm1 = status == 1 ? "ON" : "OFF";

}

我有另一个名为“NetworkAccess”的 class,它处理与设备的 TCP/IP 连接。一个简化的例子如下所示

// ModbusClient is a package which handles the reading/writing to TCP/IP Modbus 
private ModbusClient _client;
public string IPAddress {get;set;}
public string Port {get;set;}
public DeviceModel Device {get;set;}

public NetworkAccess(DeviceModel dev){
      IPAddress = dev.IPAddress;
      Port = dev.Port;
      _client = new ModbusClient(IPAddress,Port);
      _client.Connect();
}

NetworkAccess class 处理网络上设备的读写数据to/from。下面是将数据写入 Modbus 设备上的单个寄存器的示例方法。

public void WriteSingleRegister(int address,int dataToAdd){
     _client.WriteSingleRegister(address,dataToAdd);
}

在我的网页 Razor 组件中,在 OnInitialized() 方法中,我从数据库中获取了一个包含 DeviceModels 的列表,其中填充了每个设备的 IP 地址、端口和名称等信息。要向设备读取信息,我有另一种方法“GetData()”,如下所示

public async void GetData(){
     foreach(var device in Devices){
          NetworkAccess network = new NetworkAccess(dev);
          var dataUpdate = await network.ReadRegistersAsync(0,20);
          dev.Registers= dataUpdate;
     }
}

我目前的设置方式工作正常。为了写入设备,我会在我的 Razor 组件中做这样的事情

NetworkAccess network = new NetworkAccess(dev);
network.WriteRegistersAsync(0,new int[] {0,0,0,...}};

我遇到麻烦的地方是我不确定处理我的情况的正确(或最佳)方法。在我看来,如果我的 DeviceModel class 中有用于特定操作(例如“ResetAlarm1”或“ClearRegisters”)的方法,对我来说更有意义。这样我可以做到

dev.ResetAlarm1();

而不是在我下面的剃须刀组件中这样做

NetworkAccess net = new NetworkAccess(dev)
dev.WriteRegister(6,0); // where 6 is the register to write to and 0 is value to write

我想我的问题是我是否应该将“NetworkAccess”添加到设备模型并处理创建连接并 reading/writing 到其中的设备?还是将 NetworkAccess 和 DeviceModel 分开更有意义?

我希望这个 post 有意义。这更多是关于设计的问题,而不是解决问题的问题。虽然我当前的解决方案运行良好,但我想更好地了解这是否是正确的方法,或者我是否偏离了方向。

感谢您的帮助!

Or does it make more sense to keep NetworkAccess and DeviceModel separate?

As single responsibility principle of SOLID says:

The single-responsibility principle (SRP) is a computer-programming principle that states that every module, class or function in a computer program should have responsibility over a single part of that program's functionality, and it should encapsulate that part. All of that module, class or function's services should be narrowly aligned with that responsibility.

在此处阅读有关 single responsibility principle of SOLID 的更多信息。

所以在 Device class 中制作单独的方法 dev.ResetAlarm1() 对我来说更可取。

很难说我的重构代码是否适合你,但我已经尽力了:

public class Device
{
    public string Name { get; set; }

    public string IpAddress { get; set; }

    public string Port { get; set; }

    public int[] Registers { get; set; }

    public string[] Alarms { get; set; }


    public void CheckAlarm(int registerIndex)
    {
        int status = Registers[registerIndex];
        Alarms[registerIndex] = status == 1 ? "ON" : "OFF";
    }
}