1、Modbus通讯协议(RTU传输模式)本说明仅做内部参考, 具体请参阅英文版本。第一章 Modbus协议介绍Modbus 协议是应用于电子控制器上一个通用语言。经过此协议, 控制器相互之间、 控制器经由网络(比如以太网)和其它设备之间能够通信。它已经成为一通用工业标准。有了它, 不一样厂商生产控制设备能够连成工业网络, 进行集中监控。此协议定义了一个控制器能认识使用消息结构,而不管它们是经过何种网络进行通信。它描述了一控制器请求访问其它设备过程, 假如回应来自其它设备请求, 以及怎样侦测错误并统计。它制订了消息域格局和内容公共格式。当在一Modbus网络上通信时, 此协议决定了每个控制器须要知
2、道它们设备地址, 识别按地址发来消息, 决定要产生何种行动。假如需要回应, 控制器将生成反馈信息并用Modbus协议发出。在其它网络上, 包含了Modbus协议消息转换为在此网络上使用帧或包结构。这种转换也扩展了依据具体网络处理节地址、 路由路径及错误检测方法。协议在一根通讯线上使用应答式连接(半双工), 这意味着在一根单独通讯线上信号沿着相反两个方向传输。首先, 主计算机信号寻址到一台唯一终端设备(从机), 然后, 在相反方向上终端设备发出应答信号传输给主机。协议只许可在主计算机和终端设备之间, 而不许可独立设备之间数据交换, 这就不会在使它们初始化时占据通讯线路, 而仅限于响应抵达本机查询
3、信号。1 1 传输方法传输方法是一个信息帧内一系列独立数据结构以及用于传输数据有限规则, 以RTU模式在Modbus总线上进行通讯时, 信息中每8位字节分成2个4位16进制字符, 每个信息必需连续传输下面定义了与Modebus 协议 RTU方法相兼容传输方法。代码系统 8位二进制, 十六进制数0.9, A.F 消息中每个8位域都是一个两个十六进制字符组成 每个字节位 1个起始位 8个数据位, 最小有效位先发送 1个奇偶校验位, 无校验则无 1个停止位(有校验时), 2个Bit(无校验时) 错误检测域 CRC(循环冗长检测) 12 协议当信息帧抵达终端设备时, 它经过一个简单“口”进入寻址到设备
4、 该设备去掉数据帧“信封”(数据头), 读取数据, 假如没有错误, 就实施数据所请求任务, 然后, 它将自己生成数据加入到取得“信封”中, 把数据帧返回给发送者。返回响应数据中包含了以下内容: 终端从机地址(Address)、 被实施了命令(Function)、 实施命令生成被请求数据(Data)和一个校验码(Check)。发生任何错误都不会有成功响应。121 信息帧AddressFunctionDataCheck8-Bits8-BitsN x 8-Bits16-Bits图 1 1 . 信息帧格式特注: Modbus信息帧所许可最大长度为256个字节, 即N范围是大于等于零且小于等于252(
5、N0, 252)。即, 全部数据一共256个, 数据剩下253个。122 地址(Address)域信息帧地址域(信息地址)在帧开始部分, 由8位组成, 有效从机设备地址范围0-247(十进制), 各从机设备寻址范围为1-247。主机把从机地址放入信息帧地址区, 并向从机寻址。从机响应时, 把自己地址放入响应信息地址区, 让主机识别已作出响应从机地址。地址0为广播地址, 全部从机均能识别。当Modbus协议用于高级网络时, 则不许可广播或其它方法替换。123 功效(Function)域 信息帧功效域代码告诉了被寻址到终端实施何种功效。有效码范围1-225(十进制) , 有些代码是适适用于全部控制
6、器, 有些适应于某种控制器, 还有些保留以备后用。相关功效替换码全部内容见附录A。当主机向从句发送信息时, 功效代码向从机说明应实施动作。如读一组离散式线圈或输入信号ON/OFF状态, 读一组寄存器数据, 读从机诊疗状态, 写线圈(或寄存器), 许可下截、 统计、 确定从机内程序等。当从机响应主机时, 功效代码可说明从机正常响应或出现错误(即不正常响应), 正常响应时, 从句简单返回原始功效代码; 不正常响应时, 从机返回与原始代码相等效一个码, 并把最高有效位设定为“1”。如, 主机要求从机读一组保持寄存器时, 则发送信息功效码为: 0000 0011 (十六进制03)若从机正确接收请求动作
7、信息后, 则返回相同代码值作为正常响应。发觉错时, 则返回一个不正常响信息: 1000 0011(十六进制83)从机对功效代码作为了修改, 另外, 还把一个特殊码放入响应信息数据区中, 告诉主机出现错误类型和不正常响应原因, 不正常响应见附录B。主机设备应用程序负责处理不正常响应, 经典处理过程是主机把对信息测试和诊疗送给从机, 并通知操作者。表 1 1列出了全部设备常见功效码、 它们意义及它们初始功效。表 1 1 常见功效码代码名称作用01读取线圈状态取得一组逻辑线圈目前状态(ON/OFF)02读取输入状态取得一组开关输入目前状态(ON/OFF)03读取保持寄存器在一个或多个保持寄存器中取得
8、目前二进制值04读取输入寄存器在一个或多个输入寄存器中取得目前二进制值05强置单线圈强置一个逻辑线圈通断状态06预置单寄存器放置一个特定二进制值到一个单寄存器中07读取异常状态取得8个内部线圈通断状态15强置多线圈强置一串连续逻辑线圈通断16预置多寄存器放置一系列特定二进制值到一系列多寄存器中17汇报从机标识可使主机判定编址从机类型及该从机运行指示灯状态124 数据域数据域包含了终端实施特定功效所需要数据或者终端响应查询时采集到数据。这些数据内容可能是数值、 参考地址或者极限值。她由数据区有2个16进制数据位(28次方256), 数据范围为00-FF(16进制)。比如: 功效域码告诉终端读取一
9、个寄存器, 数据域则需要指明从哪个寄存器开始及读取多少个数据, 内嵌地址和数据依据类型和从机之间不一样能力而有所不一样。若无错误出现, 从机向主机响应信息中包含了请求数据, 若有错误出现, 则数据中有一个不正常代码, 使主机能判定并作出下一步动作。数据区长度可为“零”以表示某类信息。125 错误校验域该域许可主机和终端检验传输过程中错误。有时, 因为电噪声和其它干扰, 一组数据在从一个设备传输到另一个设备时在线路上可能会发生部分改变, 犯错校验能够确保主机或者终端不去响应那些传输过程中发生了改变数据, 这就提升了系统安全性和效率, 犯错校验使用了16位循环冗余方法, 即CRC校验。错误检测域包
10、含一16Bits值(用两个8位字符来实现)。错误检测域内容是经过对消息内容进行循环冗长检测方法得出。CRC域附加在消息最终, 添加时先是低字节然后是高字节。故CRC高位字节是发送消息最终一个字节。126 字符连续传输当消息在标准Modbus系列网络传输时, 每个字符或字节按由左到右次序方法发送: 最低有效位(LSB).最高有效位(MSB)。位序列是: 有奇偶校验 启始位12345678奇偶位停止位无奇偶校验 启始位12345678停止位停止位图 1 2 . 位次序(RTU) 13 错误检测1、 奇偶校验 用户能够配置控制器是奇或偶校验, 或无校验。这将决定了每个字符中奇偶校验位是怎样设置。 假
11、如指定了奇或偶校验, “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)域占用两个
12、字节, 包含了一个16位二进制值。CRC值由传送设备计算出来, 然后附加到数据帧上, 接收设备在接收数据时重新计算CRC值, 然后与接收到CRC域中值进行比较, 假如这两个值不相等, 就发生了错误。CRC开始时先把寄存器16位全部置成“1”,然后把相邻2个8位字节数据放入目前寄存器中, 只有每个字符8位数据用作产生CRC, 起始位, 停止位和奇偶校验位不加到CRC中。在生成CRC时, 每个8位字节与寄存器中内容进行异或, 然后将结果向低位移位, 高位则用“0”补充, 最低位(LSB)移出并检测, 假如是1, 该寄存器就与一个预设固定值进行一次异或运算, 假如最低位为0, 不作任何处理。上述处理
13、反复进行, 知道实施完了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、
14、 反复第3步和第4步直到8次移位。这么处理完了一个完整八位。6、 反复第2步到第5步来处理下一个八位, 直到全部字节处理结束。7、 最终CRC寄存器得值就是CRC值。CRC值附加到信息时, 低位在先, 高位在后。查阅附录C中一个实例, 它具体说明了CRC校验。第二章 Modbus数据和控制功效详解Modbus 信息中全部数据地址以零作为基准, 各项数据第一个数据地址编号为0。若无特殊说明在此节文中用进制值表示, 图中数据区则用十六进制表示。图2-1为一个例子, 说明了Modbus查询信息, 图2-2为正常响应例子, 这两例子中数据均是16进制, 也表示了以RTU方法组成数据帧方法。主机查询是读
15、保持寄存器, 被请求从机地址是06, 读取数据来自地址40108保持寄有器。注意, 该信息要求了寄存器起始地址为0107 (006BH)。从机响应返回该功效代码, 说明是正常响应, 字节数“Byle count”中说明有多少个8位字节被返回。它表明了附在数据区中8位字节数量,当在缓冲区组织响应信息时, “字节数”区域中值应与该信息中数据区字节数相等。如RTU方法时, 63H 用一个字节(01100011)发送。8个位为一个单位计算“字节数”, 它忽略了信息帧用组成方法。 AddrFunData start reg hiData start reg loData #of regs hiData
16、of regs loCRC16hiCRC16lo06H03H00H6BH00H01HXXHXXH图 2 1 Modbus查询信息AddrFunBytecountData1hiData1LoData 2hiData2loData3hiData3loCRC16hiCRC16lo06H03H06H02H2BH00H00H00H63HXXHXXH图 2 2 Modbus响应信息21 读取线圈状态(功效码01)读取从机离散量输出口(DO,0X类型) ON/OFF 状态, 不支持广播。查询查询信息要求了要读起始线圈和线圈量, 线圈起始地址为0000H, 1-16个线圈寻址地址分为0000H 0015H(
17、DO1=0000H, DO2=0001H, 依这类推)。图 2 3 例子是从地址为17从机读取DO1至DO6状态。AddrFunDO start reg hiDO start reg loDO #of regs hiDO #of regs loCRC16hiCRC16lo11H01H00H00H00H06HXXHXXH图 2 3 读取线圈状态-查询 响应响应信息中各线圈状态与数据区每一位值相对应, 即每个DO占用一位(1 = ON, 0 = OFF), 第一个数据字节LSB为查询中寻址地址, 其她线圈按次序在该字节中由低位向高位排列, 直至8个为止, 下一个字节也是从低位向高位排例。若返回线圈
18、数不是8倍数, 则在最终数据字节中剩下位至字节最高位全部填0, 字节数区说明全部数据字节数。图2 4所表示为线圈输出状态响应实例。AddrFunByte countDataCRC16 hiCRC16 lo11H01H01H2AHXXHXXH 数据000000DO2DO1MSB765432LSB图 2 4读取线圈状态-响应22 读取输入状态(功效码02)读取从机离散量输入信号(DI,0X类型)ON/OFF状态, 不支持广播。查询查询信息要求了要读输入起始地址, 以及输入信号数量。输入起始地址为0000H, 1-16个输入口地址分别为0-15(DO1=0000H, DO2=0001H, 依这类推)
19、图 2 5 例子是从地址为17从机读取DI1到DI16状态。AddrFunDI startaddr hiDI startaddr loDI numhiDI numloCRC16hiCRC16lo11H02H00H00H00H10HXXHXXH图 2 5读取输入状态-查询响应响应信息中各输入口状态, 分别对应于数据区中每一位值, 1 = ON; 0 = OFF, 第一个数据字节LSB为查询中寻址地址, 其她输入口按次序在该字节中由低位向高位排列, 直至8个位为止。下一个字节中8个输入位也是从低位到高位排列。若返回输入位数不是8倍数, 则在最终数据字节中剩下位直至字节最高位全部填零。字节数区说明
20、了全部数据字节数。图2 6 所表示为读数字输出状态响应实例。AddrFunByte countData1Data2CRC16 hiCRC16 lo11H02H02H33HCCHXXHXXH数据 1 DI8 DI7 DI6 DI5 DI4 DI3 DI2 DI1 MSB LSB 数据 2 DI16 DI15 DI14 DI13 DI12 DI11 DI10 DI9 MSB LSB 图 2 6读取输入状态-响应23 读取保持寄存器(功效码03)读取从机保持寄存器(4X类型)二进制数据, 不支持广播。查询查询信息要求了要读保持寄存器起始地址及保持寄存器数量, 保持寄存器寻址起始地址为0000H, 寄
21、存器1-16所对应地址分别为0000H 0015H。图2 7 例子是从17号从机读3个采集到基础数据U1、 U2、 U3, U1地址为0000H, U2地址为0001H, U3地址为0002H。AddrFunData startaddr hiData startaddr loData #ofregs hiData #ofregs loCRC16hiCRC16lo11H03H00H00H00H03HXXHXXH图 2 7读取保持寄存器-查询响应响应信息中寄存器数据为二进制数据, 每个寄存器分别对应2个字节, 第一个字节为高位值数据, 第二个字节为低位数据。图 2 8例子是读取U1,U2,U3(U
22、1=03E8H,U2=03E7H,U3=03E9H)响应。 AddrFunBytecountData1hiData1LoData 2hiData2loData3hiData3loCRC16hiCRC16lo11H03H06H03HE8H03HE7H03HE9HXXHXXH图 2 8读取保持寄存器-响应2.4 读取输入寄存器(功效码04)读取从机输入寄存器(3X类型)中二进制数据, 不支持广播。查询查询信息要求了要读寄存器起始地址及寄存器数量, 寻止起始地址为0, 寄存器1-16所对应地址分别为0000H 0015H。图 2 9例子是请求17号从机0009寄存器。AddrFunDO addrhi
23、DO addrloData #ofregs hiData #ofregs loCRC16hiCRC16lo11H04H00H08H00H01HXXHXXH图 2 9读取输入寄存器-查询响应响应信息中寄存器数据为每个寄存器分别对应2个字节, 第一个字节为高位数据, 第二个字节为低位数据。图 2 10例子寄存器30009中数据用000AH 2个字节表示。AddrFunBytecountDatahiDataLoCRC16hiCRC16lo11H04H02H00H0AHXXHXXH图 2 10读取输入寄存器-响应2.5 强置单线圈(功效码05)强制单个线圈(DO, 0X类型)为ON或OFF状态, 广播
24、时, 该功效可强制全部从机中同一类型线圈均为ON或OFF状态。该功效可越过控制器内存保护状态和线圈严禁状态。线圈强制状态一直保持有效直至下一个控制逻辑作用于线圈为止。控制逻辑中无线圈程序时, 则线圈处于强制状态。查询查询信息要求了需要强制一个单独线圈类型, 线圈起始地址为0000H, 1-16个线圈寻址地址分为0000H 0015H(DO1=0000H, DO2=0001H, 依这类推)。由查询数据区中一个常量, 要求被请求线圈ON/OFF状态, FF00H值请求线圈处于ON状态, 0000H值请求线圈处于OFF状态, 其它值对线圈无效, 不起作用。图示 2-11例子是请求17号从机开DO1O
25、n状态。AddrFunDO addrhiDO addrloValue hiValueloCRC16hiCRC16lo11H05H00H00HFFH00H XXHXXH图示 2-11强制单线圈-查询响应图2 12所表示为对这个命令请求正常响应是在DO状态改变以后传送接收到数据。AddrFunDO addrhiDO addrloValue hiValueloCRC16hiCRC16lo11H05H00H00HFFH00H XXHXXH图示 2-12强制单线圈-响应26 预置单寄存器(功效码06)把一个值预置到一个保持寄存器(4X类型)中, 广播时, 该功效把值预置到全部从机相同类型寄存器中。该功效
26、可越过控制器内存保护。使寄存器中预置值保持有效。只能由控制器下一个逻辑信号来处理该预置值。若控制逻辑中无寄存器程序时, 则寄存器中值保持不变。查询查询信息要求了要预置寄存器类型, 寄存器寻址起始地址为0000H, 寄存器1所对应地址为0000H。图示 2-13例子是请求17号从机0040H.值为2717。AddrFunData start reg hiData start reg loValue hiValue loCRC hiCRC lo 11H06H 00H 40H 0AH 9DH XXH XXH 图示 2-13预设单寄存器-查询响应图2 14所表示对于预置单寄存器请求正常响应是在寄存器值
27、改变以后将接收到数据传送回去。AddrFunData start reg hiData start reg loValue hiValue loCRC hiCRC lo 11H06H 00H 40H 0AH 9DH XXH XXH 图示 2-14预设单寄存器-响应27读取异常状态(功效码7)读从中机中8个不正常状态线圈数据, 一些线圈号已在不一样型号控制器中预定义, 而其它线圈由用户编程, 作为相关控制器状态信息, 如“machine ON/OFF”, “heads retraced”, (缩回标题), “safeties satisfied”(安全性满意), “error condition
28、s”(存在错误条件)或其它用户定义标志等。该功效码不支持广播。该功效代码为存取该类信息提供了一个简单方法, 不正常线圈类型是已知(在功效代码中不需要线圈类型) 预定义不正常线圈号以下: 控制器型号线圈设定M84,184/384,584,9841-8用户定义484257 电池状态258-264用户定义 884761电池状态762内存保护状态763R10工况状态764-768 用户预定义查询图示 2-15例子是请求读从机设备17中不正常状态。AddrFunCRC16 hiCRC16 lo11H07HXXHXXH图示 2-15读取异常状态-查询响应正常响应包含 8 个不正常线圈状态, 为一个数据字节
29、 每个线圈一位。LSB对应为最低线圈类型状态。图2 16所表示按查询要求返回响应: AddrFunDO DataCRC16 hiCRC16 lo11H07H6DHXXHXXH图示 2-16读取异常状态-响应该例子中, 线圈数据为 6DH (二进制0110 ,1101), 从左到右 (最高位至最低位) 线圈状态分别为: OFF ON ON OFF ON ON OFF ON。若控制器型号为 984, 这些位表示线圈 8 至 1 状态; 若控制器型号为 484 则表示线圈 264 至 257 状态。28 强置多线圈(功效码15)按线圈次序把各线圈 (DO, 0X 类型) 强制成 ON 或 OFF。
30、广播时, 该功效代码可对各从机中相同类型线圈起强制作用。该功效代码可越过内存保护和线圈严禁状态线圈。保持强制状态有效, 并只能由控制器下一个逻辑来处理。若无线圈控制逻辑程序时, 线圈将保持强制状态。查询查询信息要求了被强制线圈类型, 线圈起始地址为0000H, 1-16个线圈寻址地址分为0000H 0015H(DO1=0000H, DO2=0001H, 依这类推)。查询数据区要求了被请求线圈 ON/OFF 状态, 如数据区某位值为“1”表示请求对应线圈状态为ON, 位值为“0”, 则为OFF状态。图示 2-17例子为请求从机设备 17 中一组 10 个线圈为强制状态, 起始线圈为 20 (则寻
31、址地址为 19 或 13H), 查询数据为 2 个字节, CD01H (二进制 11001101 0000 0001) 对应线圈二进制位排列以下: Bit:1100110100000001Coll:2726252423222120-2928传送第一个字节 CDH 对应线圈为 27-20, LSB 对应线圈 20, 传送第二个字节为 01H, 对应线圈为 29-28, LSB 为继圈 28, 其它未使用位均填“0”。AddrFunDO addrhiDO addrloData #of reg hiData #of reg loByte count Value hi Value loCRC hiCR
32、C lo 11H0FH 00H 13H 00H 0AH 02H CDH 01H XXH XXH 图示 2-17强置多线圈-查询响应正常响应返回从机地址, 功效代码, 起始地址以及强制线圈数。图2 18对上述查询返回响应。AddrFunDO addrhiDO addrloData #ofreg hiData #ofreg loCRC16hiCRC16lo11H0FH00H13H00H0AHXXHXXH图示 2-18强置多线圈-响应29预置多寄存器(功效码16)把数据按次序预置到各 (4X类型) 寄存器中, 广播时该功效代码可把数据预置到全部从机中相同类型寄存器中。该功效代码可越过控制器内存保护,
33、 在寄存器中预置值一直保持有效, 只能由控制器下一个逻辑来处理寄存器内容, 控制逻辑中无该寄存器程序时, 则寄存器中值保持不变。查询查询信息要求了要预置寄存器类型, 寄存器寻址起始地址为0000H, 寄存器1所对应地址为0000H。图示 2-19例子是请求17号从机0040H.值为。AddrFunData start reg hiData start reg loData #of reg hiData #of reg loByte count Value hi Value loValue hiValue loCRC hiCRC lo 11H10H 00H 40H 00H 02H 04H 40H
34、 89H 0AH 9DH XXH XXH 图示 2-19预设多寄存器-查询响应图2 20所表示对于预置单寄存器请求正常响应是在寄存器值改变以后将接收到数据传送回去。AddrFunData startreg hiData startreg loData #ofreg hiData #ofreg loCRC16hiCRC16lo11H10H00H40H00H02HXXHXXH图示 2-20预设多寄存器-响应210汇报从机标识(功效码17)返回一个从机地址控制器类型, 从机目前状态, 以及相关从机其她说明, 不支持广播。查询图示 2-21例子是请求汇报从机设备 17 标识ID 和状态。AddrFun
35、CRC16 hiCRC16 lo11H11HXXHXXH图示 2-21汇报从机标识-查询响应图2 22所表示正常响应格式, 数据内容对应每台控制器类型。AddrFunByteCountSlave IDRun Indicator StatusAdditfional DataCRC16hiCRC16lo11H11HXXHXXHXXHXXHXXHXXH图示 2-22汇报从机标识-响应从机 ID 总结数据区第一个字节为 Modicon 控制器返回从机 IDSlave ID Controller0 Micro 841 4842 184/3843 5848 8849 984特注: 具体信息见Modbus协
36、议英文版或汉字版。第三章 附录附录A: MODBUS全部功效码ModBus网络是一个工业通信系统, 由带智能终端可编程序控制器和计算机经过公用线路或局部专用线路连接而成。其系统结构既包含硬件、 亦包含软件。它可应用于多种数据采集和过程监控。下表3-1是ModBus功效码定义。 表3-1 ModBus功效码 功效码名称作用01读取线圈状态取得一组逻辑线圈目前状态(ON/OFF)02读取输入状态取得一组开关输入目前状态(ON/OFF)03读取保持寄存器在一个或多个保持寄存器中取得目前二进制值04读取输入寄存器在一个或多个输入寄存器中取得目前二进制值05强置单线圈强置一个逻辑线圈通断状态06预置单寄
37、存器把具体二进值装入一个保持寄存器07读取异常状态取得8个内部线圈通断状态, 这8个线圈地址由控制器决定, 用户逻辑能够将这些线圈定义, 以说明从机状态, 短报文适宜于快速读取状态08回送诊疗校验把诊疗校验报文送从机, 以对通信处理进行评鉴09编程(只用于484)使主机模拟编程器作用, 修改PC从机逻辑10控询(只用于484)可使主机与一台正在实施长程序任务从机通信, 探询该从机是否已完成其操作任务, 仅在含有功效码9报文发送后, 本功效码才发送11读取事件计数可使主机发出单问询, 并随即判定操作是否成功, 尤其是该命令或其她应答产生通信错误时12读取通信事件统计可是主机检索每台从机ModBu
38、s事务处理通信事件统计。假如某项事务处理完成, 统计会给出相关错误13编程(184/384 484 584)可使主机模拟编程器功效修改PC从机逻辑14探询(184/384 484 584)可使主机与正在实施任务从机通信, 定时控询该从机是否已完成其程序操作, 仅在含有功效13报文发送后, 本功效码才得发送15强置多线圈强置一串连续逻辑线圈通断16预置多寄存器把具体二进制值装入一串连续保持寄存器17汇报从机标识可使主机判定编址从机类型及该从机运行指示灯状态18(884和MICRO 84)可使主机模拟编程功效, 修改PC状态逻辑19重置通信链路发生非可修改错误后, 是从机复位于已知状态, 可重置次
39、序字节20读取通用参数(584L)显示扩展存放器文件中数据信息21写入通用参数(584L)把通用参数写入扩展存放文件, 或修改之2264保留作扩展功效备用6572保留以备用户功效所用留作用户功效扩展编码73119非法功效120127保留留作内部作用128255保留用于异常应答ModBus网络只是一个主机, 全部通信都由她发出。网络可支持247个之多远程隶属控制器, 但实际所支持从机数要由所用通信设备决定。采取这个系统, 各PC能够和中心主机交换信息而不影响各PC实施本身控制任务。表3-2是ModBus各功效码对应数据类型。 表3-2 ModBus功效码与数据类型对应表 代码功效数据类型01读位
40、02读位03读整型、 字符型、 状态字、 浮点型04读整型、 状态字、 浮点型05写位06写整型、 字符型、 状态字、 浮点型08N/A反复“回路反馈”信息15写位16写整型、 字符型、 状态字、 浮点型17读字符型附录B: 不正常响应不正常响应: 除广播外, 主机向从机设备发送查询并期望有一个正常响应, 主机查询中有可能产生4种事件: 从机接收查询, 通讯错误正常处理信息, 则返回一个正常响应事件。 因为通讯犯错, 从机不能接收查询数据, 所以不返回响应。此时, 主机依靠处理程序给出查询超时事件。 若从机接收查询, 发觉有 (LRC或CRC) 通讯错误, 并返回响应, 此时, 依靠主机处理程
41、序给出查询超时事件。 从机接收查询, 无通讯错误, 但无法处理(如读不存在线圈和寄存器)时, 向主机汇报错误性质。不正常响应信息有2个与正常响应不相同区域: 功效代码区: 正常响应时, 从机响应功效代码区, 带原查询功效代码。全部功效代码MSB为0(其值低于80H)。不正常响应时, 从机把功效代码MSB置为1, 使功效代码值大于80H, 高于正常响应值。这么, 主机应用程序能识别不正常响应事件, 能检验不正常代码数据区。数据区: 正常响应中, 数据区含有(按查询要求给出) 数据或统计值, 在不正常响应中, 数据区为一个不正常代码, 它说明从机产生不正常响应条件和原因。例: 主机发出查询, 从机不正常响应。(为十六进制数据)。查询: AddrFunDO start reg hiDO start reg loDO #of regs hiDO #of regs loCRC16HiCRC16Lo0AH01H04HA1H00H01HXXHXXH响应(不正常或例外): AddrFunException CodeCRC16HiCRC16Lo0AH81H02HXXHXXH图 3 1 . 不正常信息帧格式上例中, 从机设备地址10(0AH), 读线