三菱#TURCKのIO-Link MasterをEthernet/IP で繋ごう

今回の記事では三菱IQ-R R00CPUとRJ71EIP91のEthernet/IP モジュールを使用し、TURCKのIO-Link MasterとEthernet/IP で接続します。

IO-Link デバイスはMurrelekronik・TURCK・Nass magent・Contrinexのものになります。

さ、はじめよう!

Reference Video

Reference Link

Project#Omrn NX-CSG320 x RJ71EIP91 Ethernet/IP Class1 Tag Communication
三菱#IQ-R RJ71EIP91を使う
Pilz#Part06_Build A Ethernet/IP Adapter and connect with TwinCAT/Mitsubishi

System architecture

IO-Link 通信には、少なくとも 1 つの IO-Link マスタと 1 つの IO-Link デバイス(センサやアクチュエータなど)が必要で、シールドされていない 3 線または 5 線標準ケーブルで相互接続されます。

IO-Linkに関する設定はコンフィグレーションツールを使うか、フィールドバスレベルで行うことができます。

IO-Link マスタは IO-Link デバイスと上位の制御システムとの接続を確立し、注意するのはIO-Link マスタは複数の IO-Link ポートを持つことができます。各ポートに接続できる IO-Link デバイスは 1 つだけです。

Combining IO-Link devices with different specifications

仕様 V1.0 のデバイスだけが、仕様 V1.0 の IO-Link マスタで操作できる。

逆に仕様 V1.0 および V1.1 のデバイスは、仕様 V1.1 の IO-Link マスターで操作できます。

Data storage mode

データストレージモードでは、再構成の必要なく IO-Link デバイスを交換することができる便利な機能です。

IO-Link マスタまたは IO-Link デバイスは、前回の設定で設定されたデバイスパラメータを保存でき、IO-Link マスタと IO-Link デバイスのパラメータデータメモリは同期されます。

データ保存モードが有効になっている場合、デバイスが交換されると、マスタは保存されているデバイスパラメータを新しいデバイスに書き込みます。新しいコンフィギュレーションを実行することなく、アプリケーションを再起動することができます。

注意するのはデータ保存モードは IO-Link 仕様 V1.1 に準拠したデバイスでのみ利用可能。

TBEN-L4-8IOL4

TBEN-L4-8IOL4保護等級IP65/IP67/IP69Kの完全密閉型ハウジングで設計されています。

  • TBEN-L…-8IOL
    • IO-Link デバイスを接続するための8つの IO-Link ポートが揃えてます。
    • コネクタ C0 ~ C3 の IO-Link ポートは、クラス A ポートになります。
    • コネクタ C4 ~ C7 の IO-Link ポートは、クラス B ポートになります。

また、 8 つの IO-Link チャンネルに加えて、4 つのユニバーサルデジタル DXP チャンネル (PNP) が利用可能です。4つの IO-Link チャネルは独立してパラメータ設定でき、IO-Link モードまたは SIO モード(DI)で動作できます。

さらにTURCKのマルチプロトコルデバイスは、自動プロトコル検出により、PROFINET、EthernNet/IP、Modbus TCPで動作させることができます。

Operating principle

IO-Link Master TBEN-L…-8IOL は、IO-Link センサとアクチュエータを上位の制御システムに接続可能で、このデバイスはEthernetインターフェースとIO-Linkマスター機能(クラスAおよびクラスBポート)を持つフィールドバスに依存しないI/Oエレクトロニクスを備えています。

Ethernet インタフェースを介して、IO-Link マスタは EtherNet/IP デバイス、Modbus TCP スレーブ、または PROFINET デバイスとしてEthernet ネットワークに接続されます。

デバイスが動作中、プロセスデータは Ethernet と IO-Link の間で交換されます。

Multiprotocol technology

TBEN-L4-8IOL4は、以下の3つのイーサネット・プロトコルで使用できる:

  • Modbus TCP
  • EtherNet/IP
  • PROFINET

デバイスに必要なイーサネット・プロトコルは、自動検出または手動で決定できます。

Automatic protocol detection

マルチプロトコル・デバイスは、ユーザーの介入なしに、EtherNet/IP デバイス、Modbus TCP スレーブ、または PROFINET デバイスすべてで操作できます。デバイスおプロトコルが検知されたあと、他のプロトコルからのデバイスへのアクセスは読み取り専用となる。

Manual Protocol Selection

ユーザーはプロトコルを手動で定義することもできます。この場合、デバイスは選択されたプロトコルに固定されます。他のプロトコルでは、デバイスは読み取り専用でしかアクセスできません。

Simple IO-Link Device Integration (SIDI)

TURCKの Simple IO-Link Device Integration (SIDI) は、PROFINET エンジニアリングシステムにおける IO-Link デバイスの取り扱いを簡単にし、デバイスはすでにマスタのGSDMLファイルに統合されています、 

ユーザはProfinet IO Controllerを構築するソフトからデバイスを選択し(例えばSiemens のTIA)からデバイスを選択し、デバイスがモジュール式I/Oシステムのサブモジュールであるかのように、ドロップダウンフィールドを使ってプロジェクトに統合することができます。

