PD Handler Modbus

Modbus ファンクションコード

PD Handler Modbus に用いられているファンクションコード

コード名称機能説明
0x01Read Coilsデジタル出力に設定されているビット値を読み込む。
0x02Read Discrete Inputデジタル入力のビット値を読み込む。
0x03Read Holding Registersレジスタ出力に設定されている値を読み込む。
0x04Read Input Registersレジスタ入力の値を読み込む。
0x05Write Single Coilデジタル出力 1 ビットのビット値を設定する。
0x06Write Single Registerレジスタ出力 1 レジスタの値を設定する。
0x07Read Exception Statusクライアント/サーバー間でエラーステータスを通知する。
0x09Write Single Discrete Inputデジタル入力 1 ビットのビット値を設定する。
0x0aWrite Single Input Registerレジスタ入力1レジスタの値を設定する。
0x0fWrite Multiple Coils連続する複数のデジタル出力のビット値を設定する。
0x10Write Multiple Registers連続する複数のレジスタ出力の値を設定する。
0x11Report Slave ID接続可能なスレーブ(サーバー)機器のIDを通知する。
0x13Write Multiple Discrete Input連続する複数のデジタル入力のビット値を設定する。
0x14Write Multiple Input Registers連続する複数のレジスタ入力の値を設定する。
0x16Mark Write Registersレジスタ出力をマスクする。
0x17Write and Read Registers連続する複数のレジスタ出力の値を設定し、その値を読み込む。

0x09, 0x0a, 0x13, 0x14 物理的な入力を持たない PD Handler Modbus Server のデジタル入力もしくはレジスタ入力をクラウド側から設定できるよう用意された、本来の Modbusプロトコルには存在しない独自拡張のファンクションです。

Modbus ファンクションコードは、 設定ファイルもしくは CSV ファイルあるいはクラウド側からの制御においてJSON 文字列の 'function' キーの値に設定される. '0x' から始まる 16 進表記のファンクションコードを文字列として 'function' キーの値に設定することも可能ですが、16 進表記とは別に整数表記と文字列表記を用いることも可能です。

'function' "キーに用いるファンクションコードの別称

コード名称整数表記文字列表記
0x01Read Coils1read_coils
0x02Read Discrete Input2read_discrete_input
0x03Read Holding Registers3read_holding_registers
0x04Read Input Registers4read_input_registers
0x05Write Single Coil5write_single_coil
0x06Write Single Register6write_single_register
0x07Read Exception Status7read_exception_status
0x09Write Single Discrete Input9write_single_input_register
0x0aWrite Single Input Register10write_single_input_register
0x0fWrite Multiple Coils15write_multiple_coils
0x10Write Multiple Registers16write_multiple_register
0x11Report Slave ID17report_slave_id
0x13Write Multiple Discrete Input19write_muliple_discrete_input
0x14Write Multiple Input Registers20write_multiple_input_registers
0x16Mark Write Registers22mark_write_registers
0x17Write and Read Registers23write_and_read_registers

PD Handler Modbus Client

デフォルトパス

PD Handler Modbus Client に関連するファイルのデフォルトパスは次の通りです。

PD Handler Modbus Client に関連するファイルのデフォルトパス

パス名説明
/usr/sbin/pd_handler_modbus_client常駐実行オブジェクト(デーモン)
/lib/systemd/system/pd_handler_modbus_client.serviceSystemd Service ファイル
/etc/init.d/pd_handler_modbus_clientRC ファイル
/var/webui/config/pd_handler_modbus_client.conf設定ファイル
/var/webui/upload_dir/pd_handler_modbus_client.csvCSV ファイル
/var/run/pd_handler_modbus_client.pidPID ファイル

設定ファイルの書式

構文

