登录
首页 PLC论坛 施耐德电气PLC
回帖 发帖
正文

主题:从Modbus开始说现场总线(二)

点击:1438 回复:6

从Modbus开始说现场总线(二)
Modbus作为一个应用层的协议,最初是为了实现PLC间通讯的,所以基础的协议内容相对简单,传输的数据主要分为四类:离散量(开关量)输入,离散量(开关量,线圈)输出,输入寄存器,保持寄存器。对应电力系统中的术语,分别是:遥信,遥控,遥测,遥调。实际使用中因为一个保持寄存器可以作为十六个开关量使用,而且读和写都支持,大家都习惯通过读/写保持寄存器来搞定一切。
最初的Modbus协议基于RS-232/485链路,有两种编码方式,RTU和ASCII,这也是为什么有时候看到“Modbus RTU”说法的由来,后面我们介绍的帧格式就是RTU格式,ASCII格式已经很少用了。
其实Modbus的通讯格式非常容易理解,主站给从站发送一条报文,大概相当于网友问支付宝:支付宝(从站地址),内定的锦鲤(数据类型,保持寄存器)第二名(寄存器地址)是多少(读数据,暗号03)啊(校验码)?报文格式如下(16进制):
   01             03             00 01           00 01           D5 CA
从机地址        功能码          数据地址      读取数据个数       CRC校验
支付宝回复网友: 支付宝(从站地址),这个嘛(重复读数据功能码),没有(返回数据长度,二),是0017这厮(返回数据),真没有(校验码):
01         03             02             0017           F8 4A
 从机地址   功能码     数据字节个数    两个字节数据    CRC校验
这样,Modbus主机就完成了一次对从机数据的读操作,是不是很简单?最常用的两个功能码就是上面介绍的0x03(读连续多个保持寄存器)和0x10(十进制16,写多个保持寄存器),其他的功能码,基本类似,无非是类型(离散量,寄存器,…)数量(单个,连续多个)的不同组合。当然还少不了错误处理等细节,详细内容见参考文献。
寄存器地址是从0000开始的,对应于Modicon(施耐德)PLC中的40001,如果是寄存器地址从0001开始,并直接对应寄存器地址40001,Modbus RTU协议就有了一个别名JBUS,可以理解为JBUS是Modbus的一个常用功能子集。另外有的厂商在返回数据时,数据长度不是按字节计算,而是按字计算,也无法和标准Modbus协议兼容。
把Modbus报文去掉地址和CRC校验码嵌入到以太网的数据帧中,就成了TCP-Modbus,如下图。这样串行设备(我们前面讲的断路器,多数都是通过附件成为一个串行设备)就可以很方便的接入以太网了,当然这个“嵌入”的过程,是由网关完成的。
附件 Modbus-3.jpg
Modbus协议的主要内容就介绍完了,我们会发现,作为一个应用层协议,Modbus并没有定义数据的格式和含义,例如,读一个保持寄存器的值,我们得到一个16位的数,至于这个数是每一位代表一个开关量的状态,还是一个无符号整数,或者是32位浮点数的高字节或者低字节,就要靠通讯双方自行定义了。所以实现Modbus通讯的很大一部分工作就是按照双方的通讯数据表逐个处理。
最后修改:2019/7/18 15:45:29
19-07-18 15:40
支付宝的比喻亮了表情
19-07-18 17:49
又见大师的文章了!精彩!给你点赞!
19-07-18 18:35
好评,通讯这块确实头疼
19-07-18 20:54
支付宝.表示.内定.真没有...是0017号....真没有
大亮啊表情
19-07-19 20:42
表情
19-09-10 10:31
阿弥陀佛。。。
19-09-11 08:50

工控新闻

更多新闻资讯