Supply concept

TBEN-L4-8IOL4は、2つの独立した電圧V1とV2を介して供給されます。

  • V1 = モジュールと各スロットへの供給
  • V2 = モジュールと各コネクターの供給(個別に取り外し可能)

I/Oチャンネルは「取り外し可能なI/O」(V2を通して供給)と「取り外し不可能な」I/O(V1を通して供給)という異なる電位グループに分けられ、非常停止回路を経由して設備の一部を安全にシャットダウンすることができます。

Class A

Class B

Setting the IP address

TBEN-L4-8IOL4のIPアドレスは、3つの1ロータリー・コーディング・スイッチもしくはWeb server・Turck Service Toolから設定できます。

Ethernet/IP

こちらはTBEN-L4-8IOL4のEthernet/IPの仕様になります。

Input/Output Assembly

こちらはTBEN-L4-8IOL4のEthernet/IPのAssembly一覧です。

103

こちらはTBEN-L4-8IOL4のEthernet/IPのInput Assembly、Instane103になります。

104

こちらはTBEN-L4-8IOL4のEthernet/IPのOutput Assembly、Instane104になります。

Implementation 

Turck Side

まずTURCK側から始めます。ChormeやFirefoxからTURCのIPアドレスを入力します。

こちらはTURCKのWeb serverになります。

password

TURCKデバイスのDefault Passwordはpasswordです。

Default Passwordを実際の使い方によって変更するかを決めましょう。

Error

もしTURCKモジュールがエラー発生した場合、LOCAL>Diagnosisに!の黄色マークがついてます。

Port Configuration

次はTURCK IO-Link Masterの各Portを設定するため、LOCAL I/O>Parameterをクリックします。

各Portの設定画面が表示されます。

Read ボタンをクリックし現在IO-Link Portの設定を読み込みます。

Port1

Port1はMurrのアナログ>IOLINK変換器と接続されてますので、Operation ModeはIO-Link without validationを選択します。

Port2

Port2はなにも接続されていませんので、Operation ModeはDIを選択します。

Port3

Port3はなにも接続されていませんので、Operation ModeはDIを選択します。

Port4

Port4はTURCKの傾きを検知B1NF360V-QR20-IOLX3-H1141 IOLINKデバイスと接続されてますので、Operation ModeはIO-Link without validationを選択します。

Port5

Port5はNass magnetのSmart Connector Form A IOLINKデバイスと接続されてますので、Operation ModeはIO-Link without validationを選択します。

Port6

Port6はなにも接続されていませんので、Operation ModeはDIを選択します。

Port7

Port7はMurrのIOLINK Hub 59719と接続されてますので、Operation ModeはIO-Link without validationを選択します。

Port8

Port8はCONTRINEXのSmart Sensor IDWE-M12MM-NMS-A0 IOLINKデバイスと接続されてますので、Operation ModeはIO-Link without validationを選択します。

IODD Configurator

次はTURCKのIODD CONFIGURATORを紹介します。こちらのツールは各PortのIO-LINKデバイスのパラメータ設定や診断情報の確認などができます。

例えばPort1を設定してみましょう。

Load IODD File

作業してるPCがネットと繋がっている場合、”Web search”ボタンをクリックし、IODDを直接IODD Fileを検索し、Downloadすることができます。

Done!

Process data

Process data項目では該当するIO-Link デバイスの入出力データを確認できます。

またProcess data隣にある小さななTrendボタンをクリックします。

Porcess Dataのグラフ表が表示できます。

Process data Structure

Processdata Structureの項目では該当するIO-Link デバイスのProcess data構造を確認できます。その機能はDebug・プログラム作成するときはすごく役に立ちます。

Active events

Active eventsの項目では該当するIO-Link デバイスが発生中のアラームを確認できます。

Event history

Event historyの項目では該当するIO-Link デバイスのアムラー履歴を確認できます。

Documents

DOCUMENTS機能ではいま使用してるデバイスの詳しい情報などを確認できます。

例えば、今回はEtherent/IPを使用するので、”Etherent/IP Memory Map”項目でEtherent/IPの使用領域を確認できます。

Mitsubishi Side

次は三菱のIQ-R側の準備を行います。

Download EDS File

TURCKのEDS Fileを下記のLINKでDonwloadしてください。

https://www.turck.de/en/product/6814082

Install Ethernet/IP Configuration Tools

RJ71EIP91でEthernet/IP ネットワークを構築するために、下記のLinkでConfiguration ToolsをDownloadし、PCにインストールしてください。 

https://www.mitsubishielectric.co.jp/fa/download/software/detailsearch.do?mode=software&kisyu=/plcr&shiryoid=0000000155&lang=1&select=0&softid=1&infostatus=1_7_8&viewradio=0&viewstatus=&viewpos=

New Project

GXWORKS3を起動し、Project>Newで新規プロジェクトを追加します。

今回使用するのはR00 CPUなので、TypeをR00に、Program LanguageをSTに設定しましょう。

