Modbus 機能コード是 Modbus メッセージフレーム(message)的重要组成部分,是 Modbus protocol中通信トランザクション処理的基础。

概述
Modbus 機能コード占用一バイト単位。,取值範囲是 1~127(即 0x01~0x7F)。同时,使用機能コード + 0x80 表示異常ステータス,即 129~255 代表異常コード。。
在 Modbus 標準プロトコル中,一共规定了三类 Modbus function code。
- パブリック機能コード
- 被明确定义的機能コード;
- 保证唯一性;
- 由 Modbus 协会確認,并提供公开的ドキュメント;
- 可进行一致性测试;
- 包括协议定义的関数コードと保留将来使用的機能コード。
- 用户自定义機能コード
- 有2つ用户自定义機能コードエリア,分别是 65
72 和 100110; - 用户自定义,不保证唯一性。
- 有2つ用户自定义機能コードエリア,分别是 65
- 保留機能コード
- 保留機能コード是因为历史遗留原因,某些公司的传统产品上现行使用的機能コード不作为公共使用。
本チュートリアル主要介绍パブリック機能コード,下表表示了 Modbus protocol中的部分パブリック機能コード。
| 代码 | Name | 英文 | register PLC address | 位/字操作 | 操作数量 |
|---|---|---|---|---|---|
| 01 | read coil status | Read Coils | 00001~09999 | ビット操作。 | 单个或多个 |
| 02 | 離散入力の読み取りステータス | Read Discrete Inputs | 10001~19999 | ビット操作。 | 单个或多个 |
| 03 | read holding registers | Read Holding Registers | 40001~49999 | 字操作 | 单个或多个 |
| 04 | read input registers | Read Input Registers | 30001~39999 | 字操作 | 单个或多个 |
| 05 | write single coil | Write Single Coil | 00001~09999 | ビット操作。 | 单个 |
| 06 | 単一保持レジスタの書き込み | Write Single Register | 40001~49999 | 字操作 | 单个 |
| 15 | write multiple coils | Write Multiple Coils | 00001~09999 | ビット操作。 | 多个 |
| 16 | 複数書き込みレジスタを保持する。 | Write Multiple Registers | 40001~49999 | 字操作 | 多个 |
機能コード的操作可分为两种:
- ビット操作。 —— 最小単位为一位(bit),包括读コイルの状態機能コード 01、離散入力の読み取りステータス機能コード 02、シングルコイルを書く。機能コード 05 和複数のコイルを書く。機能コード 15;
- 字操作 —— 最小単位为两バイト単位。,包括リードホールドレジスタ機能コード 03、読み取り入力レジスタ機能コード 04、単一保持レジスタの書き込み機能コード 06 和複数書き込みレジスタを保持する。機能コード 16。
function code
0x01 リードコイル/离散量出力值
- 该機能コード用于読み取り从デバイス的コイル或离散量輸出した。ステータス,即各 DO(Discrete Output,离散出力)的 ON/OFF status。
- メッセージフレーム中指定了需読み取り的コイル開始アドレス和コイル数目。
- 開始アドレス由 2 バイト単位。构成,取值範囲为 0x0000 to 0xFFFF。
- コイルの数由 2 バイト単位。构成,取值範囲为 0x0001 to 0x07D0(即十进制 1~2000)。
- 需要注意,在 Modbus protocol规定的 PDU 中,规定すべてのコイル或レジスター·アドレス从 0 开始計算。
0x02 読み取り离散量入力值
- 该機能コード用于読み取り从デバイス的ショップ型入力,即 DI(Discrete Input)的 ON/OFF status。
- メッセージフレーム中指定了需読み取り的ショップ型入力レジスタ開始アドレス和数目,可読み取り 1~2000 个连续的离散量入力ステータス。
- もし从デバイス接受主デバイス的リクエスト则回复機能コード 02,并戻る离散量入力各变量的当前ステータス(もし戻る的 DI 数量ではない 8 的整数倍,将用 0 填充最后データバイト的剩余位)。
- 開始アドレス由 2 バイト単位。构成,取值範囲为 0x0000 to 0xFFFF。
- 离散量数量由 2 バイト単位。构成,取值範囲为 0x0001 to 0x07D0(即十进制 1~2000),最多一次可読み取り 2000 個別入力です。ステータス值。
0x03 リードホールドレジスタ值
- 该機能コード用于読み取り从デバイスレジスタを保持する。的内容,不放送のサポートモード。
- メッセージフレーム中指定了需読み取り保持レジスタです。的開始アドレス和数目,而レジスタを保持する。中各アドレス的具体内容和意义则由デバイス開発者たちは自行规定。
- 開始アドレス由 2 バイト単位。构成,取值範囲为 0x0000 to 0xFFFF。
- レジスタの数由 2 バイト単位。构成,取值範囲为 0x0001 to 0x007D(即十进制 1~125),最多一次可连续読み取り 125 个レジスタの値。
- 需要注意,Modbus 保持レジスタです。和入力レジスタ。是以字(Word)为基本単位的(1Word equal to 2Bytes)。因此,在読み取り时需要注意バイトオーダー(大リトルエンディアン)問題。
0x04 入力レジスタの読み取り值
- 该機能コード用于読み取り从デバイス入力レジスタ。的内容,不放送のサポートモード。(与 03 機能コード类似)
- メッセージフレーム中指定了需読み取り的入力レジスタ。的開始アドレス和数目,而入力レジスタ。中各アドレス的具体内容和意义则由デバイス開発者たちは自行规定。
- 開始アドレス由 2 バイト単位。构成,取值範囲为 0x0000 to 0xFFFF。
- レジスタの数由 2 バイト単位。构成,取值範囲为 0x0001 to 0x007D(即十进制 1~125),最多一次可连续読み取り 125 个レジスタの値。
- 同样需要注意バイトオーダー問題。
0x05 write single coil/单个离散出力
- 该機能コード用于将单1つのコイルレジスタ(或离散出力)設定为 ON 或 OFF,放送のサポートモード。
- 在广播モード下,すべての駅から。デバイス的同一アドレス的值将被统一修改。
- メッセージフレーム中指定了需要变更的コイルアドレス和设定的ステータス值。
- 開始アドレス由 2 バイト単位。构成,取值範囲为 0x0000 to 0xFFFF。
- 目标データ(即查询报文中的 ON/OFF status)由报文データ字段的常数指定,0xFF00 表示 ON status,0x0000 表示 OFF status,其余すべての值均是非法的。
- 需要注意,在 Modbus protocol规定的 PDU 中,规定すべてのコイル或レジスター·アドレス从 0 开始計算。
0x06 単一保持レジスタの書き込み
- 该機能コード用于更新从デバイス的单レジスタを保持する。的值,放送のサポートモード。
- 在广播モード下,すべての駅から。デバイス的同一アドレス的值将被统一修改。
- メッセージフレーム中需要指定从デバイスアドレス以及需要变更的レジスタアドレスを保持和设定值。
- 開始アドレス由 2 バイト単位。构成,取值範囲为 0x0000 to 0xFFFF。
- 变更目标データ由 2 バイト単位。构成,取值範囲为 0x0000 to 0xFFFF。
- レジスタを保持する。以字(Word)为基本単位,写入时需要注意目标データ的バイトオーダー問題。
0x08 诊断功能
- 该機能コードSerialのみ使用链路,主要用于检测主デバイス和从デバイス之间的通信故障,或检测从デバイス的各种内部故障,该功能不放送のサポート。
- 查询报文中需要指定从デバイスアドレス、function code(Modbus Command)以及サブ機能コード(Diagnostic Sub-function)。among them,サブ機能コード字段为 2 バイト単位。,用于区别各诊断タイプ。
- 在正常的レスポンス报文中,从デバイス将原样回复関数コードとサブ機能コード。
常用的 Modbus 诊断サブ機能コード定义如下:
| function code | サブ機能コード | Description | 説明 |
|---|---|---|---|
| 08 | 00(0x00) | Return Data Query (Loop-back) | そのまま戻る。查询报文 |
| 08 | 01(0x01) | Restart Communications | 用于初期化并重新启动スレーブデバイス among them,报文字段 0x00, 0x00 表示保持事件记录 0xFF, 0x00 表示クリア事件记录 |
| 08 | 02(0x02) | Return Diagnostic Register | 診断レジスタに戻る内容 |
| 08 | 03(0x03) | Change ASCII Input Delimiter | |
| 08 | 04(0x04) | Force Listen Only Mode | 强制被寻址的スレーブデバイス进入只听モード 使其与网络中的其他デバイス断开,不戻るレスポンス |
| 08 | 10(0x0A) | Clear Counters and Diagnostic Registers | クリアカウンター·カウンター和诊断レジスタ |
| 08 | 11(0x0B) | Return Bus Message Count | 戻るバス报文计数值 |
| 08 | 12(0x0C) | Return Bus Communication Error Count | 戻るバス通信 CRC 出错计数 |
| 08 | 13(0x0D) | Return Bus Exception Error Count | 戻るバス異常计数 |
| 08 | 14(0x0E) | Return Slave Message Count | 戻るスレーブデバイス受信的报文数量 |
| 08 | 15(0x0F) | Return Slave No Response Count | 戻るスレーブデバイスない戻るレスポンス的报文数量 |
| 08 | 16(0x10) | Return Slave NAK Count | |
| 08 | 17(0x11) | Return Slave Busy Count | 戻るスレーブデバイスレスポンス忙的报文数量 |
| 08 | 18(0x12) | Return Bus Character Overrun Count | 戻るバス文字制限超過的报文数量 |
| 08 | 19(0x13) | Return IOP Overrun Count (884) | |
| 08 | 20(0x14) | Clear Overrun Counter and Flag (884) |
0x0B 取得通信イベント数器
- 该機能コード主要用于取得从デバイス通信カウンター·カウンター中的ステータス字和イベント数的值,不放送のサポートモード。
- 可以経由在通信报文之前和之后読み取り通信イベント数值,来确定从デバイス是否正常処理报文。
- 对于正常完成报文処理和传输的场合,イベント数器增加 1;而对于異常な応答、ポーリング命令或读イベント数器(即 0x0B function code)的场合,则カウンター·カウンター不变。
- 経由 0x08 诊断功能中的 0x01 子功能和 0x0A 子功能,可以复位事件レジスタ。
0x0C 取得通信事件记录
- 该機能コード主要用于从从デバイス取得ステータス字、イベント数、报文计数以及事件バイト字段。
- 其中ステータス字和イベント数与機能コード 0x0B 取得的值一致。
- 报文カウンター·カウンター包含了加电再起動、クリアカウンター·カウンター之后的报文数量,报文计数与経由 0x08 诊断功能中的 0x0B サブ機能コード取得的值一致。
- 事件バイト字段包含 0~64 バイト単位。,定义各种事件。
- 正常情况下レスポンス报文包括一个 2 Bytes ステータス字字段、一个 2 Bytes イベント数字段、一个 2 Bytes メッセージ计数字段以及 0~64 バイト単位。的事件字段。
- 由于事件字段是变长的,因此增加了一个 1 Byte 的データ長さ字段,以方便読み取り応答データ。
0x0F write multiple coils
- 该機能コード用于将连续的多1つのコイル(或离散出力)設定为 ON 或 OFF,放送のサポートモード。
- 在广播モード下,すべての駅から。デバイス的同一アドレス的值将被统一修改。
- メッセージフレーム中指定了需要变更的コイル開始アドレス和コイル数目。
- 開始アドレス由 2 バイト単位。构成,取值範囲为 0x0000 to 0xFFFF。
- レジスタの数字段由 2 バイト単位。构成,取值範囲为 0x0001 to 0x07B0。
- データ字段中为逻辑 1 的位对应 ON,逻辑 0 的位对应 OFF。
0x10 複数書き込みレジスタを保持する。
- 该機能コード用于設定或写入从デバイスレジスタを保持する。的多个连续的アドレス块(1~1231つのレジスタ),放送のサポートモード。
- 在广播モード下,すべての駅から。デバイス的同一アドレス的值将被统一修改。
- メッセージフレーム中需要指定从デバイスアドレス以及需要变更的レジスタアドレスを保持和数量。
- 開始アドレス由 2 バイト単位。构成,取值範囲为 0x0000 to 0xFFFF。
- レジスタの数字段由 2 バイト単位。构成,取值範囲为 0x0001 to 0x007B(即十进制 1~123)。
- 在实际开发中,该機能コード常用于方便用户写入多バイトタイプ的データ,例如浮動小数点数值。因此,需要注意バイトオーダー問題。
0x11 駅からの報告 ID
- 该機能コード仅適用される串行链路,用于駅から読む。デバイス的 ID、タイプ説明、当前ステータス以及其他信息,不放送のサポートモード。
- 查询报文中ないデータ字段。
- レスポンスメッセージ的构成由スレーブデバイス决定。
总结
常用 Modbus パブリック機能コード下表所示。

among them,放送のサポートモード的機能コード有:
- 0x05 write single coil
- 0x06 単一保持レジスタの書き込み
- 0x0F write multiple coils
- 0x10 複数書き込みレジスタを保持する。
除了广播モード的报文以外,其他すべての查询报文都希望能够取得一个正常的レスポンス报文。もし一切正常,则スレーブデバイス将戻る一个普通の反応报文,该レスポンス报文的機能コード与リクエスト报文的機能コード一致。
另外,对于字操作的機能コード,存在多バイト存储的大リトルエンディアン問題,因此マスターデバイス和スレーブデバイス必须保持一致的ルール処理,约定 Modbus 传输中的データ字段的バイトオーダー。
Leave a Reply