在做多设备RS-485通讯的时候,经常会遇到总线冲突的问题。
几台设备连在一条总线上,同时读写容易出错,有的设备响应快,有的设备响应慢。
轮询间隔也不好配,离线检测更头疼,不是漏报就是频繁刷屏。
数据还要自己想办法存储起来。
最近在GitHub上刷到一个用WPF做的上位机,刚好能解决这些问题。
它叫SmartPoll485,一个专门做多设备 Modbus RTU 数据采集的工具。
它最大的特点就是把多设备总线管理做好了,在架构和细节上都考虑到了现场的需求。
支持Modbus RTU协议,功能码为03读保持寄存器,属于标准的工业协议。
使用NModbus4库进行协议解析,稳定性还可以。
它用 SemaphoreSlim 做了串口互斥锁。
当多个设备共用一个串口的时候,同一时间内只能有一个设备进行读写。
这样就避免了总线冲突,通信也更加稳定。
而且每个设备的轮询间隔都可以单独设置,响应速度较快的设备每 500ms 轮询一次。
慢速设备每秒两次,不需要为了迁就慢速设备而降低整个系统的速度。
整体效率提高了很多,在调试的时候可以明显地感觉到。
每个设备都可以设置超时时间、离线阈值等参数,非常灵活。
轮询调度器使用的是异步任务,并不会阻塞UI线程。
数据流也十分清楚,由设备经串口管理器,然后到数据处理与存储。
设备离线检测也做了指数退避重试。
传统的方法不是一直报错就是设备断开连接后没有提示。
该项目采用连续失败阈值来判断离线,即连续三次超时就标记为离线状态。
然后会自动重试,但是不会盲目重试。
第一次 1 秒后重试,第二次 2 秒,第三次 4 秒。
最多间隔 60 秒,既不会漏报也不会刷屏,在现场调试的时候挺实用的。
设备状态管理器还记录了通信质量统计,成功率、失败次数都可以看到。
实时曲线用 OxyPlot 双 Y 轴显示。
温度、压力都可以显示出来,左边为温度,右边为压力。
300 点的滚动窗口,刷新速度很快。
在做上位机监控的时候,该功能很实用。
就不用自己去集成第三方图表控件了,节省了很多开发时间。
有的人可能还不知道 OxyPlot,我也简单介绍一下。
OxyPlot 是一个开源的图表库,它的性能很稳定,而且很容易上手。
曲线数据由PlotDataService来管理,追加点和清空窗口都已经封装好。
报警限值检查也内置了。
每个点位都可以设置HighLimit和LowLimit,当温度大于80度或者小于-10度时会自动报警。
日志会用红字标出,一目了然。
数据也会被保存在SQLite数据库中,方便查询和历史追溯。
报警记录也会保存,后面可以做分析。
报警检查在轮询完成后自动触发,不用单独写逻辑。
量程转换也可以实现,原始值乘以缩放系数再加上偏移,自动计算出工程值。
{ "name": "温度", "highLimit": 80, "lowLimit": -10, "unit": "℃", "scale": 0.1, "offset": 0}
历史数据查询、导出都可以。
可以按照时间、设备、标签等维度进行查询,并且在导出CSV文件时使用的是UTF-8 BOM编码。
直接用 Excel 打开,不会出现乱码的问题。
数据存储使用的是SQLite,它是一个轻量级的数据库,部署起来比较方便。
查询界面也做得不错,有时间范围和设备选择。
设备配置编辑器也是图形化的。
不需要手动修改JSON文件,在界面上就可以直接增加、删除、修改设备和标签。
修改完之后保存,程序会自动重新加载配置。
串口参数也可以在运行中进行修改,不需要重新启动应用程序。
波特率、校验位等都可以热切换,在调试的时候比较方便。
设备编辑器采用的是深拷贝副本编辑模式,修改错误不会影响到原来的配置。
标签编辑弹窗也做得很不错,寄存器地址、量程、单位都可以配置。
本地跑起来也简单
先用 Git 下载代码。
git clone https://github.com/agentthink/smart-poll485cd smart-poll485dotnet run做上位机开发的工程师,该项目可以一观。
代码分层清晰,Models、Services、ViewModels、Views 各司其职。
如果要进行二次开发的话,架构一目了然,代码风格也很整齐,扩展起来也不难。
从串口管理到数据存储,都有了,并且都是开源的。
有需要的朋友可以试试。
开源地址:https://github.com/agentthink/smart-poll485 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!