Done!

Module Configuration

Hardware Configurationを変更するために、”Module Configuration”をクリックします。

こちらはModule Configuration画面です。

R35B

Power Rack R35Bを追加します。

R00 CPUを”CPU”のSlotにひばってください。

Done!

R61P

電源モジュールR61PをPOW Slotに追加します。

Done!

RJ71EIP91

最後はRJ71EIP91モジュールをSlot0に追加します。

Done!

RJ71EIP91を選択すると、Start XYはモジュールの制御や状態確認になります。今回のTutorialはラベルプログラムをしますので、そのStartXYは気にする必要がありません。

Add Label

Elements Selection>Module>RJ71EIP91を右クリック>Add Module LabelをクリックしEIPモジュールのGlobal Labelをプロジェクトに追加します。

M+GlobalというGlobal label Listが追加されました。

EIP91_1が定義され、後ほど三菱のRJ71EIP91 Function Blockを使用するときに使いますので。

Detail DisplayをクリックするとAssignという項目が表示され、青い色の”Detailed Setting”があります。

GXWORKS3はRJ71EIP91に必要なXYとBuffer Memoryも定義されています。

CPU IP Address

PLCのIPアドレスを設定するため、Parameter>R00CPU>Module Parameterをクリックします。

IP Addressをアプリケーションに合わせてください。

Connection Destinationで実機のCPUと通信設定できます。

現在使用してるConenction設定をクリックします。

PLC Moduleをクリックし通信設定を行います。

いまは192.168.5.39になっています。

Connection Testボタンをクリックし通信テストを行います。

Done!

IP アドレスを設定し、Checkボタンで設定エラーがあるかをCheckします。

Done!

Apply ボタンで設定を保存します。

RJ71EIP91 Configurations

次はRJ71EIP91の設定を行います。

IP address

RJ71EIP91のIPアドレスを設定するためModule Information>0000:RJ71EIP91をクリックします。

IP Address欄をダブルクリックします。

IP AddressやSubnet Maskをアプリケーションに合わせて設定してください。

IPアドレスを設定した上、Checkボタンで設定を確認します。

Done!

Configure the Ethernet/IP Network

モジュールの基本設定が完成しましたので、次はEthernet/IP ネットワークを構築します。

Stat tools

Ethernet/IP Configuration Toolをダブルクリックしツールを起動します。

こちらはRJ71EIP91のEthernet/IP Configuration Toolになります。

Install EDS File

Devie LibraryにTURCKのEDS Fileを追加します。

Nextで進みます。

EDS Fileの追加画面に変わります。

Add all the EDS from the Directoryを選び>Browseをクリックします。

EDS Fileが格納されているFolderを設定し、Next>で進みます。

Next>で進みます。

Done!

Add Ethernet/IP Adapter

TURCKのEDS FileはIdent No.でデバイスを表現します。今回の記事では使用するTBEN-L4-8IOL4のIdent No.は6814082です。

Etherent/IP Devices>TURCK>Communication AdapterでTBEN-L4-8IOL4のIdent No.と一致する6814082を選びます。

6814082を選び、右にある空き部分にDropします。

Etherent/IP Adapter の設定が表示されます。

Network Properties

Network PropertiesでTURCK IO-Link MasterのIPアドレスを設定します。

Connections

Connections TabでTURCKのIO-Link Masterと接続する、Connection設定になります。

Online

設定完了したら、Onlineボタンをクリックします。

Download 

次はConfigurationをDownloadします。

Downloadで進みます。

Done!

Program

Configurationが完成したら、今度はプログラムを作ります。

Structured Data Types

DUT_TBEN_L4_8IOL_Instance103

こちらの構造体はTBEN-L4-8IOL4のInstance103データをまとめた構造体になります。

w00StatusWord Word [Signed]
w01Inputs Word [Signed]
w02DVS Word [Signed]
Port1 Word [Signed](0..15)
Port2 Word [Signed](0..15)
Port3 Word [Signed](0..15)
Port4 Word [Signed](0..15)
Port5 Word [Signed](0..15)
Port6 Word [Signed](0..15)
Port7 Word [Signed](0..15)
Port8 Word [Signed](0..15)
VERR Word [Signed]
DXP Word [Signed]
DiagnosticPort1 Word [Signed]
DiagnosticsPort2 Word [Signed]
DiagnosticsPort3 Word [Signed]
DiagnosticsPort4 Word [Signed]
DiagnosticsPort5 Word [Signed]
DiagnosticsPort6 Word [Signed]
DiagnosticsPort7 Word [Signed]
DiagnosticsPort8 Word [Signed]
IOLinkEvents01 Word [Signed](0..1)
IOLinkEvents02 Word [Signed](1..2)
IOLinkEvents03 Word [Signed](1..2)
IOLinkEvents04 Word [Signed](1..2)
IOLinkEvents05 Word [Signed](1..2)
IOLinkEvents06 Word [Signed](1..2)
IOLinkEvents07 Word [Signed](1..2)
IOLinkEvents08 Word [Signed](1..2)
IOLinkEvents09 Word [Signed](1..2)
IOLinkEvents10 Word [Signed](1..2)
IOLinkEvents11 Word [Signed](1..2)
IOLinkEvents12 Word [Signed](1..2)
IOLinkEvents13 Word [Signed](1..2)
IOLinkEvents14 Word [Signed](1..2)
IOLinkEvents15 Word [Signed](1..2)
IOLinkEvents16 Word [Signed](1..2)
DUT_TBEN_L4_8IOL_Instance104

