Pilz PSS4000 紹介の第6話です。前回Resource global variablesのResource global variables・VAR_TEMP・Instruction listについて紹介しましたが、Pilzを使用するときよくあるのはESTOPやDoor Switchなどの状態を上位のPLCに送信します。PilzはProfinetかEthernet/IPの機能もありますので、今回はEthernet/IP Adpaterを立ち上げ、Beckhoff TwinCAT3と三菱のRJ71EIP91 Ethernet/IP モジュールのScannerとデータ交換できるまでの手順を1から説明します。よろしくお願いします。
Thanks!
この記事が出来上がるのはベッコフ日本法人ベッコフオートメーション株式会社さま・Pilz Japanさまから機材を貸してくださったおかけです。誠にありがとうございます。
ベッコフ日本法人ベッコフオートメーション株式会社
IPC6920-005はベッコフ日本法人ベッコフオートメーション株式会社さまが貸してくださったものです。Beckhoff Automationは1980 年会社設立、PCベースの制御技術をベースにしたオープンオートメーションシステム導入の先頭に立つドイツ企業です。
ベッコフ日本法人ベッコフオートメーション株式会社は、2011年に横浜に本社、2017年に名古屋オフィスを設立しました。
こちらはベッコフ日本法人ベッコフオートメーション株式会社様のホームページです。
どうぞよろしくお願いします。
https://www.beckhoff.com/ja-jp/
PILZ
PILZは安全およびオートメーション技術のソリューションでトータルソリューションサプライヤとしてのFA現場を支え、人の安全だけではなく、機械、および環境の安全を保証し、機械や設備をいかに安全に稼働させます。ピルツは全世界に42の現地法人や支社を設置し、包装、自動車産業、ロボットアプリケーション、さらに風力発電、鉄道技術など様々な分野で活躍しています。
Office:
ピルツジャパン株式会社
〒222-0033
横浜市港北区新横浜3-17-5
いちご新横浜ビル 4階
HP
Reterence Link
Ethernet/IP With PSS 4000
安全ではないアプリケーションではEthernet/IP Adpaterを立ち上げ他のScannerからアクセスすることができます。PilzのPS4000ではこのような機能がSupportします。
- Etherenet/IP ScannerとImplicit message、Port2222で周期IOデータ交換
- Explicit Message ServerとしてExplicit messageでExplicit データを交換、そして以下のObjectがSupportします。
- 0x01 Identity Object
- 0x02 Message Router Object 0x02
- 0x04 Assembly Object
- Output Assembly Object Instance
- Input Assembly Object Instance
- 0x06 Connection Manager Ob
- 0xF5 TCP/IP Object
- 0xF6 Link Object
0x04 Assembly Object
Assembly Object 0x04 はPilz のEthernet/IP Adapterと他社のEthernet/IP Scanner(今回の記事ではBeckhoff TwinCAT3と三菱のRJ71EIP91)IOデータ交換するときに使用するAssembly Objectです。Pilz PLCではそのProcess DataのことをScanner目線から”Inputs”と”Output”でデータの交換方向を表現して、Output Assembly Object Instanceは”Scanner Output Assembly Object Instance”、Input Assembly Object Instanceは”Scanner Input Assembly Object Instance”になります。
Output Assembly Object Instance
Scanner Output Assembly Object InstanceはScanner側のOutputデータになり、Pilz側のInputになります。そのデータ交換サイズは可変なので、Scanner側でPilz のEthernet/IP Adapterを構築するときは交換サイズをあわせてください。
PilzのEthernet/IP EditorからVirtual Modules をInsertしAdapterを構築できす。(16IX、IB、IW 、IDなど)
Attribute ID
Attribute ID | Name | Description |
1 | Not Supported | Not Supported |
2 | Not Supported | Not Supported |
3 | Data | Scanner側のOutputデータ |
4 | Size | そのデータサイズ |
Virtual Module
Module | Data Type | Application |
16IX | ARRAY[0..15] OF BOOL | Virtual Ethernet/IP bit module長さ16BitのBool配列 |
IBAn | ARRAY[0..(n-1)]OF BYTE | Virtual Ethernet/IP Byte Array Module長さNのByte配列、N=2,4,8,16,32,64OBA2なら、ARRAY[0..(1)]OF BYTEになる。 |
IW | WORD | Virtual Ethernet/IP Word Array Module |
OWAn | ARRAY[0..(n-1)OF WORD | Virtual Ethernet/IP Word Module長さNのWord配列、N=2,4,8,16,32,64OBW2なら、ARRAY[0..(1)]OF WORDになる。 |
OD | DWORD | Virtual Ethernet/IP DWORD Array Module |
Input Assembly Object Instance
Scanner Input Assembly Object InstanceはScanner側のInputデータになり、Pilz側のOutputになります。そのデータ交換サイズは可変なので、Scanner側でPilz のEthernet/IP Adapterを構築するときは交換サイズをあわせてください。
PilzのEthernet/IP EditorからVirtual Modules をInsertしAdapterを構築できす。(16OX、OB、OW 、ODなど)
Attribute ID
Attribute ID | Name | Description |
1 | Not Supported | Not Supported |
2 | Not Supported | Not Supported |
3 | Data | Scanner側のInputデータ |
4 | Size | そのデータサイズ |
Virtual Module
Module | Data Type | Application |
16OX | ARRAY[0..15] OF BOOL | Virtual Ethernet/IP bit module長さ16BitのBool配列 |
OBAn | ARRAY[0..(n-1)]OF BYTE | Virtual Ethernet/IP Byte Array Module長さNのByte配列、N=2,4,8,16,32,64OBA2なら、ARRAY[0..(1)]OF BYTEになる。 |
OW | WORD | Virtual Ethernet/IP Word Array Module |
OWAn | ARRAY[0..(n-1)OF WORD | Virtual Ethernet/IP Word Module長さNのWord配列、N=2,4,8,16,32,64OBW2なら、ARRAY[0..(1)]OF WORDになる。 |
OD | DWORD | Virtual Ethernet/IP DWORD Array Module |
Implementation-Pilz Side
Download the EDS Files
下記のLINKからPilz PSSU PLCのEDS FileをDownloadしてください。
Configure the Ethernet/IP Adapter
Hardware configuration>Your Device>EtherNet/IP Adapterをクリックします。
Pilz CPUのEthernet/ip Adapter構築画面が表示されました。
Scanner Output
まずScanner Output側から構築します。Add Scanner Outputをクリックします。
Instance No 100のScanner Output Assembly Object Instanceが追加されました。
Mappings
Ethernet/ip IDE下にVirtual Moduleを追加できます。
16IXを追加してみます。16IXを選び>Number of modules ”1”入力しAddします。
Virtual Slot0に16IXが追加されました!
同じ操作でSlot116Anを挿入してみます。
Number Of elementsを4にしAddします。Virtual Slotが1はData Length4で、Start Byteは2から始めますね。4はその配列の長さです。Virtual Slotは16 Bitなので、Data Lengthの長さは2で、0から1までになります。
一番下に使用できるBytes数といま占有されたByte数も一覧できます。
Scanner Input
先と同じ操作でAdd Scanner InputでScanner Input Assemblyを追加します。
出力のVirtual Slotも同じ操作で追加しましょう。
Global
Resource global variablesでGlobal変数を作成します。
このように先のStepに定義したVirtual Slotに合わせて変数を追加しましょう。
Build
Build>Build AllでProjectをコンパイルしましょう。
IO Mapping
Ethernet/ip変数とUser Programを紐つけます。
INPUTとOUTPUTをResource global variablesと繋がります。
よし、これでOKです。
Program
POU2
POU2でGlobal variablesにアクセスするためにVAR_EXTERNALを定義します。
中のFS_EmergencyStop状態をそのままVAR_EXTERNALの変数に出力します。
POU1
次は転送用のプログラムを作成します。
同じくVAR_EXTERNALにGlobal variablesをアクセスするので、変数を定義してください。
プログラムはFS_EmergencyStopの状態を転送したり、Dummyのデータを送信したりします。
Status
Communication Error
Normal Status with EIP Connection
https://youtube.com/shorts/RkULzk9kF9w
Implementation-1
Implementation1はPilzとBeckhoff IPC C6920と接続してみます。
Configure Ethernet/IP Scanner
Add Ethernet/IP Scanner
I/O>Devices>Add New Itemします。
Ethernet/IP > Ethernet/IP Scannerを選び>Okで追加します。
もしDriveがインストールされてないならDevice Found Atが空なので、とりあえずOkで閉じます。
Install Driver
Real-Time Network adpaterをインストールします。AdapterのTabでCompatible Devicesをクリックします。
Yesですすみます。
OSにあるNetowork Adapterを一覧できます。
今回私はUSB>LANの変換器を使用しますので、適切のDriveを選び>Installで進みましょう。
Installで進みます。
Done!
Setup the Scanner Adapter
Searchで使用可能なNetwork Adapterを設定します。
Done!
Configure IP
Settings TabからEthernet/ip ScannerのIP・Subnetを設定します。
Done!
Configure Task
Sync TaskからCreate New I/O Taskで新しいTaskを作成します。
Task名を入力し、OKします。
Cycle ticksは実際のアプリケーションに合わせて設定しましょう。
Add PLC
PLC選び>右クック>Add new Itemします。
Standard PLC Projectを選び>Addで新しいPLC追加します。
Done!
ADD GVL
Pilz CPUと接続するためのProcess IOを定義します。GVLs>Add>Global Variable Listします。
GVLの名前を入力しOpenします。
Done!
そしてProcess IOを定義してください。
Main Program
プログラムはPilzからもらったデータをESTOP状態を取得し、なおかつDummyデータをPilzに返します。
PROGRAM MAIN VAR ESTOPEnable:BOOL; ESTOPDiagReadyReset:BOOL; ESTOPDiagReadyForTest:BOOL; ESTOPDiagSwitchError:BOOL; ESTOPInputDataVaild :BOOL; ESTOPLAMPOutput :BOOL; ButtonLAMPOuput :BOOL; DataFromPilz_ByteArray :ARRAY[0..3] OF BYTE; DataFromPilz_Word :WORD; DataFromPilz_WordArray :ARRAY[0..3] OF WORD; DataFromPilz_DWord :DWORD; DataToPilz_Word :WORD; END_VAR //Input Data //Bool Array ESTOPEnable :=GVL.inData[2].0; ESTOPDiagReadyReset :=GVL.inData[2].1; ESTOPDiagReadyForTest :=GVL.inData[2].2; ESTOPDiagSwitchError :=GVL.inData[2].3; ESTOPInputDataVaild :=GVL.inData[2].4; ESTOPLAMPOutput :=GVL.inData[2].5; ButtonLAMPOuput :=GVL.inData[2].6; //Bye Array MEMMOVE( destAddr:=ADR(DataFromPilz_ByteArray) ,srcAddr:=ADR(GVL.inData[4]) ,n:=4 ); //Word MEMMOVE( destAddr:=ADR(DataFromPilz_Word) ,srcAddr:=ADR(GVL.inData[8]) ,n:=2 ); //Word Array MEMMOVE( destAddr:=ADR(DataFromPilz_WordArray) ,srcAddr:=ADR(GVL.inData[10]) ,n:=8 ); //DWord MEMMOVE( destAddr:=ADR(DataFromPilz_DWord) ,srcAddr:=ADR(GVL.inData[18]) ,n:=4 ); //Output Data //Bool Array GVL.OutData[0]:=16#FF; GVL.OutData[1]:=16#1C; //Byte Array GVL.OutData[2]:=16#BB; GVL.OutData[3]:=16#0A; GVL.OutData[4]:=16#12; GVL.OutData[5]:=16#9D; //Word DataToPilz_Word:=16#8382; MEMCPY( destAddr:=ADR(GVL.OutData[6]) ,srcAddr:=ADR(DataToPilz_Word) ,n:=2 ); |
Build
Build>Build SolutionでProjectをコンパイルします。
Configure With EDS File
Install the EDS File
まずEDS FileからEthernet/ip Networkを構築します。先程DownloadしたEDS FileをTwinCAT/3.1/Config/io/EthernetIPに入れてください。
Add Adapter
Scannerを選び>右クリック>Add New Itemします。
Pilz PSS4000を選択し、Okします。
Pilz CPU Ethernet/ip Adapterが追加されました。
Change IP
Adapterを右クリック>Change IP AddressでPilz AdapterのIPを変更します。
Pilz実機に合わせて設定しましょう。
Done!BoxのIconにある?Markも消えました。
Add IO
Pilz Adpaterに周期IO Connectionデータを追加します。
Box>右クリック>Append IO Connection>CyclicIoConnectionします。
EDS Fileに沿ってIO Connectionを追加しますか?Yesで進みます。
Connectionが追加されました。
Configure the Connections
先程のConnectionをダブルクリックし、Connectionの細かい設定を行います。
Input Length
Input Dataの長さはDefaultは10 Bytesです。
実際ScannerInput Assemblyのデータ数にあわせて行きましょう。
Output Length
Output Dataの長さはDefaultは6 Bytesです。
実際ScannerOutput Assemblyのデータ数にあわせて行きましょう。
Link INPUT
Process InputとUser Programの変数とLinkします。右クリック>Change Link..します。
先程GVLで定義した変数とLinkしましょう。
Link Output
Process OutputとUser Programの変数とLinkします。右クリック>Change Link..します。
先程GVLで定義した変数とLinkしましょう。
Download
Activate ConfigurationでHardware configurationをRuntimeにDownloadします。
OKでConfigurationをDownloadします。
RuntimeをRun Modeに切り替えます。
Start
User ProgramをDownloadします。
Yesで進みます。
Result
まずState変数から接続状態を確認しましょう。
0=なにエラーなし、接続成功ですね。
Pilz CPUからのデータも届きましたね。
Output DataもPilz CPUに届くはずです!
Configure without EDS File
次はEDS Fileなしで、TwincatからGenericの方法でEthernet/ip Networkを構築します。
Disable
まず先程設定したAdapterをDisableします。
よし、これでOK。
Add Adpter
今度はGeneric EtherNet/IP Slaveを選び>Okします。
Generic EtherNet/IP Slaveが追加されました。
Change IP
Boxを右クリック>Change IP Addressします。
Add Connections
Generic EtherNet/IP Slaveを右クリック>Append IO Connection>Default(Without EDS)で進みます。
Connectionが追加されました。
Configure Connections
先と同じく接続情報を設定する必要があります。
TwincatのConnection Portはつまり接続するInstance番号です。
Scanner Input AssemblyはInputsのConnection Port(101)、Scanner Output AssemblyはOutput Port(100)になります。
よし、これでOKです。
Add Input Data
次はInput Dataを追加します。Pilzで8Bytesを構築しましたよね。
Create Array Typeをクリックします。
配列を作成し、Okで完了します。
Done!
Add Output Data
Outputも同じような操作で変数を追加します。Outputs>右クリック>Add New Itemします。
長さ8Bytesの配列を作成します。
Done!
Link Input
Inputs変数を右クリック>Change Link..でUser Programの変数と繋がりましょう。
Link Output
Outputs変数を右クリック>Change Link..でUser Programの変数と繋がりましょう。
Result
Stateから接続結果を確認します。
0なら接続問題ありません。
Pilz CPUからのデータも届きましたね。
Output DataもPilz CPUに届くはずです!
Implementation-2
Implementation2はPilzとRJ71EIP91と接続してみます。
Mels
Add New Project
GXWorks3を起動し、Project>Newで新しいプロジェクトを追加します。
今回記事で使用するのはR00でSeriesをRCPU、TypeはR00、Program Language はSTでOkします。
プロジェクトが新規作成されました。
Insert RJ71EIP91 Module
次はRJ71EIP91モジュールをインストールし、Parameter>System Parameterをクリックします。
Slot0 に…のボタンをクリックします。
Rj71を検索します。
RJ71EIP91を選び>Okします。
もう一度OKでRJ71EIP91をProjectにInsertする。
Done!
Configure IP Address
RJ71EIP91のIPアドレスを設定します。Module Information>RJ71EIP91をクリックします。
Basic Settingを開きます。
IP Address Settingの赤枠のところをダブルクリックします。
IP Address・Subnet Mask・Default Gatewayをアプリケーションに合わせて設定してあげてください。
今回は192.168.1.241/24にします。
Basic Program
こちらは基本のプログラムです。FlagSend.uiConnectionNoとFlagReceive.UiConnectionNoを2に変更したら、Connection2のデータにアクセスするようになります。
実際、Connection番号はツールの隣に[001],[002]のように表示されています。
DUT_RJ71EIP91_Flags
こちらはClass1Set/ClassGetのFunction Blockを呼び出すときのInput/Outputパラメータで、一つずつ定義するのは面倒なので、構造体でまとめて宣言します。
MAIN
こちらはMainプログラムです。いまは200ms一回Function Blockを呼び出すようになっています。
//Ready EIPModuleReady:= NOT EIP91_1.bSts_ModuleError AND EIP91_1.bSts_ModuleReady ; //Set the Request EIP91_1.bSet_CommunicationStartupRequest:=EIPModuleReady; //Auto Reset EIP91_1.bSet_ModuleErrorClearRequest:=EIP91_1.bSts_ModuleError; //Connection Numbers FlagsSend.iuConnectionNo:=1; FlagsReceive.iuConnectionNo:=1; //Reflesh Time RefleshTime:=T#200ms; //Send Reflesh TON1( IN:= NOT TON1.Q AND EIPModuleReady AND NOT EIP91_1.bnSts_Class1Error_Connection_D[2] ,PT:= RefleshTime ,Q=>FlagsSend.ibEN ); //Receive Reflesh TON2( IN:= NOT TON2.Q AND EIPModuleReady AND NOT EIP91_1.bnSts_Class1Error_Connection_D[2] ,PT:= RefleshTime ,Q=>FlagsReceive.ibEN ); //Send DataArraySend[0]:=16#F0F0; DataArraySend[1]:=16#1567; DataArraySend[2]:=16#91AC; DataArraySend[3]:=16#E134; DataSend( i_bEN:= FlagsSend.ibEN ,i_stModule:= EIP91_1 ,i_uConnectionNo:= FlagsSend.iuConnectionNo ,i_uOutputData:= DataArraySend[0] ,o_bENO=> FlagsSend.oENO ,o_bOK=> FlagsSend.obOK ,o_bErr=> FlagsSend.obErr ,o_uErrId=> FlagsSend.ouErrId ,o_uStatusId=>FlagsSend.ouErrId ); //Receive DataReceive( i_bEN:= FlagsReceive.ibEN ,i_stModule:= EIP91_1 ,i_uConnectionNo:= FlagsReceive.iuConnectionNo ,o_bENO=> FlagsReceive.oENO ,o_bOK=> FlagsReceive.obOK ,o_bErr=> FlagsReceive.obErr ,o_uErrId=> FlagsReceive.ouErrId ,o_uStatusId=> FlagsReceive.ouStatusId ,o_uInputData=> DataArrayReceive[0] ); Device_0_ESTOP_Enable:=DataArrayReceive[1].0; Device_0_ESTOP_DiagReadyForReset:=DataArrayReceive[1].1; Device_0_ESTOP_DiagReadyForTest:=DataArrayReceive[1].2; Device_0_ESTOP_DiagSwitchError:=DataArrayReceive[1].3; Device_0_ESTOP_InputDataNotVaild:=DataArrayReceive[1].4; Device_0_ESTOP_LAMP_OUTPUT:=DataArrayReceive[1].5; Device_0_RESET_Button_LAMP_OUTPUT:=DataArrayReceive[1].6; ; |
Startup Configuration tools
GXWORKS3に戻り、Etherent/IP Configuration Toolを起動します。
しばらく待ちます…
Configuration Toolが起動されました。
Configure RJ71EIP91 IP
まずはRJ71EIP91本体を設定します。
IPアドレスはProjectに合わせて設定しましょう。
Configure by EDS
1つ目の実装はPilz HPからDownloadしたEDS FileをインストールしEthernet/IP Networkを構築します。
Install the EDS File
AddでEDS Fileをインストールします。
Next>で進みます。
EDS FileのDirectoryを設定し、Next>で進み、インストールすればOKです。
Insert the Pilz PLC Adapter
Ethernet/IP Devices>Pilz GmbH & Co>Communications Adapter>Pilz PLC Reveision 1.8を選んでEthernet/IP ネットワークに追加します。
Ip address
IPアドレスは実際の実機に合わせてください。
Configure the Input Data Size
次はConnections Tabから接続の細かい情報を設定します。
Input Sizeは22Bytesでその22ByteはPilz 側のScanner Input Assembly Object Instanceを対象とします。
Configure the Output Data Size
Output Sizeは8Bytesでその8ByteはPilz 側のScanner Output Assembly Object Instanceを対象とします。
Configure the Instance Number
次はInstance番号を設定します。
Input Instance O->Tは100でPilzのScanner Output Assembly Object Instanceで、Output Instance T->Oは101でPilzのScanner Input Assembly Object Instanceの紐付けです。
Download
ConfigurationをDownloadします。Online CommandでToolsとModuleを接続します。
Download the current configuration in the module でConfigurationをモジュールにDownloadします。
Result
よし、CIP CM Packageもきて、PilzからForward OpenにSuccessの返答が来ましたね!
Configure by Generic EDS
次はEDS FileなしのGeneric EDS FileからEthernet/IP Networkを構築します。
Disable
先程実装したConnectionを右クリック>Enable/Disable DeviceでConnectionを無効にします。
Install the Generic EDS
Device Library>Advanced Generic EDSを選び、Ethernet/IP Networkに追加します。
Ip address
IpアドレスもPilzの実機に合わせてください。
Connections Tabから接続の細かい設定を行います。
Configure the Input Data Size/Instance
Input instance 101というのはPilz からみるとScanner Input Assembly Object Interfaceに対応します。
Output Instance 100 というのはPilz からみるとScanner Output Assembly Object Interfaceに対応します。
Configure the Output Data Size/Instance
Input Size 22 BytesはPilzのScaner Input Assembly Object Interfaceの101、そのInstance101は22Bytesになります。
Output Size 22 BytesはPilzのScaner Output Assembly Object Interfaceの100、そのInstance100は8Bytesになります。
Download
ConfigurationをDownloadします。Online CommandでToolsとModuleを接続します。
Download the current configuration in the module でConfigurationをモジュールにDownloadします。
Result
よし、CIP CM Packageもきて、PilzからForward OpenにSuccessの返答が来ましたね!
データもちゃんとPilzからもらいましたね!
三菱側がPilzにもちゃんとデータを送信しました。