PD Handler Modbus 2

Modbus モデリングファイル

従来の PD Handler Modbus では、 Modbus のファンクションコードと共にデータのタイプとレジスタのアドレスと個数を直接指定することで、データを整数配列として読み書きしていたのに対し、PD Handler Modbus 2 では、 モデリングファイルを用意することで、そのインデックスとなるメーカー/プロダクト/モデル/SKUを指定することにより、 モデルリングファイルの定義に従いデータの読み書きを行います。

PD Handler Modbus と PD Handler Modbus 2 の比較

PD Handler Modbus 2 を使用するためには、モデリングファイルを用意しなくてはなりませんが、複数のレジスタセットや混在するデータタイプに対するアクセスを一つのインデックスを読み出すことで処理でき、また、JSONキーを自由に割り当てることができ、データの書式も幾つか選択できるようになりました。

インデックスの階層

モデリングファイルのインデックスは、以下の JSON 文字列に示すようにメーカー名、プロダクト名、モデル名、SKU 名の 4 階層で構成され、各階層が JSON オブジェクトの配列となっており、各配列要素を maker オブジェクト、product オブジェクト、model オブジェクト、sku オブジェクトと呼びます。 sku オブジェクトには、レジスタと出力書式を定義する幾つかのオブジェクト配列が含まれています。

[
{
"maker": "Maker Name A",
"products": [
{
"product": "Product Name",
"models":[
{
"model": "Model Name",
"skus": [
{
"sku": "Sku Name",
:
}
]
}
]
}
]
},
{
"maker": "Maker Name B",
:
}
]

なお、PD Handler Modbus 2 には、複数のモデリングファイルをマージするツールが用意されているため、モデリングファイルは SKU やモデル毎に分けて作成することも可能です。

モデリングファイルの例

モデリングファイルの例を示します。
この例では、1 つのファイルに 2 つの SKU が記載されています。
SKU '0001' は、電流と電圧を配列 (ex. "current": [23.1, 45.2], "voltage": [100.2, 100.3]) で出力するのに対し、SKU '0002' は個別 (ex. "current0": 23.1, "current1": 45.2, "voltage0": 100.2 "voltage1": 100.3) に出力します。

{
"maker": "Example Co.,Ltd.",
"include": false,
"products": [
{
"product": "Smart Meter",
"include": false,
"models": [
{
"model": "ZZZ1",
"include": false,
"byteOrder": "lsb",
"wordOrder": "lsb",
"bitOrder": "msb",
"precision": 15,
"skus": [
{
"sku": "0001",
"include": false,
"outputBits": [
{
"address": "0x0101",
"enable": false,
"writeOnly": true,
"bitsArray": [
{ "include": true, "key": "switch" }
]
}
],
"inputRegisters": [
{
"address": "0x0001",
"enable": true,
"registersArray": [
{ "include": true, "type": "int32_t",
"form": "dec", "ratio": 0, "key": "power" },
{ "include": false, "type": "int32_t",
"form": "dec", "ratio": 0, "key": "reversePower" },
{ "include": true, "type": "int32_t",
"form": "dec", "ratio": -1, "key": "current", "array": 2 },
{ "include": true, "type": "int32_t",
"form": "dec", "ratio": -1,"key": "voltage", "array": 2 },
{ "include":false, "type":"int32_t",
"form": "dec", "ratio": 0, "key": "instPower" },
{ "include": false, "type": "uint32_t",
"form": "dec", "ratio": 0, "key": "serialNumber" }
]
}
],
"infos": {}
},
{
"sku": "0002",
"include": false,
"outputBits": [
{
"address": "0x0101",
"enable": false,
"writeOnly": true,
"bitsArray": [
{ "include": true, "key": "switch" }
]
}
],
"inputRegisters": [
{
"address":"0x0001",
"enable":true,
"registersArray": [
{ "include": true, "type": "int32_t",
"form": "dec", "ratio": 0, "key": "power" },
{ "include": false, "type": "int32_t",
"form": "dec", "ratio": 0, "key": "reversePower" },
{ "include": true, "type": "int32_t",
"form": "dec", "ratio": -1, "key": "current0" },
{ "include": true, "type": "int32_t",
"form": "dec", "ratio": -1, "key": "current1" },
{ "include": true, "type": "int32_t",
"form": "dec", "ratio": -1, "key": "voltage0" },
{ "include": true, "type": "int32_t",
"form": "dec", "ratio": -1, "key": "voltage1" },
{ "include": false, "type": "int32_t",
"form": "dec", "ratio": 0, "key": "instPower" },
{ "include": false, "type": "uint32_t",
"form": "dec", "ratio": 0, "key": "serialNumber" }
]
}
],
"infos": {}
}
]
}
]
}
]
}

