核心内容摘要
mPLUG视觉问答+Streamlit:打造交互式图片分析平台
Modbus RTU主站 485通讯主站程序端口0作主站
西门子224xp或200smart
采用modbus rtu协议
支持16#03和16#06功能码
使用XMT和RCV指令开发
具有重试2次的通讯功能重试次数可修改最近在工控项目里踩了个坑搞了个西门子200 SMART做主站的Modbus RTU通讯程序。
这玩意儿用XMT/RCV指令手搓协议帧是真费劲不过折腾完发现也没那么邪乎今天就把核心代码扒出来聊聊。
Modbus RTU主站 485通讯主站程序端口0作主站
西门子224xp或200smart
采用modbus rtu协议
支持16#03和16#06功能码
使用XMT和RCV指令开发
具有重试2次的通讯功能重试次数可修改硬件配置这块儿得先整明白224xp或200 SMART的Port0默认是PPI口得先用SM
1初始化成自由口MOV_B 16#09, SMB30 //9600波特率,8数据位无校验 MOV_B 16#B0, SMB87 //启用接收定时器 MOV_B 200, SMB34 //接收超时200ms ATCH INT_0, 9 //接收完成中断 ENI功能码03和06的处理其实可以套模板。
比如写保持寄存器的06功能码报文//发送缓冲区VB100-VB109 VB100 1 //从站地址 VB101 6 //功能码 VB102 0 //寄存器地址高字节 VB103 1 //寄存器地址低字节 VB104 0 //数据高字节 VB105 100 //数据低字节(写入值
CRC16(VB100,
//自动生成校验码到VB106-VB107 XMT VB100, 8 //发送8个字节这里有个小细节要注意西门子的数据存储是高位在前但Modbus寄存器地址得用大端模式。
比如说VW200对应保持寄存器40001的话得拆成00 00转成16进制地址。
接收处理在中断程序里搞//INT_0 RCV VB200, 0 //接收数据到VB200开始 MOV_B VB200, VB0 //取从站地址 MOV_B VB201, VB1 //功能码 MOV_B VB202, VB2 //返回数据长度校验这块儿得自己写个CRC校验子程序网上找个现成的算法挂上去就行。
校验失败就触发重试//主程序里 LD SM
0 CALL CRC_CHECK, VB200, 8 //假设接收8字节 M
0 //校验结果标志 LDN M
0 EU //校验失败上升沿 INC_VB 10 //重试计数器VB10重试机制用了个循环结构//发送失败后 LD SM
5 //发送完成标志 A I
0 //手动启动信号 MOV_B 0, VB10 //初始化重试计数器 LBL 1: XMT VB100, 8 //发送报文 TON T37, 500 //500ms超时 LD T37 //超时未响应 O SM
5 //或发送失败 CTU C0, VB10 //计数重试次数 LD C0 AB VB10, 2 //重试次数未达上限 JMP 1 //跳回重试实测发现这个结构有个坑——连续发送时得等前一条报文超时才能重发。
后来在发送前加了段复位逻辑//每次发送前 R SM
8
7, 1 //禁用接收 XMT VB100, 8 MOV_B 2, SMB87 //重新启用接收最后说个血的教训用自由口搞Modbus千万别开西门子自带的库指令这俩货会互相抢串口控制权。
测试时用Modscan32之类的工具抓包看原始报文最靠谱毕竟现场仪表经常不按套路出牌。