こちらの構造体はTBEN-L4-8IOL4のInstance104データをまとめた構造体になります。

w00NotUsed Word [Signed]
w01DXP Word [Signed]
Port1 Word [Signed](0..15)
Port2 Word [Signed](0..15)
Port3 Word [Signed](0..15)
Port4 Word [Signed](0..15)
Port5 Word [Signed](0..15)
Port6 Word [Signed](0..15)
Port7 Word [Signed](0..15)
Port8 Word [Signed](0..15)
VAUX Word [Signed]
DUT_TURCK_DVS

こちらの構造体はTBEN-L4-8IOL4のDVSデータをまとめた構造体になります。

DVS0 Bit
DVS2 Bit
DVS4 Bit
DVS6 Bit
DVS8 Bit
DVS10 Bit
DVS12 Bit
DVS14 Bit
DUT_TURCK_VAUX

こちらの構造体はTBEN-L4-8IOL4のVAUXデータをまとめた構造体になります。

b0VAUX1Pin1C0 Bit
b1VAUX1Pin1C1 Bit
b2VAUX1Pin1C2 Bit
b3VAUX1Pin1C3 Bit
b4VAUX1Pin1C4 Bit
b5VAUX1Pin1C5 Bit
b6VAUX1Pin1C6 Bit
b7VAUX1Pin1C7 Bit
b8NoUsed Bit
b9NoUsed Bit
bANoUsed Bit
bBNoUsed Bit
bCVAUX1Pin2C4 Bit
bDVAUX1Pin2C5 Bit
bEVAUX1Pin2C6 Bit
bFVAUX1Pin2C7 Bit
DUT_TURCK_IOILINKPORT_Diagnostics

こちらの構造体はTBEN-L4-8IOL4のIO-Link  Port診断データを纏めた構造体です。

b0NotUsed Bit
b1PPR Bit
b2CFGERR Bit
b3DSERR Bit
b4HWERR Bit
b5PDINV Bit
b6EVT2 Bit
b7EVT1 Bit
b8PRMERR Bit
b9OTMP Bit
bALLVU Bit
bBULVE Bit
bCVLOW Bit
bDVHIGH Bit
bEOVL Bit
bFGENERR Bit
DUT_IOLINK_EVENT_SQ_QUALIFIER_INSTANCE

こちらの構造体はIO-Link Event QualifierのInstance部分になります。

bUnknown Bit
bNotUsed Bit
bApplications Bit
DUT_IOLINK_EVENT_SQ_QUALIFIER_SOURCE

こちらの構造体はIO-Link Event QualifierのSource部分になります。

bIsMaster Bit
bIsDevice Bit
DUT_IOLINK_EVENT_SQ_QUALIFIER_MODE

こちらの構造体はIO-Link Event QualifierのMode部分になります。

bNotUsed Bit
bEventSingleShot Bit
bEventDisappears Bit
bEventAppears Bit
DUT_IOLINK_EVENT_SQ_QUALIFIER_TYPE

こちらの構造体はIO-Link Event QualifierのTYPE部分になります。

bNotUsed Bit
bNotification Bit
bWarning Bit
bError Bit
DUT_IOLINK_EVENT_SQ_QUALIFIER

こちらの構造体はIO-Link Event Qualifier のInstance・Source・Type・Modeを纏めた構造体です。

Instance DUT_IOLINK_EVENT_SQ_QUALIFIER_INSTANCE
Source DUT_IOLINK_EVENT_SQ_QUALIFIER_SOURCE
EvType DUT_IOLINK_EVENT_SQ_QUALIFIER_TYPE
EveMode DUT_IOLINK_EVENT_SQ_QUALIFIER_MODE
DUT_TURCK_IOLINK_EVENTS

こちらの構造体はTBEN-L4-8IOL4のEVENTS構造体になります。中にはQualifier・Event Code・Port・先程定義したDetailsがあります。

Port Word [Unsigned]/Bit String [16-bit]
Qualifier Word [Unsigned]/Bit String [16-bit]
EventCode Word [Signed]
Details DUT_IOLINK_EVENT_SQ_QUALIFIER
DUT_Murr_59719

こちらはmurrelektronik社のIO-Link Hub 59719の構造体になります。

b0Pin4X0 Bit
b1Pin2X0 Bit
b2Pin4X1 Bit
b3Pin2X1 Bit
b4Pin4X2 Bit
b5Pin2X2 Bit
b6Pin4X3 Bit
b7Pin2X3 Bit
b8Pin4X4 Bit
b9Pin2X4 Bit
bAPin4X5 Bit
bBPin2X5 Bit
bCPin4X6 Bit
bDPin2X6 Bit
bEPin4X7 Bit
bFPin2X7 Bit
DUT_Contrinex_IDWE_SENSOR

