C#实现数据采集系统-配置文件化

系统优化-配置

配置信息ip端口,还有点位信息,什么的都是直接在代码里直接写死,添加点位,修改配置,比较麻烦,每次修改都需要重新生成打包。
所以将这些配置都改成配置文件,这样只需要修改配置文件,程序无须修改,即可更新。
配置代码:
在这里插入图片描述

如果我们有100个采集,一个个去添加就很累,或者ip地址改了,都要重新改了打包发布再部署

所以将这些属性和信息都改成配置文件

主要的配置信息

设备信息:

设备信息:设备ID

网络信息:IP、端口

协议配置信息:从站地址

Mqtt配置

服务器Ip、端口

用户名、密码

点位表

点ID
寄存器类型
地址
长度(寄存器数量)
数据类型

配置文件创建和编辑

由此我们添加两个文件

json信息配置

一个json文件,用于配置参数等信息,主要是配置设备信息和Mqtt服务器配置

{
    
    
  "DeviceLink": {
    
    
    "UID": "device01",
    "Ip": "127.0.0.1",
    "Port": 502,
    "SlaveId": 1
  },
  "MqttConfig": {
    
    
    "Ip": "127.0.0.1",
    "Port": 1883,
    "Username": "admin",
    "Password": "12345"
  }
}

点位配置表csv

另一个csv表格文件,用于加载数据点位信息,然后编写一些点位信息

示例数据如下:

UID Name Type RegisterType Address Length
001 1号数据点 Int16 HoldingRegister 0 1
002 2号数据点 Int16 HoldingRegister 1 1
003 3号数据点 Int16 HoldingRegister 2 1
004 4号数据点 Int16 HoldingRegister 3 1
005 5号数据点 Int16 HoldingRegister 4 1
006 6号数据点 Int16 HoldingRegister 5 1
IO1 1号开关状态 bool Coil 0 1
IO2 2号开关状态 bool Coil 1 1
IO3 3号开关状态 bool Coil 2 1
IO4 4号开关状态 bool Coil 3 1
IO5 5号开关状态 bool Coil 4 1
IO6 6号开关状态 bool Coil 5 1
IO7 7号开关状态 bool Coil 6 1
IO8 8号开关状态 bool Coil 7 1
IO9 9号开关状态 bool Coil 8 1
IO10 10号开关状态 bool Coil 9 1

配置文件导入

复制到主程序中Config文件夹
在这里插入图片描述

然后设置为复制到输出目录
在这里插入图片描述

MqttControllr参数优化

后续还要加入用户名Username 和密码Password 等一系列参数,一个个传入就导致参数传入过多,搞一个专门的配置类用于存储和加载配置信息

 public class MqttConfig
 {
    
    
     public string Ip {
    
     get; set; }

     public int Port {
    
     get; set; } = 1883;

     public string Username {
    
     get; set; } = "admin";

     public string Password {
    
     get; set; } = "12345";

     public string ClientId {
    
     get; set; }
 }

创建主配置类

添加一个跟配置文件一样的配置类

需注意字段名称和大小写要跟json文件对上

 public class DAqOption
 {
    
    
     public DeviceLink DeviceLink {
    
     get; set; }

     public MqttConfig MqttConfig {
    
     get; set; }
 }

配置文件加载

主配置文件反序列化

使用System.Text.Json进行反序列化操作
先将json文件读入到

 var str = File.ReadAllText("Config\\Config.json");
 var config = JsonSerializer.Deserialize<DAqOption>(str);

测试结果:
在这里插入图片描述

数据点位表加载

csv文件以逗号分隔,一行行读入,然后处理,复制给类对象。
这里需要注意,中文的编码问题

 var lines = File.ReadAllLines("Config\\AllPoint.csv", Encoding.UTF8).ToList();
 lines.RemoveAt(0);
 List<RegisterPoint> points = new List<RegisterPoint>();
 foreach (var line in lines)
 {
    
    
     var values = line.Split(',');
     var point = new RegisterPoint()
     {
    
    
         UID = values[0],
         Name = values[1],
         Type = Type.GetType("System." + values[2]),
         RegisterType = values[3],
         Address = int.Parse(values[4]),
         Length = int.Parse(values[5]),
     };
     points.Add(point);
 }

后面再加上正常启动的代码

     MqttControllor = new MqttControllor(config.MqttConfig);

     ModbusTcp modbusTcp = new ModbusTcp(deviceLink, points);
     modbusTcp.DoMonitor();
     modbusTcp.ValueUpdated += ModbusTcp_ValueUpdated;

猜你喜欢

转载自blog.csdn.net/qq_39427511/article/details/140726684