{
"csv_file": "<CSVファイルのパス名>",
"clients" : [
{
<clients オブジェクト>,
"acquisitions" : [
{
<acquisitions オブジェクト>
},
{
<acquisitions オブジェクト>
}
},
{
<clients オブジェクト>,
"acquisitions" : [
{
<acquisitions オブジェクト>
},
{
<acquisitions オブジェクト>
}
},
]
}

ルートオブジェクト

ルートオブジェクト

キーデータ型説明
csv_file文字列CSVファイルのパス名. デフォルト値は '/var/webui/upload_dir/pd-data/pd_handler_modbus_client.csv'. (MAXPATHLEN)
clientsJSON objclients オブジェクト

clients オブジェクト

clients オブジェクトは、PD Handler Modbus Client の動作を規定する設定オブジェクトです。 clients オブジェクトの配列数は、最大256 個です。 Modbus のプロトコル (TCP, RTC) に依存するオブジェクトとプロトコルに依存しない共通のオブジェクトがあります。

clients オブジェクト

キーデータ型説明
enable論理値デフォルト値は false.
localname文字列デバイスのローカル名. (32byte)
bind文字列制御メッセージを受け取るソケット名. 文字列の先頭が '@' の場合は abstract namespace と解釈する. 空の場合は、デフォルト値 '@/pd_handler/<localname>.sock' が設定される. (MAXPATHLEN)
push_to文字列データの送り先ソケット名. 文字列の先頭が '@' の場合は abstract namespace と解釈する. 空の場合は、デフォルト値 '@/pd_repeater/<localname>.sock' が設定される. (MAXPATHLEN)
buffer_size整数値データのバッファサイズ(byte). デフォルト値は 4096.
receive論理値クラウドからメッセージを受け取る下流方向制御)か否か. デフォルト値は false.
writeout論理値push_to に指定するソケットに出力するか否か. デフォルト値は true.
protocol文字列接続プロトコル 'tcp' 又は 'rtu' を指定. デフォルト値は 'tcp'.
interval整数値データを取得する間隔(sec). デフォルト値は 60.
timeout整数値データを取得出来ない場合のタイムアウト(msec). デフォルト値は 5000.
time_sync論理値基準時刻制御モード. デフォルト値は false.
base_time文字列基準時刻制御モードの基準時刻を 'HH:MM' 形式で指定する. デフォルト値は '00:00'.
node文字列【TCP 接続】PLC 機器の IP アドレス. デフォルト値は '127.0.0.1'.
port整数値【TCP 接続】PLC 機器のポート番号. デフォルト値は 502.
device文字列【RTU接続】のデバイス名. デフォルト値は '/dev/ttyUSB1'.
rtu_speed整数値【RTU接続】のビットレート. デフォルト値は 115200.
rtu_bits整数値【RTU接続】のビット数. 8 又は 7. デフォルト値は 8.
rtu_parity文字列【RTU接続】のパリティ. 'none', 'even', 'odd' のいずれか. デフォルト値は'none'.
rtu_stop整数値【RTU接続】のストップビット. 1 又は 2. デフォルト値は 1.
rtu_rts_delay整数値【RTU接続】の RTS ディレイ値(usec). 0 の場合は自動設定される値.
rtu_reset整数値設定される値を越えて接続エラーが連続して発生した場合に 'device' キーに設定されるデバイスをリセットする. デフォルト値は 10.
memo文字列出力に付加されるユーザー定義文字列. (256byte)
infosJSON Object出力に付加されるユーザー定義オブジェクト
acquisitionsJSON配列acquisitions オブジェクト

acquisitions オブジェクト

acquisitions オブジェクト

キーデータ型説明
unit整数値PLC 機器の Modbus ユニットID. 1 ~ 247 又は 255 (TCP接続のみ).
function文字列又は整数Modbus プロトコルのデータ読み出しファンクション名又はファンクション番号. 文字列の場合は、'read_coils', 'read_discrete input', 'read_holding_registers','read_input_registers' 又は'0x01'~'0x04'、 整数値の場合は文字列の順に 1~4. デフォルト値は 'read_holding_r_gisters'.
data_type文字列又は整数文字列の場合は 'uint16_t', 'int16_t', 'uint32lsb_t', 'int32lsb_t', 'uint32msb_t', 'int32msb_t' のいずれか. 整数値の場合は文字列の順に 0~5. 'function' が 'read_coils' 又は'read_discrete_input'の場合は、'uint16_t' に固定される. デフォルト値は'uint16 t'.
address文字列又は整数読み込み介しレジスタアドレスを指定する. 文字列の先頭に '0x' が付加されている場合は 16 進表記と解釈される. デフォルト値は '0x0'.
number文字列又は整数読み込むビット数またはレジスタ数、文字列の先頭に '0x' が付加されている場合は16 進表記と解釈される. data_type が'uint32lsb_t', 'int32ls_t', 'uint32msb_t', 'int32msb_t' の場合は、内部的に 2 倍の値で扱われる. デフォルト値は 1.

利用可能なファンクションコード

PD Handler Modbus Client で利用可能なファンクションコードを示する。

PD Handler Modbus Client で利用可能なファンクションコード

コード名称ローカルクラウド
0x01Read Coils
0x02Read Discrete Input
0x03Read Holding Registers
0x04Read Input Registers
0x05Write Single Coil
0x06Write Single Register
0x07Read Exception Status
0x09Write Single Discrete Input
0x0aWrite Single Input Register
0x0fWrite Multiple Coils
0x10Write Multiple Registers
0x11Report Slave ID
0x13Write Multiple Discrete Input
0x14Write Multiple Input Registers
0x16Mask Write Registers
0x17Write And Read Registers

ローカルは、設定ファイルもしくは CSV ファイルに指定可能なファンクションコード、クラウドはクラウド側か指定可能なファンクションコードを意図する。

CSVファイル

/var/webui/config/pd_handler_modbus_client.conf の 'csv_file' キーに設定される CSV ファイルを置くことで、/var/webui/config/pd_handler_modbus_client.conf で設定された 1 つのデバイス番号に対し複数の取得 Modbus クライアントデバイスを設定することができます。

CSV ファイルの書式は、次の通りです。

デバイス番号,ユニットID,読込方式,データタイプ,読込開始アドレス,読込レジスタ数

PD Handler Modbus ClientのCSVファイルの書式

パラメータデータの形式説明
デバイス番号半角英数字WEB-UIにより割り振れたデバイス番号を記載する。 WEB-UIに設定されていないデバイス番号は無視される。先頭が '#' 又は '/' の場合は、コメント行として扱われる。
ユニットID半角数字PLC 機器の Modbus ユニット ID を設定する。 ユニットIDは、1~247 または 255を記載する。
読込方式半角英数字読込方式として次の何れかを記載する。
デジタル出力 :
'read_coils'又は '0x01' 又は '1'.
デジタル入力 :
'read_discrete_input' 又は '0x02'又は '2'.
レジスタ出力 :
'read_holding_registers' 又は '0x03' 又は '3'.
レジスタ入力 :
'read_input_registers' 又は'0x04' 又は '4'.
データタイプ半角英数字データタイプとして次の何れかを記載する。
符号なし16ビット整数 :
'uint16_t' 又は '0'.
符号付き16ビット整数 :
'int16_t' 又は '1'.
符号なし32ビット整数/リトルエンディアン :
'uint32lsb_t' 又は '2'.
符号付き32ビット整数/リトルエンディアン :
'int32lsb_t' 又は '3'.
符号なし32ビット整数/ビッグエンディアン :
'uint32msb_t' 又は '4'.
符号付き32ビット整数/ビッグエンディアン :
'int32msb_t' 又は '5'.
読込開始アドレス半角英数字読み込みたいデータが格納されている PLC 機器上の開始アドレスを設定する。 先頭が '0x' の場合は 16 進数と解釈される。
読込レジスタ数半角数字読み込みたいレジスタ数を記載する。

各パラメータの区切りはカンマ、先頭がシャープ '#' もしくはスラッシュ '/' の行はコメント行と見なされる。

CSV ファイルが読み込まれると clients オブジェクトに設定された Modbus クライアントデバイスは上書きされる。
そのため、CSV ファイルには client オブジェクトに設定した Modbus クライアントデバイスを含む取得したい全ての Modbus クライアントデバイスを記載して下さい。

基準時刻制御

基準時刻制御は、特定の時刻にデータを取得する機能である。
clients オブジェクトの 'time_sysnc' キーを true に設定し、'interval' キーと 'base_time' キーで取得間隔と取得時刻を設定する。
基準時刻制御における「取得時間間隔」は300, 600, 900, 1800, 3600, 7200, 10800, 14400, 21600, 28800, 43200 と 86400の倍数に限られる。「取得時間間隔」としてこれら以外の値が設定される とPD Handler Modbus Client内で次のように扱われる。

基準時刻制御における取得時間間隔の設定と実動作値

取得時間間隔の設定値実動作値
0 ~ 599300
600 ~ 899600
900 ~ 1799900
1800 ~ 35991800
3600 ~ 71993600
7200 ~ 107997200
10800 ~ 1439910800
14400 ~ 2159914400
21600 ~ 2879921600
28800 ~ 4319928800
43200 ~ 8639943200
86400 ~86400 の倍数

「基準時刻」とは動作の起点となる時刻で、例えば「取得時間間隔」を300とし、「基準時刻」を '00:01' とした場合、データの取得は 00:01, 00:06, 00:11 ... 00:56,'01:01 ... 23:56, 00:01 の定刻に行われる。
データの取得開始時刻は「基準時刻」に設定さた時刻そのものではなく、「基準時刻」と「取得時間間隔」から算定される直近の時刻となる。
例えば08:30に「基準時刻」'01:05'、「取得時間間隔」10800の設定が行われた場合、最初のデータ取得は10:05に行われ、以降13:05,16:05, 19:05, 22:05, 01:05 の順におこなわれる。

メッセージオブジェクト

入出力メッセージに用いられる JSON オブジェクトを示する。

PD Handler Modbus Client のメッセージオブジェクト

キー内容データ型方向備考
timeデータ取得日時文字列出力ISO8601拡張書式
prototocolプロトコル文字列入出力'tcp' 又は 'rtu'.
node取得先 IP アドレス文字列入出力TCP接続時のみ.
portポート番号整数値入出力TCP接続時のみ.
deviceデバイスファイル名文字列入出力RTU接続時のみ.
unitModbus Unit ID整数値入出力
memoメモ文字列出力memo キーに設定された値.
address読み/書き込みアドレス整数値入出力
number読み込むレジスタ数整数値入力
functionModbus function code整数値入出力
data_typeデータの型文字列入出力'uint16_t', 'int16_t', 'uint32lsb_t', 'int32lsb_t', 'uint32msb_t', 'int32msb_t' のいずれか.
valuse読み/書き込み 整数配列 入出力
reply_toリクエストメッセージのMD5文字列出力
result制御ステータス文字列出力'done', 'not queuing', 'failed' のいずれか.
reasonエラーの理由文字列出力

クラウドからの制御

クラウドから PD Repeater を介し制御(JSON)文字列を送ることで、接続されている PLC 機器のレジスタを読み書きすることができます。
制御文字列には、PLC 機器を特定するため clients オブジェクトの protocol, node, port, もしくは device と acquisitions オブジェクトの unit, function, data_type, addres, number および書き込みファンクションにおいては、valuse に値を記載する。
node, port, もしくは device は、設定ファイルに設定されているものでなければなりません。 物理的に接続されていても設定ファイルに設定されていない node, port, もしくは device を操作することはできません。

例えば、TCP 接続されている PLC 機器の入力レジスタを読み込むのであれば、その制御文字列は次のようになります。

{
"protocol": "tcp", "node": "192.168.1.8", "port": 502,
"unit": 255, "function": "0x04",
"data_type": "uint16_t", "address": "0x160", "number": 5
}

これに対する、応答メッセージは、次のようになります。 :

{
"time": "2017-09-05T15:30:05.758+09:00",
"reply_to": "452556d8daf1f7eb483d00ee03718e8e", "result": "done",
"memo": "Modbus Client 00",
"protocol": "tcp", "node": "192.168.1.8", "port": 502,
"unit":255, "address":352, "function": 4, "data_type": "uint16_t",
"values": [65535, 0, 1, 2, 3]
}

ここで、reply_to は、制御文字列の MD5 です。

シリアル接続の PLC 機器の出力レジスタを書き込むのであれば、その制御文字列は次のようになります。

{
"protocol": "rtu", "device": "/dev/ttyMDF1",
"unit":16, "function": "0x10", "data_type": "uint32lsb_t", "address": "0x120",
"values": [4567, 891011]
}

ここで data_type が 32bit の場合、values は上位/下位の 16 bitsに分割されて処理されるため、書き込む値の数が 1 であっても function は Write Multiple Registers を使用しなくてはなりません。

これに対する、応答メッセージは、次のようになります。

{
"time": "2017-09-05T16:35:13.653+09:00",
"reply_to": "fe9b49ff045f435a371303a82281f3f9", "result": "done",
"memo": "Modbus Client 01",
"protocol": "rtu", "device": "/dev/ttyMDF1",
"unit": 16, "address": 288, "function": 16, "data_type": "uint32_t",
"values": [4567, 891011]
}

PD Handler Modbus Server

Modbusサーバーは次表に示すレジスタマップを保持し、PLC 機器からの Modbus プロトコルによる接続を待ち受け、PLC 機器の書き込み操作によりレジスタの値を更新すると共に更新されたレジスタとその値を PD Repeater を介してクラウドに送ります。
また、PD Repeater を介してクラウドから送られる制御メッセージ(JSON文字列)に基づきレジスタマップを読み書きすることもできます。
レジスタマップは、60 秒毎に更新があればレジスタマップファイル registers.map に出力される。

PD Handler Modbus Serverのレジスタマップ

レジスタ開始アドレスサイズ
デジタル出力(Coils)0x000uint8_t × 2048
デジタル入力(Discrete Input)0x000uint8_t × 2048
レジスタ出力(Holdig Registers)0x000uint16_t × 2048
レジスタ入力(Input Registers)0x000uint16_t × 2048

デフォルトパス

PD Handler Modbus Server に関連するファイルのデフォルトパスは次の通りです。

PD Handler Modbus Server に関連するファイルのデフォルトパス

パス名説明
/usr/sbin/pd_handler_modbus_server常駐実行オブジェクト(デーモン)
/lib/systemd/system/pd_handler_modbus_server.serviceSystemd Service ファイル
/etc/init.d/pd_handler_modbus_serverRC ファイル
/var/webui/config/pd_handler_modbus_server.conf設定ファイル
/var/webui/.modbus_server/registers.mapレジスタマップファイル
/var/run/pd_handler_modbus_server.pidPID ファイル

設定ファイルの書式

構文

{
"registers_file": "<レジスタマップファイルのパス名>",
"servers" : [
{
<servers オブジェクト>
},
{
<servers オブジェクト>
}
]
}

ルートオブジェクト

ルートオブジェクト

キーデータ型説明
registers_file文字列レジスタマップファイルのパス名. デフォルト値は '/var/webui/.modbus_server/pd-data/registers.map'. (MAXPATHLEN)
serversJSON objservers オブジェクト

servers オブジェクト

server オブジェクトは、PD Handler Modbus Serverの動作を規定する設定オブジェクトです。 server オブジェクトの配列数は、最大8 個. Modbus のプロトコル(TCP, RTC)に依存するオブジェクトとプロトコルに依存しない共通のオブジェクトがあります。

servers オブジェクト

キーデータ型説明
enable論理値デフォルト値は false.
localname文字列デバイスのローカル名. (32byte)
bind文字列制御メッセージを受け取るソケット名. 文字列の先頭が '@' の場合は abstract namespace と解釈する. 空の場合は、デフォルト値 '@/pd_handler/<localname>.sock' が設定される. (MAXPATHLEN)
push_to文字列データの送り先ソケット名. 文字列の先頭が '@' の場合は abstract namespace と解釈する. 空の場合は、デフォルト値 '@/pd_repeater/<localname>.sock' が設定される. (MAXPATHLEN)
buffer_size整数値データのバッファサイズ(byte). デフォルト値は 4096.
receive論理値クラウドからメッセージを受け取る下流方向制御)か否か. デフォルト値は false.
writeout論理値push_to に指定するソケットに出力するか否か. デフォルト値は true.
protocol文字列接続プロトコル 'tcp' 又は 'rtu' を指定. デフォルト値は 'tcp'.
timeout整数値データを取得出来ない場合のタイムアウト(msec). デフォルト値は 5000.
node文字列【TCP 接続】PLC 機器からの接続を待ち受ける IP アドレス. デフォルト値は'0.0.0.0'
port整数値【TCP 接続】PLC 機器からの接続を待ち受ける TCP ポート番号. デフォルト値は 502
device文字列【RTU接続】PLC 機器からの接続を待ち受けるシリアル接続デバイス名. デフォルト値は '/dev/ttyUSB1'
rtu_speed整数値【RTU接続】PLC 機器からの接続を待ち受けるシリアル接続ビットレート. デフォルト値は 115200
rtu_bits整数値【RTU接続】PLC 機器からの接続を待ち受けるシリアル接続ビット数. 8 又は 7. デフォルト値は 8.
rtu_parity文字列【RTU接続】PLC 機器からの接続を待ち受けるシリアル接続パリティ. 'none', 'even', 'odd' のいずれか. デフォルト値は 'none'.
rtu_stop整数値【RTU接続】PLC 機器からの接続を待ち受けるシリアル接続ストップビット. 1 又は 2. デフォルト値は 1.
rtu_rts_delay整数値【RTU接続】PLC 機器からの接続を待ち受けるシリアル接続の RTS ディレイ値(usec). 0 の場合は自動設定される値.
unit整数値自身に付与する Modbus ユニット ID. 1 〜 247.
memo文字列出力に付加されるユーザー定義文字列. (256byte)
infosJSON Object出力に付加されるユーザー定義オブジェクト

