modbus通讯协议详解
1、Modbus 协议简介 (转  )
  Modbus协议是⼀种已⼴泛应⽤于当今⼯业控制领域的通⽤通讯协议。通过此协议,控制器相互之间、或控制器经由⽹络(如以太⽹)可以和其它设备之间进⾏通信。Modbus协议使⽤的是主从通讯技术,即由主设备主动查询和操作从设备。⼀般将主控设备⽅所使⽤的协议称为Modbus Master,从设备⽅使⽤的协议称为Modbus Slave。典型的主设备包括⼯控机和⼯业控制器等;典型的从设备如PLC可编程控制器等。
  Modbus通讯物理接⼝可以选⽤串⼝(包括RS232、RS485和RS422),也可以选择以太⽹⼝。其通信遵循以下的过程:
主设备向从设备发送请求
从设备分析并处理主设备的请求,然后向主设备发送结果
如果出现任何差错,从设备将返回⼀个异常功能码
  此协议定义了⼀个控制器能认识使⽤的消息结构,⽽不管它们是经过何种⽹络进⾏通信的。它描述了
⼀控制器请求访问其它设备的过程,如何回应来⾃其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。
 当在Modbus⽹络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产⽣何种⾏动。如果需要回应,控制器将⽣成反馈信息并⽤Modbus协议发出。在其它⽹络上,包含了Modbus协议的消息转换为在此⽹络上使⽤的帧或包结构。这种转换也扩展了根据具体的⽹络解决节地址、路由路径及错误检测的⽅法。
  Modbus的⼯作⽅式是请求/应答,每次通讯都是主站先发送指令,可以是⼴播,或是向特定从站的单播;从站响应指令,并按要求应答,或者报告异常。当主站不发送请求时,从站不会⾃⼰发出数据,从站和从站之间不能直接通讯。
  Modbus协议是应⽤层(协议层)报⽂传输协议,它定义了⼀个与物理层⽆关的协议数据单元(PDU),即PDU=功能码+数据域,功能码1byte,数据域不确定。
  Modbus协议能够应⽤在不同类型的总线或⽹络。对应不同的总线或⽹络,Modbus协议引⼊⼀些附加域映射成应⽤数据单元(ADU),即ADU=附加域+PDU,例如modbus tcp/ip------ ADU=MBAP+ADU。
2、Modbus 通讯⽅式
  2.1、Modbus三种通讯⽅式
    Modbus有下列三种通信⽅式:
    (1)、以太⽹:对应的通信模式是Modbus TCP/IP
    (2)、异步串⾏传输(各种介质如有线RS-232-/422/485/;光纤、⽆线等):对应的通信模式是Modbus RTU或Modbus  ASCII
    (3)、⾼速令牌传递⽹络:对应的通信模式是Modbus PLUS
    Modbus RTU和Modbus ASCII协议应⽤于串⼝链接(RS232、RS485、RS422),Modbus tcp/ip协议应⽤于以太⽹链接。
  2.2、在Modbus⽹络上传输
   标准的Modbus⼝是使⽤RS-232C兼容串⾏接⼝,它定义了连接⼝的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组⽹。
   控制器通信使⽤主/从技术,即仅⼀设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。
  典型的主设备:主机和可编程仪表。
  典型的从设备:可编程控制器。
通信协议   主设备可单独和从设备通信,也能以⼴播⽅式和所有从设备通信。如果单独通信,从设备返回⼀消息作为回应,如果是以⼴播⽅式查询的,则不作任何回应。
    Modbus协议建⽴了主设备查询的格式:设备(或⼴播)地址、功能代码、所有要发送的数据、⼀错误检测域。
   从设备回应消息也由Modbus协议构成,包括确认要⾏动的域、任何要返回的数据、和⼀错误检测域。如果在消息接收过程中发⽣⼀错误,或从设备不能执⾏其命令,从设备将建⽴⼀错误消息并把它作为回应发送出去。
  2.3、在其它类型⽹络上转输
   在其它⽹络上,控制器使⽤对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发⽣的传输进程。
   在消息位,Modbus协议仍提供了主/从原则,尽管⽹络通信⽅法是“对等”。如果⼀控制器发送⼀消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到⼀消息,它将建⽴⼀从设备回应格式并返回给发送的控制器。
  2.4、查询---回应
 (1)、查询
 查询消息中的功能代码告之被选中的从设备要执⾏何种功能。数据段包含了从设备要执⾏功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了⼀种验证消息内
容是否正确的⽅法。
  (2)、回应
 如果从设备产⽣正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发⽣,功能代码将被修改以⽤于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可⽤。
3、三种通讯⽅式的报⽂格式
  Modbus协议的报⽂(或帧)的基本格式是:表头 + 功能码 + 数据区 + 校验码
  功能码和数据区在不同类型的⽹络都是固定不变的,表头和校验码则因⽹络底层的实现⽅式不同⽽有所区别。表头包含了从站的地址,功能码告诉从站要执⾏何种功能,数据区是具体的信息。
  对于不同类型的⽹络,Modbus的协议层实现是⼀样的,区别在于下层的实现⽅式,常见的有TCP/IP和串⾏通讯两种。
  Modbus TCP基于以太⽹和TCP/IP协议,Modbus RTU和Modbus ASCII则是使⽤异步串⾏传输(通常是RS-232/422/485)。
