Modbusクライアントの下流方向制御

PD Handler Modbus Client の下流方向制御について説明します。
PD Handler Modbus Client の下流方向制御に用いるJSON文字列のオブジェクトを示します。

PD Handler Modbus Client の下流方向制御に用いるJSON文字列のオブジェクト

キーデータ型必須説明
protocol文字列〇TCP接続機器の場合は"tcp"、RTU接続機器の場合は"rtu"を設定。
node文字列△TCP接続PLC機器のIPアドレスを設定。
port整数△TCP接続PLC機器のポート番号を設定。
device文字列△RTU接続PLC機器のデバイスファイルを設定。
unit整数〇PLC機器のModbusID、1~247又は255(TCP接続のみ)を設定。
function文字列又は整数〇Modbusの下流方向制御に説明するファンクションコードの内、次表PD Handler Modbus Clientで利用可能なファンクションコードに記載されるコードを設定。
data_type文字列又は整数次の何れか
符号なし16ビット整数 :
'uint16_t' 又は '0'
符号付き16ビット整数 :
'int16_t' 又は '1'
符号なし32ビット整数/リトルエンディアン :
'uint32lsb_t' 又は '2'
符号付き32ビット整数/リトルエンディアン :
'int32lsb_t' 又は '3
符号なし32ビット整数/ビッグエンディアン :
'uint32msb_t' 又は '4'
符号付き32ビット整数/ビッグエンディアン :
'int32msb_t' 又は '5'
指定されない場合は、符号なし16ビット整数
address文字列又は整数データが格納されている、あるいは格納するPLC機器上の開始アドレスを設定します。先頭が'0x'の場合は16進数と解釈されます。指定されない場合は、0x00となります。
number文字列又は整数読み書きするレジスタ数を記載します。指定されない場合は、1となります。
values整数配列△書き込むデータ(整数値)の並び

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
0x16Mark Write Registers
0x17Write and Read Registers〇

例えば、TCP接続されている入力レジスタを読み込むのであれば、クラウドより次のような制御メッセージを送ります。

{
"protocol": "tcp", "node": "192.168.1.8", "port": 502, "unit": 255,
"function": "0x04", "data_type": "uinit16_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/ttyEX1",
"unit": 16, "function": "0x10", "data_type": "uint32lsb_t", "address": "0x120",
"values": [4567, 891011]
}

ここで"data _type"が32bitsの場合、"values"は上位/下位の16bitsに分割されて処理されるため、"number"が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]
}

なお、"protocol","node","port","device"で指定されるPLC機器(への接続方法)は、Modbusクライアントデバイスとして登録され使用設定が有効になっているものに限られます。