こちらはContrinex社のIDWEシリーズを纏めた構造体になります。

b0OSS1 Bit
b1OSS2 Bit
b2TSS Bit
b3SSC1 Bit
b4SCC2 Bit
b5ALR1 Bit
b6ALR2 Bit
b7ALR3 Bit
r32ScaleValue FLOAT [Single Precision]
r32MeasureValue FLOAT [Single Precision]

Function

次はTurckのIO-Link Master Instance103にあるEventsや診断情報を取り出す関数を作成します。

FC_TURCK_GetEVENTS

こちらはTUCKのIO-Link Master Instance103にあるEventsを取り出します。

VAR
iData Word [Signed](1..2) VAR_INPUT
bENOTEMP Bit VAR
tempWord Word [Unsigned]/Bit String [16-bit] VAR
tempWord2 Word [Unsigned]/Bit String [16-bit] VAR
Code
//Q
WAND(TRUE,iData[1],16#00FF,FC_TURCK_GetEVENTS.Qualifier);
//Port
WAND(TRUE,iData[1],16#FF00,tempWord);
tempWord:=SHR_E(TRUE,bENOTEMP,tempWord,8);
FC_TURCK_GetEVENTS.Port:=tempWord;
//EventCode
FC_TURCK_GetEVENTS.EventCode:=iData[2];

tempWord:=FC_TURCK_GetEVENTS.Qualifier;
//
FC_TURCK_GetEVENTS.Details.EveMode.bEventAppears:=FALSE;
FC_TURCK_GetEVENTS.Details.EveMode.bEventDisappears:=FALSE;
FC_TURCK_GetEVENTS.Details.EveMode.bEventSingleShot:=FALSE;
FC_TURCK_GetEVENTS.Details.EveMode.bNotUsed:=FALSE;
//
FC_TURCK_GetEVENTS.Details.EvType.bError:=FALSE;
FC_TURCK_GetEVENTS.Details.EvType.bNotification:=FALSE;
FC_TURCK_GetEVENTS.Details.EvType.bNotUsed:=FALSE;
FC_TURCK_GetEVENTS.Details.EvType.bWarning:=FALSE;
//
FC_TURCK_GetEVENTS.Details.Instance.bApplications:=FALSE;
FC_TURCK_GetEVENTS.Details.Instance.bNotUsed:=FALSE;
FC_TURCK_GetEVENTS.Details.Instance.bUnknown:=FALSE;
//
FC_TURCK_GetEVENTS.Details.Source.bIsDevice:=FALSE;
FC_TURCK_GetEVENTS.Details.Source.bIsMaster:=FALSE;

IF tempWord >0 THEN

//
WAND(TRUE,tempWord,2#00000111,tempWord2);
CASE WORD_TO_INT(tempWord2) OF

0:
FC_TURCK_GetEVENTS.Details.Instance.bUnknown:=TRUE;
1..3,5..7:
FC_TURCK_GetEVENTS.Details.Instance.bNotUsed:=TRUE;
4:
FC_TURCK_GetEVENTS.Details.Instance.bApplications:=TRUE;

END_CASE;

//
WAND(TRUE,tempWord,2#00001000,tempWord2);
tempWord2:=SHR_E(TRUE,bENOTEMP,tempWord2,3);
CASE WORD_TO_INT(tempWord2) OF

0:
FC_TURCK_GetEVENTS.Details.Source.bIsDevice:=TRUE;
1:
FC_TURCK_GetEVENTS.Details.Source.bIsMaster:=TRUE;
END_CASE;

//
WAND(TRUE,tempWord,2#00110000,tempWord2);
tempWord2:=SHR_E(TRUE,bENOTEMP,tempWord2,4);
CASE WORD_TO_INT(tempWord2) OF

0:
FC_TURCK_GetEVENTS.Details.EvType.bNotUsed:=TRUE;
1:
FC_TURCK_GetEVENTS.Details.EvType.bNotification:=TRUE;
2:
FC_TURCK_GetEVENTS.Details.EvType.bWarning:=TRUE;
3:
FC_TURCK_GetEVENTS.Details.EvType.bError:=TRUE;
END_CASE;

//
WAND(TRUE,tempWord,2#11000000,tempWord2);
tempWord2:=SHR_E(TRUE,bENOTEMP,tempWord2,6);
CASE WORD_TO_INT(tempWord2) OF

0:
FC_TURCK_GetEVENTS.Details.EveMode.bNotUsed:=TRUE;
1:
FC_TURCK_GetEVENTS.Details.EveMode.bEventSingleShot:=TRUE;
2:
FC_TURCK_GetEVENTS.Details.EveMode.bEventDisappears:=TRUE;
3:
FC_TURCK_GetEVENTS.Details.EveMode.bEventAppears:=TRUE;
END_CASE;
END_IF;
FC_TURCK_GetIOLINKDiagnostics

こちらはTUCKのIO-Link Master Instance103にある各IO-Link Portの診断情報を取り出します。

VAR
iPortData Word [Signed] VAR_INPUT
iPortData1 Word [Unsigned]/Bit String [16-bit] VAR
Code
iPortData1:=INT_TO_WORD(iPortData);
FC_TURCK_GetIOLINKDiagnostics.b0NotUsed:=iPortData1.0;
FC_TURCK_GetIOLINKDiagnostics.b1PPR:=iPortData1.1;
FC_TURCK_GetIOLINKDiagnostics.b2CFGERR:=iPortData1.2;
FC_TURCK_GetIOLINKDiagnostics.b3DSERR:=iPortData1.3;
FC_TURCK_GetIOLINKDiagnostics.b4HWERR:=iPortData1.4;
FC_TURCK_GetIOLINKDiagnostics.b5PDINV:=iPortData1.5;
FC_TURCK_GetIOLINKDiagnostics.b6EVT2:=iPortData1.6;
FC_TURCK_GetIOLINKDiagnostics.b7EVT1:=iPortData1.7;
FC_TURCK_GetIOLINKDiagnostics.b8PRMERR:=iPortData1.8;
FC_TURCK_GetIOLINKDiagnostics.b9OTMP:=iPortData1.9;
FC_TURCK_GetIOLINKDiagnostics.bALLVU:=iPortData1.A;
FC_TURCK_GetIOLINKDiagnostics.bBULVE:=iPortData1.B;
FC_TURCK_GetIOLINKDiagnostics.bCVLOW:=iPortData1.C;
FC_TURCK_GetIOLINKDiagnostics.bDVHIGH:=iPortData1.D;
FC_TURCK_GetIOLINKDiagnostics.bEOVL:=iPortData1.E;
FC_TURCK_GetIOLINKDiagnostics.bFGENERR:=iPortData1.F;

Function Block

GXWORKSのEthernet/IP Libraryを追加するため、Module FB>RJ71EIP91を右クリック>Add to Projectをクリックします。

Done!

Global Label

次はGlobal labelでTURCK IO-Linker Masterとデータ交換する領域を定義します。

IOLINK_1_103 DUT_TBEN_L4_8IOL_Instance103
IOLINK_1_104 DUT_TBEN_L4_8IOL_Instance104

Global label定義画面にある”Show Details”ボタンをクリックします。

Assign(Detailed Setting)をクリックします。

Instance103はD100から割り付けます。

Instance104はD500から割り付けます。

MAIN

次はMainプログラムです。

VAR
r32Port1Current FLOAT [Single Precision]
r32Port1Level FLOAT [Single Precision]
r32Temp FLOAT [Single Precision]
i16Port4_ProcessDataRev Word [Signed]
i16Port4_ProcessData Word [Unsigned]/Bit String [16-bit]
i16Port4_Scale Word [Signed]
bENOTEMP Bit
fbClass1SetOutputData_00A M+RJ71EIP91_Class1SetOutputData_00A
i16PWMSetPoint Word [Unsigned]/Bit String [16-bit]
udtMurr59719_inputs DUT_Murr_59719
udtMurr59719_outputs DUT_Murr_59719
fbTON1 TON
fbTON2 TON
udtContrinex_Sensor1 DUT_Contrinex_IDWE_SENSOR
iConnetionNO Word [Unsigned]/Bit String [16-bit]
udtVAUX DUT_TURCK_VAUX
udtVERR DUT_TURCK_VAUX
TURCKPortsDiagnostic DUT_TURCK_IOILINKPORT_Diagnostics(1..8)
TURCKPortsEvent DUT_TURCK_IOLINK_EVENTS(1..4)
Code

プログラムは詳しく説明しませんが、三菱のLibraryを使用し、Connection1のデータを取得し、各Portと接続されているIO-Linkデバイスによってデータ処理します。

最後はまた三菱のLibraryを使用し、Connection1に出力データを書き込みます。

//Connections
iConnetionNO:=1;

//1s Pulse
fbTON1(
IN:= NOT fbTON2.Q
,PT:= T#1s
//,Q=> ?BOOL? ,ET=> ?TIME?
);

fbTON2(
IN:= fbTON1.Q
,PT:= T#1s
//,Q=> ?BOOL? ,ET=> ?TIME?
);

//Start2Communication
bStart2Comm:=EIP91_1.bSts_ModuleReady
AND NOT EIP91_1.bSts_ModuleError;
EIP91_1.bSet_CommunicationStartupRequest:=bStart2Comm;

//Case Control
IF i16Step = 0 AND bStart2Comm THEN
i16Step:=10;
END_IF;

CASE i16Step OF

10:
fbClass1GetInputData_00A(
i_bEN:= bStart2Comm
,i_stModule:= EIP91_1
,i_uConnectionNo:= iConnetionNO
,o_bENO=> bENO
,o_bOK=> bOK
,o_bErr=> bErr
,o_uErrId=> uErrID
,o_uStatusId=> uStatusID
,o_uInputData=> D100
);
IF bErr THEN
i16Step:=20;
END_IF;

20:
fbClass1GetInputData_00A(
i_bEN:= FALSE
,i_stModule:= EIP91_1
,i_uConnectionNo:= iConnetionNO
,o_bENO=> bENO
,o_bOK=> bOK
,o_bErr=> bErr
,o_uErrId=> uErrID
,o_uStatusId=> uStatusID
,o_uInputData=> D100
);
i16Step:=0;


END_CASE;

//Process Input data valid
udtDVS.DVS0:=IOLINK_1_103.w02DVS.0;
udtDVS.DVS2:=IOLINK_1_103.w02DVS.2;
udtDVS.DVS4:=IOLINK_1_103.w02DVS.4;
udtDVS.DVS6:=IOLINK_1_103.w02DVS.6;
udtDVS.DVS8:=IOLINK_1_103.w02DVS.8;
udtDVS.DVS10:=IOLINK_1_103.w02DVS.A;
udtDVS.DVS12:=IOLINK_1_103.w02DVS.C;
udtDVS.DVS14:=IOLINK_1_103.w02DVS.E;

//Port1 Murr, Analog->IOLINK Converter
r32Port1Current:=
(INT_TO_REAL(IOLINK_1_103.Port1[0])/32767.0)*20.0+4.0;
r32Port1Level:=
(INT_TO_REAL(IOLINK_1_103.Port1[0])/32767.0)*100.0;


//Port4 Turck Sensor
i16Port4_ProcessDataRev:=IOLINK_1_103.Port4[0];
i16Port4_ProcessData:=INT_TO_WORD(IOLINK_1_103.Port4[1]);


//Port5 Nass
//
IOLINK_1_104.Port5[0].0:=M101;
i16PWMSetPoint:=D1003;

IOLINK_1_104.Port5[0].1:=i16PWMSetPoint.0;
IOLINK_1_104.Port5[0].2:=i16PWMSetPoint.1;
IOLINK_1_104.Port5[0].3:=i16PWMSetPoint.2;
IOLINK_1_104.Port5[0].4:=i16PWMSetPoint.3;
IOLINK_1_104.Port5[0].5:=i16PWMSetPoint.4;
IOLINK_1_104.Port5[0].6:=i16PWMSetPoint.5;
IOLINK_1_104.Port5[0].7:=i16PWMSetPoint.6;
IOLINK_1_104.Port5[0].8:=i16PWMSetPoint.7;

//Port7 Murr IOLINK-hub
//
udtMurr59719_inputs.b0Pin4X0:=IOLINK_1_103.Port7[0].0;
udtMurr59719_inputs.b1Pin2X0:=IOLINK_1_103.Port7[0].1;
udtMurr59719_inputs.b2Pin4X1:=IOLINK_1_103.Port7[0].2;
udtMurr59719_inputs.b3Pin2X1:=IOLINK_1_103.Port7[0].3;
udtMurr59719_inputs.b4Pin4X2:=IOLINK_1_103.Port7[0].4;
udtMurr59719_inputs.b5Pin2X2:=IOLINK_1_103.Port7[0].5;
udtMurr59719_inputs.b6Pin4X3:=IOLINK_1_103.Port7[0].6;
udtMurr59719_inputs.b7Pin2X3:=IOLINK_1_103.Port7[0].7;
udtMurr59719_inputs.b8Pin4X4:=IOLINK_1_103.Port7[0].8;
udtMurr59719_inputs.b9Pin2X4:=IOLINK_1_103.Port7[0].9;
udtMurr59719_inputs.bAPin4X5:=IOLINK_1_103.Port7[0].A;
udtMurr59719_inputs.bBPin2X5:=IOLINK_1_103.Port7[0].B;
udtMurr59719_inputs.bCPin4X6:=IOLINK_1_103.Port7[0].C;
udtMurr59719_inputs.bDPin2X6:=IOLINK_1_103.Port7[0].D;
udtMurr59719_inputs.bEPin4X7:=IOLINK_1_103.Port7[0].E;
udtMurr59719_inputs.bFPin2X7:=IOLINK_1_103.Port7[0].F;
//
udtMurr59719_outputs.b6Pin4X3:=fbTON1.Q;
IOLINK_1_104.Port7[0].5:=udtMurr59719_outputs.b6Pin4X3;
//
udtContrinex_Sensor1.b0OSS1:=IOLINK_1_103.Port8[1].0;
udtContrinex_Sensor1.b1OSS2:=IOLINK_1_103.Port8[1].1;
udtContrinex_Sensor1.b2TSS:=IOLINK_1_103.Port8[1].2;
udtContrinex_Sensor1.b3SSC1:=IOLINK_1_103.Port8[1].3;
udtContrinex_Sensor1.b4SCC2:=IOLINK_1_103.Port8[1].4;
udtContrinex_Sensor1.b5ALR1:=IOLINK_1_103.Port8[1].5;
udtContrinex_Sensor1.b6ALR2:=IOLINK_1_103.Port8[1].6;
udtContrinex_Sensor1.b7ALR3:=IOLINK_1_103.Port8[1].7;

bENOTEMP:=WAND(TRUE,IOLINK_1_103.Port8[1],16#FF00,D1000);
D1001:=SHR_E(TRUE,bENOTEMP,D1000,8);
udtContrinex_Sensor1.r32ScaleValue:=INT_TO_REAL(D1001);
udtContrinex_Sensor1.r32MeasureValue:=
(INT_TO_REAL(IOLINK_1_103.Port8[0])/16384.0)*110.0;

//VERR
udtVERR.b0VAUX1Pin1C0:=IOLINK_1_103.VERR.0;
udtVERR.b1VAUX1Pin1C1:=IOLINK_1_103.VERR.1;
udtVERR.b2VAUX1Pin1C2:=IOLINK_1_103.VERR.2;
udtVERR.b3VAUX1Pin1C3:=IOLINK_1_103.VERR.3;
udtVERR.b4VAUX1Pin1C4:=IOLINK_1_103.VERR.4;
udtVERR.b5VAUX1Pin1C5:=IOLINK_1_103.VERR.5;
udtVERR.b6VAUX1Pin1C6:=IOLINK_1_103.VERR.6;
udtVERR.b7VAUX1Pin1C7:=IOLINK_1_103.VERR.7;
udtVERR.b8NoUsed:=IOLINK_1_103.VERR.8;
udtVERR.b9NoUsed:=IOLINK_1_103.VERR.9;
udtVERR.bANoUsed:=IOLINK_1_103.VERR.A;
udtVERR.bBNoUsed:=IOLINK_1_103.VERR.B;
udtVERR.bCVAUX1Pin2C4:=IOLINK_1_103.VERR.C;
udtVERR.bDVAUX1Pin2C5:=IOLINK_1_103.VERR.D;
udtVERR.bEVAUX1Pin2C6:=IOLINK_1_103.VERR.E;
udtVERR.bFVAUX1Pin2C7:=IOLINK_1_103.VERR.F;

//Port Diagnostics
TURCKPortsDiagnostic[1]:=FC_TURCK_GetIOLINKDiagnostics(
bStart2Comm
,bENOTEMP
,IOLINK_1_103.DiagnosticPort1
);
TURCKPortsDiagnostic[2]:=FC_TURCK_GetIOLINKDiagnostics(
bStart2Comm
,bENOTEMP
,IOLINK_1_103.DiagnosticsPort2
);
TURCKPortsDiagnostic[3]:=FC_TURCK_GetIOLINKDiagnostics(
bStart2Comm
,bENOTEMP
,IOLINK_1_103.DiagnosticsPort3
);
TURCKPortsDiagnostic[4]:=FC_TURCK_GetIOLINKDiagnostics(
bStart2Comm
,bENOTEMP
,IOLINK_1_103.DiagnosticsPort4
);
TURCKPortsDiagnostic[5]:=FC_TURCK_GetIOLINKDiagnostics(
bStart2Comm
,bENOTEMP
,IOLINK_1_103.DiagnosticsPort5
);
TURCKPortsDiagnostic[6]:=FC_TURCK_GetIOLINKDiagnostics(
bStart2Comm
,bENOTEMP
,IOLINK_1_103.DiagnosticsPort6
);
TURCKPortsDiagnostic[7]:=FC_TURCK_GetIOLINKDiagnostics(
bStart2Comm
,bENOTEMP
,IOLINK_1_103.DiagnosticsPort7
);
TURCKPortsDiagnostic[8]:=FC_TURCK_GetIOLINKDiagnostics(
bStart2Comm
,bENOTEMP
,IOLINK_1_103.DiagnosticsPort8
);

//IOLINK Events

TURCKPortsEvent[1]:=FC_TURCK_GetEVENTS(
bStart2Comm
,bENOTEMP
,IOLINK_1_103.IOLinkEvents01
);

//
fbClass1SetOutputData_00A(
i_bEN:= bStart2Comm
,i_stModule:= EIP91_1
,i_uConnectionNo:= iConnetionNO
,i_uOutputData:= D500
,o_bENO=> bENO
,o_bOK=> bOK
,o_bErr=> bErr
,o_uErrId=> uErrID
,o_uStatusId=> uStatusID
);

;

Result

こちらはTURCK IO-Link Masterとcontrinex Smart Sensorを連携する動画です。

こちらはTURCK IO-Link Masterとmurrelektronik IO-Link Coverterを連携する動画です。

こちらはTURCK IO-Link MasteのEvent処理する動画です。

こちらはTURCK IO-Link Masterとmurrelektronik IO-Link Hubを連携する動画です。

こちらはTURCK IO-Link MasterとNass magnetのデバイスを連携する動画です。

こちらはTURCK IO-Link MasterとTURCKのデバイスを連携する動画です。

Download

下記のLinkでプロジェクトをDownloadしてください。

https://github.com/soup01Threes/GXWROKS/blob/main/Project_RJ71EIP91_TURCK.gx3

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

シェアする

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

フォローする