利用可能なファンクションコード

PD Handler Modbus Server で利用可能なファンクションコードを示する。

PD Handler Modbus Server で利用可能なファンクションコード

コード名称ローカルクラウド
0x01Read Coils
0x02Read Discrete Input
0x03Read Holding Registers
0x04Read Input Registers
0x05Write Single Coil
0x06Write Single Register
0x07Read Exception Status
0x09Write Single Discrete Input
0x0aWrite Single Input Register
0x0fWrite Multiple Coils
0x10Write Multiple Registers
0x11Report Slave ID
0x13Write Multiple Discrete Input
0x14Write Multiple Input Registers
0x16Mask Write Registers
0x17Write And Read Registers

ローカルは、設定ファイルに指定可能なファンクションコード、クラウドはクラウド側か指定可能なファンクションコードを意図する。

メッセージオブジェクト

入出力メッセージに用いられる JSON オブジェクトを示する。

PD Handler Modbus Server のメッセージオブジェクト

キー内容データ型方向備考
timeデータ取得日時文字列出力ISO8601拡張書式
prototocolプロトコル文字列出力'tcp' 又は 'rtu'.
node取得先 IP アドレス文字列出力TCP接続時のみ.
portポート番号整数値出力TCP接続時のみ.
deviceデバイスファイル名文字列出力RTU接続時のみ.
unitModbus Unit ID整数値出力
memoメモ文字列出力memo キーに設定された値.
address読み/書き込みアドレス整数値入出力
number読み込むレジスタ数整数値入力
functionModbus function code整数値入出力
data_typeデータの型文字列入出力'uint16_t', 'int16_t', 'uint32lsb_t', 'int32lsb_t', 'uint32msb_t', 'int32msb_t' のいずれか.
valuse読み/書き込み 整数配列 入出力
reply_toリクエストメッセージのMD5文字列出力
result制御ステータス文字列出力'done', 'not queuing', 'failed' のいずれか.
reasonエラーの理由文字列出力

