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






