系统优化-配置
配置信息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;