1、当信息帧到达终端设备时,它通过一个简单的“口”进入寻址到的设备,该设备去掉数据帧的“信封”(数据头),读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据加入到取得的“信封”中,把数据帧返回给发送者。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和一个校验码(Check)。发生任何错误都不会有成功的响应。121 信息帧AddressFunctionDataCheck8-BitsN x 8-Bits16-Bits图 1 1 . 信息帧格式特注:Modbus信息帧所允许的最大长度为256个
2、字节,即N的范围是大于等于零且小于等于252(N0,252)。即,所有的数据一共256个,数据剩下253个。122 地址(Address)域信息帧地址域(信息地址)在帧的开始部分,由8位组成,有效的从机设备地址范围0-247(十进制),各从机设备的寻址范围为1-247。主机把从机地址放入信息帧的地址区,并向从机寻址。从机响应时,把自己的地址放入响应信息的地址区,让主机识别已作出响应的从机地址。地址0为广播地址,所有从机均能识别。当Modbus协议用于高级网络时,则不允许广播或其它方式替代。123 功能(Function)域 信息帧功能域代码告诉了被寻址到的终端执行何种功能。有效码范围1-225
3、(十进制) ,有些代码是适用于所有控制器,有些适应于某种控制器,还有些保留以备后用。有关功能代替码的全部内容见附录A。当主机向从句发送信息时,功能代码向从机说明应执行的动作。如读一组离散式线圈或输入信号的ON/OFF状态,读一组寄存器的数据,读从机的诊断状态,写线圈(或寄存器),允许下截、记录、确认从机内的程序等。当从机响应主机时,功能代码可说明从机正常响应或出现错误(即不正常响应),正常响应时,从句简单返回原始功能代码;不正常响应时,从机返回与原始代码相等效的一个码,并把最高有效位设定为“1”。如,主机要求从机读一组保持寄存器时,则发送信息的功能码为:0000 0011 (十六进制03)若从
4、机正确接收请求的动作信息后,则返回相同的代码值作为正常响应。发现错时,则返回一个不正常响信息:1000 0011(十六进制83)从机对功能代码作为了修改,此外,还把一个特殊码放入响应信息的数据区中,告诉主机出现的错误类型和不正常响应的原因,不正常响应见附录B。主机设备的应用程序负责处理不正常响应,典型处理过程是主机把对信息的测试和诊断送给从机,并通知操作者。表 1 1列出了所有设备常用的功能码、它们的意义及它们的初始功能。表 1 1 常用功能码代码名称作用01读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)02读取输入状态取得一组开关输入的当前状态(ON/OFF)03读取保持寄存器在一个
5、或多个保持寄存器中取得当前的二进制值04读取输入寄存器在一个或多个输入寄存器中取得当前的二进制值05强置单线圈强置一个逻辑线圈的通断状态06预置单寄存器放置一个特定的二进制值到一个单寄存器中07读取异常状态取得8个内部线圈的通断状态15强置多线圈强置一串连续逻辑线圈的通断16预置多寄存器放置一系列特定的二进制值到一系列多寄存器中17报告从机标识可使主机判断编址从机的类型及该从机运行指示灯的状态124 数据域数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者极限值。他由数据区有2个16进制的数据位(2的8次方256),数据范围为00-F
6、F(16进制)。例如:功能域码告诉终端读取一个寄存器,数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同能力而有所不同。若无错误出现,从机向主机的响应信息中包含了请求数据,若有错误出现,则数据中有一个不正常代码,使主机能判断并作出下一步的动作。数据区的长度可为“零”以表示某类信息。125 错误校验域该域允许主机和终端检查传输过程中的错误。有时,由于电噪声和其它干扰,一组数据在从一个设备传输到另一个设备时在线路上可能会发生一些改变,出错校验能够保证主机或者终端不去响应那些传输过程中发生了改变的数据,这就提高了系统的安全性和效率,出错校验使用了16位循环冗余
7、的方法,即CRC校验。错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。126 字符的连续传输当消息在标准的Modbus系列网络传输时,每个字符或字节按由左到右的次序方式发送: 最低有效位(LSB).最高有效位(MSB)。位的序列是:有奇偶校验 启始位12345678奇偶位停止位无奇偶校验 图 1 2 . 位顺序(RTU) 13 错误检测1、奇偶校验 用户可以配置控制器是奇或偶校验,或无校验。这将决定了每个字符中的奇偶校验位是如
8、何设置的。如果指定了奇或偶校验,“1”的位数将算到每个字符的位数中(ASCII模式7个数据位,RTU中8个数据位)。例如RTU字符帧中包含以下8个数据位:1 1 0 0 0 1 0 1 整个“1”的数目是4个。如果便用了偶校验,帧的奇偶校验位将是0,便得整个“1”的个数仍是4个。如果便用了奇校验,帧的奇偶校验位将是1,便得整个“1”的个数是5个。如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加的停止位填充至要传输的字符帧中。2、CRC检测RTU方式时,采用CRC方法计算错误校验码,CRC校验传送的全部数据。它忽略信息中单个字符数据的奇偶校验方法。循环冗余校验(CRC)域
9、占用两个字节,包含了一个16位的二进制值。CRC值由传送设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。CRC开始时先把寄存器的16位全部置成“1”,然后把相邻2个8位字节的数据放入当前寄存器中,只有每个字符的8位数据用作产生CRC,起始位,停止位和奇偶校验位不加到CRC中。 在生成CRC时,每个8位字节与寄存器中的内容进行异或,然后将结果向低位移位,高位则用“0”补充,最低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值进行一次异或运算,如果最低位为0,不作任何处理。 上述处理重复进
10、行,知道执行完了8次移位操作,当最后一位(第8位)移完以后,下一个8位字节与寄存器材的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的最终值就是CRC值。生成一个CRC的流程为:1、 预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。2、 把数据帧中的第一个8位字节与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。3、 将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。4、 如果最低位为0:重复第3步(下一次移位)。 如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。5、 重复第3步和第
11、4步直到8次移位。这样处理完了一个完整的八位。6、 重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。7、 最终CRC寄存器得值就是CRC的值。CRC值附加到信息时,低位在先,高位在后。查阅附录C中的一个实例,它详细说明了CRC的校验。第二章 Modbus数据和控制功能详解 Modbus 信息中的所有数据地址以零作为基准,各项数据的第一个数据地址的编号为0。若无特殊说明在此节文中用进制值表示,图中的数据区则用十六进制表示。图2-1为一个例子,说明了Modbus的查询信息,图2-2为正常响应的例子,这两例子中的数据均是16进制的,也表示了以RTU方式构成数据帧的方法。主机查询是读保持寄
12、存器,被请求的从机地址是06,读取的数据来自地址40108保持寄有器。注意,该信息规定了寄存器的起始地址为0107 (006BH)。从机响应返回该功能代码,说明是正常响应,字节数“Byle count”中说明有多少个8位字节被返回。它表明了附在数据区中8位字节的数量,当在缓冲区组织响应信息时,“字节数”区域中的值应与该信息中数据区的字节数相等。如RTU方式时,63H 用一个字节(01100011)发送。8个位为一个单位计算“字节数”,它忽略了信息帧用组成的方法。AddrFunData start reg hiData start reg loData #of regs hiData #of r
13、egs loCRC16hilo06H03H00H6BH01HXXH图 2 1 Modbus的查询信息BytecountData1LoData 2Data2Data302H2BH63H图 2 2 Modbus的响应信息21 读取线圈状态(功能码01)读取从机离散量输出口(DO,0X类型)的 ON/OFF 状态,不支持广播。查询 查询信息规定了要读的起始线圈和线圈量,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H 0015H(DO1=0000H,DO2=0001H,依此类推)。 图 2 3 的例子是从地址为17的从机读取DO1至DO6的状态。DO start reg hiDO
14、start reg loDO #of regs hiDO #of regs lo11H图 2 3 读取线圈状态-查询 响应 响应信息中的各线圈的状态与数据区的每一位的值相对应,即每个DO占用一位(1 = ON, 0 = OFF),第一个数据字节的LSB为查询中的寻址地址,其他的线圈按顺序在该字节中由低位向高位排列,直至8个为止,下一个字节也是从低位向高位排例。若返回的线圈数不是8的倍数,则在最后的数据字节中的剩余位至字节的最高位全部填0,字节数区说明全部数据的字节数。图2 4所示为线圈的输出状态响应的实例。Byte countCRC16 hiCRC16 lo2AH 数据DO2DO1MSBLSB
15、图 2 4读取线圈状态-响应22 读取输入状态(功能码02)读取从机离散量输入信号(DI,0X类型)的ON/OFF状态,不支持广播。查询查询信息规定了要读的输入起始地址,以及输入信号的数量。输入的起始地址为0000H,1-16个输入口的地址分别为0-15(DO1=0000H,DO2=0001H,依此类推)。图 2 5 的例子是从地址为17的从机读取DI1到DI16的状态。DI startaddr hiaddr loDI num10H图 2 5读取输入状态-查询响应 响应信息中的各输入口的状态,分别对应于数据区中的每一位值,1 = ON; 0 = OFF,第一个数据字节的LSB为查询中的寻址地址
16、,其他输入口按顺序在该字节中由低位向高位排列,直至8个位为止。下一个字节中的8个输入位也是从低位到高位排列。若返回的输入位数不是8的倍数,则在最后的数据字节中的剩余位直至字节的最高位全部填零。字节数区说明了全部数据的字节数。图2 6 所示为读数字输出状态响应的实例。33HCCH数据 1 DI8 DI7 DI6 DI5 DI4 DI3 DI2 DI1 MSB LSB 数据 2 DI16 DI15 DI14 DI13 DI12 DI11 DI10 DI9图 2 6读取输入状态-响应23 读取保持寄存器(功能码03)读取从机保持寄存器(4X类型)的二进制数据,不支持广播。查询信息规定了要读的保持寄存
17、器起始地址及保持寄存器的数量,保持寄存器寻址起始地址为0000H,寄存器1-16所对应的地址分别为0000H 0015H。图2 7 的例子是从17号从机读3个采集到的基本数据U1、U2、U3,U1的地址为0000H, U2的地址为0001H,U3的地址为0002H。Data startData #ofregs hiregs lo图 2 7读取保持寄存器-查询响应信息中的寄存器数据为二进制数据,每个寄存器分别对应2个字节,第一个字节为高位值数据,第二个字节为低位数据。图 2 8的例子是读取U1,U2,U3(U1=03E8H,U2=03E7H,U3=03E9H)的响应。E8HE7HE9H图 2 8
18、读取保持寄存器-响应2.4 读取输入寄存器(功能码04)读取从机输入寄存器(3X类型)中的二进制数据,不支持广播。查询信息规定了要读的寄存器的起始地址及寄存器的数量,寻止起始地址为0,寄存器1-16所对应的地址分别为0000H 0015H。图 2 9的例子是请求17号从机的0009寄存器。DO addr04H08H图 2 9读取输入寄存器-查询响应信息中的寄存器数据为每个寄存器分别对应2个字节,第一个字节为高位数据,第二个字节为低位数据。图 2 10的例子寄存器30009中的数据用000AH 2个字节表示。0AH图 2 10读取输入寄存器-响应2.5 强置单线圈(功能码05)强制单个线圈(DO
19、,0X类型)为ON或OFF状态,广播时,该功能可强制所有从机中同一类型的线圈均为ON或OFF状态。该功能可越过控制器内存的保护状态和线圈的禁止状态。线圈强制状态一直保持有效直至下一个控制逻辑作用于线圈为止。控制逻辑中无线圈程序时,则线圈处于强制状态。查询信息规定了需要强制一个单独线圈的类型,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H 0015H(DO1=0000H,DO2=0001H,依此类推)。由查询数据区中的一个常量,规定被请求线圈的ON/OFF状态, FF00H值请求线圈处于ON状态,0000H值请求线圈处于OFF状态,其它值对线圈无效,不起作用。图示 2-11的
20、例子是请求17号从机开DO1的On状态。Value Value05HFFH00H 图示 2-11强制单线圈-查询图2 12所示为对这个命令请求的正常响应是在DO状态改变以后传送接收到的数据。图示 2-12强制单线圈-响应26 预置单寄存器(功能码06) 把一个值预置到一个保持寄存器(4X类型)中,广播时,该功能把值预置到所有从机的相同类型的寄存器中。该功能可越过控制器的内存保护。使寄存器中的预置值保持有效。只能由控制器的下一个逻辑信号来处理该预置值。若控制逻辑中无寄存器程序时,则寄存器中的值保持不变。 查询信息规定了要预置寄存器的类型,寄存器寻址起始地址为0000H,寄存器1所对应的地址为00
21、00H。 图示 2-13的例子是请求17号从机0040H.的值为2717。Data start reg hi reg lo hi loCRC 11H 00H 40H 0AH 9DH XXH 图示 2-13预设单寄存器-查询图2 14所示对于预置单寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。图示 2-14预设单寄存器-响应27读取异常状态(功能码7) 读从中机中8个不正常状态线圈的数据,某些线圈号已在不同型号的控制器中预定义,而其它的线圈由用户编程,作为有关控制器的状态信息,如“machine ON/OFF”,“heads retraced”,(缩回标题),“safeties satisfied”(安全性满意),“error conditions”(存在错误条件)或其它用户定义的标志等。该功能码不支持广播。该功能代码为存取该类信息提供了一种简单的方法,不正常线圈的类型是已知的(在功能代码中不需要线圈类型) 预定义的不正常线圈号如下:控制器型号 线圈 设定M84,184/384,584,984 1-8 用户定义484 257 电池状态 258-264 用户定义 884 761 电池状态 762 内存保护状态 763 R10工况状态 764-768 用户预定义 图示 2-15的例子是请求读从机设备17中的不正常状态。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1