クラウドからからの制御

クラウドから PD Repeater を介し制御(JSON)文字列を送ることで、レジスタマップを読み書きすることができます。
acquisitions オブジェクトの function, data_type, address, number 相当のパラメタと、書き込みファンクションにおいては、valuse に値を記載する。
PD Handler Modbus Client とは異なり自身のレジスタマップを読み書きするため、node, port, unit もしくは device の設定は必要としません。

例えば、入力レジスタを読み込むのであれば、その制御文字列は次のようになります。

{
"function": "0x04", "data_type": "uint16_t", "address": "0x160", "number": 5
}

これに対する応答メッセージは、次のようになります。

{
"time": "2017-09-05T15:30:05.758+09:00",
"reply_to": "14239b236795a8a9e06d60a25c015f2e", "result": "done",
"memo": "Modbus Server 00",
"protocol": "tcp", "node":"192.168.1.8", "port": 502,
"unit":255, "address": 352, "function":4, "data_type": "uint16_t",
"values": [65535, 0, 1, 2, 3]
}

ここで、reply_to は、制御文字列の MD5 です。
レジスタマップに node, port, もしくは device の区別はありませんが、PD Repeater からは異なる localname を持つ個別のデバイスと位置付けられるため、応答メッセージには、制御文字列を受けだ Unix ドメインソケットと対をなす node, port, もしくは device が付加される。