PD Handler Modbus 2 が読み込むモデリングファイルのルートオブジェクトは、maker オブジェクトの配列でなければなりませんが、モデリングファイルをマージするツールは以上の例のようにルートオブジェクトに maker オブジェクトを配置したファイルも処理することができます。

Modbusモデリングファイルの書式

構文

PD Handler Modbus 2 のモデリングファイルは次の書式で構成されています。

[
{
maker オブジェクト,
"products": [
{
product オブジェクト,
models": [
{
model オブジェクト,
skus": [
{
sku オブジェクト,
"outputBits": [
{
bit オブジェクト,
"bitsArray":[
{
bitsArray オブジェクト,
},
{
bitsArray オブジェクト,
}
]
},
{
bit オブジェクト,
:
}
],
"inputBits": [
{
bit オブジェクト,
:
},
{
bit オブジェクト,
:
}
],
"outputRegisters": [
{
register オブジェクト,
"registersArray": [
{
registersArray オブジェクト,
},
{
registersArray オブジェクト,
}
]
},
{
register オブジェクト,
:
}
],
"inputRegisters": [
{
register オブジェクト,
:
},
{
register オブジェクト,
:
}
],
                "rawRequests": [
rawRequest オブジェクト,
:
                ],
"infos": infos オブジェクト,
"infos_poll": infos_poll オブジェクト,
"infos_od": infos_od オブジェクト
},
{
sku オブジェクト,
:
}
]
},
{
model オブジェクト,
:
}
]
},
{
product オブジェクト,
:
}
]
},
{
maker オブジェクト,
:
}
]

ルートオブジェクト

ルートオブジェクト

キーデータ型説明
JSON配列makerオブジェクトの配列. (最大 32 オブジェクト)

maker オブジェクト

maker オブジェクト

キーデータ型説明
maker文字列メーカー名. (64byte)
include論理値メーカー名を送信するデータに含むか否か. デフォルト値は true.
productsJSON配列product オブジェクトの配列. (最大 32 オブジェクト)

product オブジェクト

product オブジェクト

キーデータ型説明
product文字列プロダクト名. (64byte)
include論理値プロダクト名を送信するデータに含むか否か. デフォルト値は true.
modelsJSON配列model オブジェクトの配列. (最大 32 オブジェクト)

model オブジェクト

model オブジェクト

キーデータ型説明
model文字列モデル名. (64byte)
include論理値モデル名を送信するデータに含むか否か. デフォルト値は true.
wordOrder文字列ワードの順列. 'lsb' 又は 'msb'. デフォルト値は 'lsb'.
byteOrder文字列バイトの順列. 'lsb' 又は 'msb'. デフォルト値は 'lsb'.
bitOrder文字列ビットの順列. 'lsb' 又は 'msb'. デフォルト値は 'lsb'.
wait整数値シリアル接続 PLC 機器に対する読み書きコマンド後の待ち時間 (μsec). デフォルト値は 0.
precision整数値送信するデータとして JSON 文字列にダンプされる際のリアル型データの精度(libjanssonに与えるパラメータ) 1〜17. デフォルト値は 17.
skusJSON配列sku オブジェクトの配列. (最大 32 オブジェクト)

sku オブジェクト

sku オブジェクト

キーデータ型説明
sku文字列sku名. (64byte)
include論理値sku名を送信するデータに含むか否か. デフォルト値は true.
outputBitsJSON配列出力ビットのレジスタ情報. bit オブジェクトの配列 (最大 32 オブジェクト)
inputBitsJSON配列入力ビットのレジスタ情報. bit オブジェクトの配列 (最大 32 オブジェクト)
outputRegistersJSON配列出力レジスタのレジスタ情報. register オブジェクトの配列 (最大 32 オブジェクト)
inputRegistersJSON配列入力レジスタのレジスタ情報. register オブジェクトの配列 (最大 32 オブジェクト)
rawRequestJSON配列RAWリクエストのための情報. rawRequestオブジェクトの配列 (最大 32 オブジェクト)
infosJSON objsku 固有のユーザー定義オブジェクト.
infos_pollJSON objポーリング処理による出力に付加される sku 固有のユーザー定義オブジェクト.
infos_odJSON objオンデマンド処理にいる出力に付加される sku 固有のユーザー定義オブジェクト.

bit オブジェクト

bit オブジェクト

キーデータ型説明
address整数値又は文字列レジスタの開始アドレス. 整数値又は '0x' で始まる 16 進数表記の文字列.
enable論理値このオブジェクトに基づくポーリングによるデータの読み込みを行うか否か. デフォルト値は true.
single論理値単一レジスタの書き込みに Modbus ファンクション 0x05 を用いる. false の場合は 0x0F を用いる. デフォルト値は true.
writeOnly論理値書き込み専用のレジスタ. デフォルト値は false.
bitsArrayJSON配列bitsArray オブジェクトの配列 (最大 512 オブジェクト)

