Modbus通讯协议详解

 

工业控制已从单机控制走向集中监控、集散控制,如今已进入网络时代,工业控制器连网也为网络管理提供了方便。Modbus就是工业控制器的网络协议中的一种。

1.1          Modbus 协议简介

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

1.1.1          Modbus网络上转输

标准的Modbus口是使用一RS -232C 兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。

控制器通信使用主从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。

主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。

从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

1.1.2          在其它类型网络上转输

在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。

在消息位,Modbus协议仍提供了主从原则,尽管网络通信方法是对等。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。

1.1.3          查询回应周期

l       查询

查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。

 

l       回应

如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。

 

1.2         两种传输方式

控制器能设置为两种传输模式(ASCIIRTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。
所选的ASCIIRTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。

在其它网络上(象MAPModbus PlusModbus消息被转成与串行传输无关的帧。

1.2.1          ASCII模式

 当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。
  代码系统
·  
十六进制,ASCII字符0...9A...F
·  
消息中的每个ASCII字符都是一个十六进制字符组成

每个字节的位

·   1
个起始位
·   7
个数据位,最小的有效位先发送

·   1
个奇偶校验位,无校验则无

  CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。CRC是先调入一值是全“ 1” 16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB1,寄存器单独和预置的值或一下,如果LSB0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。CRC添加到消息中时,低字节先加入,然后高字节。

CRC简单函数如下:

unsigned short CRC16(puchMsg, usDataLen)

unsigned char *puchMsg ; /* 要进行CRC校验的消息 */

unsigned short usDataLen ; /* 消息中字节数 */

{

unsigned char uchCRCHi = 0xFF ; /* CRC字节初始化 */

unsigned char uchCRCLo = 0xFF ; /* CRC 字节初始化 */

unsigned uIndex ; /* CRC循环中的索引 */

while (usDataLen--) /* 传输消息缓冲区 */

{
uIndex = uchCRCHi ^ *puchMsgg++ ; /*
计算CRC */

uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;

uchCRCLo = auchCRCLo[uIndex] ;

}

return (uchCRCHi << 8 | uchCRCLo) ;

}

/* CRC 高位字节值表 */

static unsigned char auchCRCHi[] = {

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40

} ;

/* CRC低位字节值表*/

static char auchCRCLo[] = {

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,

0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x 0C , 0x0D, 0xCD,

0x 0F , 0xCF, 0xCE, 0x0E, 0x 0A , 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x 1A ,

0x1E, 0xDE, 0xDF, 0x 1F , 0xDD, 0x1D, 0x 1C , 0xDC, 0x14, 0xD4,

0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,

0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,

0x 3C , 0xFC, 0xFD, 0x3D, 0xFF, 0x 3F , 0x3E, 0xFE, 0xFA, 0x 3A ,

0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,

0xEB, 0x2B, 0x 2A , 0xEA, 0xEE, 0x2E, 0x 2F , 0xEF, 0x2D, 0xED,

0xEC, 0x 2C , 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,

0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,

0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,

0xA5, 0x65, 0x64, 0xA4, 0x 6C , 0xAC, 0xAD, 0x6D, 0xAF, 0x 6F ,

0x6E, 0xAE, 0xAA, 0x 6A , 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,

0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x 7A , 0xBA, 0xBE, 0x7E,

0x 7F , 0xBF, 0x7D, 0xBD, 0xBC, 0x 7C , 0xB4, 0x74, 0x75, 0xB5,

0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,

0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,

0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x 9C , 0x 5C ,

0x5D, 0x9D, 0x 5F , 0x 9F , 0x9E, 0x5E, 0x 5A , 0x 9A , 0x9B, 0x5B,

0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,

0x 8A , 0x 4A , 0x4E, 0x8E, 0x 8F , 0x 4F , 0x8D, 0x4D, 0x 4C , 0x 8C ,

0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,

0x43, 0x83, 0x41, 0x81, 0x80, 0x40

} ; 

 

ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。下表1ModBus的功能码定义。

1 ModBus功能码

01 READ COIL STATUS

02 READ INPUT STATUS

03 READ HOLDING REGISTER

04 READ INPUT REGISTER

05 WRITE SINGLE COIL

06 WRITE SINGLE REGISTER

15 WRITE MULTIPLE COIL

16 WRITE MULTIPLE REGISTER

ModBus网络只是一个主机,所有通信都由他发出。网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。
  (1ModBus的传输方式

ModBus系统中有2种传输模式可选择。这2种传输模式与从机PC通信的能力是同等的。选择时应视所用ModBus主机而定,每个ModBus系统只能使用一种模式,不允许2种模式混用。一种模式是ASCII(美国信息交换码),另一种模式是RTU(远程终端设备)这两种模式的定义见表3

3 ASCIIRTU传输模式的特性

 

ASCII可打印字符便于故障检测,而且对于用高级语言(如Fortan)编程的主计算机及主PC很适宜。RTU则适用于机器语言编程的计算机和PC主机。
RTU模式传输的数据是8位二进制字符。如欲转换为ASCII模式,则每个RTU字符首先应分为高位和低位两部分,这两部分各含4位,然后转换成十六进制等量值。用以构成报文的ASCII字符都是十六进制字符。ASCII模式使用的字符虽是RTU模式的两倍,但ASCII数据的译玛和处理更为容易一些,此外,用RTU模式时报文字符必须以连续数据流的形式传送,用ASCII模式,字符之间可产生长达1s的间隔,以适应速度较快的机器。


2ModBus的数据校验方式
  CRC-16(循环冗余错误校验)

  CRC-16错误校验程序如下:报文(此处只涉及数据位,不指起始位、停止位和任选的奇偶校验位)被看作是一个连续的二进制,其最高有效位(MSB)首选发送。报文先与X16相乘(左移16位),然后看X16+X15+X2+1除,X16+X15+X2+1可以表示为二进制数11000000000000101。整数商位忽略不记,16位余数加入该报文(MSB先发送),成为2CRC校验字节。余数中的1全部初始化,以免所有的零成为一条报文被接收。经上述处理而含有CRC字节的报文,若无错误,到接收设备后再被同一多项式(X16+X15+X2+1)除,会得到一个零余数(接收设备核验这个CRC字节,并将其与被传送的CRC比较)。全部运算以2为模(无进位)。

习惯于成串发送数据的设备会首选送出字符的最右位(LSB-最低有效位)。而在生成CRC情况下,发送首位应是被除数的最高有效位MSB。由于在运算中不用进位,为便于操作起见,计算CRC时设MSB在最右位。生成多项式的位序也必须反过来,以保持一致。多项式的MSB略去不记,因其只对商有影响而不影响余数。

生成CRC-16校验字节的步骤如下:

装如一个16位寄存器,所有数位均为1
16位寄存器的高位字节与开始8位字节进行异或运算。运算结果放入这个16位寄存器。
把这个16寄存器向右移一位。
若向右(标记位)移出的数位是1,则生成多项式1010000000000001和这个寄存器进行异或运算;若向右移出的数位是0,则返回
重复,直至移出8位。
另外8位与该十六位寄存器进行异或运算。
重复~,直至该报文所有字节均与16位寄存器进行异或运算,并移位8次。
这个16位寄存器的内容即2字节CRC错误校验,被加到报文的最高有效位。
另外,在某些非ModBus通信协议中也经常使用CRC16作为校验手段,而且产生了一些CRC16的变种,他们是使用CRC16多项式X16+X15+X2+1,单首次装入的16位寄存器为0000;使用CRC16的反序X16+X14+X1+1,首次装入寄存器值为0000FFFFH

LRC
(纵向冗余错误校验)

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Modbus通讯协议是一种应用层协议,被广泛应用于工业自动化领域,用于在不同设备之间进行数据通信Modbus通讯协议分为两种模式:串行模式和以太网模式。在串行模式下,Modbus使用RS-232或RS-485接口进行通信,而在以太网模式下,则使用以太网协议进行通信Modbus通讯协议主要包括以下四种常见的消息类型:读取线圈状态、读取输入状态、读取保持寄存器和读取输入寄存器。通过这些消息类型,可以实现对不同类型数据的读取和写入。 Modbus通讯协议使用简单的数据结构来表示不同类型的数据。例如,线圈状态和输入状态使用位来表示,保持寄存器和输入寄存器使用16位字来表示。这种数据结构的使用使得通讯协议更为简洁。 Modbus通讯协议使用主/从架构,其中一个设备充当主节点,负责发送请求消息和接收响应消息,而其他设备充当从节点,负责接收请求消息和发送响应消息。 在Modbus通讯协议中,主节点通过从节点的地址进行通信,并使用功能码指定要执行的操作。每个从节点都有一个唯一的地址,所以主节点可以通过地址来区分和访问不同的从节点。 Modbus通讯协议还支持数据批量传输和广播通信。数据批量传输允许一次性读取或写入多个寄存器的数据,从而提高通讯效率。广播通信允许主节点向所有从节点发送命令,从而实现一次性向多台设备发送相同的指令。这些功能使得Modbus通讯协议更加灵活和高效。 综上所述,Modbus通讯协议是一种可靠、简单和高效的工业通讯协议,适用于各种自动化设备之间的数据通信,为工业自动化系统提供了可靠的数据交换手段。 ### 回答2: Modbus通讯协议是一种用于工业领域常见的通讯协议,用于在不同设备间实现数据传输和通讯的标准。下面我将详细解释Modbus通讯协议的相关内容。 Modbus协议采用了主从结构,其中主机负责发出请求,从机负责响应请求。协议定义了一系列的功能码,用于不同的数据交换操作。常见的功能码包括读写寄存器、读写输入寄存器、读写线圈等。 在Modbus通讯中,数据的传输是基于二进制形式进行的。通讯过程包括三个步骤:建立连接、数据交互和释放连接。建立连接阶段是主机向从机发送一个请求,从机响应确认连接。确认连接后,主机可以发送请求指令给从机,从机则根据指令进行相应的操作,并返回相应结果给主机。最后,当通讯结束时,可以释放连接。 Modbus协议支持不同的物理层,包括串口、以太网等。在串口通讯中,常用的物理层为RS485,而在以太网通讯中,常用的物理层为TCP/IP协议。 Modbus协议的应用非常广泛,在工业自动化领域、能源管理系统、楼宇自控系统等各种领域都有应用。它具有简单、开放、易于实现和跨平台等特点,因而深受工程师的喜爱。 总之,Modbus通讯协议是一种常见的工业领域通讯协议,通过主从结构和功能码,实现了不同设备之间的数据传输和通讯。它的简单与开放使得它在各个领域都有广泛的应用。 ### 回答3: Modbus通信协议是一种用于实现工业控制系统中设备之间数据交换的协议。它由Modicon公司于1979年首次引入,如今已成为工业领域中最为广泛应用的通信协议之一。 Modbus采用了一种主从结构的通信模式,主节点负责发起通信请求,从节点负责响应请求并提供数据。主节点可以是监控控制系统(如PLC)或上位机,而从节点则可以是传感器、执行器或其他可编程设备。 Modbus通信协议基于传统串行通信,通过串口实现数据传输。它定义了一种简单易懂的帧格式,包括起始符、地址、功能码、数据、校验和等字段。通过这些字段的组合,主从节点能够进行数据的读取和写入操作。 Modbus协议支持不同的功能码,其中最常用的包括读取保持寄存器、读取输入寄存器、写单个寄存器、写多个寄存器等。每个寄存器可以存储16位或32位的数据,如开关状态、温度值、电压等。 Modbus通信协议具有以下特点:首先,它是一种简单轻便的通信协议,不需要复杂的硬件和软件开发。其次,它具有良好的兼容性,可以与各种设备和系统进行无缝集成。第三,它支持多种通信介质,包括串口、以太网和无线电等。最后,Modbus协议具有广泛的应用领域,包括自动化控制、楼宇管理、能源监测等。 总的来说,Modbus通信协议是一种简单易用、高效可靠的工业通信协议,能够满足各种设备之间的数据交换需求。它的广泛应用和不断改进的发展将为工业控制系统的运行提供强有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值