如图所⽰,串⾏传输的物理层是RS-485或RS-232,数据链路层是Modbus的串⾏传输协议;Modbus TCP传输的1、2、3、4层实现和⽇常所见的以太⽹、因特⽹⼀样,Modbus默认采⽤的TCP端⼝号是502。
  3.1、以太⽹(modbus  tcp/ip)
  对于Modbus TCP⽽⾔,主站通常称为Client,从站称为Server;⽽对于Modbus RTU和Modbus ASCII来说,主站是Master,从站是Slave。
  ModbusTCP的数据帧可分为两部分:ADU=MBAP+PDU = MBAP + 功能码 + 数据域,MBAP  7byte,功能码1byte,数据域不确定,由具体功能决定。
事务处理标识
协议标识长度单元标识符2byte
2byte 2byte 1byte 内容
解释事务处理标识可以理解为报⽂的序列号,⼀般每次通信之后就要加1以区别不同的通信数据报⽂协议标识符
00 00表⽰ModbusTCP 协议长度
表⽰接下来的数据长度,单位为字节单元标识符
可以理解为设备地址
  MBAP 为报⽂头,长度为7字节,组成如下:
下图说明了Modbus TCP
的改动:
(1)、取消了校验位。数据链路层上就进⾏了CRC-32的校验,TCP/IP 是⾯向连接的可靠性的协议,因此没必要再加上校验位。
  (2)、Slave 地址换成了Unit Identifier 。当⽹络⾥的设备全是使⽤TCP/IP ,这个地址是没有意义的,因为IP 就能进⾏路由寻址。如果⽹络⾥还有串⾏通讯的设备,则需要⽹关来实现Modbus TCP 到Modbus RTU 或ASCII 之间的协议转换,这时⽤Unit Identifier 来标识⽹关后⾯的每个串⾏通讯设备。
  (3)、Length 是指后⾯的字节总数。实际上数据区的长度是能确定的,有的功能码就可以确定数据区的长度,有的功能码虽不能确定数据区长度,但是数据区有字节计数,参见上⽂举的从站应答的例⼦。表头增加的Length 是为了应对有些情况下TCP/IP 协议会将应⽤层的数据拆包传输。
  (4)、Transaction Identifier 和Protocol Identifier 由Client ⽣成,Server 的响应将复制这些参数。
    3.1.1、modbus tcp/ip 通信⽅式
    Modbus 设备可分为主站(poll)和从站(slave)。主站只有⼀个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使⽤TCP 通信时,主站为client 端,主动建⽴连接;从站为server 端,等待连接。
主站请求:功能码+数据
从站正常响应:请求功能码+响应数据
从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最⾼有效位置1,异常码指⽰差错类型
注意:需要超时管理机制,避免⽆期限的等待可能不出现的应答
    IANA(Internet Assigned Numbers Authority,互联⽹编号分配管理机构)给Modbus协议赋予TCP端⼝号为502,这是⽬前在仪表与⾃动化⾏业中唯⼀分配到的端⼝号。
    3.1.2、通信过程
      A、connect 建⽴TCP连接
      B、准备Modbus报⽂
      C、使⽤send命令发送报⽂
      D、在同⼀连接下等待应答
      E、使⽤recv命令读取报⽂,完成⼀次数据交换
      F、通信任务结束时,关闭TCP连接
  3.2、异步串⾏传输的两种传输⽅式(modbus RTU和modbus ASCII)
   异步串⾏传输时,控制器可以设置为两种传输模式(ASCII或RTU)中的任何⼀种在标准的Modbus⽹络通信。⽤户选择想要的模式,包括串⼝通信参数(波特率、校验⽅式等),在配置每个控制器的时候,在⼀个Modbus⽹络上的所有设备都必须选择相同的传输模式和串⼝参数。
    ASCII模式:
起始位设备地址功能代码数据数量数据LRC⾼字节LRC低字节结束符
:2*8bit2*8bit n n*8bit8bit8bit CR、LF(回车、换⾏)
RTU模式:
起始位设备地址功能代码数据数量数据CRC低字节CRC⾼字节结束符
⽆8bit8bit n n*8bit8bit8bit⽆
 3.2.1、ASCII模式
   当控制器设为在Modbus⽹络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种⽅式的主要优点是字符发送的时间间隔可达到1秒⽽不产⽣错误。
    代码系统:
⼗六进制,ASCII字符0...9,A...F
消息中的每个ASCII字符都是⼀个⼗六进制字符组成
每个字节的位:1个起始位、7个数据位(最⼩的有效位先发送)、1个奇偶校验位(⽆校验则⽆)、1个停⽌位(有校验
时)、2个Bit(⽆校验时)
错误检测域:LRC(纵向冗长检测)
    3.2.2、RTU模式
   当控制器设为在Modbus⽹络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含
