西门子smart SB CM01与台达DT330温控器485通讯程序(XMZ200-3) 器件:西门子s7 200 smart PLC,扩展模块SB CM01,台达DT330温控器。 昆仑通态触摸屏(带以太网),中途可以加路由器 控制方式:触摸屏与plc以太网通讯,PLC扩展模块SB CM01与台达温控器通讯485口相连 功能:PLC轮询控制读取温控器实际温度,设定温控器温度。 说明:的是程序,非硬件。 程序有注释,温控器设置,接线都有,一应俱全
最近在搞西门子S7-200 Smart和台达DT330温控器的485通讯,这俩设备协议不同但都能玩转Modbus,折腾了三天终于搞定轮询读写。直接上干货,建议备好咖啡边看边操作。
先怼通讯参数设置:
台达DT330的通讯参数得用面板设置(别偷懒):
- 地址:1(默认不改)
- 波特率:9600
- 数据位:8
- 停止位:1
- 校验:None
PLC这边用SB CM01模块,STEP7里双击485口配置:
![PLC配置截图]
关键参数必须与温控器完全一致,特别是奇偶校验别整反了,这货默认是偶校验容易踩坑。
核心程序结构长这样:
//主程序 Network1 LD SM0.1 CALL INIT_COM //初始化通讯口 MOVB 16#0A, VB100 //定义轮询间隔10秒 Network2 LDN T37 TON T37, VW100 //定时触发轮询重点在轮询调度这块,我用了状态位切换法避免数据打架。用V区变量做流程控制:
//轮询控制段 LD T37 EU MOVB 1, VB200 //触发读取实际温度 LD M0.0 //完成读取标志 EU MOVB 2, VB200 //切换写入设定温度 LD M0.1 //完成写入标志 EU MOVB 0, VB200 //复位状态读写子程序里藏着魔鬼细节,台达的寄存器地址要换算成4x保持寄存器模式。比如实际温度在0x1000,换算成Modbus地址是40001:
//读取实际温度 LD SM0.0 MOVB 1, VB501 //从站地址 MOVB 3, VB502 //功能码03 MOVW 16#1000, VW503 //寄存器地址 MOVW 1, VW505 //读取长度 MOVB 6, VB500 //报文长度 XMT VB500, 0 //发送指令 //接收处理 RCV VB600, 0 //接收缓冲区这里有个坑要注意:台达返回的温度值是16位有符号整数,得用INTTOREAL转换。比如收到0xFF38其实是-20℃:
//数据转换处理 LD SM0.0 BTI VB603, VW700 //取温度值字节 ITD VW700, VD702 //转双整 DTR VD702, VD706 //转实数 MOVR VD706, VD710 //最终温度值存储写入设定温度时得算校验码,台达要低字节在前。比如写25℃到0x1001地址:
//写入设定温度 LD SM0.0 MOVB 1, VB501 //从站地址 MOVB 6, VB502 //功能码06 MOVW 16#1001, VW503 //目标地址 MOVW 250, VW505 //温度值x10(25.0℃) MOVB 6, VB500 //报文长度 XMT VB500, 0 //发送调试时建议用串口助手抓包,碰到返回错误码0x84说明地址错误,0x85是数据格式不对。实测发现台达响应速度比PLC轮询慢,建议每条指令后加500ms延时。
最后在触摸屏上搞个趋势图,地址指向VD710实时温度值。这套程序跑起来后温度曲线稳如老狗,PID参数直接在温控器里调就行,PLC只做数据搬运工。完整代码已上传GitHub(地址私),注释比正文还多,欢迎拍砖。