Modbus機器の仕様の問題点
Modbusは規格とはいえ、ほとんどの機器の仕様において、公式規格から逸脱がみられれます。その為、実際には機器ごとに接続のためのプロトコルを直接プログラムに記述しなければなりませんでした。(ハードコーディング)
FW3.4でのModbus接続機能強化
今回アップデートしたFW3.4では、Modbus機器について、データのモデリングが可能となり、対象Modbus機器のデータに対応したモデルファイルを記述することで、プロトコルを直接プログラムに記述することなく、Modbus機器が接続可能となりました。
一度記述したモデルファイルは、再利用可能のため、既にOpenBlocksで対応済みとなっている機器については、モデルファイル記述も不要で、FW3.4のWeb UIの設定画面でシンプルにプルダウンリストから機種を選ぶだけで済みます。
FW3.4に含まれるPD HandlerによるModbusモデルファイルの取り扱い
従来の PD Handler Modbus では、Modbus のファンクションコードと共にデータのタイプとレジスタのアドレスと個数を直接指定することで、データを整数配列として読み書きしていました。
それに対し、PD Handler Modbus 2 では、モデリングファイルを用意することで、そのインデックスとなるメーカー/プロダクト/モデル/SKU を指定することによりモデルリングファイルの定義に従いデータの読み書きを行います
PD Handler Modbus と PD Handler Modbus 2 の比較
モデルファイルの構造
モデルファイルのインデックスは、以下の 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", : } ]
モデリングファイルの記述例
この例では、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": {} } ] } ] } ] }
詳しくは以下をご覧ください。
OpenBlocksデータハンドリング設定リファレンスガイド
お問い合わせはこちらから
コメント