汇川伺服Modbus-RTU通讯实战:从帧结构解析到西门子PLC程序实现

张开发
2026/5/5 14:07:30 15 分钟阅读

分享文章

汇川伺服Modbus-RTU通讯实战:从帧结构解析到西门子PLC程序实现
1. 从零理解Modbus-RTU通讯协议第一次接触汇川伺服和西门子PLC通讯时我被Modbus协议的各种术语绕得头晕。后来发现把它想象成邮局寄信就简单多了。Modbus-RTU就像是一套标准化的明信片书写格式规定了寄件人怎么写地址、怎么写内容、怎么贴邮票CRC校验。而汇川伺服和西门子PLC就是两个用这套明信片通信的笔友。Modbus-RTU帧结构包含几个关键部分设备地址相当于收件人门牌号1-247功能码说明这封信要干什么0x03读参数/0x06写单个参数/0x10写多个参数数据域具体要读写的参数地址和数值CRC校验相当于明信片的防伪码实际项目中踩过的坑有次调试时发现PLC始终收不到伺服响应查了3小时才发现是H0C.26参数数据高低位顺序设置错误。这个参数就像中文和英文的阅读顺序差异设置不对会导致数据解析完全混乱。2. 关键功能码的帧结构拆解2.1 读参数命令码0x03实战读参数就像查水表需要告诉对方要查哪个表参数地址以及查几个表读取长度。以读取H0B.00当前速度值为例请求帧示例01 03 0B 00 00 01 CRC01伺服地址103读命令0B 00参数H0B.000B是组号00是偏移00 01读取1个字长响应帧解析01 03 02 12 34 CRC02返回2个字节12 34当前速度值0x1234需根据H06.03量程换算实际转速调试技巧用串口助手抓包时建议先调通读功能再尝试写操作。我曾遇到CRC计算错误导致通讯失败后来发现是西门子PLC的CRC算法需要将高低字节交换。2.2 写参数命令码0x06/0x10写单个参数用0x06批量写用0x10。就像点菜0x06是单点0x10是套餐。设置H06.03目标速度的典型流程单点写入帧01 06 06 03 13 88 CRC06 03参数H06.0313 88写入值0x1388对应5000rpm批量写入时要注意32位参数的特殊处理。比如设置H11.12位移量为1234567801 10 0B 0C 00 02 04 12 34 56 78 CRC关键点00 02表示写2个字长32位04表示后续4个字节数据数据顺序受H0C.26参数控制3. 西门子S7-200Smart硬件配置3.1 接线避坑指南RS485接线看似简单但接错线导致的通讯问题能让人崩溃。正确的接线方式PLC端口伺服CN3端子线缆颜色3RS4853红8RS485-8蓝5PE5黄绿双色接地要点务必连接PE线我曾因未接地导致通讯时好时坏屏蔽层单端接地通常接PLC侧避免与动力线平行走线3.2 伺服参数关键设置这几个参数必须检查H0C.00 1 // 设备地址1 H0C.25 5 // 波特率57600bps H0C.33 3 // 无校验1停止位 H0C.26 0 // 数据高低位顺序常见故障排查通讯指示灯不亮检查接线极性能发不能收检查H0C.26设置数据乱码确认波特率一致4. PLC程序实现详解4.1 通讯初始化西门子S7-200Smart需要先配置端口参数// 端口0初始化 MOV_B 16#09, SMB30 // 9600bps,无校验 MOV_B 16#04, SMB87 // 启用接收 MOV_B 16#0B, SMB88 // 起始字符01 MOV_B 16#0A, SMB89 // 结束字符CRLF4.2 读速度程序示例每1秒读取H0B.00的完整流程// 触发读取 LD SM0.5 // 1秒脉冲 EU MOV_B 16#01, VB100 // 从站地址 MOV_B 16#03, VB101 // 功能码 MOV_W 16#0B00, VW102 // 参数地址 MOV_W 16#0001, VW104 // 读取长度 CALL CRC_Calc // 计算CRC XMT VB100, 0 // 发送请求 // 接收处理 RCV VB200, 0 // 接收缓冲区 MOV_W VW203, VW300 // 提取速度值4.3 写速度程序优化写入H06.03时的注意事项// 数据转换 ITD VW400, VD500 // 整数转双字 DTR VD500, VD504 // 转浮点数 MUL VD504, 100.0, VD508 // 量程缩放 ROUND VD508, VD512 // 四舍五入 DTI VD512, VW516 // 转回整数 // 构建写指令 MOV_B 16#01, VB600 MOV_B 16#06, VB601 MOV_W 16#0603, VW602 MOV_W VW516, VW604 CALL CRC_Calc XMT VB600, 0调试中发现直接写入整数值可能导致速度突变最好加入斜坡函数。我的经验是每次写入变化不超过当前值的10%。

更多文章