この記事ではEXOR社のXA5 IP67タッチパネルからModbus RTU Serverを立ち上げ、Schneider TM221のModbus RTU からFunction Blockを使用し各Registerにアクセスします。
さ、はじめよう!
Wiring
こちらは配線図です。
Function Block
今回使用するFunction BlockはProgramming Tabから追加できます。
%READ_VAR
%READ_VAR Function Blockは、Modbus SLまたはModbus TCPでRemote Devicesからデータを読み取るために使用されます。注意するのは初期起動のタスクでEXECUTEをTrueにセットしても通信開始はしませんので、Function BlockのEXECUTEは最初にFalseに検知>そのあとTrueの立ち上がりエッジを検知する必要があります。
VAR_INPUT
Variable | Type | Description |
Execute | BOOL | 立ち上がりエッジを検出するとFBを実行する |
Abort | BOOL | 立ち上がりエッジを検出するとFBを停止する |
VAR_OUTPUT
Variable | Type | Description |
Done | BOOL | TRUE=FBがエラーなし実行されました |
Busy | BOOL | TRUE=FBが実行中 |
Aborted | BOOL | TRUE=FBが実行してる間にABORT のせいで実行中断された |
Error | BOOL | TRUE=FBエラーあり |
Comm error Code
Configuration
これから%READ_VARの設定について説明します。%READ_VAR FBをクリックするとConfiguration PopUPが表示されます。
Link
該当するFunction Blockが使用するHardware Portです。設定できるのはSL1: Serial 1・SL2: Serial 2・ETH1: Ethernetになります。(もちろんTM221のCPU Hardwareの制限もあり)
Id
Remote DevicesのIDになります。
Serial Lineの場合、設定範囲は1-247になります。
Ethernetの場合。設定範囲は1-16になります。
Timeout
Remote Deviceから応答を受信するまでの最大待ち時間を設定できます(100ms単位、Default=10s)。
ObjType
Function BlockがRemote Devicesから読み出すObject 種類を設定します。
- 0 for words Mbs 0x03 – Read multiple words (holding register)
- 1 for digital inputs Mbs 0x02 – Read multiple bits (digital inputs)
- 2 for digital outputs Mbs 0x01 – Read multiple bits (digital outputs)
- 3 for input words Mbs 0x04 – Read multiple words (input register)
First object
Remote Devicesから読み出すObjectの最初のアドレスになります。
Quantity
Remote Devicesから読み込むオブジェクトの数で、設定できる範囲は:
- 1…125 for %MW
- 1…2000 for %I
- 1…2000 for %Q or %M
- 1…125 for %IW
IndexData
読み込まれた値が格納されると、TM221のLocal Devices (%MW) のアドレスになります。例えばビット(%I または %Q)を読み出す場合、読み出されたビットは指定された最初のアドレスから%MWに書き込まれます。(IndexData = 10、Quantity = 16 で 16 ビットを読み取る場合、結果は %MW10:X0 から %MW10:X15 に格納するのイメージです)
%WRITE_VAR
%WRITE_VAR Function Blockは、Modbus SLまたはModbus TCPでRemote Devicesのデータを書き込むために使用されます。注意するのは初期起動のタスクでEXECUTEをTrueにセットしても通信開始はしませんので、Function BlockのEXECUTEは最初にFalseに検知>そのあとTrueの立ち上がりエッジを検知する必要があります。
VAR_INPUT
Variable | Type | Description |
Execute | BOOL | 立ち上がりエッジを検出するとFBを実行する |
Abort | BOOL | 立ち上がりエッジを検出するとFBを停止する |
VAR_OUTPUT
Variable | Type | Description |
Done | BOOL | TRUE=FBがエラーなし実行されました |
Busy | BOOL | TRUE=FBが実行中 |
Aborted | BOOL | TRUE=FBが実行してる間にABORT のせいで実行中断された |
Error | BOOL | TRUE=FBエラーあり |
Configuration
%WRITE_VARの設定について説明は%READ_VARとあまり変わらないので、ここで説明しません。
Implementation
EXOR Side
Add Protocols
Configuration>Protocolsを開き、+ボタンで新しい通信Protocolを追加します。
DropListからModbus RTU Serverを追加します。
Configuration
次はEXOR パネルのModbus RTU Server設定を行います。
Modbus ID
EXORパネルのModbus IDを設定します。
PLC Models
次はPLC Modelで、今回の記事では通信先がSchneiderなので、Modicon Modbus に設定しましょう。
Comm
今度はEXORパネルのCom設定を行います。
実際のアプリケーションに合わせて通信速度などを設定してください。
注意するのは今回はXA5を使用していますので、Com=1でModeはRS-485にしてください。
Add tags
Protocolが追加終わったら次はTagsを定義します。
Configuration>Tags>Modbus RTU Serverを選び>+ボタンでTagを追加します。
Coil Status
Coil Registerを追加する場合、Memory TypeをCoil Statusに設定し、Data Typeをboolean[]に設定すれば一括でBool配列を定義できます。
配列のサイズはArraysizeに入力してください。
Input Status
Input Status Registerを追加する場合、Memory TypeをInput Statusに設定し、Data Typeをboolean[]に設定すれば一括でBool配列を定義できます。
配列のサイズはArraysizeに入力してください。
Input Register
Input Registerを追加する場合、Memory TypeをInput Registersに設定し、Data TypeをShort[]に設定すれば一括で16Bitの整数配列を定義できます。
配列のサイズはArraysizeに入力してください。
Holding Register
Holding Registerを追加する場合、Memory TypeをHolding Registersに設定し、Data TypeをShort[]に設定すれば一括で16Bitの整数配列を定義できます。
配列のサイズはArraysizeに入力してください。
Screen
次はEXORのModbus RTU Serverに定義したRegister一覧画面を作成します。
Schneider Side
Serial Line Configuration
Schneider M221 CPUのシリアルPortを設定するため、SL1を開きます。
ProtocolをModbusに設定し、通信速度などもEXOR のRTU Serverに合わせて設定してください。
下図はEXORパネルの設定画面とSchneider CPUの設定画面の比較です。
Modbus Configuration
今後はModbus RTUの設定を行います。
AddressingをMasterにします。
Program
これから通信プログラムを作成します。
Rung0,1
変数を初期化するプログラムです。ISTEPは通信の制御を行うための変数です。
Rung2,3,4
Rung2,3,4はEXORのModbus RTU Sever 000001から16Bitを読み込むプログラムです。
通信エラーが発生した場合、ISTEPを990に遷移します。
Rung5,6,7
Rung5,6,7はEXORのModbus RTU Sever 100001から16Bitを読み込むプログラムです。
通信エラーが発生した場合、ISTEPを991に遷移します。
Rung8,9,10
Rung8,9,10はEXORのModbus RTU Sever 400001から10個のRegisterを読み込むプログラムです。通信エラーが発生した場合、ISTEPを992に遷移します。
Rung11,12,13
Rung11,12,13はEXORのModbus RTU Sever 300001から10個のRegisterを読み込むプログラムです。通信エラーが発生した場合、ISTEPを993に遷移します。
Rung14,15,16
Rung14,15,16はEXORのModbus RTU Sever 400001から10個のRegisterを書き込むプログラムです。通信エラーが発生した場合、ISTEPを994に遷移します。
Rung17,18,19
Rung17,18,19はEXORのModbus RTU Sever 300001から10個のRegisterを書き込むプログラムです。通信エラーが発生した場合、ISTEPを995に遷移します。
RTU20,21
こちらのRungは今回のプログラムに使用しませんが、Rung20,21はEXORのModbus RTU Sever 400001から1個のRegisterを書き込むプログラムです。
Rung22,23
こちらのRungは今回のプログラムに使用しませんが、Rung22,23はEXORのModbus RTU Sever 000001から1個のBitを書き込むプログラムです。
Result
Rung2,Read Coil status
Rung2ではFirstObj=0,Quantity=16,Index=404に設定されましたので、EXOR パネルのCoil Status 000001から16個のRegisterを読み込み、結果をMW404に格納されます。
Rung4,Read Input Status
Rung4ではFirstObj=0,Quantity=16,Index=400に設定されましたので、EXOR パネルのInput Status 100001から16個のRegisterを読み込み、結果をMW400に格納されます。
Rung6,Read Holding Register
Rung6ではFirstObj=0,Quantity=16,Index=410に設定されましたので、EXOR パネルのHolding Register 400001から10個のRegisterを読み込み、結果をMW410からMW419までに格納されます。
Rung8,Read Input Register
Rung8ではFirstObj=0,Quantity=16,Index=420に設定されましたので、EXOR パネルのInput Register 300001から10個のRegisterを読み込み、結果をMW420からMW429までに格納されます。
Rung12,Write Coil Status
Rung12ではFirstObj=0,Quantity=16,Index=402に設定されましたので、Schneider PLCのMW402をEXOR パネルのCoil Status 000001から16個のRegisterを書き込みます。
Rung14,Write Holding Register
Rung14ではFirstObj=0,Quantity=10,Index=430に設定されましたので、Schneider PLCのMW430からMW439をEXOR パネルのHolding Register 400001から10個のRegisterを書き込みます。
Rung16,Write Single Holding Register
Rung16ではFirstObj=0,Quantity=1,Index=440に設定されましたので、Schneider PLCのMW440をEXOR パネルのHolding Register 400015VRegisterに書き込みます。
Rung18,Write Single Coil Status
Rung18ではFirstObj=0,Quantity=1,Index=441に設定されましたので、Schneider PLCのMW441 をEXOR パネルのCoil Status 000001VRegisterに書き込みます。
Download
こちらのLinkからプロジェクトをDownloadできます。
https://github.com/soup01Threes/Schneider/blob/main/Project_M221_ModbusRTU_Master.smbp