MODBUS协议基础 点击:353 | 回复:2



郭远林

    
  • [版主]
  • 精华:3帖
  • 求助:8帖
  • 帖子:106帖 | 2106回
  • 年度积分:294
  • 历史总积分:43018
  • 注册:2011年10月21日
发表于:2018-07-13 15:23:48
楼主

  

 前一张讲述了RS-485的通讯接口及物理层和通讯方式,以及更加深刻了解RS-485物理层接口定义,从而深入了解在PLC中和各种设备之间的通讯方式及通讯内容。接下来,就开始说一下,国际上公开开放的协议-MODBUS 协议,现在国内几乎智能设备上都采用了标准的MODBUS-协议,与PLC和上位机编程及监控,集中数据处理,让工厂的设备实现工业自动化的。


一、MODBUS 协议

  Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。


 当在网络上通信时,Modbus协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成应答并使用Modbus协议发送给询问方。

  Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。 
  Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。 
 

 所以在这里我仅介绍一下Modbus的ASCII和RTU协议,可以更加认识两种的协议内容。如果想学习Modbus协议。可以采用台达变频器。可以通过两种不同协议,让你更加深入了解Modbus协议,尤其是工厂上扫描枪及读码器。它们都是采用RS-232接口。这就要通过Modbus协议的ASCII的协议,有的可能支持RTU,有的就得采用无协议通讯,(例如西门子 200SMART 1200 都是有自由口编程)具体编程方式,下回详解,


下表是ASCII协议和RTU协议进行的比较(台达变频器VFD系列)里面包括了ASCII协议和RTU协议,下面我来简单的给大家介绍一下,对于Modbus的ASCII、RTU和TCP协议来说,其中TCP和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去.


以台达变频器MODBUS协议为例:


  1、MODBUS-ASII 字符结构:

 ASCII模式使用的字符虽是RTU模式的两倍,但ASCII数据的译玛和处理更为容易一些,此外,用RTU模式时报文字符必须以连续数据流的形式传送,用ASCII模式,字符之间可产生长达1s的间隔,以适应速度较快的机器.



     MODBUS -ASII  通讯数据结构:



  2、MODBUS-RTU 字符结构:

  用RTU模式传输的数据是8位二进制字符。如欲转换为ASCII模式,则每个RTU字符首先应分为高位和低位两部分,这两部分各含4位,然后转换成十六进制等量值。用以构成报文的ASCII字符都是十六进制字符




MODBUS -RTU  通讯数据结构:




   通过比较可以看到,ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验也比较容易。但是因为它传输的都是可见的ASCII字符

    RTU传输的数据每一个字节ASCII都要用两个字节来传输,比如RTU传输一个十六进制数0xF9,ASCII就需要传输’F’’9’的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以一般来说,如果所需要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最好能使用RTU协议。


ModBus协议的数据校验方式分为两大类:


 1、LRC(纵向冗余错误校验)

 2、CRC-16(循环冗余错误校验)


 1、LRC(纵向冗余错误校验)

 LRC错误校验用于ASCII模式。

 这个错误校验是一个8位二进制数,可作为2个ASCII十六进制字节传送。把十六进制字符转换成二进制,加上无循环进位的二进制字符和二进制补码结果生成LRC错误校验(参见图)。这个LRC在接收设备进行核验,并与被传送的LRC进行比较,冒号(:)、回车符号(CR)、换行字符(LF)和置入的其他任何非ASCII十六进制字符在运算时忽略不计。


2、CRC-16(循环冗余错误校验)


三、MODBUS -协议的功能代码


以下就介绍01 、02、03和06的功能代码。因为这个常用的功能代码,尤其是03和06,一个是读保持寄存器,另一个是写保持寄存器


1、01H-读线圈状态

1)描述:读从机线圈寄存器,位操作,可读单个或者多个; 
2)发送指令: 
假设从机地址位0x01,寄存器开始地址0x0023,寄存器结束抵制0x0038,总共读取21个线圈。协议图如下:

3)响应: 
返回数据的每一位对应线圈状态,1-ON,0-OFF,如下图


上表中data1表示0x0023-0x002a的线圈状态,data1的最低位代表最低地址的线圈状态,可以理解为小端模式;

data2表示地址0x002b-0x0033的线圈状态,如下表:


data3表示地址0x0034-0x0038的线圈状态,不够8位,字节高位填充为0,如下表


2、02H-读离散输入状态

1):读离散输入寄存器,位操作,可读单个或多个,协议类似功能码0X01协议,此处省略


3、03H-读保持寄存器

1)描述:读保持寄存器,字节指令操作,可读单个或者多个; 
2)发送指令: 

从机地址0x01,保持寄存器起始地址0x0032,读2个保持寄存器

3)响应:


数据存储顺序


4、06H-写单个保持寄存器

1)描述:写单个保持寄存器,字节指令操作,只能写一个; 
2)发送指令: 
写0x0032保持寄存器为0x1232;

3)响应:同发送指令;如果写入成功,返回发送的指令,即01、06、00、32、12、32


表1 ModBus功能码

   Modbus中常用的功能码有8个,可以分为位操作和字操作两类

   




以上就是我整理的MODBUS 协议的通讯。如有错误,请指正。一起共同谈谈工控。,接下来准备对台达变频器的 MODBUS ASI 的学习。深入了解MODBUS

阅读 81


1分不嫌少!


楼主最近还看过



郭远林

  • [版主]
  • 精华:3帖
  • 求助:8帖
  • 帖子:106帖 | 2106回
  • 年度积分:294
  • 历史总积分:43018
  • 注册:2011年10月21日
发表于:2018-07-13 15:34:58
1楼

03 06都是字寄存器操作!不是字节!

自恋洪城

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 596回
  • 年度积分:0
  • 历史总积分:538
  • 注册:2016年11月05日
发表于:2018-08-23 20:12:58
2楼

太好了,谢谢楼主分享


热门招聘
相关主题

官方公众号

智造工程师