今回はJX-BASIC Part5になり、RS485通信のためにあるSend/Receive命令について説明します。JX-BASICはJTEKTが2022年12月から発売した、20命令語のみの薄型・省スペースの基板型シンプルコントローラになります。特徴としては20の命令語に絞り、シンプル機能(電源、通信、I/O)を実現できます。ちなみに、この基板型シンプルコントローラを使用するJXプログラミングソフトウエアは無料です。
詳しい仕様はこちらのLinkから確認してください。
https://www.electronics.jtekt.co.jp/jp/product/plc/jx-basic/
Reference Link
Implementation
こちらが今回の構成になります。Modbus RTU ServerはSchneider社のM221で、Modbus RTU ClientはJTEKTのJX-Basicです。
Hardware
JXBASIC基板にはRS485の端子台があり、Modbus RTUもしくはASCII通信に対応しています。
Wiring
こちらは配線図になります。
Program
こちらは今回JXBASIC側で組んだプログラムで、これからStep By Stepで説明します。
Rung1
最初にStep制御用のレジスタを初期化する必要があるため、アドバンスからMath機能をRung1に追加してください。
このようなMath機能の設定画面が表示されます。
JX-BASICはADD/SUBみたいに計算によって関数を分けるのではなくMath関数で一括管理します。今回はDS1=1に設定するだけなので、結果はDS1に設定し、計算式は1にすればOKです。
Done!
Rung2
Rung2はDS1は10なのかを比較する操作になります。Step=10かどうかは接点からCompare関数を使用します。
Compare(A-B)の設定が画面に出てました。
JXBASICでは比較の種類によって関数が別々ではなく、Compare関数で一括管理しています。今回はDS1が10なのかを比較したいだけなので、データA(Address)をDS1に入力、データB(Value)を10に入力すればOkです。
Done!
今度はまた加算するためMath関数を追加します。
DS200;=DS200+1のような計算式だけなので、オプションのワンショットもCheck入れます。
Done!いまDS=10になるたび、DS200は一回1を加算するようになります。
下図のようにDS201からDS204も同じ計算を行います。DS200からDS204まではSchneider PLCに送信するデータになります。
Rung3
今度はSchneider PLCにModbus RTU経由でデータを送信するため、通信からSend Blockを追加します。
Send Blockの設定画面が表示されます。
ComPort
最初にSend Portを実行するときに使用するComPortを指定します。
下図のようにDrop-Listから使用するPort を設定してください。
今回の記事ではModbus RTUを使用しますので、Port3を設定してください。
Com Port設定
次はPort3の詳しい設定を行うためCom Port設定をクリックします。
各ポートの設定詳細を変更できます。
プロトコル
今回の記事ではSchneider PLCとModbus 通信するのでプロトコルをModbusに指定します。
基本設定
こちらの設定は受信側に合わせて設定しましょう。
送信データ設定
今度は送信データの設定を行います。
シリアルデバイスのスレーブID
こちらはModbus RTU ServerのSlave IDになります。
Schneider PLC側では1を設定しましたので、こちらも同じように設定しましょう。
Modbus ファンクションコード
次はSchneiderと通信するときのFunction Blockを設定します。
JX-BASICでは05・06・15・16に対応しています。
今回の記事ではFunction Code16を使用します。
アドレス指定タイプ
こちらはModbus のアドレスタイプを設定できます。今回の記事ではSchneiderのPLCと接続しますので、Modbus 984 Addressingにしてください。
開始スレーブアドレス
こちらはJX-BASICがModbus RTU Serverで書き込む際のレジスタ番号先番になります。今回の記事ではレジスタ40001から読み始めます。
開始マスタアドレス
こちらはModbus RTUに書き込むデータをJX-BASICの先頭アドレスになります。
下記の例だとSend Blockから送信するデータはDS200からになります。
マスターアドレスの数
こちらはJX-BASICがModbus RTU Serverに書き込む合計のレジスタ数です。
下図の設定になると、Schneider PLCの400001から1個を書き込み、DS200から転送する設定になります。
ステータス
こちらはSend Blockの状態を示すフラグやエラーコードを設定する場所です。
結果
Done!Send Blockが追加されました。
Rung4
回路4ではC100が1秒のTimer Delayプログラムで、C100=Send Blockが実行中のフラクです。
Rung5
回路5ではC100(Send Block実行中)が1秒経ったらStep20に移します。
Rung6
回路6ではC101=True(つまりSend Block実行成功)したらStepを40に遷移します。
Rung7
もしSend Blockにエラーが発生した場合、Step=900になります。
Rung8
回路8ではModbus RTU受信用のReceive Blockを追加します。
Receive Blockの設定画面が表示されます。
COMポート
JX-BASICではRS485を使用する場合CPU Port3を選択してください。
COMポート設定
次はCOMポート設定を行います。
こちらはCOMポートの通信速度やノードアドレスなど詳細設定画面です。
基本設定
基本的にはModbus RTU Server側の通信設定に合わせてください。
Modbus ファンクションコード
次はModbusのFunction Codeを設定します。今回の記事では04‐ Read Input Registerに指定します。
アドレス指定タイプ
こちらはModbus のアドレスタイプを設定できます。今回の記事ではSchneiderのPLCと接続しますので、Modbus 984 Addressingにしてください。
スレーブ・アドレスの開始
こちらはJX-BASICがModbus RTU Serverで読み始めるアドレス先番になります。今回の記事ではレジスタ40011から読み始めます。
マスターアドレスの開始
こちらはModbus RTUで読み取ったデータをJX-BASICの保存先になります。
下記の例だとReceive Blockから読み取ったデータはDS250から転送します。
マスターアドレス数
こちらはJX-BASICがModbus RTU Serverに読み取る合計のレジスタ数です。
下図の設定になると、Schneider PLCの400011から1個を読み、DS250に転送する設定になります。
ワードスワップ
場合によってMSBとLSBが逆になることもあり、このとき下図のオプションをONにしてください。
ステータス
こちらはReceive Blockの状態を示すフラグやエラーコードを設定する場所です。
Done!
これでReceive Blockが追加されました。
Rung9
回路9ではC110が1秒のTimer Delayプログラムで、C110=Receive Blockが実行中のフラクです。
Rung10
回路5ではC110(Receive Block実行中)が1秒経ったらStep40に移ります。
Rung11
Receive Blockが実行に成功した場合、Step=50になります。
Rung12
Receive Blockが実行に失敗した場合、Step=991になります。
Rung13 Copy
次はModbus RTU Serverから読み取ったデータを別にMemory 領域に転送するため、Copy関数を使用します。
Copy関数の設定画面が表示されます。
今回は複数のメモリを一括転送するので、タイプをブロックに設定し、コピー元とコピー先を設定してください。下図の例ではDS250からDS254まで5つのメモリをDS350からDS354までに転送します(三菱のFMOVに似てる関数です)。
最後はワンショットオプションも入れておきます。
Done!
Rung14
最後はStep10に戻り、またSend Blockを実行するようにします。
Result
Done!JXBASICはSchneiderと通信できます。
このようにSchneider PLCにデータを送信し、Schneider PLCも受信したデータをそのままLoop Backします。
こちらはJXBASICとSchneider側が同時Monitorする様子です。
Schneider PLCの本体にあるSL LEDも点灯します。
Download
https://github.com/soup01Threes/JTEKT/blob/main/Project_ModbusRTU.jkp