register オブジェクト

register オブジェクト

キーデータ型説明
address整数値又は文字列レジスタの開始アドレス. 整数値又は '0x' で始まる 16 進数表記の文字列.
enable論理値このオブジェクトに基づくポーリングによるデータの読み込みを行うか否か. デフォルト値は true.
single論理値単一レジスタの書き込みに Modbus ファンクション 0x06 を用いる. false の場合は 0x10 を用いる. デフォルト値は true.
writeOnly論理値書き込み専用のレジスタ. デフォルト値は false.
registersArrayJSON配列registersArray オブジェクトの配列 (最大 512 オブジェクト)

rawRequest オブジェクト

rawRequest オブジェクト

キーデータ型説明
key整数値又は文字列この RAW リクエストを呼び出すためのキー. (32byte)
unitId整数値又は文字列RAW リクエストに設定される Modbus ID. 整数値又は '0x' で始まる 16 進数表記の文字列. デフォルト値は Modbus client に設定さる Modbus ID.
function整数値又は文字列RAW リクエストに設定される Modbus ファンクション番号.  整数値又は '0x' で始まる 16進数表記の文字列.
address整数値又は文字列RAW リクエストに設定されるレジスタのアドレス. 整数値又は '0x' で始まる 16 進数表記の文字列.
value整数値又は文字列RAW リクエストに設定されるレジスタの値.  整数値又は '0x' で始まる 16 進数表記の文字列.
form文字列出力メッセージの書式. 'hex'(16 進表記の文字列)、'HEX'(16 進表記の大文字列). デフォルト値は 'HEX'.

bitsArray オブジェクト

bitsArray オブジェクト

キーデータ型説明
include論理値このビット値を送信するデータに含むか否か. デフォルト値は true.
form文字列このビット値の書式. 'bit'(1 or 0 の整数値) または 'bool'(true or false)、'BOOL'(TRUE or FALSE)、'hex'(16 進表記の小文字列)、'HEX'(16 進表記の大文字列). デフォルト値は 'bit'.
key文字列このビット値に与える JSON キー. (32byte)
array整数値配列表記としたい場合は、array キーにその素数の数を指定する.

registersArray オブジェクト

registersArray オブジェクト

キーデータ型説明
include論理値こののレジスタ値を送信するデータに含むか否か. デフォルト値は true.
form文字列このレジスタ値の書式. 'dec'(数値) または 'hex'(16進表記の文字列)、'HEX'(16進表記の大文字列). デフォルト値は 'dec'.
base_ratio整数値値の係数に用いる冪乗値の底を指定する. デフォルト値は10.
ratio整数値値の係数に用いる冪乗値の冪指数を指定する. デフォルト値は 0.
key文字列このレジスタ値に与える JSON キー. (32byte)
array整数値配列表記としたい場合は、array キーにその素数の数を指定する.

モデリングファイル作成支援ツール

PD Handler Modbus 2 のパッケージには、モデリングファイルの構文を確認するツールと複数のモデリングファイルをマージする 2 つの作成支援ツールが用意されています。

モデリングファイル作成支援ツール

パス名説明
/usr/sbin/pd_handler_modbus_2_verifyモデリングファイル 構文確認ツール
/usr/sbin/pd_handler_modbus_2_mergeモデリングファイル マージツール

構文確認ツール

pd_handler_modbus_2_verify は、作成したモデリングファイルの構文を確認するツールです。

pd_handler_modbus_2_verify コマンドのコマンドオプションを示します。

root# /usr/sbin/pd_handler_modbus_2_verify -h
usages: pd_handler_modbus_2_verify [-v] <model file>
-v Show progress.

pd_handler_modbus_2_verify コマンドの実行例を示します。

root# cd /usr/share/pdhms/modbus2/models/OMRON/ SmartPowerMonitor
root# /usr/sbin/pd_handler_modbus_2_verify -v KM-N1-FLK.conf
Read modeling file : KM-N1-FLK.conf
Maker: OMRON
Product: Smart Power Monitor
Model: KM-N1-FLK
SKU: 00
SKU: 01
Verified total 1 makers done.

マージツール

PLC 機器によってはモデリングファイルが数百行に及ぶ場合もあり、 全ての PLC 機器のモデリングを一つのファイルで管理することは現実的でないことから、モデリングファイルについては、プロダクト・モデルもしくは SKU 毎にファイルを分割し、必要に応じて下図のよにディレクトリ階層を細分化して管理することを推奨します。

