接收到一串字符,总要知道在那个地方结束吧,这就是结束符的作用,接收方不管以后还会收到多少个字符。当接收到结束符时,以后再接收的字符就算是下一轮的东西了,从起始符到结束符之间的字符就是它要分析的字符!MODBUS的ASCII方式结束符是---Chr$(13) + Chr$(10)
现在的组合是“:02030A000004FB“+ Chr$(13) + Chr$(10)
至此,ASCII方式的发送就完成了,控制器接收到此串字符后,根据MODBUS协议定义的通讯规范分析此串字符的作用,返回相应的字符!
注意:发送的字符都是以十六进制数表示!
控制器返回的字符根据命令的不同而不同,此处不好讲解,在下面具体例子中会有说明!
RTU方式:
RTU方式发送时的规范定义如下:
至少3.5个字符传输时间的停顿间隔时间标定消息的开始 设备地址 +功能代码+数据 +校验+至少3.5个字符传输时间的停顿间隔时间标定了消息的结束
其他的就不用说了,与ASCII方式一样的作用,唯独这3.5个字符的时间搞晕了很多人,实际我也不敢太解释,大致说一下吧,您就当听着玩,比如通讯格式是9600,E,8,1
波特率是做什么的?一秒传输多少个位(比如一秒传送9600个位),一个字符是多少个位呢?通讯格式已经标定了(7个位或是8个位),那3.5个字符的传送时间就好算了吧:
3.5*11(或10)=39个位(35个位),传3.5个字符需要的时间是:39/9600=4毫秒。
不是说八位嘛,怎么乘11,记住了,还有一个起始位,奇或偶的校验位(无奇偶校验,则没有此位),停止位(两个停止位就是2了。)
如9600,N,8,2为11个位,
9600,N,7,1.为9个位
就是说,您得保证发送字符串的连续性,中间停顿时间超过4毫秒,接收方就认为您已经发送完了这组消息,开始处理了。这就是至少3.5个字符传输时间的停顿间隔时间标定了消息的结束的含义
如果您发送的太连续,下一组消息与上一组消息之间的间隔时间没超过4毫秒,接收方就认为这些字符是一组消息,按一组消息去处理。您发送结束一组命令后,必须间隔4毫秒才能发送下一组命令.这就是至少3.5个字符传输时间的停顿间隔时间标定消息的开始的含义
至此我的大白话结束,有什么错误,请您批评,多谢!
通讯协议实际也就是这回事,任何一个协议都大同小异。通讯格式,通讯规范两种而已。
您如果愿意,也可以自己定义一个通讯规范,用PLC或是VB语言按照您自己定义的这个规范处理,如果可靠性超过modbus,那您的通讯规范就是Zui流行的了!
我经常问某些产品推广人员,“您设备的通讯协议是什么”,他回答:“232”或是“485”。今天您看了上面这些大白话,请您就不要再这样回答了。
Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。
“232”或是“485”只是一种线路传输方式,与协议是无关的!232传输抗干扰性差,485传输抗干扰相对强。
MODBUS做为一种标准的协议,应用于各种PLC,控制器,仪表。这些仪表或是控制器应用中,元件的通讯地址肯定是不一样了;各个命令码的各部分组成的意义也许也会不同;
它一定会遵守MODBUS的协议规范。即,每个命令码的组成一定符合MODBUS的规范!一样不多,一样不少!
下面针对某种支持MODBUS协议的控制器,说一下具体的读/写例子
1\ 读某控制器的十五个寄存器值,发送的字符串是:(ASCII方式)
": 01031000000FDD"+ Chr$(13) + Chr$(10)
起始符“:” + 站号(01) + 读命令(03)+ 起始寄存器通讯地址(1000)+ 字数(15;转换成十六进制000F)+校验和(DD)+ 结束符
控制器返回的字符数是71个
起始符“:” + 站号(01) + 读命令(03)+ 字数(0F)+ 60个数据字符(一个寄存器是4个,一共十五个) +校验和(DD)+ 结束符(两个)
2\ 分别向某控制器两个寄存器写入数值,发送的字符串是:(ASCII方式)
": 01101000000204"+ 写入的数值(8个字符)+ 校验和 + Chr$(13) + Chr$(10)
起始符“:” + 站号(01) + 写命令(10)+ 起始寄存器通讯地址(1000)+ 字数(2;转换成十六进制0002)+字节数(04) + 校验和(因为写入数值是变化的,需要得经过计算得出校验和)+ 结束符
控制器返回的字符数是17个
起始符“:” + 站号(01) + 写命令(10)+ 起始寄存器通讯地址(1000)+ 字数(02)+ 错误码(2个) +校验和(DD)+ 结束符(两个)
***错误码,当通讯正确时是什么,通讯错误时是什么,具体控制器会有说明
读其他仪表的某值时,参照上述读的规范,也就是更改一下起始寄存器通讯地址、字数、校验和(校验和是编制程序块自动计算的。)
要读多个仪表的同一个检测值更简单,更改站号就可以了。