| 作者 | 主题 |
|---|---|
|
WWCWWC 至圣
经验值:79172 发帖数:9104 精华帖:157 |
楼主
主题:说说西门子200smart modbus自由口通讯的那些事11
说说西门子200smart modbus自由口通讯的那些事11 上文说到常用任意字符做消息接收的开始,用消息定时器作为消息接收的结束标记的验证,当PLC主站方式一串消息请求后,等待从站消息数据的回传,如果从站工作或通讯中断,则判断消息接收的错误,并停止接收。 这次,我们再来做一个利用起始符合结束符判断消息的开始和消息的结束程序,目的是在规划编写发送数据时需要规避利用起始符中出现的2个相同字符的一些问题。 假设,串口调试软件先发送一串数据字符“modbus1”和“odbus2”,主站PLC在初始化参数、数据后,立即启动接收消息。如果主站接收到通讯回路上有一个数据字符为“6D(m)”,则判断为接收消息的开始,消息的结束则由结束符“32(2)”完成接收。当一串消息中同时出现2个相同的字符时,有必要规避用消息的起始符作为消息的开始(或者常用消息定时器作为消息的开始等方式)。本例中如果将消息数据“modbus1”和“modbus2”的首字符“m”一起写入串口调试软件,则,串口调试软件发生的数据在PLC接收时会引起概率较大的错误。 控制思路: 初始化子程序:SMB87= 16# E0; 1) 设置通讯端口SMB30 = 16#09,0#自由口通讯,9600,8个数据位,1个停止位,无效验; 2) 启用起始符,SMB88 = 16#6D(“m”)字符; 3) 启用结束符,SMB89 = 16#32(“2”)字符; 4) 定义接收数据的长度字节数SMB94 = 255(必须填写内容) 5) 启用接收完成中断,中断事件号23;在接收完成中断中仍然调用接收指令 6) 开中断;ENI 7) 启用接收指令RCV;接收区地址从VB0接收数据个数地址开始 程序: 初始化子程序: 主程序调用初始化子程序: 接收完成中断调用接收指令: 打开串口调试软件,设置通讯参数与PLC SMB30一致,并设置COM3,在数据发送区输入数据“modbus1odbus2”字符,手动点击发送,图示: 返过来,监控PLC“状态图表”中的显示内容,图示: 2者比较看各软件运行的结果能够实现编程的思路: 反过来,我特意写入这串字符存在2个“m”时,则,错误的概率会大大增加,图示: 错误的原因当然是系统无法最设别这整串字符中什么是开始的字符字节了,继续、、、、、、 |