前回の記事はFESTOのCPX-AP-I-EPモジュールからEthernet/IP Networkを立ち上げましたが、今回はModbus TCP Modeを使用し三菱のIQ-R CPUとその内臓Ethernet Port・Pre-definedProtocol機能を使用しネットワークを構築します。
IOLINKのプログラムはPart2でKeyence CPUのプログラムとあまり変わらなくほぼそのまま流用でき、それもIOLINKデバイスを使用するのメリットで上位はどんなCPUであれプログラムそんなに変更なく使用できます。
そのほか、FESTOのCPX-AP-I-EPモジュールの診断機能なども含めて紹介します。
どうぞよろしくお願いします。
Reference Link
Festo Side
まずFestoのモジュールのModbus TCP Modeを紹介します。
Rotary Switch
今回はModbus TCP Modeを使用しますので、Rotary スイッチの設定は745に設定します。
IPアドレスは192.168.1.145、Modbus TCP Modeに構築されます。
Status
Web Serverにアクセスするとモジュールの通信状態の確認ができます。
Information
ツールICONをクリックすると各モジュールの詳しい情報を確認できます。
Process Data
Process Data項目から各モジュールのIOデータを確認できます。
各モジュールRawデータの確認は可能です。
Supply Voltages
Supply Voltagesは各モジュールの電源供給状態を確認できます。
Cable Information
各モジュール間で繋がってるケーブルの長さを確認できます。
Assembly View
Modbus TCP Modeを使用するとEthernet/IP機能は無効になり、Assembly Viewからなに表示できなくなります。
Modbus TCP Function
Assembly Viewが無効になる代わりにModbus TCP機能の確認ができるようになります。
Support Functions
Modbus TCP>Support Function Codesをクリックします。
モジュールが対応してるFunction Codeを一覧できます。
Holding Register
Holding Register Viewから各Modueの出力の意味合い・Reigister番号・なども詳細を確認できます。
Input Register
Input Register Viewから各Modueの入力の意味合い・Reigister番号・なども詳細を確認できます。
Mitsubishi Side
New Project
GXWORKS3を起動し、Project>Newで新規プロジェクトを作成します。
CPU Typeなどを選び、OKでプロジェクトを作成します。
Configure IP Address
CPUのIPアドレスを設定します。CPU>Module Parametersをクリックします。
Setting Item ListのところからIPを検索します。
内蔵LAN PortのIPアドレスを設定し、Applyで保存します。
Setup
次はModbus TCP Connectionsを設置します。
External Device Configuration>Detailed Settingsをクリックします。
Add Connection
Ethernet Configuration画面が表示されました。
右のModule Listから”Active Connection Module”をDropします。
Done!Active Connection Moduleが追加されました。
PLC Side
Communication Method
Communication Methodは”Predeined Protocol”に設定してください。
Port
IQ-RのPort番号は適当に使ってないPortを入力すればOKです。
Festo Side
次はFesto 側の設定ですね。Sensor/Deviceの項目があります。
IP AddressとPort No.を設定してください。今回の記事ではIP=192.168.1.159,PortはDefaultの502を使用します。
Save it
Ethernet Configuration>Close with Reflecting the Settingで設定を保存します。
Predefined Protocol Support Function
Tools>Predefined protocol support function を開きます。
module type を選択できます。
Drop list からbuild-in Ethernet CPUを選択します。
Ok で確定します。
Predefined protocol support function 画面が表示されました。
New Project
File>New で新規プロジェクトを開きます。
新しいpredefined protocol support project が追加されました。
Add Protocol
”Add”で新規のPredefined Protocolを追加します。
Protcolの設定画面が表示されます。
Protocol No.1
Model項目からMODBUS/TCPを選択します。
Protocol Nameのところに04:RD IN Register、つまりFunction Code04を実行するようにします。
Protocol No1.が追加されました。
Request
04:RD IN RegisterのRequest に各部品に対応する絶対アドレスを設定します。
- D100:Transaction ID
- D101:Module ID
- D102:読み込むInput Registerの先頭番号
- D103:読み込むRegisterの数
Normal Response
次は04:RD IN Registerの正常リスボンに各部品に対応する絶対アドレスを設定します。
- D110:Transcation ID
- D111:Module ID
- D1000,D1001-D1125:読み込まれたデータの転送先
Error Response
最後は04:RD IN Registerのエラーリスボンに各部品に対応する絶対アドレスを設定します。
Protocol No2.
Protocol No1と同じように2番目のProtocolを作成します。Protocol Nameは16:WR Multi Register、つまりFunction Code16を使用します。
Request
16:WR Multi RegisterのRequest に各部品に対応する絶対アドレスを設定します。
- D200:Transaction ID
- D201:Module ID
- D202:書き込むHolding Registerの先頭番号
- D203:書き込むHolding Registerの数
- D1200:書き込むのTotol サイズ(Byte単位)
- D1201-D1323:書き込むのデータ
Normal Response
次は16:WR Multi RegisterのRequest rの正常リスボンに各部品に対応する絶対アドレスを設定します。
- D210:Transcation ID
- D211:Module ID
- D212:Head Holding Register番号
- D213:書き込まれたRegister数
Error Response
最後は16:WR Multi Registerのエラーリスボンに各部品に対応する絶対アドレスを設定します。
Write to Module
Write to Moduleで設定されたProtocolをCPUにDownloadします。
Executeで実行します。
Done!
Program
Function
プログラムを紹介する前にまず今回使用する関数を紹介します。
SP_SOCOPEN
こちらの関数はConnectionをオープンできます。
Parameters
Operand | Descirption |
U | Dummy |
s1 | Connection番号 |
s2 | 関数の制御データ |
d | 関数の実行状態 |
s2
s2+0 | 関数は制御データを使用するかOpen Settingsを使用するか0000H=Open Settings・8000H=制御データ使用 |
s2+1 | 関数の実行結果、0=成功 |
s2+2 | Connection設定 |
s2+3 | 送信元のPort番号 |
s2+4、s2+5 | IPアドレス |
s2+6 | 受信先のPort番号 |
SP_ECPRTCL
こちらの関数はPre-definedProtocolを使用し、接続先にリクエストを送信します。
Parameters
Operand | Descirption |
U | Dummy |
s1 | Connection番号 |
s2 | 処理するProtocl関数 |
s3 | 制御出た- |
d | 関数の実行状態 |
s2
s2+0 | 実行成功したProtocol数 |
s2+1 | 関数の実行結果、0=成功 |
s2+2-s2+9まで | 実行するProtocol番号 |
s2+10-s2+17まで | 0=該当するProtocolは受信のみ |
SP_SOCCLOSE
こちらの関数を使用し、Connectionを閉じることができます。
Parameters
Operand | Descirption |
U | Dummy |
s1 | Connection番号 |
s2 | 関数の制御データ |
d | 関数の実行状態 |
Add Module Label
Element Selection>Module Label>R00CPUを右クリックし>Add Module LabelでCPUのLabelを追加します。
MAIN
Local Label
こちらは今回のプロジェクトで使用したローカルラベルです。
DUT_SMART_IDWx_MxMM_NMS_A0
こちらの構造体はContrinex社のスマートセンサーの状態を示す構造体です。
OB100
こちらのSTはCPUがSTOP>RUNするときCPU内のFlagをすべてリセットするプログラムです。
//Init the Parameters IF RCPU.stSM.bAfter_RUN1_Scan_ON THEN bSocOK:=FALSE; bSocError:=FALSE; bSocketOpen:=FALSE; bPredefineConnError:=FALSE; bPredefineConnOK:=FALSE; bSocketClose:=FALSE; bSocketCloseError:=FALSE; stECPRTCL_s3[2]:=1; //we will only use this control word and change it dynaimiclly stECPRTCL_s3[3]:=0; stECPRTCL_s3[4]:=0; stECPRTCL_s3[5]:=0; //Protocol Number1 D100:=1; //Transaction ID D101:=1; //Slave ID D102:=0; //Starting Register Number D103:=39; //Your Reading Points //Protocol Number2 D200:=2; //TransactionID D201:=1; //Slave ID D202:=0; //Starting Register Number D203:=33; //Write Points D1200:=66; //Totol writing bytes – 33 words END_IF; ; |
Open Socket Connection
こちらのプログラムはConnection1の接続をOpenします。
bSocOK=Connection接続成功で、 bSocError=Connection接続失敗になります。
Trigger the Pre-definedProtocol
こちらのプログラムはConnection1の接続先(この記事ではFestoのモジュール)にPre-definedProtocolのリクエストを送信します。
s2は常に1を入れていますが、実際はその関数の制御データを変更し異なるPre-definedProtocolをFestoモジュールに送信します。そしてSTB_1にはそのPre-definedProtocolを切り替えと入出力データをEncodeするプログラムが入っています。
STB_1
stECPRTCL_s3[2]はそのPre-definedProtocol番号を切り替えるRegisterです。そしてIOLINK Sensorのデータを正しい形式にEncodeするなどをしています。
// fbTON1(IN:= NOT fbTON1.Q ,PT:= T#1s); D1:= stECPRTCL_s3[2]; IF bDataProcessOK THEN CASE D1 OF //Protocol 1 1: D0:=1; stECPRTCL_s3[2]:=2; ScalingValue[0]:= (INT_TO_REAL(D1036)/32000.0)*10.0; ScalingValue[1]:= (INT_TO_REAL(D1037)/32000.0)*10.0; ScalingValue[2]:= (INT_TO_REAL(D1038)/32000.0)*10.0; ScalingValue[3]:= (INT_TO_REAL(D1039)/32000.0)*10.0; // SMART_IDWx_MxxMM_NMS_A0_ScalingValue:=D1002 & 16#00FF; //SMART_IDWx_MxxMM_NMS_A0_MeasureValue:= //(INT_TO_REAL(SWAP(EN:=TRUE ,d=>D1001 ))/16383.0)*110.0; M0:=SWAP(EN:=TRUE ,d=>D1001 ); SMART_IDWx_MxxMM_NMS_A0_MeasureValue:= (INT_TO_REAL(D1001 )/16383.0)*110.0; SMART_IDWx_MxxMM_NMS_A0_Status.OSS1:=D1002.8; SMART_IDWx_MxxMM_NMS_A0_Status.OSS2:=D1002.9; SMART_IDWx_MxxMM_NMS_A0_Status.TSS:=D1002.A; SMART_IDWx_MxxMM_NMS_A0_Status.SSC1:=D1002.B; SMART_IDWx_MxxMM_NMS_A0_Status.SSC2:=D1002.C; SMART_IDWx_MxxMM_NMS_A0_Status.ALR1:=D1002.D; SMART_IDWx_MxxMM_NMS_A0_Status.ALR2:=D1002.E; SMART_IDWx_MxxMM_NMS_A0_Status.ALR3:=D1002.F; DigtialInputs[0]:=D1035.0; DigtialInputs[1]:=D1035.1; DigtialInputs[2]:=D1035.2; DigtialInputs[3]:=D1035.3; //Protocol 2 //Holding Register 2: D0:=1; stECPRTCL_s3[2]:=1; IF D1233.0 = TRUE THEN D1233.0:=FALSE; D1233.1:=FALSE; D1233.2:=TRUE; D1233.3:=TRUE; ELSE D1233.0:=TRUE; D1233.1:=TRUE; D1233.2:=FALSE; D1233.3:=FALSE; END_IF; END_CASE; END_IF; ; |
実際STB_1のプログラムをTriggerするにはbDataProcessOKのBitになります。
bDataProcessOKは送信が成功するたびに1CycleをTrueにし、STB_1を実行します。
Close the Socket
こちらのプログラムはConnection1の接続をCloseします。
bSocketCloseOK=ConnectionClose成功で、 bSocketCloseError=Connection Close失敗になります。
Result
三菱のCPUとFestoのモジュールはエラーなしで通信でき、データも交換しています。
WiresharkからもMODBUS TCPのパケットが見えますね!
Download
こちらのLinkからプロジェクトをDownloadしてください。
https://github.com/soup01Threes/GXWROKS/blob/main/GX3_Festo_CPX-AP-I-EP_Project.zip