上位机与下位机通讯是经过物理介质连接设备, 通过特定通讯协议, 访问变量地址, 最终得到变量, 以周期性或者其他方式读或者写变量, 通过这种方式可以把整个通讯过程按层级进行划分
为什么需要三层分级?
在实际项目中,设备通讯有明显的层次关系:
- 「最底层是物理/链路层」:一台设备对应一个串口(或TCP连接),有固定的波特率、奇偶校验、扫描周期、超时时间、连接状态等。这些是“设备级”属性,属于Device层。
- 「中间是协议分组层」:同一设备上往往有多个通讯功能块。比如Modbus通讯协议下面,功能码03读保持寄存器为一组,功能码06写单个寄存器为另一组;或者不同地址段分批读写以优化效率。这些分组有起始地址、读写数量、功能码、数据类型转换规则等,属于Group层。
- 「最上层是业务变量层」:最终我们关心的不是寄存器,而是“温度”“压力”“运行状态”等工程量。每个变量有名称、单位、量程上下限、报警阈值、是否参与趋势曲线、是否需要死区滤波等,属于Variable层。
如果把这三层混在一起配置,修改一个寄存器地址可能要翻遍代码;加一台新设备就要复制粘贴一堆代码。三层分级后,每一层职责单一,修改互不干扰,配置即插即用。
这种分层符合“单一职责原则”和“开闭原则”:新增协议只需扩展Group类型,新增变量只需加Variable节点,核心轮询逻辑几乎不动。
三层模型的具体定义
包含的属性: 设备名称, 设备连接状态, 首次连接标志位, 串口号, 波特率, 停止位, 奇偶校验, 数据位, 断线检测...
特点:一台物理设备对应一个Device实例,通常是根节点
包括的属性: 组名称, 组状态, 重连次数, 延迟时间, 从站地址, 存储区, 起始地址, 读写数量...
特点:一个Device下可以挂多个Group,实现分批轮询、读写分离,避免单次请求过长导致超时
包括的属性: 变量名称, 变量地址, 数据类型, 斜率, 偏置, 高报警开启, 低报警开启, 高报警值, 低报警值, 最大值, 最小值...
特点:最贴近工艺人员视角,一个Group下通常挂10-50个变量
配置界面:TreeView + PropertyGrid 的组合
实际开发中,使用WinForms的TreeView控件做主配置树,左侧显示层次结构,右侧用PropertyGrid显示选中节点的详细属性。
典型树形结构如下:
选中任意节点,右侧PropertyGrid自动显示对应类的属性,修改后实时保存
配置完成后,可以通过序列化保存成JSON格式。JSON结构自然嵌套
运行时加载与轮询逻辑
程序启动时,读取JSON,反序列化成对象列表(用Newtonsoft.Json)。
然后启动一个后台线程(或Timer),按Device遍历:
- 遍历每个Group,根据协议类型调用对应通讯库(这里可以用之前写的ModbusLib通讯库)。
- 批量读写后,把原始数据解析到Variable实例,应用比例、偏移、报警判断。