今回の記事ではOMRONのNX102-1220とSL5700の組み合わせを利用し、Turck社のTBIP-L5-4FDI-4FDXにCIP Safety とEthernet/IP 接続を確立させ・またTurckのSafety EDS Fieプログラムの組み方など0から説明します。
さ、はじめよう!
Reference Video
TBIP−L5−4FDI−4FDX?
TBIP-L…-4FDI-4FDXはEtherNet/IP経由のCIP Safety用セーフティブロックI/Oモジュールです。このデバイスには、ライトバリアや非常停止ボタンなどの異なる安全センサを接続するための4つの2チャンネルデジタル安全入力(FDI)があります。 さらに4つの安全チャンネル(FDX)は、入力(FDI)または出力(FDO)として自由に使用できます。
また、安全I/Oとその機能の設定はソフトウェアツールTurck Safety Configuratorで行います。
TBIP-L…-4FDI-4FDXは、安全なセンサーとアクチュエーターを接続するための8個のM12コネクターがあります。電源電圧の接続には、4ピン7/8”コネクタ(TBIP-L4)、5ピン7/8”コネクタ(TBIPL5)、または5ピンLコードM12コネクタ(TBIP-LL)をご利用いただけます。
IP Addressing
TBIP-L…-4FDI-4FDXは 2 つの IP アドレスをサポートしていて、セカンダリ IP アドレスが必要かどうかは、使用するアプリケー ションと CIP Safety Scanner によって異なります。
メインIPアドレスの最初の3バイトは、装置のウェブサーバー経由で設定できます(Default状態はIPアドレス:192.168.1.254)。IPアドレスの最後のバイト メインIPアドレスは、装置のロータリーコードスイッチやTurckサービスツール、またはウェブサーバー経由で設定できます。
こちらはロータリーコードスイッチの意味になります。
Input Data
Ethernet/IP Connectionの入力データMappingになります。
Output Data
Ethernet/IP Connectionの出力データMappingになります。
Unlock Safe Unit
セーフユニットのロックを解除するBit信号は、立ち下がりエッジによって応答する。
Implementation
Turck Side
Access WebServer
Turck CIP SafetyモジュールのWeb serverにアクセスします。
Login
右にあるLoginボタンでLoginしましょう。
Default Passwordはpasswordです。
Done!Logintしたら設定できる項目も増えました。
Factory Reset
最初はCIP SafetyモジュールをFactory Resetします。
Station Configuration>Reset to Factory Defaultsをクリックします。
Etherent/IP Memory Map
こちらはTurck CIP SafetyモジュールのNormal Ethernet/IP 接続に使用するInstance番号やメモリMappingです。
Install the Tools
今度は下記のサイトからTurckのSafety ConfiguratorをDownloadしてください。
注意するのはソフトウエアのDownloadするにはクーポンコードが必要で、ローカルのTurck Officeに問い合わせしてください。
https://www.turck.jp/ja/product/SW_Turck_Safety_Configurator
Install.exeをダブルクリックしソフトウエアのインストレーションを開始します。
言語を選び、Installで進みます。
しばらく待ちます…
Next>で進みます。
ライセンスに同意し、Nextで進みます。
Nextで進みます。
インストレーションを開始します。
しばらく待ちます…
Done!
インストーラーを閉じます。
次はライセンスの入力が求められ、Yesで進みます。
Coupon Codeを選び、先程ソフトウェアをDownloadしたときで使用したCoupon Codeを入力しましょう。
しばらく待ちます…
Done!
Create your project
TurckのSafety Configuratorを起動します。
File>New>New Workspaceで新しいWorkspaceを作成します。
Workspaceの保存先を設定します。
Checkを入れてOKで進みます。
プロジェクトで使用するSafety IO Blockを選びます。
今回使用するのはTBIP−L5−4FDI−4FDXなので、直接先程のリストから選ぶか、もしくはOrder Numberに沿ってデバイスを選んでもOKです。
TBIP−L5−4FDI−4FDXを選び、Okで進みましょう。
OKで確定します。
次はSafety IOの基本設定画面に変わります。
Local I/OsはSafety IO Blocksの各IO Portの設定を行うことができます。
今回の記事ではすべてDefautlのままにします。
今度は”Show Advanced Settings”のCheckboxを入れます。
Properties画面にCIP Safety関連の設定も表示され、SCID Time Stampなども設定できますが、今回の記事では使用しません。
すべての設定を完了したらOkで進みます。
プロジェクトを保存します。
Commissioning Wizard
今度はTurck のCIP Safety Configuratorとデバイスを接続するため、Commissioning Wizardを起動します。
Next>で進みます。
Safetyプロジェクトの認証User NameとPasswordを設定することができます。
もちろん、そのStepは必ずではないので、必要のない場合はSkipしてください。
注意するのはUserとPassword設定した場合、Safety プロジェクトをDownloadする際、そのValidator名とPasswordが求められます。
最初は”No Connection”というエラーが表示されます。これはPCとデバイス間で接続するEthernet Interfaceがまだ設定されていないのが原因です。
Setup Interfaceをクリックします。
Interface Configuration画面が表示されます。
Ethernetを選択し>Search for deviceをクリックします。
Done!TurckのCIP Safety IO Moduleが見つかりました。そのModuleを選択し、Okで進みます。
最後はOkボタンをクリックしPCとデバイスを接続します。
YesでConfigurationを保存します。
Default Passwordを変更し、Okで進みます。
しばらく待ちます…
Done!
OKで進みます。
Moduleが再起動するので、しばらくお待ち下さい…
Finishをクリックします。
最後は変更したConfigurationを保存しましょう。
Assing Output
Turck CIP Safety IO BlockではCIP Safety とNormal Ethernet/IPにも自由に割り付けられる出力領域があり、アプリケーションによって上位に様々な状態をFeedbackできます。
Start>Output Assignmentで出力データを割り付けます。
このような出力割付表が表示されます。
CIP Safety
デバイスをCIP Safetyの出力として割り付けたい場合、CIP Safetyの欄を選び>右にあるFree Outputsのところにまだ使用されていないBit領域に割り付けましょう。
0-0は0Byte目の0Bit目、0-1は0Byte目の1Bit目のような形でBit単位でMappingできます。
Done!これでOKです。
いまTurckのCIP Safety IO Blockにある4つの入力Portの信号状態をCIP Safety の0-0、0-1、0-2、0-3とMappingしました。
Fieldbus Bit
今度はFieldbus Bitを割り付けます。こちらの領域はTurck Normal Ethernet/IP Instance104出力になります。下記の例ではFDI 0/1 の信号を”Fieldbus”に選択し、Free outputs欄に空きの領域(Word Offset0,Bit0)を設定します。
Done!
下図のようにWord Offset0,Bit0‐3まで割り付けました。
次はFDX 出力も同じようにFieldbus Bitに割り付けましょう。
Done!
最後はOutput devicesをアップデートしましょう。
Finally
こちらは今回記事で使用するCIP SafetyとFieldbus BitのMappingになります。
Safety Program
TurckのTBIP−L5−4FDI−4FDXはBlock IOとして使用するだけではなく、内部でもロジックを作成できます。内部ロジックを使用することにより、小さなアプリケーションはCIP Safety Scannerなくても複数のTBIP−L5−4FDI−4FDXでシステム構成ができます。また、分散制御することによって、CIP Safety Scannerが持つロジックが減り、将来他社のCIP Safety Scannerに切り替えることも簡単です。
Default上ではCIP Safety の入力Bit0の状態をそのままCIP Safety出力に繋がります(自動リセット)。
また、Turck Safety Configuratorはプログラムの作成ではDropとDragと線繋ぎみたいで完結しますので、プログラム知識はなくてもすぐアプリケーション構築できます。
今回はTBIP−L5−4FDI−4FDXにローカルロジックを作成しています。プログラムのFlowはFDI 0/1 がTrueになり>2秒のDelay待ち>最後はオムロンのFieldbus リセット信号のFalse>True>False信号変化によって出力FDX 8/9をTrueします。
Add Single Channel Safety
信号FDI 0/1 の信号をMonitorしたいので、Single Channel SafetyをDropします。
Done!Single channel safety#1が追加されました。
NameはSafety Configurator上で該当するBlockの表示名で、Addressはモジュールを使用する安全入力アドレスを指定し、Inputはどちらの入力を使用するかを設定できます。
Add Switch-on delay
今回はDelay-On Timerを追加するため、Logic Devices>Switch-on delayをプロジェクトにDropします。
Done!
NameはOn-Delayの名前で、Delay Timeは定数で設定できます。
Add Monitoring Devices
次は安全出力のアンロック信号を構築していきます。Defaultのプロジェクトではすべて自動リセットなので、先程言った立ち下げ信号はみていません。
では、DefaultのAutomatic start部品を一旦削除しましょう。
次はStart Devices>Monitored start-deviceをプロジェクトに追加しましょう。
Add Fieldbus Bit
今度はアンロックするFieldbus bitを追加します。
Done!
次はEthernet/IP Connection経由でアンロックするFieldbus Bit番号を指定するため、先程追加したFieldbus 部品をダブルクリックします。
現在はFB0-0と設定されていますので、Fieldbus Word0、Bit Offset0に該当する意味です。
Finally
最後は下図のように部品を繋がりましょう。
Send Configuraiton
最後はプロジェクトをモジュールに転送しましょう。Start>PC->Monitorをクリックします。
また、Drop ListからプロジェクトのUploadの動作も可能です。
Yesで進みます。
先程設定したPasswordを入力しましょう。
しばらくまちます…
Done!
最後はValidatorとPasswordをもう一度入力しましょう。
しばらくまちます…
Done!
Go Online
Go lineでプロジェクトをMonitorします。
Done!
Omron Side
次はOmron側を構築します。
Reference Link
Create EDS File
TurckのTBIP−L5−4FDI−4FDXモジュール Safety EDS Fileを作成します。
Vendor ID
Vendor IDは48になります。
Vendor Name
Vendor Nameは実際Sysmac StudioのEDS Libraryの整理や表示に影響されますので、できるだけ正しい情報を入力しましょう。
Product Type
Product Typeは100になります。
Product Type String
Product Type Stringは実際Sysmac StudioのEDS Libraryの整理や表示に影響されますので、できるだけ正しい情報を入力しましょう。
Product Code
Product Codeは20014になります。
Product Name
Product Nameは実際Sysmac StudioのEDS Libraryの整理や表示に影響されますので、できるだけ正しい情報を入力しましょう。
Revision
Major Revisonは3で、Minor Rervisionは1になります。
Safety Input
Input Assembly Instanceは1024、Output Assembly Instanceは1279で、Data Sizeは8Byteになります。
Safety Output
Input Assembly Instanceは1279、Output Assembly Instanceは1056で、Data Sizeは8Byteになります。
Configuration Instance
Configuration Instanceは1088になります。
Add CIPSafety Devices
次はEthernet/IP のNetworkに先程定義したTurck CIP Safetyモジュールを追加しましょう。
SNN Number
CIP Safetyを使用するにはデバイスにSafety Network Numberを設定する必要があります。
Sysmac Studioに設定されたSafety Network NumberをCopyし、
Turck CIP Safety モジュールのWeb Server>Network Configuration>SNN Numberのところに貼り付けてください。
Create Device Variable
今度はI/O Mapの画面からTurck CIP Safety のモジュールを選び>右クリック>Create Device Variableをクリックし自動で変数を生成します。
Done!
Add Ethernet/IP Connections
TurckのCIP SafetyモジュールはCIP Safety接続以外にもNormalのEthernet/IP接続も可能です。今回の記事ではCIP Safety通信とNormal のEthenret/IPを同時にOMRONのNX-SL5700とNX CPUを接続してみます。
Define Global Variables
Data>Global Variablesを開き、Global変数を定義します。
dataFromTurck とdataToTurckというByte配列を定義します。
Register Variables
先ほど定義した変数をEtherent/IPのProcess Dataとして登録します。
Install EDS File
Turck HPからDonwloadしたTBIP−L5−4FDI−4FDXのEDS Fileをインストールします。
Add Connection
TBIP−L5−4FDI−4FDXのTargetデバイスを定義し、Connectionsに追加しましょう。
Safety Program
こちらはオムロン側の安全プログラムです。ただTurckから
Normal Program
Data Types
Byte2Bool
こちらはByteの各BitをBool配列に分配できるように作ったUnionタイプです。
TURCK_CIPSafety_StationStatusWord
こちらはTURCK Etherent/IP Connection経由で取得できる、Turckモジュールの状態データの構造体です(Word offset 0)。
TURCK_CIPSafety_Status
こちらはTURCK Etherent/IP Connection経由で取得できる、Turckモジュールの状態データの構造体です(Word offset 1-3)。
TURKC_CIPSafety_CxStatus
こちらはTURCK Etherent/IP Connection経由で取得できる、Turckモジュールの状態データの構造体です(Word offset 4-7)。
TURCK_CIPSafety_ModuleStatus
こちらはTURCK Etherent/IP Connection経由で取得できる、Turckモジュールの状態データの構造体です(Word offset 9)。
TURCK_CIP
こちらの構造体は先程定義した構造体をさらにまとめた構造体になります。
Function
FC_GetCxStatus
こちらのFCではTurckモジュールのPort状態をByteデータから分解してきます。
In/Out
EN Input BOOL iByte1 Input BYTE udtCxStatus In/Out TURCK_CIPSafety_CxStatus |
Internals
uByte2Bool Byte2Bool |
Program
uByte2Bool.ByteData:=iByte1; udtCxStatus.Normal:=uByte2Bool.BoolData[0]; udtCxStatus.WaitForInput:=uByte2Bool.BoolData[1]; udtCxStatus.TestInput:=uByte2Bool.BoolData[2]; udtCxStatus.InputError:=uByte2Bool.BoolData[3]; udtCxStatus.CrossCircuitCh0:=uByte2Bool.BoolData[4]; udtCxStatus.CrossCircuitCh1:=uByte2Bool.BoolData[5]; udtCxStatus.OutputOverload:=uByte2Bool.BoolData[7]; |
Function Block
FB_TURCKCIPSafety
こちらのFunction BlockはTurckモジュールとEthernet/IP Connection経由で取得した入力データ(19Bytes)を構造体に分解していきます。
In/Out
udtTURCK_CIP In/Out TURCK_CIP iData Input ARRAY[0..19] OF byte |
Internals
uByte2Bool Byte2Bool |
Program
uByte2Bool.ByteData:=iData[0]; //Station Status word uByte2Bool.ByteData:=iData[0];//word0 udtTURCK_CIP.StationStatus.ModuleDiagnosticsAvailable:=uByte2Bool.BoolData[0]; udtTURCK_CIP.StationStatus.StationConfiguredChanged:=uByte2Bool.BoolData[3]; udtTURCK_CIP.StationStatus.OverCurrentIsys:=uByte2Bool.BoolData[5]; udtTURCK_CIP.StationStatus.OverVoltageV2:=uByte2Bool.BoolData[6]; udtTURCK_CIP.StationStatus.UnderVoltageV2:=uByte2Bool.BoolData[7]; uByte2Bool.ByteData:=iData[1];//word0 udtTURCK_CIP.StationStatus.OverVoltageV1:=uByte2Bool.BoolData[0]; //8 udtTURCK_CIP.StationStatus.UnderVoltageV2:=uByte2Bool.BoolData[1]; //9 udtTURCK_CIP.StationStatus.ModuleBusCoumLost:=uByte2Bool.BoolData[2]; //10 udtTURCK_CIP.StationStatus.ModuleBusError:=uByte2Bool.BoolData[3]; //11 udtTURCK_CIP.StationStatus.ForceModeEnabled:=uByte2Bool.BoolData[6]; //14 //Safety Status uByte2Bool.ByteData:=iData[2];//word1 byte2,3 udtTURCK_CIP.SafetyStatus.ProtectiveMode:=uByte2Bool.BoolData[0]; udtTURCK_CIP.SafetyStatus.ConfigurationMode:=uByte2Bool.BoolData[1]; udtTURCK_CIP.SafetyStatus.UnKnownMode:=uByte2Bool.BoolData[2]; uByte2Bool.ByteData:=iData[4];//word2 byte4,5 uByte2Bool.ByteData:=iData[6];//word3 byte6,7 udtTURCK_CIP.SafetyStatus.NoMemoryStick:=uByte2Bool.BoolData[0]; udtTURCK_CIP.SafetyStatus.NoConfigurationAvailable:=uByte2Bool.BoolData[1]; udtTURCK_CIP.SafetyStatus.ConfigurationMismatch:=uByte2Bool.BoolData[2]; udtTURCK_CIP.SafetyStatus.CommunicationLoss:=uByte2Bool.BoolData[4]; udtTURCK_CIP.SafetyStatus.FateError:=uByte2Bool.BoolData[7]; uByte2Bool.ByteData:=iData[8];//word4 byte8 FC_GetCxStatus( EN:=TRUE ,iByte1:=iData[8] ,udtCxStatus:=udtTURCK_CIP.SafetyCx[0] ); uByte2Bool.ByteData:=iData[9];//word4 byte9 FC_GetCxStatus( EN:=TRUE ,iByte1:=iData[9] ,udtCxStatus:=udtTURCK_CIP.SafetyCx[1] ); uByte2Bool.ByteData:=iData[10];//word5 byte10 FC_GetCxStatus( EN:=TRUE ,iByte1:=iData[10] ,udtCxStatus:=udtTURCK_CIP.SafetyCx[2] ); uByte2Bool.ByteData:=iData[11];//word5 byte11 FC_GetCxStatus( EN:=TRUE ,iByte1:=iData[11] ,udtCxStatus:=udtTURCK_CIP.SafetyCx[3] ); uByte2Bool.ByteData:=iData[12];//word6 byte12 FC_GetCxStatus( EN:=TRUE ,iByte1:=iData[11] ,udtCxStatus:=udtTURCK_CIP.SafetyCx[4] ); uByte2Bool.ByteData:=iData[13];//word6 byte13 FC_GetCxStatus( EN:=TRUE ,iByte1:=iData[11] ,udtCxStatus:=udtTURCK_CIP.SafetyCx[5] ); uByte2Bool.ByteData:=iData[14];//word7 byte14 FC_GetCxStatus( EN:=TRUE ,iByte1:=iData[11] ,udtCxStatus:=udtTURCK_CIP.SafetyCx[6] ); uByte2Bool.ByteData:=iData[15];//word7 byte15 FC_GetCxStatus( EN:=TRUE ,iByte1:=iData[11] ,udtCxStatus:=udtTURCK_CIP.SafetyCx[7] ); uByte2Bool.ByteData:=iData[16];//word8 Byte16 udtTURCK_CIP.FieldbusBits[0]:=uByte2Bool.BoolData[0]; udtTURCK_CIP.FieldbusBits[1]:=uByte2Bool.BoolData[1]; udtTURCK_CIP.FieldbusBits[2]:=uByte2Bool.BoolData[2]; udtTURCK_CIP.FieldbusBits[3]:=uByte2Bool.BoolData[3]; udtTURCK_CIP.FieldbusBits[4]:=uByte2Bool.BoolData[4]; udtTURCK_CIP.FieldbusBits[5]:=uByte2Bool.BoolData[5]; udtTURCK_CIP.FieldbusBits[6]:=uByte2Bool.BoolData[6]; udtTURCK_CIP.FieldbusBits[7]:=uByte2Bool.BoolData[7]; uByte2Bool.ByteData:=iData[17];//word8 Byte17 udtTURCK_CIP.FieldbusBits[8]:=uByte2Bool.BoolData[0]; udtTURCK_CIP.FieldbusBits[9]:=uByte2Bool.BoolData[1]; udtTURCK_CIP.FieldbusBits[10]:=uByte2Bool.BoolData[2]; udtTURCK_CIP.FieldbusBits[11]:=uByte2Bool.BoolData[3]; udtTURCK_CIP.FieldbusBits[12]:=uByte2Bool.BoolData[4]; udtTURCK_CIP.FieldbusBits[13]:=uByte2Bool.BoolData[5]; udtTURCK_CIP.FieldbusBits[14]:=uByte2Bool.BoolData[6]; udtTURCK_CIP.FieldbusBits[15]:=uByte2Bool.BoolData[7]; uByte2Bool.ByteData:=iData[18];//word9 Byte18 udtTURCK_CIP.ModuleStatus.ModuleDiagnosticsAvailable:=uByte2Bool.BoolData[0]; udtTURCK_CIP.ModuleStatus.UnderVoltage2:=uByte2Bool.BoolData[7]; uByte2Bool.ByteData:=iData[18];//word9 Byte19 udtTURCK_CIP.ModuleStatus.UnderVoltage1:=uByte2Bool.BoolData[1]; udtTURCK_CIP.ModuleStatus.InternalError:=uByte2Bool.BoolData[2]; udtTURCK_CIP.ModuleStatus.IOAssistantForceMode:=uByte2Bool.BoolData[6]; |
MAIN
こちらはMainプログラムで、先程定義したFunction Blockを呼び出し、またFieldbus Bitの立ち上げ信号をTurckモジュールに送信し、安全アンロックします。
Download
最後はSafety プロジェクト・Normal プロジェクト・あとEthernet/IP Connection設定もNX CPUにDownloadし、電源をリセットしてください。
Result
Done!TurckモジュールとCIP Safety接続経由で安全入出力データをやり取りできました。
Normal Ethernet/IP 接続経由で非常停止の状態も取りました。
Turck Safety Configuratorソフトからも現在の入出力状態を監視できました。
こちらの動画はOMRON CIP Safety経由でTURCKモジュールを確認できます。
OMRON.CIP Safety Connection with TURCK Safety Blocks
こちらの動画でTurckモジュールの動作を確認できます。
OMRON.Normal Condition of SL5700 and Turck Safety IO
こちらの動画でOMRONの安全プログラム状態を確認できます。
OMRON.CIP Safety Connection with TURCK Safety Blocks Safety Program Side
Download EDS File
こちらのLinkからOMRON Sysmac Stuido用のTurck Safety EDS FileをDownloadできます。
https://github.com/soup01Threes/OMRON/blob/main/0030_4E2E_TBIP-L5-4FDI-4FD_16B9A185.eds
Download Project
こちらのLinkから記事のサンプルプロジェクトをDownloadできます。
https://github.com/soup01Threes/OMRON/blob/main/CIPSafety_TURCK.smc2