西门子1200 PLC 485轮询读写仪表通讯学习案例:涵盖PLC与触摸屏程序,基于Modbu...

张开发
2026/4/16 21:40:16 15 分钟阅读

分享文章

西门子1200 PLC 485轮询读写仪表通讯学习案例:涵盖PLC与触摸屏程序,基于Modbu...
西门子1200plc485轮询读写28个测试仪表包括plc程序和触摸屏程序仪表485通讯协议说明书是学习西门子1200modbus通讯非常好的借鉴程序此程序为工作实际运用项目凌晨三点半的车间里PLC柜的绿灯规律闪烁。握着万用表的手有点抖——第27号仪表死活不认数据帧。突然意识到这堆Modbus RTU轮询的坑正是新手进阶的必经之路。这个项目用了台S7-1200 1215C DC/DC/DC做主站RS485模块CM1241挂在右侧。要命的是28台不同型号的仪表每台都自带变种的Modbus协议。最老的那台压力变送器甚至还在用03功能码读保持寄存器新的流量计却要用23功能码批量读取。硬件组态里最容易被忽视的细节是CM1241的硬件标识符。这个16进制的数字会在程序里反复出现特别是MB_MASTER指令块的PORT参数。新手常在这里栽跟头以为填1就是第一个485口实际得在设备视图里右键属性找硬件标识符。西门子1200plc485轮询读写28个测试仪表包括plc程序和触摸屏程序仪表485通讯协议说明书是学习西门子1200modbus通讯非常好的借鉴程序此程序为工作实际运用项目轮询的核心在OB1里用定时器计数器实现L T_ModbusCycle //500ms周期 SD T1 A T1 FP M0.0 JCN _end CU C10 //轮询计数器 L C10 L 28 I JCN _next CLR _next: L C10 SLW 3 LAR1 L DeviceDB.Station[AR1,P#0.0] //取当前设备站号 T #MB_Station CALL MB_MASTER ...这段代码的玄机在于用计数器值做设备索引配合结构体数组实现设备轮转。注意那个SLW 3左移三位本质是把计数器值乘以8因为每个设备参数结构体占8个字节。仪表协议的破解更有意思。某国产温控器的数据格式居然是IEEE754浮点但寄存器排列是反的。得用MOVE指令把高低字对调TempRaw : MB_Data.ReadData[0] 16 | MB_Data.ReadData[1]; RealTemp : REAL_TO_INT(TempRaw);触摸屏这边WinCC Flexible的IO域要绑定PLC变量里的RealTemp。但实际调试中发现直接映射会导致数值跳变——必须在前端做滤波处理。在画面脚本里加了个移动平均var newVal SmartTags(RealTemp); buffer.shift(); buffer.push(newVal); avg buffer.reduce((a,b)ab,0)/buffer.length;最深的坑出现在第17号设备。它的响应时间比其他仪表慢200ms导致轮询超时。解决方案是在设备参数结构体里增加超时时间字段动态调整MB_MASTER的Timeout参数。这个项目教会我们Modbus轮询不是简单的循环读取而是节奏控制、异常处理、数据解析的综合体。当第28个IO域终于同步刷新时那种快感比写完Hello World强烈百倍——毕竟这可是能控制真实物理世界的代码。

更多文章