今回の記事ではBeckhoff IPC C6920とIFM AL1332 Ethercat IOLINK Masterを繋がり、Keyence IO-LINK 距離Sensor LR-TB200から現在距離を取得し、またPilzのESTOPもIFM AL1332のPortに配線にDI/DOの簡単な制御します。
よろしくお願いします。
Thanks!
この記事が出来上がるのはベッコフ日本法人ベッコフオートメーション株式会社さまとifm efector co. ltd.さまから機材を貸してくださったおかけです。誠にありがとうございます。
ベッコフ日本法人ベッコフオートメーション株式会社
IPC6920-005はベッコフ日本法人ベッコフオートメーション株式会社さまが貸してくださったものです。Beckhoff Automationは1980 年会社設立、PCベースの制御技術をベースにしたオープンオートメーションシステム導入の先頭に立つドイツ企業です。
ベッコフ日本法人ベッコフオートメーション株式会社は、2011年に横浜に本社、2017年に名古屋オフィスを設立しました。
こちらはベッコフ日本法人ベッコフオートメーション株式会社様のホームページです。
どうぞよろしくお願いします。
https://www.beckhoff.com/ja-jp/
ifm efector co. ltd.
ifmは1969年にドイツで誕生依頼”ifm-Close to you”を企業理念とする、センサのスペシャリストです。 今日では世界95ヶ国以上の拠点で従業員7000名を超える大企業になり、IoTのカギとなるIO-Linkの先駆者としても世界的に広く認知されるメーカーとなります。
こちらはIFMさまのホームページです。
どうぞよろしくお願いします。
Download ESI File
Ports
EtherCAT
こちらはEtherCAT Portです。
ConnectorはM12で、以下はPortの配置です。
IOT
こちらはIOT Portで、また今回の記事で使用方法を紹介します。
ConnectorはM12で、以下はPortの配置です。
IOLINK Port
こちらはIOLINK Portです。
ConnectorはM12で、以下はPortの配置です。
Power
こちらは電源Portです。
ConnectorはM12で、以下はPortの配置です。
Implementation
IFM Side
まずIFM Ethercat IO LINK Masterの各Portの役割を決めます。いまはPor1、Port7はIOLinkで、Port2,3,4は不使用で、Port5はデジタル出力、Port6はデジタル入力です。
IO Ports X1からX8までには4つのOperation Modeがあります。
- Disabled:Pin4(C/Q)はデータ交換しない
- Digital Input(DI):Pin4(C/Q)はBinary 入力データを受け取る
- Digital Output(DQ):Pin4(C/Q)はBinary 出力データする
- IO-LINK:Pin4(C/Q)はIO-Linkデータを交換する
そしてData MappingにTxPDOとRxPDOがあり、Ethercat MasterからみるとTxPDOはBytes入力データ、RxPDOはBytes出力データになります。
Support Module
AL1332がSupportするモジュールは以下になります。
Port Qualifier(0xF101)
DI4 | True=PIN4がONしてる |
DI2 | True=PIN2がONしてる |
PVO | True=IOLINKデバイスデータが有効 |
DACT | True=Portは無効や使用できない |
DA | True=IOLINKデビアスがPreoperateかOperate状態 |
PE | True=Portエラー |
PVI | True=Portデータは有効 |
Device Status(0xF100)
Keneyce Side
Setup
KeyenceのLR-TB2000 Sensorの設定手順を簡単に説明します。Mode+Set Buttonを長押しでデバイスを初期化します。
Start Config.が表示されます。MODEボタンで進みます。
Select I/Oが表示され、今回じゃOut1+Out2のDefault設定でMODE進みます。
Output ModeをPNPにし、MODEで進みます。
これで終わります!
Mapping
Sensorが図れる距離は49-9999まで。
Beckhoff Side
Import the ESI File
Zipを解凍し、中のFileをすべて\TwinCAT3\3.1\Config\io\EtherCATに移動します。
TwinCAT>EtherCAT Devices>Reload Device DescriptionaでDevice Listを更新します。
Add EtherCAT Master
EtherCAT Masterを追加します。I/O>Device>Add New Itemします。
EtherCAT>EtherCAT Masterを選び>Okします。
Adpater Tabから正しいInterfaceを選んでたかどうかを再確認します。
Add IFM AL1332
次はIFM Ethercat IO LINK Master AL1332を追加します。EtherCAT>Add New Itemします。
Ifm IO-Link master AL1332を選び>Okします。
IFM AL1332が追加されました。
Configure IFM
次はTwinCAT IDEからIFM AL1332の設定を変更します。Default上ですべてのPortもIOLINK 4IN/4OUTになっています。まず”Box 1″をクリックします。
Slots Tadで各Portの設定を行います。
例えばIO-Link Ch2を選んでる状態から”x”ボタンをクリックするとCh2の現在Port設定を削除します。
いまCh2はModuleの列にはなにも入ってない状態になりました。ですが、そのままコンパイルするとErrorになります。
次は右のModule ListからIOL_in_4_Byteを選び、”>”ButtonでModuleをCh2に追加します。
いまはCH2がIOL_in_4_Byteで、つまりIO-LINKで4BytesのINPUTデータを受け取る設定になっています。
ImplementationのIFM Sideにある図のように各Portを設定しましょう。
Box1のTreeからみると各PortのConfigurationも反映され、無効されたPortは表示しません。
Program
次はTwinCAT側のプログラムを組みます。
DUT
DUT_PortState
こちらはIFM AL1332の各Port状態を示すDUTです。
TYPE DUT_PortState : STRUCT Deactivated :BOOL; DigitalInput :BOOL; DigitalOutput :BOOL; IOLinkOP :BOOL; IOLinkStop :BOOL; IOLinkPreOP :BOOL; END_STRUCT END_TYPE |
DUT_IFM_AL1322_Qualifier
こちらはIFM AL1332の各Portのデータ評価状態を示すDUTです。
TYPE DUT_IFM_AL1322_Qualifier : STRUCT DI4 :BOOL;//Signal status of the digital input on pin 4 (if used) DI2 :BOOL;//Signal status of the digital input on pin 2 (if used) PVO :BOOL;//Port validity output DACT :BOOL;//Device deactivated DA :BOOL;//Device available PE :BOOL;//Port error PVI :BOOL;//Port validity input END_STRUCT END_TYPE |
DUT_IFM_AL1332
こちらはIFM AL1332のモジュール自体の状態をまとめて示すDUTで、8つのStateIOLinksとQualifierIOLinksはAL1332が8Portあるからです。
AT %I*の宣言はそれらの変数はProcess IOで実際EtherCAT Networkと紐つける必要があるからです。
TYPE DUT_IFM_AL1322 : STRUCT StateIOLinks AT %I* :ARRAY[1..8]OF USINT; QualifierIOLinks AT %I* :ARRAY[1..8]OF USINT; NewDiagnosisMessage AT %I* :BIT; TimeStamp AT %I* :ULINT; END_STRUCT END_TYPE |
uDUT_LR_TB2000
こちらはKeyence LR_TB2000 距離Sensor用のDUTで、2 Bytesの距離データを受け取るからです。
TYPE uDUT_LR_TB2000 : UNION raw :ARRAY[0..1]OF BYTE; Data :WORD; END_UNION END_TYPE |
Function Block
FB_IFM_AL1332
こちらはIFM AL1332のFunction Blockです。AL1332の数に合わせて複数定義し、変数とひもつければOkです。
FUNCTION_BLOCK FB_IFM_AL1322 VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR _Data :DUT_IFM_AL1322; END_VAR |
METHOD PUBLIC GetErroCode : uSINT
Port番号パラメータを受け取り、そして該当するPortのStateIOLinksをReturnします。
METHOD PUBLIC GetErroCode : uSINT VAR_INPUT PortNumbers:INT; END_VAR VAR Port :USINT; END_VAR IF PortNumbers >=1 AND Port <=8 THEN Port:=_Data.StateIOLinks[PortNumbers]; ELSE Port:=0; END_IF Port:=SHR(Port,4); GetErroCode:=Port; |
METHOD PUBLIC GetIOLinkSts : BOOL
Port番号パラメータを受け取り、そして該当するPortのIOLINK StatusをReturnします。
True=IOLINK Status正常。
METHOD PUBLIC GetIOLinkSts : BOOL VAR_INPUT PortNumbers:INT; END_VAR VAR PortState:DUT_PortState; Qualifier:DUT_IFM_AL1322_Qualifier; END_VAR GetIOLinkSts:=False; IF PortNumbers >=1 AND PortNumbers <=8 THEN PortState:=GetPortState(PortNumbers); Qualifier:=GetQualifier(PortNumbers); GetIOLinkSts:=GetErroCode(PortNumbers) = 0 AND PortState.IOLinkOP AND NOT Qualifier.PE ;END_IF |
METHOD PUBLIC GetPortState : DUT_PortState
Port番号パラメータを受け取り、該当するPortのDUT_PortState Data TypeをReturnします。
METHOD PUBLIC GetPortState : DUT_PortState VAR_INPUT PortNumbers:INT; END_VAR VAR Port :USINT; END_VAR GetPortState.Deactivated:=FALSE; GetPortState.DigitalInput:=FALSE; GetPortState.DigitalOutput:=FALSE; GetPortState.IOLinkOP:=FALSE; GetPortState.IOLinkPreOP:=FALSE; GetPortState.IOLinkStop:=FALSE; IF PortNumbers >=1 AND Port <=8 THEN Port:=_Data.StateIOLinks[PortNumbers]; ELSE Port:=0; END_IF Port:=Port AND 16#0F; GetPortState.Deactivated:=Port = 16#0; GetPortState.DigitalInput:=Port = 16#1; GetPortState.DigitalOutput:=Port = 16#2; GetPortState.IOLinkOP:=Port = 16#3; GetPortState.IOLinkStop:=Port = 16#4; GetPortState.IOLinkPreOP:=Port.5; |
METHOD PUBLIC GetQualifier : DUT_IFM_AL1322_Qualifier
Port番号パラメータを受け取り、該当するPortのDUT_IFM_AL1322_Qualifier Data TypeをReturnします。
METHOD PUBLIC GetQualifier : DUT_IFM_AL1322_Qualifier VAR_INPUT PortNumbers:INT; END_VAR VAR Port :USINT; END_VAR GetQualifier.DA:=FALSE; GetQualifier.DACT:=FALSE; GetQualifier.DI2:=FALSE; GetQualifier.DI4:=FALSE; GetQualifier.PE:=FALSE; GetQualifier.PVI:=FALSE; GetQualifier.PVO:=FALSE; IF PortNumbers >=1 AND PortNumbers <=8 THEN Port:=_Data.QualifierIOLinks[PortNumbers]; ELSE Port:=0; END_IF GetQualifier.DI4:=Port.0; GetQualifier.DI2:=Port.1; GetQualifier.PVO:=Port.3; GetQualifier.DACT:=Port.4; GetQualifier.DA:=Port.5; GetQualifier.PE:=Port.6; GetQualifier.PVI:=Port.7; |
PROPERTY PUBLIC TimeStamp : ULINT
現在AL1332のTimeStampを取得します。
PROPERTY PUBLIC TimeStamp : ULINT TimeStamp:=_Data.TimeStamp; |
FUNCTION_BLOCK FB_LR_TB2000
こちらはKeyenceのIOLINK Sensor用のFunction Blockです。
FUNCTION_BLOCK FB_LR_TB2000 VAR_INPUT iIOLinkOK :BOOL; END_VAR VAR_OUTPUT qDistance :WORD; END_VAR VAR _devices AT %I* :uDUT_LR_TB2000; temp :uDUT_LR_TB2000; END_VAR |
ByteをSwapし、現在値を出力します。
MAIN
こちらはMain Programです。
IOLINK Deviceのデータを取ると、Port4,5のDI/DOを制御する簡単なプログラムです。
PROGRAM MAIN VAR LR_TB2000_1:FB_LR_TB2000; AL1322_1 :FB_IFM_AL1322; Distance :WORD; Port4,Port5 :DUT_IFM_AL1322_Qualifier; Port5_Outputs AT %q*:USINT; END_VAR LR_TB2000_1( iIOLinkOK:=AL1322_1.GetIOLinkSts(1) ,qDistance=>Distance ); Port4:=AL1322_1.GetQualifier(4); Port5:=AL1322_1.GetQualifier(5); IF NOT Port4.DI2 THEN Port5_Outputs:=1; ELSE Port5_Outputs:=0; END_IF |
Add Link
最後に、Ethercat IOLINK Slave Al1332の変数とUser ProgramをLinkします。
IO-Link Device Status
TxPDO IO-LINK Device Statusで各IOLINKの状態をLinkします。
Qualifier of IO-Link
TxPDO IO-LINK Qualifierで各IOLINKの評価をLinkします。
Timestamp
TxPDO TimeStampでAL1332のTimeStampをLinkします。
Module1(IOL_In_4Byte)
Module 1(IOL_In_4Byte)>TxPDOのByte0とByte1をUser Programとひもつけます。
Module5(Digital OUT)
Module5>RxPDOのByte0は出力なので、1=出力する。その変数をUser Programとひもつけます。
Activte
最後はActivate ConfigurationでHardware ConfigurationをRuntimeにDownloadします。
Runtimeを再起動します。
Login
LoginでUser ProgramをDownloadします。
Start
Runtimeを起動します。
Result
DI/DO
Beckhoff TwinCAT with IFM AL1332 Ethercat IOLink and Pilz ESTOP – YouTube
IO-LINK
Beckhoff TwinCAT with IFM AL1332 Ethercat IOLink and keyence IOLink Devices – YouTube
Source Code
下記のLINKから記事のプロジェクトをDownloadしてください。
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT_IFM_AL1332.tnzip