入力レジスタを書き込むのであれば、その制御文字列は次のようになります。

{
"function": "0x14", "data_type": "uint32_t", "address": "0x140",
"values": [4567, 8910, 561, 435]
}

これに対する応答メッセージは、次のようになります。

{
"time": "2017-09-05T16:35:13.653+09:00",
"reply_to": "d5bcc347ad36fa6e7090d0f763108882", "result": "done",
"memo": "Modbus Server 01",
"protocol": "rtu", "device": "/dev/ttyMDF1",
"unit":17, "address":320, "function":20, "data_type": "uint32_t",
"values": [4567, 8910, 561, 435]
}

レジスタマップのダンプと作成

レジスタマップファイル(/var/webui/.modbus_server/registers.map)の内容は、/usr/sbin/pd_handler_modbus_register コマンドを用いて CSV ファイルへダンプもしくは、CSV ファイルからレジスタマップファイルを作成することができます。

pd_handler_modbus_register コマンドのコマンドオプションを示する。

root# /usr/sbin/pd_handler_modbus_register -h
usages: pd_handler_modbus_register [-d][-f <mapfile>][-C <CSV file>]
-d Dump a registers map file to CSV file.
-f mapfile Registers map file. [default: /var/webui/.modbus_server/registers.map]
-C CSV file CSV file path for in/out [default: stdin/stdout]

