LUA言語拡張ハンドラ
LUA言語は、C言語ベースのバイナリー実行モジュールに、高級言語スクリプト実行環境をアドオンできるシステムです。
OpenBlocksのPD Handlerではシステムソフトウェアの主だった処理系がLUA言語から利用できる関数として用意されており、LUA言語スクリプトを用いて機能を拡張することができます。
例えばEnOceanデバイスの様にプロファイルがあれば、そのプロファイルによってバイナリーデータ列が規則化されているので、EnOceanコミュニティからプロファイルの仕様を手に入れれば、容易にデータを抽出しjsonテキスト化ができます。
本章ではBLE(ビーコン型センサー)とEnOcean(EEP仕様)およびRS-232CやRS-485などのシリアル通信の機能拡張ハンドラの作成について解説しています。
また、Luaを利用する前には、BLE/EnOcean/RS-SERIALなどの各ハンドラを前もってモジュール起動制御でアクティブにしておく必要があります。
Luaソースコードの配置
それぞれBLE/EnOcean/RS-SERIAL各ハンドラ毎にソースコードを下図例の通りディレクトリ分けして配置してあります。
また、それぞれのLuaファイルはdevicesディレクトリとdevices_customディレクトリの二つの領域に区別し保存しています。
devicesディレクトリ
ぷらっとホームから提供される標準対応センサー用のLuaファイルの保存領域です。
devices_customディレクトリ
ユーザーが自分でカスタマイズしたLuaファイルを保存する領域です。
funcディレクトリ
ぷらっとホームから提供される標準ユーティリティ関数のLuaファイルを保存する領域です。
func_customディレクトリ
ユーザーが自分でカスタマイズしたユーティリティ関数のLuaファイルを保存する領域です。
標準サポートセンサーのLuaファイルを手直して使う
devicesディレクトリから標準の任意センサーのLuaソースコードをダウンロードして、改造した後にファイル名をそのまま変えずにdevices_customディレクトリへアップロードすれば、
標準のdevicesディレクトリあるLuaスクリプトよりも優先して実行(実際には上書)されます。
クラウドに送信されるjsonメッセージは、jo.で始まるテーブルに例えばメンバを jo.temperature = 30 とすることで {"temperature":30} がjsonに追加されます。
またはもともとjo.temperature = 30たっだのをjo.temp = 30とすれば出力は {"temp":30} と変更されます。
(ここで説明されているjson例は該当部分のみです。)
カスタムしたLuaを有効にする
Luaスクリプトを編集・作成後、Luaファイルを保存しただけではシステムに反映されません。
このためプロセスの再起動が必要になります。
プロセスの再起動はダッシュボードで行います。
BLE Lua
BLE 接続で知っておくこと
通常、BLEのアドバタイジングでセンサデータを受けるビーコン型センサーが、IoTシステムとして何年もの間に安定してデータを受信し続けられるために一般的に使われています。
これはBLEデバイスがアドバタイズ(定期的に発するビーコン)によって一方的に送出してくる電波を、単に受信するだけの一方通行通信であるため、プロトコルを必要とせず安定しているためです。
これに対してBLEコネクションモード(GATT通信とも呼ばれる)は、電波の状態に影響を受けやすいため非常に安定性が悪く、また、センサーメーカー毎のプロトコルの作りに互換性が無く、コネクション切断毎の処理系がマチマチでその復旧方法も曖昧でした。
どちらかと言うとスマートフォンでデータを見たい時、一時的なコネクションで一気にデータを取り込むような使い方あれば多機能なコネクション型が向いていますが、IoTの様に24/365での接続を求めるシステム向きではありません。
長時間接続するといつの間にかにコネクションが切れたり、BLEデバイスとホスト装置のステートが不一致になり、最悪、現場に設置してあるBLEデバイスの電源を入れなおさないと復帰できないようなケースもあります。
こう言った現象はホスト側であれば再起動などでの復帰も可能ですが、BLEデバイスによっては電源を切るしか方法が無いものが多くあります。
しかしIoTでも下流制御が必要な場合もあるため、この場合は、センサーの通常ステータスの取得は安定したアドバタイジングデータで受信をします。
そして制御に必要になった場合にのみ、コネクションモードでBLEデバイスを制御し、制御が終わった時点で即ディスコネクトすることで、デッドロックリスクの高いコネクションモードでの接続を短時間で終わらせる事ができます。
BLEのLuaハンドラの関数構成
BLEのLuaハンドラは、1つのセンサーに1つのスクリプトが用意されています。
このスクリプトにはアドバタイジング用のビーコンハンドラと、コネクションモード用のGATT通信ハンドラが混載されており、各々に対応した関数で動作を分けています。
LuaスクリプトはBLEのデバイス登録の際、そのデバイス用のLuaハンドラーを各々選んで登録して下さい。
.parse_adv()
アドバタイジング用関数は、センサーからのアドバタイジングを受けた時に呼ばれる関数です。
.parse_beacon()
ビーコン用関数はWEB-UIでビーコン指定(dataのプレフィックスで指定されるデバイス)されたアドバタイジングを受信した時に起動する関数です。
.gatt_exec()
コネクションモード(GATT)用の関数は、WEB-UIで設定したシステムインターバルタイマーの間隔で起動されます。
.downstream_exec()
クラウド(上流)からの制御命令を受けた時に起動する関数は以下の通りです。
その他、ユーザーが別の名前の関数を定義してサブルーチンを作ることは自由です。
BLEアドバタイジング対応のLua
BLEデバイスが一方的にアドバタイジングによって送信してくるセンサーデータを受けるためのハンドラ作成について説明します。
この例はビーコン用のハンドラの参考にもなります。
BLEハンドラはC言語部分とLUA言語部分で構成され、共通の部分をC言語で、カスタム部分をLua言語で記述する構成となっています。
標準サポートのセンサーのLuaハンドラーは以下のディレクトリに保存されています。
BLEから受信したアドバタイズのデータ部分であるペイロードには、デバイスメーカーが自由に使っていい領域があり、BLEハンドラではこのペイロード部分をLua言語に渡しています。
OpenBlocksが起動後、PD HandlerがBLEビーコンを受信するとBLE登録で登録されたデバイスのみ選別されWEB-UIで設定したLua関数に送り込まれます。
ここではナカヨ製ボタン付きBLEビーコンのハンドラソースコードをサンプルに説明します。
※このビーコンはiBeaconに互換です。
※仕様変更もありえる詳細はナカヨ様の最新仕様書で確認して下さい。
NAKAYO_NYCBCON.lua
ナカヨ製ボタン付きBLEビーコンは、ボタンを長押しするとjo.pushの値が "1 → 2 → 3 → 1 → 2" と変化します。
BLEビーコンセンサにはiBeacon規格以外のもあるので、デバイスマッチングについては他のソースコードも参考にして下さい。
以上のコードでIoTクラウドへ送信されるjsonテキストは以下の通りになります。
その他のセンサーのjsonテキストはこちらを参照して下さい。
それぞれのセンサ毎にLuaで書かれたソースコードがdevicesディレクトリにあります。
編集が終わったら、<メーカー名>_<デバイス名>.luaと名前を付けてdevices_customディレクトリにアップロードして下さい。
GATT通信(双方向通信)
BLEはGATT通信を使う事で双方向通信となり下流デバイスの制御が可能となります。
GATTを使う上で理解しておくこと
BLEを使ったIoT機器にはビーコンの様に、アドバタイジングと言うデータを垂れ流すだけの一方通行の通信方式が、動作安定性が高く一般的に使われている通信方法です。
このアドバタイジングにセンサーデータを一緒に乗せてしまう事で複数の受信機でセンサーデータを得る事ができます。
このアドバタイジングに対し通信プロトコルによって双方向のやり取りを行い、単一の受信機でセンサーなどのデータをやり取りする方式がGATT通信です。
GATTは1対1接続でかつ暗号化などの機能を持つためセキュリティの高い通信ではありますが、BLEの使う通信帯域は非常に混雑しているためにエラーリトライが多発する不安定な要素も多々あります。
このため秘匿する様なデータでは無く、また機器制御(下流制御)を必要の無い通信では、アドバタイジングモードでの通信を奨めてます。
GATT通信の概要
GATT通信はとあるレジスタに対して読み書きを行う事で通信を行います。
このとあるレジスタはUUIDという名前で管理されており、このレジスタは複数バイトの16進数を用いられて表現されています。
このUUIDで表現されるレジスタは、デバイスによって複数バイトで構成されており、大体20Byte程度に収まる様な構成になっており、このUUIDの何バイト目で何ビット目の位置などで各々に意味を持たせています。
特定のBLEデバイスにアクセスするには、ホストとなる装置がscanと言う電波を送信すると、各々の応答可能なBLEデバイスが、アドバタイジング電波を送信します。
ホストはこのアドバタイジング情報から任意のBLEデバイスを見つけてコネクション動作に入ります。
コネクションに成功すると、接続されたBLEデバイスが持つUUIDのリストや接続ハンドル、通信パラメータをホストが得ます。
GATT通信ではペアリングによって、特定のホストとの接続限定や暗号化する場合もあれば、ペアリングなしで接続できるデバイスもあります。
これらの情報交換も行われてコネクションが完了します。
この状態から指定したUUIDに対して読み書きする事で通信が始まります。
それぞれのUUIDには書き込み専用・読み込み専用・読み書き両用があるので各々のデバイスの仕様書で確認して下さい。
そして通信が終わった時点で、ディスコネクトする事で一連の処理が完了します。
OpenBlocksでのGATTアクセス関数
OpenBlocksではGATTアクセスライブラリを用意しており、以下の手順通りライブラリで操作を行うことにより容易にGATT通信を可能にします。
またライブラリの使用においてUUIDをhandleに置き換えてアクセスする方法を取っているので、これを混同しないように注意して下さい。
このライブラリではUUIDとhandleが1対1で紐づけられています。
以下にGATTアクセスに用意されたLua関数を示します。
LUA_gatt_connect()
BlutoothデバイスアドレスdeviceIdにGATT接続します。
LUA_ble_read()
Bluetoothデバイスの指定したUUIDハンドルからデータを読み込みます。
LUA_ble_write()
Bluetoothデバイスの指定したUUIDハンドルにデータを書き込みます。
LUA_gatt_disconnect()
BluetoothデバイスとのGATT接続を切断します。
GATT通信の応用のUARTサービスとインターバルによる自発的なデータ送信関数
BLEデバイスによっては、UUIDを受信専用のものと送信専用のものと分けて実装し、データ転送を20Byte程度の単位に抑えて少しずつ転送を行い一般のシリアル通信の様な動作機能を持つデバイスがあります。
ホストはこういったデバイスを相手にする時、特定のUUIDを受信ポート・送信ポートと見立ててシリアル通信を行う事が必要があります。
もう一つは、BLEデバイスが自分のインターバルタイマによって定期的にデータを送信してくる機能への対応です。
例えば1分毎に消費電力を通知させるような場合に使います。
OpenBlocksのGATTライブラリでは、こういった動作もサポートできるように作られています。
なお、これらの関数は、前記、LUA_gatt_connect、LUA_gatt_disconnect、と一緒に利用します。
以下がBLEデバイスの自発的な通知を制御する関数です。
LUA_ble_register_notify()
BLEデバイスの自発的な通知を有効にします。
LUA_ble_notify_show()
BLEデバイスからの通知されたデータを取得します。
LUA_ble_unregister_notify()
BLEデバイスの自発的な通知を無効にします。
BLEハンドラ用のユーティリティ関数
その他ユーティリティ関数です。
LUA_send_sensor_data()
データをクラウド(上流)へ送信します。
LUA_ble_getcrc8()
CRC8を取得する(UARTサービスなどで必要な場合に使う)
LUA_ble_sleep()
プロセスをスリープする(秒単位)
LUA_ble_usleep()
プロセスをスリープする(マイクロ秒単位)
GATT通信のLuaハンドラーサンプル
このサンプルではセンサーデータのパースを行っていないので、パースについては他のセンサーハンドラを参考にして下さい。 このサンプルはdevices_customディレクトリの skelton.lua です。
skelton.lua
アップロード/ダウンロード操作
作成したLuaハンドラのアップロードや、参考にするLuaハンドラのダウンロード操作は以下の通りです。
BLE Lua メニューの操作項目
設定項目 | 説明 |
---|---|
更新 | Luaファイルのアップロード先のファイル一覧表示を更新します。 |
削除 | ファイルを選択後削除 ボタンで削除します。削除可能なファイルはカスタム用ディレクトリ配下のファイルです。 |
ダウンロード | ファイルを選択後ダウンロード ボタンでクライアントパソコンのダウンロードフォルダにファイルをダウンロードします。 |
実行権付与 | ファイルを選択後実行権付与 ボタンで実行権を付与します。通常では不要です。 |
アップロード先 | アップロードしたいディレクトリをプルダウンから選択して下さい。 ※対象ディレクトリ配下がプルダウン対象です。 |
アップロード | ファイルを選択 ボタンを押すと、クライアントパソコンのファイル一覧から指定のファイルを選択してアップロードできます。*1 |
info
- アップロード後にプロセスの再起動が必要なので、ダッシュボードから停止・起動の操作を行って下さい。
caution
アップロード先にLuaファイル以外が存在している場合には正常に動作しません。
Luaファイル以外を置かないで下さい。
EnOcean Lua
EnOceanはEEP(EnOcean Equipment Profile)というプロファイルでデバイスが定義されています。
また一部のGP(Generic Profile)のデバイスについても対応していますが、Tech-inデータを用いない為EEPデバイスと同様にGPから始まるプロファイルを使用します。
EnOcean登録とLua関数の関係
EnOceanデバイスはBLE機器に比べプロファイルと言う形式をとっているため、データ形式が規格化されているため扱い易いです。
デバイス毎のハンドラは以下の通り、devicesディレクトリにプロファイル名でLuaハンドラが登録されています。
IoTデータ⇒EnOcean Luaタブの操作画面の以下のディレクトリです。
EnOceanを受信登録するする時はEnOcean登録でデバイスIDとEEPの登録が必須です。
ここで登録されたEEPあわせて、devicesディレクトリに登録されたLuaハンドラーの中から該当するハンドラーが選択され実行します。
※EnOceanハンドラはBLEハンドラとは違ってLuaを呼ばれた時点でデバイスのプロファイルが決定しています。
ユーザースクリプトは以下のdevices_customディレクトリに保存するので、ここに置いてある"skelton.lua"をダウンロードして、テンプレートにすると良いです。
skelton.lua
登録したいEEPは次のようなデバイスのものです。
EnOceanアライアンスのEEP仕様書から A50205 |
---|
最初に"skelton"文字列をデバイスのEEPに置換します。
かつ、クラウド送信用のjo配列のメンバーにtemperatureを追加しtemperaturen値を計算し代入します。
※元のskeltonは受け取ったデータをそのまま16進テキスト文字列でjsonで送るものです。
skelton.lua(編集後)
以上のコードでIoTクラウド送信用のjsonテキストは以下の様になります。
その他のセンサーのjsonテキストはこちらを参照して下さい。
編集が終わったら、<プロファイル名>.luaと名前を付けてdevices_customディレクトリにアップロードして下さい。
アップロード/ダウンロード操作
作成したLuaハンドラのアップロードや、参考にするLuaハンドラのダウンロード操作は以下の通りです。
EnOcean Lua メニューの操作項目
設定項目 | 説明 |
---|---|
更新 | Luaファイルのアップロード先のファイル一覧表示を更新します。 |
削除 | ファイルを選択後削除 ボタンで削除します。削除可能なファイルはカスタム用ディレクトリ配下のファイルです。 |
ダウンロード | ファイルを選択後ダウンロード ボタンでクライアントパソコンのダウンロードフォルダにファイルをダウンロードします。 |
実行権付与 | ファイルを選択後実行権付与 ボタンで実行権を付与します。通常では不要です。 |
アップロード先 | アップロードしたいディレクトリをプルダウンから選択して下さい。 ※対象ディレクトリ配下がプルダウン対象です。 |
アップロード | ファイルを選択 ボタンを押すと、クライアントパソコンのファイル一覧から指定のファイルを選択してアップロードできます。*1 |
info
- アップロード後にプロセスの再起動が必要なので、ダッシュボードから停止・起動の操作を行って下さい。
caution
アップロード先にLuaファイル以外が存在している場合には正常に動作しません。
そのため、ファイル内容については skelton.lua を参考に作成して下さい。
標準登録センサーのLuaハンドラ編集
例えば"EEP:A50205"と言うセンサーでクラウドに送信するキー名"temperature"となっているのを"temp"と変更したい場合、"devices"ディレクトリから"a50205.lua"というファイルをダウンロードします。
a50205.lua
この行
を
に変更します。
そして変更したファイルを"devices_custom"ディレクトリにファイル名を変更せずに"a50205.lua"と言う名前のままアップロードして下さい。
この作業だけでオリジナルの送信データを作成できます。
新規センサーのLuaハンドラ作成
未サポートのデバイスのハンドラを新規に追加する時は、"devices_custom"ディレクトリに"skelton.lua"というファイルが置いてあるので、このファイルをテンプレートとして使って下さい。
このファイルの中の"skelton"と言う部分をEEPプロファイル名に変更して使います。
上記の"EEP:A50205"のソースコードが参考になると思います。
あとはxxxxxx.xxxxxx_decode関数の中にバイナリデータからの変換ルーチンを用意するだけです。
完成したらEEPプロファイル名.luaというファイル名で"devices_custom"ディレクトリにアップロードして下さい。
なお、"skelton.lua"テンプレートにあるxxxxxx.xxxxxx_decode関数内のルーチン
skelton.skelton_decode()
は、バイナリデータをそのまま16進数ASCII文字列に変えているだけなので、変換ルーチンを別途用意する場合は全て不要になります。
info
ファームウェア 1.x、2.x は、Lua に対応しておりません。
EEPタイプとGPタイプに対応しています。
EEPタイプはプロファイルコードで検索して下さい。
GPタイプはEEPの欄に"GP"から始まるプロファイル名を入力します。(GP_xxxx)
GPセンサーはファームウェア 4.xからのサポートになります。
RS-SERIAL Lua
PD Handler RS-SERIALでは、対向のシリアルデバイス(RS-232C/RS-485など)向けに処理内容をフルカスタムできるユーザー定義ハンドラです。
IoTデータ⇒SERIAL Luaタブから、カスタマイズしたLuaファイルをアップロードし使用します。
info
- デフォルトでインストールされているrs-serial.luaはサンプルとなります。このファイルを参考に編集して下さい。
- PD Handler RS-SERIALは指定したLuaファイルを読み込み、LUA_main関数を実行します。
- PD Handler RS-SERIALはPD Repeaterへのアクセスするパスのデバイス名部をLuaファイル内にて定義しています。そのため、環境に合わせてLuaファイルを編集する必要があります。
caution
Luaファイルが不正(フォーマットエラーやシンタックスエラー等)の場合エラー終了となるので、ログを確認して下さい。
RS-SERIAL Lua のカスタマイズ(シリアルポート側)
基本的には一般の高級言語でシリアルインターフェース機器との通信全般を書くのと違いがありません。
※実際にはシリアル通信にこだわらずLuaだけで汎用的なアプリケーションもここで作れてしまいます。
システムの単純な流れとしては
この作り方になりますが、OpenBlocks上ではデーモンとして起動するので、シリアルポートのクローズはSTOPシグナルが入った時となるので、データ送受信部分で無限ループする作りになります。
このディレクトリにあるrs-serial.luaをテンプレートとしてダウンロードしてから編集して使って下さい。
※利用開始前にはモジュール設定でPD Handler RS-Serialの起動を忘れずに!
以下はrs-serial.luaのデフォルトソースコードです。
OpenBlocksとパソコンをRS-232Cクロスケーブルで接続しテストを行って下さい。
動作はパソコン側でTeraTermなどを使ってOpenBlocksと接続しキーボード入力するとその文字をエコーバックします。
そして"who?"と入力すると"I am openblocks"と返事し、"exit!"と入力すると"!!!!!! STOPING prcess !!!!!"と返事してからプロセスを停止します。
※本番用デーモンとして起動する時は無限ループを抜ける仕組みがない方が良いです。
rs-serial.lua_org
これは非常に簡単なプログラムで、もう少し色々試したい時はsample.luaを一度ダウンロードでして別名のluaのファイル名でアップロードして下さい。
IoTクラウド(PD Repeater)への送信サンプルなども用意されていますので参考にして下さい。
RS-SERIAL Lua のカスタマイズ(クラウドとの通信側)
もともとはシリアルポート側の処理系と一緒のソースコードとして作成しますが、わかりやすく解説するためにクラウド側の処理を分けて説明します。
以下は簡単なサンプルです。
クラウドとの通信側
RS-SERIAL Lua で Device Shadow を使う
AWS IoTのDevice Shadowはクラウド上に仮想化したステートマシンを配置し、エッジ側の装置はそのステートマシンの状態を常に同期する仕組みを取ります。
例えばSwitchAがクラウド上のステートマシンで定義され、それがonになれば、エッジ側のマシンのSwitchAはonのステータスへ移行します。
また、エッジ側のSwitchAが何らかのエッジ処理によってoffとされた場合、クラウド上のステートマシンに対してSwitchAはoffになったステータスを通知します。
さらにエッジ側の自己処理でステータスが変わった場合もエッジ側が自発的にそのステータス変化を通知します。
こう言った一連の処理をMQTTプロトコルによって行います。
このAWS IoTのDevice Shadowの仮想ステートマシンは全てjson文字列で記述されています。
jsonで記述されたステートマシンの基本構造(参考例)
上記の形式で'...'の部分がユーザー定義部分です。
このユーザー定義の部分の使い方は自由ですが、基本的な操作の流れはクラウド(操作する側)からdesiredのメンバーでエッジデバイスに操作要求を送り、エッジデバイス(操作される側)がreportedのメンバでその結果をDeviceShadowに送ります。
例えばDeviceShadow仮想ステートマシンの状態が
の所へクラウドから以下のjsonメッセージをDeviceShadowへパブリッシュすると
DeviceShadow仮想ステートマシンは
と、このようになり、この変化がDeviceShadow配下のトピックにその状態変化を通知するメタ情報がパブリッシュされます。
OpenBlocksのPD Repeaterでは、このトピックの全てをサブスクライブしているため、すべてのメタ情報が取り込まれ読み出すことができます。
実際のDeviceShadowはこの状態変化が起こると、documents,delta,acceptedの3つのトピックにパブリッシュしてきます。
基本的にはどのトピックを参照しても現在のステータスを得ることができますが、エッジ処理ではdeltaトピックの内容を参照すると、その状態変化が容易にわかります。
deltaトピックはdesiredとreportedのメンバーの差分をパブリッシュしてくるので次の様になります。
このようにステータスに変異のあったメンバのみ通知されるので、この変異に同期するようにエッジ側の処理を実行します。
ここではSwitchAをonにするためのエッジ処理を実行します。
エッジ処理を実行して実際のSwitchAをonした後は、クラウドにそのリポートを通知します。
以上のようにクラウドにパブリッシュして処理の完了となります。
DeviceShadowはこの変異に対して同じようにdocuments,delta,acceptedの3つのトピックにパブリッシュしてきます。
これに対してもOpenBlocksはメッセージを受け取ることができますが、自発のレポートの変異であるためこのメッセージは無視します。
最終的にクラウドの仮想ステートマシンの状態は以下の通りとなります。
仮想ステートマシンの特定のメンバを消すときには次の様にパブリッシュします。
仮想ステートマシンのdesired全部を消す場合は次の様にパブリッシュします。
Luaスクリプトの実際
以下のLuaスクリプトは上記の手順を追ったものです。
Device Shadow を扱う Lua スクリプト
RS485半二重通信での注意点
RS485の場合、送信線と受信線を共有して4ワイヤ(実質2ワイヤでも通信可能)の半二重接続が主流の使い方になっています。
ここでよく問題となるのは、送信と受信を切り替えるタイミングで発生するデータ化け問題です。
例えば通信フレームに対してのエラーチェックでCRCを付与している時やパリティチェックしている時など、この切替の微妙なタイミングでエラーを発生します。
これを通信回路で発生するノイズと勘違いされている方が非常に多いです。
この図で示される切替のタイミングはプライマリが送信側としてセカンダリが受信機側としている場合、プライマリが送信終わって送受信を切り替えても即時切り替わるわけではなく多少の遅延が発生します。
このため、低いボーレートでは気にならなかった送受信線の切替が、高いボーレートではセカンダリのデバイスがデータを受けきらないタイミングで切り替わってしまい、データが化けるという現象が起こってしまいます。
この逆のパターンでは、セカンダリデバイスが送信し始めたタイミングをうまく検出できなくて、データ化けが起こるケースもあります。
これはデバイスがRS485半二重に対応したLSIを採用している場合にはデータ化けの無い通信が可能ですが、元々全二重のRS232Cの回路をRS485半二重にハードウェアロジックなどでコンバートした回路を採用しているデバイスにはこの切替の遅延が発生します。
(旧版のOpenBlocks IoT EX1やBXシリーズも対象になります。)
この場合には通信速度を遅くすることで対処も可能ですが、ソフトウェア的に解決するには、RS485に流すデータのフレームの前後にダミーデータを置く方法があります。
ダミーデータ付与の例
こういった感じのプロトコルで有効部分のデータの最後にCRCを付けて転送します。
受信側はダミー部分を捨てて有効部分のデータのみ使います。
また、スタートコードやエンドコードは1バイトの場合、使用制限が付きやすいので2バイトでスタート・エンドコードを設定するやり方が一般的です。
RS-SERIALのLua用関数
以下はOpenBlocksのLua言語用に実装している関数です。
sample.luaではこれら関数を一通り使っているので参考にして下さい。
LUA_open_serial()
シリアルポートを指定の通信パラメータでオープンする。
LUA_close_serial()
シリアルポートをクローズする。
LUA_send_serial()
シリアルポートからバイナリーデータを送信する。
LUA_read_serial()
シリアルポートからバイナリーデータを受信する。
LUA_post()
ユニックスドメインソケット経由で PD Repeater にメッセージを送信する。
PD Repeater はそのメッセージをWEB-UIの設定に従いクラウドへ送信する。
LUA_open_udomain()
ユニックスドメインソケットの待ち受けサーバーを起動する。
PD Repeater はWEB-UIの設定に従いクラウドからの下流制御メッセージを受け取り、
このコマンドでオープンされたユニックスドメインソケットにjsonメッセージを送信する。
LUA_read_udomain()
ユニックスドメインソケットの待ち受けからメッセージを受け取る。
LUA_close_udomain()
ユニックスドメインソケットの待ち受けをクローズする。
LUA_dump_byte()
バイナリーのバイト列をダンプする。(デバッグメッセージとして出力)
※デバッグのために用意された関数です。
LUA_usleep()
プロセスを指定の時間停止させる。
LUA_sleep()
プロセスを指定の時間停止させる。
LUA_sys_log()
シスログにメッセージを送る。フォアグランドでは標準出力も一緒に行われる。
LUA_get_iso_datetime()
IoTクラウドに基本的に用いられるISO8601形式の日付時間を得ます。
アップロード/ダウンロード操作
SERIAL LuaのスクリプトファイルはIoTデータ⇒SERIAL Luaタブの操作画面からアップロードやダウンロードすることができます。
設定項目 | 説明 |
---|---|
更新 | Luaファイルのアップロード先のファイル一覧表示を更新します。 |
削除 | ファイルを選択後削除 ボタンで削除します。 |
ダウンロード | ファイルを選択後ダウンロード ボタンでクライアントパソコンのダウンロードフォルダにファイルをダウンロードします。 |
実行権付与 | ファイルを選択後実行権付与 ボタンで実行権を付与します。通常では不要です。 |
アップロード | ファイルを選択 ボタンを押すと、クライアントパソコンのファイル一覧から指定のファイルを選択してアップロードできます。*1 |
info
- アップロード後に、プロセスの再起動が必要となります。
- 別名のファイルでアップロード指定した場合、IoTデータ⇒モジュール設定タブのPD Handler RS-SERIALの指定Luaファイルにて使用するLuaファイルを変更して下さい。
BルートLua
低圧・高圧スマートメーター用のLuaハンドラのファイルです。
アップロード/ダウンロード操作
作成したLuaハンドラのアップロードや、参考にするLuaハンドラのダウンロード操作は以下の通りです。
BルートLua メニューの操作項目
設定項目 | 説明 |
---|---|
更新 | Luaファイルのアップロード先のファイル一覧表示を更新します。 |
削除 | ファイルを選択後削除 ボタンで削除します。削除可能なファイルはカスタム用ディレクトリ配下のファイルです。 |
ダウンロード | ファイルを選択後ダウンロード ボタンでクライアントパソコンのダウンロードフォルダにファイルをダウンロードします。 |
実行権付与 | ファイルを選択後実行権付与 ボタンで実行権を付与します。通常では不要です。 |
アップロード先 | アップロードしたいディレクトリをプルダウンから選択して下さい。 対象ディレクトリ配下がプルダウン対象です。 パスの最初のディレクトリが以下の場合、各対応するハンドラの配置場所となります。
|
アップロード | ファイルを選択 ボタンを押すと、クライアントパソコンのファイル一覧から指定のファイルを選択してアップロードできます。*1 |
info
- アップロード後にプロセスの再起動が必要なので、ダッシュボードから停止・起動の操作を行って下さい。
caution
アップロード先にLuaファイル以外が存在している場合には正常に動作しません。
HVSMC Lua
info
FW5.0.5までのタブとなります。FW5.0.6からはBルートLuaタブへ統合されております。
アップロード/ダウンロード操作
作成したLuaハンドラのアップロードや、参考にするLuaハンドラのダウンロード操作は以下の通りです。
HVSMC Lua メニューの操作項目
設定項目 | 説明 |
---|---|
更新 | Luaファイルのアップロード先のファイル一覧表示を更新します。 |
削除 | ファイルを選択後削除 ボタンで削除します。削除可能なファイルはカスタム用ディレクトリ配下のファイルです。 |
ダウンロード | ファイルを選択後ダウンロード ボタンでクライアントパソコンのダウンロードフォルダにファイルをダウンロードします。 |
実行権付与 | ファイルを選択後実行権付与 ボタンで実行権を付与します。通常では不要です。 |
アップロード先 | アップロードしたいディレクトリをプルダウンから選択して下さい。 対象ディレクトリ配下がプルダウン対象です。 |
アップロード | ファイルを選択 ボタンを押すと、クライアントパソコンのファイル一覧から指定のファイルを選択してアップロードできます。*1 |
info
- アップロード後にプロセスの再起動が必要なので、ダッシュボードから停止・起動の操作を行って下さい。
caution
アップロード先にLuaファイル以外が存在している場合には正常に動作しません。