昆仑通态控温程序,MCGS通讯10块仪表,不需要用plc,直接触摸屏通讯各种仪表
昆仑通态的MCGS触摸屏搞控温项目是真带劲,特别是直接甩开PLC单挑十块仪表的时候。最近碰上个项目,客户非要省掉PLC成本,咱就直接拿MCGS Pro组态软件硬刚了一波Modbus通讯。实测下来发现这玩法比想象中靠谱,不过有些坑必须得提前填。
先说说硬件怎么接。十台温控表清一色485接口,直接怼到触摸屏的COM2口上。注意这里必须上120Ω终端电阻,之前偷懒没加,结果第8号到第10号仪表数据总抽风。接线顺序建议用菊花链式手拉手接法,别整星型拓扑,485总线最怕这个。
通讯参数配置得用脚本暴力初始化:
' 通讯口初始化 Device.SetComParam "COM2", 1, 8, 2, 0 ' 站号1,波特率9600 For i = 1 To 10 Device.SetDeviceParam "Device" & i, 3, i, 500 ' 仪表站号1-10 Next这个循环设定直接把十个仪表的站号从1到10绑到不同设备变量上。注意超时设500ms刚好卡在仪表响应极限,设短了容易丢包。
数据读写最骚的是用矩阵操作。比如同时读取十块表的当前温度:
Dim arr(9) For i = 0 To 9 arr(i) = Device.ReadRegister("Device" & (i+1), 4, 3000, 1) Next !SetVar("PV_All", arr)这里用数组一口气存十个PV值,比单个读取省了三分之二时间。实测从原来单次读取需要3秒缩短到800ms左右,关键是把读取间隔从100ms调到20ms也不会冲突。
碰到最坑爹的是浮点数转换。某品牌仪表用Modbus传过来的32位float居然是反字节序,得这么处理:
Function ReverseFloat(bytes) Dim tmp = StrReverse(bytes) !fVal = CDbl(tmp) ' 字节逆序转换 ReverseFloat = Round(fVal * 10) / 10 ' 保留一位小数 End Function这个自定义函数直接解决温度值显示乱跳的问题,后来发现不同品牌仪表字节顺序居然不一样,建议每个设备单独做转换测试。
最后来个实战技巧:在画面切换时插入这个脚本:
If !ScreenChange() Then Device.FlushBuffer "COM2" ' 清空缓存防数据粘连 Delay(50) End If能有效避免页面切换时的数据错位。项目跑了两月没出过通讯故障,证明这套方案完全能扛住产线环境。想省PLC钱的兄弟可以放心冲,不过仪表数量超过15台还是建议加个通讯模块更稳。