レジスタマップファイルの CSV ファイルへダンプ例を示する。

root# /usr/sbin/pd_handler_modbus_register -d
#address, coil, discrete_input, register, input_register, comment
0,0,0,0,0,
1,1,0,0,0,
2,0,0,65534,0,
3,0,0,0,0,
4,1,0,3,0,
5,0,1,2,0,
6,1,0,1,0,
7,0,1,0,65534,
8,0,0,65535,65535,
9,0,1,65534,0,
10,0,0,0,1,
11,0,1,0,0,
12,0,0,0,0,
13,0,0,0,0,
14,0,0,0,0,
15,0,0,0,0,
:
2047,,0,0,0,0,

ここで、数値の並びは、

アドレス(0〜2047)、ディジタル出力値、ディジタル入力値、レジスタ出力値、レジスタ入力値

の順です。

値は全て符号なし 16 ビットです。
レジスタマップファイルはコメントを保持しないため、コメント欄は常に空欄となります。

CSV ファイルからレジスタマップファイルを作成する場合は、次のような CVS ファイルを用意し、pd_handler_modbus_register コマンドでレジスタマップファイルに変換する。

// default register map
#address, coil, discrete_input, register, input_register, comment
0,0,0,0,0,
1,1,1,1,1,
8,0,1,65535,65534,
16,0,0,32767,65535,
17,0,0,65535,65535,

CSVファイルは、アドレス 0〜2047 の全てを用意する必要はなく、値を設定する必要があるアドレスだけで構いません。
値は全て符号なし 16 ビットで指定し、ディジタル出力値とディジタル入力値は必ず 0 又は 1とする。 記載されていないアドレスのレジスタ値は 0 がセットされる。 先頭が '#' もしくは '/' の行はコメントと見なされる。

pd_handler_modbus_register コマンドによるレジスタマップファイルへの変換方法は次の通りです。

root# /usr/sbin/pd_handler_modbus_register -C default_register_map.csv