两个4Bit的⼗六进制字符。这种⽅式的主要优点是:在同样的波特率下,可⽐ASCII⽅式传送更多的数据。
    代码系统:
8位⼆进制,⼗六进制数0...9,A...F
消息中的每个8位域都是两个⼗六进制字符组成
每个字节的位:1个起始位、8个数据位(最⼩的有效位先发送)、1个奇偶校验位(⽆校验则⽆)、1个停⽌位(有校验
时),2个Bit(⽆校验时)
错误检测域:CRC(循环冗长检测)
    3.2.3、RTU和ASCII的区别
    (1)、RTU模式下,⼀个字节的数据,传输的就是⼀个字节。ASCII模式下,同样⼀个字节数据⽤了两个字节来传输。例如,要传输数字0x5B,RTU传输的是0101 1011(⼆进制),⽽ASCII传输的是00110101和01000010。可见,ASCII传输的速率是RTU的⼀半。 
    (2)、ASCII模式采⽤LRC校验,RTU模式采⽤16位CRC校验。
    (3)、ASCII有开始标记和结束标记,RTU没有
4、Modbus RTU和Modbus ASCII消息帧
 两种传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始⼯作,读地址分配信息,判断哪⼀个设备被选中(⼴播⽅式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能设置为返回结果。
  4.1、ASCII帧
 使⽤ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换⾏符结束(ASCII码 0DH,0AH)。
 其它域可以使⽤的传输字符是⼗六进制的0...F。⽹络上的设备不断侦测“:”字符,当有⼀个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给⾃⼰的。
 消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。⼀个典型消息帧如下所⽰:
起始位设备地址功能代码数据LRC校验结束符
1个字符2个字符2个字符n个字符2个字符2个字符
  4.2、RTU帧
 使⽤RTU模式,消息发送⾄少要以3.5个字符时间的停顿间隔开始。在⽹络波特率下多样的字符时间,这是最容易实现的(如下图的T1-
T2-T3-T4所⽰)。传输的第⼀个域是设备地址。可以使⽤的传输字符是⼗六进制的0...F。⽹络设备不断侦测⽹络总线,包括停顿间隔时间内。当第⼀个域(地址域)接收到,每个设备都进⾏解码以判断是否发往⾃⼰的。在最后⼀个传输字符之后,⼀个⾄少3.5个字符时间的停顿标定了消息的结束。⼀个新的消息可在此停顿后开始。
 整个消息帧必须作为⼀连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下⼀字节是⼀个新消息的地址域。同样地,如果⼀个新消息在⼩于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前⼀消息的延续。这将导致⼀个错误,因为在最后的CRC域的值不可能是正确的。⼀典型的消息帧如下所⽰:
起始位设备地址功能代码数据CRC校验结束符
T1-T2-T3-T48Bit8Bit n个8Bit16Bit T1-T2-T3-T4
  4.3、两种帧的分析
  (1)、地址域
 消息帧的地址域包含两个字节(ASCII)或⼀个字节(RTU)。可能的从设备地址是0...247 (⼗进制)。单个设备的地址范围是1...247。主设备通过将要联络的从设备的地址放⼊消息中的地址域来选通从设备。当从设备发送回应消息时,它把⾃⼰的地址放⼊回应的地址域中,以便主设备知道是哪⼀个设备作出回应。
 地址0是⽤作⼴播地址,以使所有的从设备都能认识。当Modbus协议⽤于更⾼⽔准的⽹络,⼴播可能不允许或以其它⽅式代替。
  (2)、如何处理功能域
 消息帧中的功能代码域包含了两个字节(ASCII)或⼀个字节(RTU)。可能的代码范围是⼗进制的1...255。当然,有些代码是适⽤于所有控制器,有此是应⽤于某种控制器,还有些保留以备后⽤。
 当消息从主设备发往从设备时,功能代码域将告之从设备需要执⾏哪些⾏为。例如去读取输⼊的开
关状态,读⼀组寄存器的数据内容,读从设备的诊断状态,允许调⼊、记录、校验在从设备中的程序等。
 当从设备回应时,它使⽤功能代码域来指⽰是正常回应(⽆误)还是有某种错误发⽣(称作异议回应)。对正常回应,从设备仅回应相应的功能代码。对异议回应,从设备返回⼀等同于正常代码的代码,但最重要的位置为逻辑1。
 例如:⼀从主设备发往从设备的消息要求读⼀组保持寄存器,将产⽣如下功能代码:0 0 0 0 0 0 1 1 (⼗六进制03H)
 对正常回应,从设备仅回应同样的功能代码。对异议回应,它返回:1 0 0 0 0 0 1 1 (⼗六进制83H)
 除功能代码因异议错误作了修改外,从设备将⼀独特的代码放到回应消息的数据域中,这能告诉主设备发⽣了什么错误。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。