ディレクトリ階層を細分化した例とフラット展開した例

マージツール pdhandler_modbus_2_merge は、指定されてたディレクトリ下に保存されている .conf のファイルディスクリプタを持つモデリングファイルを再回帰検索し、マージします。
ただし、ASCII 英数字と '-', '
', '.' 以外の記号文字を含むパス名には対応できません。

pd_handler_modbus_2_merge コマンドのコマンドオプションを示します。

root# /usr/sbin/pd_handler_modbus_2_merge -h
usages: pd_handler_modbus_2_merge [-v][-o <file>][<root path>]
-v Show progress.
-o file Output file. [default: stdout]
root path Root path. [default: ./]
pd_handler_modbus_2_merge コマンドの実行例を示します。
```pd_handler_modbus_2_merge_example.txt
root# cd /usr/share/pdhms/modbus2/models/
root# /usr/sbin/pd_handler_modbus_2_merge -v -o /tmp/foo.conf WatanabeElectricInc/
Found 14 files in WatanabeElectricInc/.
Load file: WatanabeElectricInc/WMS/PE1N/00A000_SW4x.conf
Maker: Watanabe Electric Inc.
Product: WMS
Model: PE1N
SKU: 00A000_SW4x
Load file: WatanabeElectricInc/WMS/PE1N/00A000.conf
Maker: Watanabe Electric Inc.
Product: WMS
Model: PE1N
SKU: 00A000
:
(中略)
:
Merge 1 makers.
Maker: Watanabe Electric Inc.
Product: WMS
Model: PE1N
SKU: 00A000_SW4x
SKU: 00A000
Model: PE6N
SKU: 00A007_SW4x-A
SKU: 00A007_SW4x-B
SKU: 00A007-A
SKU: 00A007-B
Product: WMB
Model: DIO8R
SKU: 00D000
SKU: 00D000_SW4x_DIO
Model: DI16A
SKU: 00D000
Model: AI8
SKU: 36D000
Model: DI16
SKU: 00D000
Model: DIO8RA
SKU: 00D000
SKU: 00D000_SW4x_DIO
Model: MAI6
SKU: 36FD000
Dump to /tmp/foo.conf.

PD Handler Modbus 2 Client

PD Handler Modbus 2 Clien は、モデリングファイル pd_handler_modbus_2_model.conf と設定ファイル pd_handler_modbus_2_client.conf、CSVファイル pd_handler_modbus_client.csv の設定に基づき定期的に PLC 機器に Modbus プロトコルで接続しデータを読み取ります。
また、PD Repeater を介しクラウドから送られる JSON 文字列に基づき PLC 機器に Modbus プロトコルで接続しデータを読み書きすることもできます。

デフォルトパス

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

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

パス名説明
/usr/sbin/pd_handler_modbus_2_client常駐実行オブジェクト(デーモン)
/usr/sbin/pd_handler_modbus_2_cliコマンドラインインタフェース
/lib/systemd/system/pd_handler_modbus_2_client.serviceSystemd Service ファイル
/etc/init.d/pd_handler_modbus_2_clientRC ファイル
/var/webui/config/pd_handler_modbus_2_client.conf設定ファイル
/var/webui/config/pd_handler_modbus_2_model.confModbus モデリングファイル
/var/webui/config/pd_handler_modbus_2_model.conf.defaultModbus モデリングファイル(デフォルト)
/var/webui/upload_dir/ pd_handler_modbus_2_client.csvCSV ファイル
/var/run/pd_handler_modbus_2_client.pidPID ファイル

Modbus モデリングファイル(デフォルト)は、Modbus モデリングファイルが存在しない場合に読み込まれます。

設定ファイルの書式

構文

PD Handler Modbu Client 2 の設定ファイルは次の書式で構成されています。

{
"csv_file": "<CSV ファイル>",
"model_file": "<モデリングファイル>",
"clients" : [
{
<clients オブジェクト>
},
{
<clients オブジェクト>
}
]
}

ルートオブジェクト

ルートオブジェクト

キーデータ型説明
csv_file文字列CSVファイルののパス名. デフォルト値は、'/var/webui/upload_dir/pd_handler_modbus_2_client.csv'. (MAXPATHLEN)
model_file文字列Modbusモデリングファイルのパス名. デフォルト値は、'/var/webui/config/pd_handler_modbus_2_model.conf'. (MAXPATHLEN)
clientsJSON配列clientsオブジェクトの配列 (最大 64 オブジェクト)

clients オブジェクト

clients オブジェクトは、PD Handler Modbus 2 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.
reply論理値下流方向制御に対しステータスメッセージを返すか否か. デフォルト値は false.
protocol文字列接続プロトコル 'tcp' 又は 'rtu' を指定. デフォルト値は 'tcp'.
timeout整数値データを取得出来ない場合のタイムアウト(msec). デフォルト値は 5000.
node文字列【TCP接続】PLC 機器の IP アドレス. デフォルト値は'127.0.0.1'
port整数値【TCP接続】PLC 機器のポート番号. デフォルト値は 502.
device文字列【RTU接続】シリアル接続のデバイス名. デフォルト値は '/dev/ttyRS485'
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整数値【RTU接続】設定される値を越えて接続エラーが連続して発生した場合にシリアルポートをリセットする. デフォルト値は 10.
id_form文字列Modbus Id の表記フォーマト. 'dec'(数値) または 'hex'(16進表記の文字列)、'HEX'(16進表記の大文字列). デフォルト値は 'dec'.
timestamp_key文字列タイムスタンプのキーを設定する. デフォルト値は 'timestamp' (32byte)
infosJSON obj出力に付加される Modbus クライアント ノード固有のユーザー定義オブジェクト.
acquisitionsJSON配列acquisitions オブジェクト. (最大 32 オブジェクト)

acquisitions オブジェクト

acquisitions オブジェクト

キーデータ型説明
enable論理値デフォルト値は false.
makre文字列モデルファイルに定義されるメーカー名 (64byte)
product文字列モデルファイルに定義されるプロダクト名 (64byte)
model文字列モデルファイルに定義されるモデル名 (64byte)
sku文字列モデルファイルに定義される sku 名 (64byte)
unitId整数値又は文字列PLC 機器のModbus ユニットID. 1 ~ 247 又は 255 (TCP プロトコルのみ). '0x' で始まる 16 進数表記の文字列入力も可能.
include論理値unitId を送信するデータに含むか否か. デフォルト値は true.
interval整数値データを取得する間隔(sec). デフォルト値は 60.
time_sync論理値基準時刻制御モード. デフォルト値は false.
base_time文字列基準時刻制御モードの基準時刻を 'HH:MM' 形式で指定する. デフォルト値は '00:00'.
infosJSON obj出力に付加されるデータ取得対象 PLC 機器固有のユーザー定義オブジェクト.

CSVファイル

PD Handler Modbus Client 2 は、CSVファイル /var/webui/upload_dir/pd_handler_modbus_2_client.csv が存在すると同ファイルより acquisitions オブジェクトに相当する設定パラメータを読み込み、設定ファイル /var/webui/config/pd_handler_2_modbus.conf から読み込んだパラメータを上書きします。
CSVファイルに設定される情報は、clients オブジェクトの localname とacquisitions オブジェクトの unitId, include, maker, product, model, sku, infos, interval, time_sync, base_time です。ただし、infos オブジェクトは、2 組の key と値(文字列)に限定され、また不要な場合は空欄とします。
パラメータの並びは次の通りで、パラメータの区切りはコンマ ','、先頭がシャープ '#' 又はスラッシュ '/' の場合はコメント行として扱います。

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

localname, include, maker, product, model, sku, key1, value1, key2, value2, interval, time_sync, base_time

パラメータのデータ型は acquisitions オブジェクトと同じですが、JSON 文字列とは異なり文字列に空白が含まれない限り、文字列を '"' で括る必要はありません。 なお、localname が設定ファイルに存在しない場合は、無効となります。

記載例

#localname,unitId,include,maker,product,model,sku,key1,val1,key2,val2,interval,time_sync,base_time
mdc2dev_0000001,1,1,"Toukou Toushiba","SmaMe Series",S2MS-RNS22,0001,IBS,1-1,Mater,1,300,true,00:00
mdc2dev_0000001,2,1,"Toukou Toushiba","SmaMe Series",S2MS-RNS22,0001,IBS,1-1,Mater,2,300,true,00:00
mdc2dev_0000001,3,1,"Toukou Toushiba","SmaMe Series",S2MS-RNS22,0001,IBS,1-2,Mater,1,300,true,00:00
mdc2dev_0000001,4,1,"Toukou Toushiba","SmaMe Series",S2MS-RNS22,0001,IBS,1-2,Mater,2,300,true,00:00

基準時刻制御モード

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

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

取得時間間隔の設定値実動作値
0 ~ 19960
120 ~ 179120
180 ~ 299180
300 ~ 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 2 Client のメッセージオブジェクト

キー内容データ型方向備考
timestampデータ取得日時文字列出力ISO8601拡張書式. キーの名称は 'timestamp_key'. で変更可能.
unitIdModbus Unit ID整数値又は文字列入出力clients オブジェクト の 'include' が true 時のみ出力.
makreメーカー名文字列出力モデリングファイルの maker オブジェクトの 'include' が true 時のみ.
productプロダクト名文字列出力モデリングファイルの product オブジェクトの 'include' が true 時のみ.
modelモデル名文字列出力モデリングファイルの model オブジェクトの 'include' が true 時のみ.
skusku 名文字列出力モデリングファイルの sku オブジェクトの 'include' が true 時のみ.
reply_toリクエストメッセージの MD5文字列出力clients オブジェクトの 'reply' が true 時のみ.
request_fromリクエストメッセージの送付元クラウドID文字列出力clients オブジェクトの 'reply' が true 時のみ.
result制御ステータス論理値出力clients オブジェクトの 'reply' が true 時のみ.
reasonエラーの理由文字列出力clients オブジェクトの 'reply' が true 時のみ.
write書き込み制御JSON obj入力モデリングファイルに定義されるキーと値.
rawRequestRAWリクエストJSON obj入力モデリングファイルに定義される RAWリクエストキーと値. モデリングファイルに定義される値を持ちいる場合は値を null にする.

クラウドからの制御

クラウドから PD Repeater を介し制御(JSON)文字列を送ることで、接続されている PLC 機器のレジスタを読み書きすることができます。
制御文字列には、PLC 機器を特定するため acquisitions オブジェクトの unitId を記載します。

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

{
"unitId”: 3
}

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

{
"timestamp": "2019-11-07T11:19:08.949+09:00"
"request_from": "0x13(0)",
"reply_to": "6bee94d5a2f29eb63b5faecd7e8af8d9", "result": true,
"unitId": 3,
"doValue_ch1": 0, "doValue_ch2": 0, "doValue_ch3": 0, "doValue_ch4": 0,
"diValue": [0, 0, 0, 0],
"pulseCoutLimit": [99999999, 99999999, 99999999, 99999999],
"pulseCountReset_ch1": 0, "pulseCountReset_ch2": 0,
"pulseCountReset_ch3": 0, "pulseCountReset_ch4": 0,
"pulseCount": [10000, 0, 0, 0]
}

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

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

{
"unitId": 3, "write": { "doValue_ch1": 1, "pulseCountReset_ch1": 1 }
}

ここで write オブジェクトに与えられるキーと値は、モデリング の outputBits オブジェクト配列内の bit オブジェクト、又は outputRegisters オブジェクト配列内の registers オブジェクトに指定される key, type, array に応じた値でなくてはなりません。但し書き込み処理において base_ratio と ratio を用いた数値の逆変換は行われません。

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

{
"timestamp": "2019-06-11T15:30:05.758+09:00",
"request_from": "0x13(0)",
"reply_to": "38bfe79195fc09b37b6a85b6fdc97d73", "result": true,
"doValue_ch1": 1, "doValue_ch2": 0, "doValue_ch3": 0, "doValue_ch4": 0,
"pulseCountReset_ch1": 1
}

書込み制御は、outputBits オブジェクト配列内のbitオブジェクト、又は outputRegisters オブジェクト配列内の registers オブジェクトの単位で行われます。

書込み処理においては、連続しない複数のレジスタに対する制御を効率良く処理するため、bit オブジェクト又は register オブジェクトに定義されるレジスタの全てを PLC 機器からプログラムに読み込み、write キーに指定されるレジスターのみを書き換えた後、レジスタの全てを PLC 機器へ書き戻します。

CLI (pd_handler_modbus_2_cli)

pd_handler_modbus_2_cli は、クラウドからの制御をローカルに行うためのアプリケーションです。
PLC 機器の初期設定(ディジタル出力もしくは出力レジスタへの書き込み)やモデリングファイルの確認などに用いるものですが、制御対象が RTU 接続の場合は、pd_handler_modbus_2_client とインタフェースが競合するため、pd_handler_modbus_2_client を停止した上で使用することを推奨します。

pd_handler_modbus_2_cli のオプションを示します。

root# /usr/sbin/pd_handler_modbus_2_cli -h
usages: pd_handler_modbus_2_cli [-adqr][-c <conf file>][-C <CSV file>][-l <local name>]
[-m <model file>] <control JSON strings>
-a Force enable all for read.
-c conf file Conf file. [default: /var/webui/config/pd_handler_modbus_2_client.conf]
-C CSV file CSV file for multiple acquisitions.
[default: /var/webui/config/pd_handler_modbus_2_client.csv]
-d Debug mode.
-l local name Local name. [default: mdcdev_0000001]
-m model file Modbus model file.
[default: /var/webui/config/pd_handler_modbus_2_model.conf]
-q Quiet mode.
-r Read only for writ process.

'-a' オプションは、モデリング上 disable ('enable' キーが false) とされているレジスタも読み出します。

例えば、Modbus ID 3 の PLC 機器のレジスタを読み込むのであれば、pd_handler_modbus_2_cli の引数にクラウドからの制御と同じ制御文字列を与えます。

root# pd_handler_modbus_2_cli '{"unitId": 3}'

これに対し応答メッセージは、標準出力に返されます。

{
"timestamp": "2019-06-11T15:30:05.758+09:00",
"maker":"Toukou Toushiba", "product":"SmaMe Series", "model":"S2MS-RNS22", "sku":"0001",
"switch": 1, "power": 1234, "reversePower": 4567, "current":[2.5, 3.1],
"voltage":[101.2, 101.3], "instPower": 5678, "serialNumber": 112345678
}

クラウドから制御した場合と異なり、reply_to と result は出力されません。

同 PLC 機器の出力レジスタに値を書き込むのであれば、pd_handler_modbus_2_cli の引数は次のようになります。

# pd_handler_modbus_2_cli '{"unitId": 3, "write":{"switch": 0}}'

ここで write オブジェクトに与えられるキーと値は、モデリングの outputBits オブジェクト配列内の bit オブジェクト、又は outputRegisters オブジェクト配列内の registers オブジェクトに指定される key, type, array に応じた値でなくてはなりません。但し書き込み処理において base_ratio と ratio を用いた数値の逆変換は行われません。

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

{
"timestamp":"2019-06-11T15:30:05.758+09:00",
"maker":"Toukou Toushiba", "product":"SmaMe Series", "model":"S2MS-RNS22", "sku":"0001",
"switch": 0
}

PD Handler Modbus 2 Server

PD Handler Modbus Server 2 は、モデリングファイル pd_handler_modbus_2_model.conf と設定ファイル pd_handler_modbus_2_server.conf の設定に基づき共有メモリにレジスタマップを構成し PLC 機器(Modbusクライアント)からの接続を待ち受け、PLC 機器(Modbusクライアント)の書き込み操作によりレジスタの値を更新すると共に、更新されたレジスタとその値を PD Repeater を介してクラウドへ送ります。
また、PD Repeater を介しクラウドから送られる JSON 文字列に基づき、レジスタマップを読み書きすることができます。
レジスタマップは、60 秒毎に更新があれば、共有メモリからレジスタマップファイルに出力(バックアップ)されます。

デフォルトパス

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

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

パス名説明
/usr/sbin/pd_handler_modbus_2_server常駐実行オブジェクト(デーモン)
/etc/init.d/pd_handler_modbus_2_serverRC ファイル
/lib/systemd/system/pd_handler_modbus_2_server.serviceSystemd Service ファイル
/var/webui/config/pd_handler_modbus_2_server.conf設定ファイル
/var/webui/config/pd_handler_modbus_2_model.confModbus モデリングファイル
/var/webui/config/pd_handler_modbus_2_model.conf.defaultModbus モデリングファイル(デフォルト)
/var/webui/.modbus_2_server/<localname>.mapレジスタマップファイル
/var/run/pd_handler_modbus_2_server.pidPID ファイル

Modbus モデリングファイル(デフォルト)は、Modbus モデリングファイルが存在しない場合に読み込まれます。

設定ファイルの書式

構文

PD Handler Modbu Server 2 の設定ファイルは次の書式で構成されています。

{
"model_file": "<モデリングファイル>",
"backup_interval": バックアップ周期,
"servers" : [
{
<servers オブジェクト>
},
{
<servers オブジェクト>
}
]
}

ルートオブジェクト

ルートオブジェクト

キーデータ型説明
model_file文字列Modbusモデリングファイルのパス名. デフォルト値は、'/var/webui/config/pd_handler_modbus_2_model.conf'. (MAXPATHLEN)
backup_interval整数値レジスタをファイルにバックアップする周期(sec)を指定する. デフォルト値は 60.
serversJSON配列serversオブジェクトの配列. (最大 8 オブジェクト)

servers オブジェクト

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

servers オブジェクト

キーデータ型説明
enable論理値デフォルト値は false.
localname文字列デバイスのローカル名. (32byte)
map_file文字列レジスタマップファイルのパス名. デフォルト値は /var/webui/.
modbus_2_server/<localname>.map
bind文字列制御メッセージを受け取るソケット名. 文字列の先頭が '@' の場合は abstract namespace と解釈する. 空の場合は、デフォルト値 '@/pd_handler/<localname>.sock' が設定される. (MAXPATHLEN)
push_to文字列データの送り先ソケット名. 文字列の先頭が '@' の場合は abstract namespace と解釈する. 空の場合は、デフォルト値 '@/pd_repeater/<localname>.sock' が設定される. (MAXPATHLEN)
buffer_size整数値データのバッファサイズ(byte). デフォルト値は 4096.
receive論理値クラウドからメッセージを受け取る下流方向制御)か否か. デフォルト値は false.
reply論理値下流方向制御に対しステータスメッセージを返すか否か. デフォルト値は false.
protocol文字列接続プロトコル 'tcp' 又は 'rtu' を指定. デフォルト値は 'tcp'.
timeout整数値データを取得出来ない場合のタイムアウト(msec). デフォルト値は 5000.
node文字列【TCP接続】待ち受けIP アドレス. デフォルト値は'127.0.0.1'.
port整数値【TCP接続】待ち受けポート番号. デフォルト値は 502.
device文字列【RTU接続】シリアル接続のデバイス名. デフォルト値は '/dev/ttyRS485'.
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 の場合は自動設定される値.
maker文字列モデルファイルに定義されるメーカー名 (64byte)
product文字列モデルファイルに定義されるプロダクト名 (64byte)
model文字列モデルファイルに定義されるmodel名 (64byte)
sku文字列モデルファイルに定義される sku 名 (64byte)
unitId整数値又は文字列PLC 機器の Modbus ユニット ID. 1 〜 247 又は 255 (TCPプロトコルのみ). '0x' で始まる 16 進数表記の文字列入力も可能.
include論理値unitId を送信するデータに含むか否か. デフォルト値は true.
id_form文字列Modbus Id の表記フォーマト. 'dec'(数値) または 'hex'(16進表記の文字列)、'HEX'(16進表記の大文字列). デフォルト値は 'dec'
timestamp_key文字列タイムスタンプのキーを設定する. デフォルト値は 'timestamp' (32byte)
infosJSON obj出力に付加される Modbus クライアントノード固有のユーザー定義オブジェクト

メッセージオブジェクト

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

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

キー内容データ型方向備考
timestampデータ取得日時文字列出力ISO8601拡張書式. キーの名称は 'timestamp_key'. で変更可能.
unitIdModbus Unit ID整数値又は文字列出力servers オブジェクト の 'include' が true 時のみ出力.
makreメーカー名文字列出力モデリングファイルの maker オブジェクトの 'include' が true 時のみ.
productプロダクト名文字列出力モデリングファイルの product オブジェクトの 'include' が true 時のみ.
modelモデル名文字列出力モデリングファイルの model オブジェクトの 'include' が true 時のみ.
skusku 名文字列出力モデリングファイルの sku オブジェクトの 'include' が true 時のみ.
reply_toリクエストメッセージの MD5文字列出力servers オブジェクトの 'reply' が true 時のみ.
request_fromリクエストメッセージの送付元クラウドID文字列出力clients オブジェクトの 'reply' が true 時のみ.
result制御ステータス論理値出力serverss オブジェクトの 'reply' が true 時のみ.
reasonエラーの理由文字列出力serverss オブジェクトの 'reply' が true 時のみ.
write書き込み制御JSON obj入力モデリングファイルに定義されるキーと値.

クラウドからの制御

クラウドから PD Repeater を介し制御(JSON)文字列を送ることで、レジスタマップの読み取りと入力レジスタに対する書き込みができます。

レジスタマップを読み取る場合は、空の制御文字を送ります。

{ }

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

{
"timestamp": "2019-06-11T15:30:05.758+09:00",
"request_from": "0x13(0)",
"reply_to": "99914b932bd37a50b983c5e7c90ae93b", "result": true,
"unitId": 16,
"maker":"Plat Home", "product":"Modbus Handler", "model":"Test Server", "sku":"001",
"do00": "0x24", "do01": "0x36", "do02": "0xcd", "do03": "0xac",
"di00": "0x00", "di01": "0x00", "di02": "0x00", "di03": "0x00",
"rego00": 128, "regi01": 25, "regi02": -1, "regi03": 45,
"regi": [0, 0, 0, 0]
}

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

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

{
"write": { "di00": "0xff", "regi": [123, 456, 678, 910] }
}

ここで write オブジェクトに与えられるキーと値は、モデリングの inputBits オブジェクト配列内の bit オブジェクト、又は inputRegisters オブジェクト配列内の registers オブジェクトに指定される key, type, ratio に応じた値でなくてはなりません。但し書き込み処理において base_ratio と ratio を用いた数値の逆変換は行われません。

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

{
"timestamp": "2017-06-11T16:35:13.653+09:00",
"reply_to": "9e5d68f8ce9bb5dc3e86f2d3c2ef4167", "result": true,
"request_from": "0x13(0)",
"unitId": 16,
"maker": "Plat Home", "product": "Modbus Handler", "model":"Test Server", "sku":"001",
"di00": "0xff", "regi": [123, 456, 678, 910]
}