今回は、デバイスを操作するためのプラグインとOpenHABインターフェースの設定方法、Modbusプロトコルのアドレス指定とデバッグの基本を学びます。 このペーパーでは、プラグインのソースコードを使用した実験を紹介します。vk.com/ myremoterページで、スマートホームのオープンコントローラーについて説明します。これについては、次の実験で使用します。
しかし、もう一度見てみましょう、Modbus規格はどのような利点をもたらしますか?
現代の家は複雑なエンジニアリング構造であり、照明制御は最も重要な機能ではありません。 センサーに加えて、空調および換気システム、加熱制御、排水ポンプおよび井戸が家に設置されています。 そのようなタスクは、特別なコントローラーまたは産業用コントローラーに委ねることができます。この場合、Modbusプロトコルはすべてのエンジニアリングシステムを単一のネットワークに統合するのに役立ち、同じバスで実行されるシンプルで安価なコントローラーは追加の制御と機能を追加し、多くのお金を節約します。 Modbusの人気の主な秘密は、おそらくプログラムと機器をドッキングする際の柔軟性にありますが、これに賛成して、ハードウェア要件が低く、標準が公開され、広く使用されています。
さあ、仕事に取り掛かる時です。
OpenHAB、コンフィギュレータ、およびヌルモデム接続のエミュレータをインストールします
ドキュメントを見て、 ダウンロードページを開き、ランタイムコアとデモのセットアップをダウンロードし、C:\ openhabで解凍してから、openHAB Designerをダウンロードして、C:\ openhab \ designerで解凍します。 java –versionを実行してJavaをチェックします。Javaがない場合は、 指示に従ってインストールします 。
C:\ openhab \ start.batを実行してOpenHABを起動し、 localhostで Webインターフェースを開きます:8080 / openhab.app?Sitemap = demo
com0comをダウンロードしてインストールし、実行します プログラムメニューからセットアップし、仮想ペアが作成されるシリアルポートを確認します(私にとってはCOM7 + COM8です)。 これらを使用して、OpenHABとシミュレーターをリンクします。
C:\ openhab \ start.batを実行してOpenHABを起動し、 localhostで Webインターフェースを開きます:8080 / openhab.app?Sitemap = demo
com0comをダウンロードしてインストールし、実行します プログラムメニューからセットアップし、仮想ペアが作成されるシリアルポートを確認します(私にとってはCOM7 + COM8です)。 これらを使用して、OpenHABとシミュレーターをリンクします。
次に、modbusデバイスとOpenHABの相互作用を提供するModbus Tcp Bindingプラグインをインストールします。 ダウンロードページを開き、アドオンをダウンロードし 、org.openhab.binding.modbus-1.6.2.jarをC:\ openhab \ addonsフォルダーに解凍します。
その後、プラグインとデバイスの接続を構成します。そのために、OpenHAB configuratorを実行し、openhab_default.cfgファイルを開きます。 Modbus Bindingセクションを見つけて、このセクションの最後に次の情報を追加し、ファイルを保存します。
modbus:serial.slave1.connection=COM7 modbus:serial.slave1.id=1 modbus:serial.slave1.start=0 modbus:serial.slave1.length=4 modbus:serial.slave1.type=discrete modbus:serial.slave2.connection=COM7 modbus:serial.slave2.id=1 modbus:serial.slave2.start=16 modbus:serial.slave2.length=4 modbus:serial.slave2.type=coil modbus:serial.slave3.connection=COM7 modbus:serial.slave3.id=1 modbus:serial.slave3.start=2 modbus:serial.slave3.length=3 modbus:serial.slave3.type=input modbus:serial.slave4.connection=COM7 modbus:serial.slave4.id=1 modbus:serial.slave4.start=5 modbus:serial.slave4.length=3 modbus:serial.slave4.type=holding
設定には、デバイスレジスタにマップされる4つのアドレスグループが含まれます。 各グループには、シリアルポート番号、コントローラーのmodbusアドレス、グループ内の最初のレジスターのmodbusアドレス、グループ内のレジスター数、およびこれらのレジスターのタイプが含まれます。 アドレスグループは、OpenHAB要素とデバイス間のリンクになります。
次に、デバイスレジスタを使用してOpenHAB接続を設定しましょう。 コンフィギュレーターでdemo.itemsファイルを開き、このファイルの最後に次のコードを追加します。
Group FF_Modbus "Modbus" (All) Contact MB_DT0 "DT0 [MAP(en.map):%s]" (FF_Modbus){modbus="slave1:0"} Contact MB_DT1 "DT1 [MAP(en.map):%s]" (FF_Modbus){modbus="slave1:1"} Contact MB_DT2 "DT2 [MAP(en.map):%s]" (FF_Modbus){modbus="slave1:2"} Contact MB_BTN "BTN [MAP(en.map):%s]" (FF_Modbus){modbus="slave1:3"} Switch MB_CL16 "CL16" (FF_Modbus){modbus="slave2:0"} Switch MB_CL17 "CL17" (FF_Modbus){modbus="slave2:1"} Switch MB_CL18 "CL18" (FF_Modbus){modbus="slave2:2"} Switch MB_LED "LED" (FF_Modbus){modbus="slave2:3"} Number MB_INPT2 "INPT2[%d]" (FF_Modbus){modbus="slave3:0"} Number MB_INPT3 "INPT3[%d]" (FF_Modbus){modbus="slave3:1"} Number MB_INPT4 "INPT4[%d]" (FF_Modbus){modbus="slave3:2"} Number MB_HOLD5 "HOLD5[%d]" (FF_Modbus){modbus="slave4:0"} Number MB_HOLD6 "HOLD6[%d]" (FF_Modbus){modbus="slave4:1"} Number MB_HOLD7 "HOLD7[%d]" (FF_Modbus){modbus="slave4:2"}
最初の行は、追加された要素を結合するFF_Modbusグループを定義します。 各要素は、そのタイプ、名前、テキストラベル形式、要素が含まれるグループのリスト、およびデバイスとの通信設定によって設定されます。 連絡先、スイッチ、番号の3つのタイプの要素を使用し、通信設定でタイプ(modbus)、プラグイン設定で指定されたグループの1つの名前(slave1など)、このグループのレジスタのシリアル番号を指定しました。
次の表は、コントローラーレジスタ、通常および論理Modbusアドレス、プラグイン設定のレジスタグループ、およびOpenHAB要素間の関係を視覚化するのに役立ちます。
インターフェースに要素を表示します。 コンフィギュレーターでdemo.sitemapファイルを開き、2つのフレームの説明を追加します。
Frame { Group item=FF_Modbus icon="attic" } Frame { Text item= MB_DT0 Text item= MB_DT1 Text item= MB_DT2 Text item= MB_BTN Switch item= MB_CL16 Switch item= MB_CL17 Switch item= MB_CL18 Switch item= MB_LED Text item= MB_INPT2 Text item= MB_INPT3 Text item= MB_INPT4 Setpoint item= MB_HOLD5 minValue=0 maxValue=50 step=1 Setpoint item= MB_HOLD6 minValue=0 maxValue=500 step=10 Setpoint item= MB_HOLD7 minValue=0 maxValue=500 step=100 }
最初のフレームにはFF_Modbusグループが含まれ、それに含まれるすべての要素が表示されます。
2番目のフレームでは、各要素に個別のインターフェイス設定があります。 設定は、ウィジェットのタイプ、要素との接続、および場合によっては追加のパラメーターを示します。 この説明で OpenHABインターフェースを構築する原理を理解することができます。
作成した構成をシミュレーターでテストしてみましょう。
ダウンロードページからRSsim 8.19シミュレーターをダウンロードし、C:\ arduinoフォルダーに解凍します。 このプログラムには興味深い機能があり、無料で、 ソースコードも入手できますが、同時に登録が必要です。 登録には、MOD_RSsimのバージョン情報ウィンドウを開き、「登録」ボタンをクリックし、登録名フィールドに「完全無料」、登録キーフィールドに「66840713」と入力する必要があると説明されています。
シミュレーターを実行し、登録を実行し、ポートフィールドでMODBUS RS-232を選択し、ボタンを押します 、シリアルポート設定ダイアログで、仮想ペアの2番目のポート(COM8など)、速度9600、1ストップビット、パリティなしを指定します。
OpenHABを起動してWebインターフェースを開き、スイッチをクリックして、シミュレーターのCoilテーブルの値がどのように変化するかを確認し、シミュレーターでDigital Inputsテーブルを開き、アドレス10001から10004のレジスターの値を変更し、Webインターフェースの連絡先の状態の変更を制御します。 その後、アナログ入力テーブルを開き、レジスタ30003-30005に値を入力し、INPT2-INPT4フィールドの値の変更を制御します。 最後に、フィールドHOLD5-HOLD7に値を設定し、シミュレータのレジスタ40006-40008でそれらのコンプライアンスを確認します。 シミュレーターが論理アドレスを使用していることにすでに気付いています。 レジスタ、アドレス、および要素が完全に失われないようにするには、上の表を使用してください。
一見、すべてが判明しましたが、OpenHABコンソールをよく見ると、コントローラーのポーリングのたびに、何も変更されていなくても、プラグインがイベントをバスに送信することがわかります。 この問題を解決するには、プラグインを調べて変更する必要があるようです。
ソリューションの説明
OpenHABプラグインアーキテクチャの概要については、 こちらをご覧ください 。
OpenHAB開発環境のセットアップの問題は、このガイドに反映されています 。
その過程で、変更は2つのModbusGenericBindingProvider.javaおよびModbusBinding.javaファイルに影響しました。
ModbusGenericBindingProviderには、要素の構成を格納するネストされたクラスModbusBindingConfigが含まれ、現在の状態を保存するメカニズムを作成します。
このクラスに変数を追加します
機能コードを修正する
そして、関数を追加します
ModbusBindingクラスには2つのメソッドが含まれています。
これらのメソッドは、スレーブをポーリングするたびに呼び出されます。 データが変更された場合にのみイベントを送信するように、コードを修正しましょう。
OpenHAB開発環境のセットアップの問題は、このガイドに反映されています 。
その過程で、変更は2つのModbusGenericBindingProvider.javaおよびModbusBinding.javaファイルに影響しました。
ModbusGenericBindingProviderには、要素の構成を格納するネストされたクラスModbusBindingConfigが含まれ、現在の状態を保存するメカニズムを作成します。
このクラスに変数を追加します
private State mb_itemState = UnDefType.NULL;
機能コードを修正する
State getItemState() { return mb_itemState; }
そして、関数を追加します
void setItemState(State state) { mb_itemState = state; }
ModbusBindingクラスには2つのメソッドが含まれています。
protected void internalUpdateItem(String slaveName, InputRegister[] registers, String itemName)
データ型を保持するためにOpenHABバスに更新イベントを送信します。
protected void internalUpdateItem(String slaveName, BitVector coils, String itemName)
コイルタイプのデータの更新イベントをOpenHABバスに送信します。
これらのメソッドは、スレーブをポーリングするたびに呼び出されます。 データが変更された場合にのみイベントを送信するように、コードを修正しましょう。
protected void internalUpdateItem(String slaveName, InputRegister[] registers,String itemName) { for (ModbusBindingProvider provider : providers) { if ( !provider.providesBindingFor(itemName) ) { continue; } ModbusBindingConfig config = provider.getConfig(itemName); if ( !config.slaveName.equals(slaveName)) { continue; } String slaveValueType = modbusSlaves.get(slaveName).getValueType(); double rawDataMultiplier = modbusSlaves.get(slaveName).getRawDataMultiplier(); State newState = extractStateFromRegisters(registers, config.readRegister, slaveValueType); /* receive data manipulation */ if (config.getItem() instanceof SwitchItem) { newState = newState.equals(DecimalType.ZERO) ? OnOffType.OFF : OnOffType.ON; } if (( rawDataMultiplier != 1 ) && (config.getItem() instanceof NumberItem)) { double tmpValue = (double)((DecimalType)newState).doubleValue() * rawDataMultiplier; newState = new DecimalType( String.valueOf(tmpValue) ); } State currentState = config.getItemState(); if (! newState.equals(currentState)) { eventPublisher.postUpdate(itemName, newState); config.setItemState(newState); //!!! } } } protected void internalUpdateItem(String slaveName, BitVector coils, String itemName) { for (ModbusBindingProvider provider : providers) { if (provider.providesBindingFor(itemName)) { ModbusBindingConfig config = provider.getConfig(itemName); if (config.slaveName.equals(slaveName)) { boolean state = coils.getBit(config.readRegister); State currentState = provider.getConfig(itemName).getItemState(); State newState = provider.getConfig(itemName).translateBoolean2State(state); if (!newState.equals(currentState)) { eventPublisher.postUpdate(itemName, newState); config.setItemState(newState); //!!! } } } } }
固定プラグインとソースコードは、このリポジトリにあります 。
OpenHABを停止し、org.openhab.binding.modbus-1.6.2.jarをダウンロードしてC:\ openhab \ addonsフォルダーにコピーします。 C:\ openhab \ start.batを起動し、Webインターフェースを開いて操作を再度確認します。 これですべてが正常になり、対応するレジスタの値が変更されたときにのみイベントが表示されます。
残された最も興味深いことは、前の記事のコントローラーとのOpenHABの対話を直接チェックすることです。
コントローラーのUSBケーブルをコンピューターに接続し、アダプターがインストールされているポート(COM6など)を確認し、OpenHABを停止し、コンフィギュレーターのopenhab_default.cfgファイルを開きます。ModbusBindingセクションで、各レジスタグループの通信設定で、ポート番号(例:modbus serial.slave1.connection = COM6)。 ファイルを保存し、OpenHABを実行してWebインターフェースを開きます。 フィールドHOLD5 ... HOLD7およびCL16 ...L18の値を変更してみましょう。対応するフィールドINPT2..INPT4およびDT0..DT2の値は変更する必要があり、レイアウトボタンをクリックして、BTNフィールドの値を変更し、LEDフィールドをクリックします、LEDが点灯または消灯します。
私たちの仕事の結果として得たもの:
1. modHABデバイスをOpenHABプラットフォームにドッキングしました。
2. OpenHABでインターフェースを構築する原則に精通しました。
3.プラグインの内部構造に精通しました。これにより、作業の不正確さを修正できました。
結論:
ArduinoコントローラとOpenHABプラットフォームに基づいて、たとえばSmart Homeシステムで自動化のためのソフトウェアおよびハードウェアソリューションを作成することは難しくありません。 さらに実用的な実験のために、コントローラーとシステム全体の基本的な機能と要件を決定しようとします;この問題を議論するために、オープンプロジェクトvk.com/myremoterのページが作成されました 。