Festo#CPX-AP-I-EPとIQ-RをModbus TCPで連携してみよう

前回の記事は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#CPX-AP-I-EC EtherCAT Moduleを使ってみよう
Festo#CPX-AP-I-EP EtherNet/IP ModuleとKV8000連携してみよう
EtherCAT#少し話しよ_02
三菱IQ-R#Socket通信

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
OperandDescirption
UDummy
s1Connection番号
s2関数の制御データ
d関数の実行状態
s2
s2+0関数は制御データを使用するかOpen Settingsを使用するか0000H=Open Settings・8000H=制御データ使用
s2+1関数の実行結果、0=成功
s2+2Connection設定
s2+3送信元のPort番号
s2+4、s2+5IPアドレス
s2+6受信先のPort番号

SP_ECPRTCL

こちらの関数はPre-definedProtocolを使用し、接続先にリクエストを送信します。

Parameters
OperandDescirption
UDummy
s1Connection番号
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
OperandDescirption
UDummy
s1Connection番号
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

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする