この記事ではBeckhoffのTwinSAFEからSafety Programを作成する第2話です。今回はTwinCAT Groups・Function Block PropertiesとSignal Typeなどを紹介し、TwinSAFEのESTOP制御の標準 FunctionBlock safeEstopで簡単な緊急停止アプリケーションを作成します。記事はできるだけ誰でもそのWork-Flowに従えば絶対に構築できるように心かけて作っています。どうぞよろしくおねがいします。
Thanks!
この記事が出来上がるのはベッコフ日本法人ベッコフオートメーション株式会社さまとMana Design worksさまから機材を貸してくださったおかけです。誠にありがとうございます。
ベッコフ日本法人ベッコフオートメーション株式会社
IPC6920-005・EL6910・EL1904はベッコフ日本法人ベッコフオートメーション株式会社さまが貸してくださったものです。Beckhoff Automationは1980 年会社設立、PCベースの制御技術をベースにしたオープンオートメーションシステム導入の先頭に立つドイツ企業です。
ベッコフ日本法人ベッコフオートメーション株式会社は、2011年に横浜に本社、2017年に名古屋オフィスを設立しました。
こちらはベッコフ日本法人ベッコフオートメーション株式会社様のホームページです。
どうぞよろしくお願いします。
Reference Link
Blog
Video
TwinSAFE groups
TwinSAFE Groupsというのは様々な機械から異なる安全ZONEをシンプルで分散制御できて、かなり合理的な構造です。TwinSAFE Groupの中のFBののConnection ErrorはGroupのエラーとなり該当するGroupの出力をすべてOFFになります。
VAR
TwinSAFE GroupではVariable MappingのTabからGroupを制御・状態取得することができます。Variable Mapping>Group PortsからすべてのVariablesを一覧できます。
Input
Group Pots | Description |
Err Ack | TwinSAFE Groupエラーをリセットします。Standard変数と紐つける必要があります。 |
Run/Stop | True=TwinSAFE Group起動、False=TwinSAFE Group停止Standard変数と紐つける必要があります。 |
Module Fault | 別ののModule(例えばEK1960)のエラー出力と紐つけます |
Output
Group Pots | Description |
Comm Err | 1つ以上のConnectionは通信エラー発生中 |
FB Err | FBがエラー発生 |
Module Fault | 別ののModule(例えばEK1960)のエラー出力と紐つけます |
Com Startup | 1つ以上Connectionsが起動した |
FB Deactive | TwinSAFE Groupが無効してる |
FB Run | TwinSAFE FBが実行中か |
In Run | TwinSAFE GroupがRun Modeしてるか |
Group State
Value | Status | Description |
1 | RUN | Input Run=1 Safety Groupにエラーなく、すべでのConnectionも立ち上げた |
2 | STOP | Input Run=0 |
4 | ERROR | TwinSAFE Groupがエラーあり |
5 | RESET | TwinSAFE Groupのエラー解消、Err Ack信号がTrueの状態 |
6 | START | TwinSAFE GroupにすべでのConnection立ち上げてない状態を示しています。 |
7 | ESTOPERROR | |
16 | DEACTIVE | TwinSAFE Groupが無効されてる |
17 | WAITCOMERROR | Passivate 機能が選択されている |
Group Diag
Value | Status | Description |
0 | エラーなし | |
1 | FBERROR | 1つ以上のFBがエラー状態になっています。 |
2 | COMERROR | 1つ以上の接続がエラー状態になっています。 |
3 | MODULEERROR | ModuleFault=True |
4 | CMPERROR | Power-On Analog Value Check Error |
6 | DEACTIVATEERROR | |
6 | RESTARTERROR | TwinSAFE Logic ProgramのEtherCAT通信が再起動されたか、UserがLogin するときTwinSAFE Logic ProgramをReloadしてないのか |
FB port properties
各Function自身や各Portにも設定できるPropertiesがあります。例えば下図のようにSafeESTOPのPort入力を選んで、Propertiesを選べば設定項目が表示されます。ChannelのInterface種類・データ・タイプなど…
Implementation
Function Block
Signal Type?
Type | Description |
TwinSAFE-In | TwinSAFEの入力 |
Standard-In | PLCにある%Q* 標準変数 |
FB-Out | TwinSAFE Function Block出力 |
TwinSAFE-Out | TwinSAFEの出力 |
Standard-Out | PLCにある%I* 標準変数 |
FB-In | TwinSAFE Function Block入力 |
DECOUPLE
FB_Decoupleは信号をTwinSAFE Connectionから外すためのFunction Blockです。このFunction Blockは8入力と8出力があり、該当する番号のDecInXがそのままDecOutXに流れます。ここでまた基本的なコンセプトになりますが、TwinSAFE I/O TerminalとTwinSAFE ConnectionはTwinSAFEグループに振り分けられ、そのFB_DecoupleはTwinSAFE Connectionを他のTwinSAFE Groupに分配することができます。
safeEstop
FB_ESTOPは最大8つの緊急停止入力(EStop1からEStop8で)があり、各PortにもBreack Contact(NO)かMake Contact(NC)に設定できます。
そのFunction Blockは2つの出力がありEStopOutはESTop信号からすぐ反応する代わりに、EStopDelOutはTime-Delayのパラメータがつけられています。
あと、一回ESTOP信号からFB_ESTOPがSafe状態に遷移したら、Restartの信号からBlockをリセットする必要があります。
最後にFB_STOPにEDM Feedback Loop信号を設定できます。Function Block EStopOutを直接EDM1で、EStopDelOutを直接EDM2に接続します。そのEDMは”True”がないとFB_STOPがエラー状態に代わり、Error=Trueになります。
さらに補足ですが、入力Portの組み合わせはEStopIn1/EStopIn2、EStopIn3/EStopIn4、EStopIn5/EStopIn6、EStopIn7/EStopIn8のPairで、信号の組み合わせはSingleでもDualでもOKです。もしESTOPの入力時間が監視時間(Discrepancy Time)を超えたらFB ErrorがTrueになります。
FB Error FlagがTrueになると、出力がFalseになり、Error OutputがTrueになります。
VAR INPUT
Variable | Permitted Type | Data Type | Desription |
Restart | TwinSAFE-InFB-OutStandard-Iin | BOOL | TwinSAFE Groupが立ち上げなどに必要なパルス起動信号 |
EStopIn1 | TwinSAFE-InFB-Out | BOOL | 1stの非常停止信号 |
EStopIn2 | TwinSAFE-InFB-Out | BOOL | 2ndの非常停止信号 |
EStopIn3 | TwinSAFE-InFB-Out | BOOL | 3rdの非常停止信号 |
EStopIn4 | TwinSAFE-InFB-Out | BOOL | 4thの非常停止信号 |
EStopIn5 | TwinSAFE-InFB-Out | BOOL | 5thの非常停止信号 |
EStopIn6 | TwinSAFE-InFB-Out | BOOL | 6thの非常停止信号 |
EStopIn7 | TwinSAFE-InFB-Out | BOOL | 7thの非常停止信号 |
EStopIn8 | TwinSAFE-InFB-Out | BOOL | 8thの非常停止信号 |
EDM1 | TwinSAFE-InFB-OutStandard-Iin | BOOL | Non Delay出力Channel(EStopOut)のFeedback信号になり、EDM信号が有効の場合、Safe出力はTrueになる条件はEDM1がTrue 信号になる前提です。 |
EDM2 | TwinSAFE-InFB-OutStandard-Iin | BOOL | Delay出力Channel(EStopDelOut)のFeedback信号になり、EDM信号が有効の場合、Safe出力はTrueになる条件はEDM2がTrue 信号になる前提です。 |
VAR OUTPUT
Variable | Permitted Type | Data Type | Desription |
Error | TwinSAFE-InFB-InStandard-OutLocal-Out | BOOL | True=入力Pairの異なる状態は設定時間より超えたか・Feedback Loopエラーがあるか。ERR_ACK のTrue信号でTwinSAFE Groupのリセットが必要。 |
EStopOut | TwinSAFE-InFB-InStandard-OutLocal-Out | BOOL | ESTOP状態出力、True=正常 |
EStopDelOut | TwinSAFE-InFB-InStandard-OutLocal-Out | BOOL | ESTOP+Delay状態出力、True=正常 |
Diagnostics Information
16Bit
Bit | Description |
0 | Error – Input Group1 |
1 | Error – Input Group2 |
2 | Error – Input Group3 |
3 | Error – Input Group4 |
4 | EDM Error – EDM1 |
5 | EDM Error – EDM2 |
6 | – |
7 | – |
8 | “Safe Input after Disc Error” Optionが有効で、Input Groupの状態が異なるときTrueになります。 |
9 | “Safe Input after Disc Error”Optionが有効で、Input Groupの状態が異なるときTrueになります。 |
10 | “Safe Input after Disc Error”Optionが有効で、Input Groupの状態が異なるときTrueになります。 |
11 | “Safe Input after Disc Error”Optionが有効で、Input Groupの状態が異なるときTrueになります。 |
State Information
Value | Description |
0 | 未定義 |
1 | FB_ESTOPモジュールはいまRUN StateでありFail-Safe状態のESTOPがありません。Error=0EStopOut=1EStopDelOut=1 |
2 | FB_ESTOPモジュールはいまSTOP StateでありFbRunがFalse状態。Error=0EStopOut=0EStopDelOut=0 |
3 | FB_ESTOPモジュールはいまSAFE Stateであり最低限1つのESTOP入力がFaild-safe状態。Error=0EStopOut=0EStopDelOut=0 |
4 | FB_ESTOPモジュールはいまError Stateであり最低限1つのESTOP入力がFaild-safe状態。Error=1EStopOut=0EStopDelOut=0 |
5 | FB_ESTOPモジュールはいまReset Stateでありエラー解消したがErrAckのリセット待ちError=0EStopOut=0EStopDelOut=0 |
6 | FB_ESTOPモジュールはいまSTART StateでありRstart信号待ちError=0EStopOut=0EStopDelOut=0 |
8 | FB_ESTOPモジュールはいまDELAYOUT Stateで、Safet状態がリクエストされたが、ESTOPDelOutまだTrueの状態。Error=0EStopOut=0EStopDelOut=1 |
Channel Interface
Settings | Description |
Both Deactivated | 2つのChannelも無効する |
Single-Channel 1 Activated | Channel1:Single-Channel評価Channel2:無効 |
Single-Channel 2 Activated | Channel1:無効Channel2:Single-Channel評価 |
Single-Channel Both Activated | Channel1:Single-Channel評価Channel2:Single-Channel評価 |
Two-Channel | Channel1・Channel2も有効しDiscrepancy Time内で評価する |
Channel Contact
Flow
Connect to IPC
SYSTEM>Choose Targetで接続するBeckhoffのIPCやRuntimeを設定します。
Search(Ethernet)でRuntimeを検索します。
Enter Host Name/IPでIpを入力、Enterで検索。
Add Routeします。
Secure ADSのCheck Boxを入れ、Password入力>Okします。
Connectedされました!
Configuration
Add EtherCAT Master
I/O>Devices>Add New Itemします。
EtherCAT>EtherCAT Masterを選び>Okします。
EtherCAT Masterとして使用するNetwork Interface Cardを設定>Okします。
Scan
EtherCAT Master右クリック>ScanでEtherCAT Nodeを探します。
Motorは今回の記事で検索しなくもよいので、Noで進みます。
Done!
中にTwinSAFEの主人公 EL6910がありましたね。
ADD PLC
PLC>Add New Itemします。
PLCが追加されました。
DUT
DUT_safeESTOP_InfoData
こちらの構造体はFBESTOPのStateとDiag情報を格納するために作られたんです。
TYPE DUT_safeESTOP_InfoData : STRUCT State AT %I* :USINT; Diag AT %i*:UINT; END_STRUCT END_TYPE |
DUT_SafetygroupsStatus
こちらの構造体はTwinSAFEの制御や情報を格納するために作られたんです。
TYPE DUT_SafetygroupsStatus : STRUCT //Standard Input from Safety Group RunStop AT %Q* :BOOL; ErrorAck AT %Q* :BOOL; //Standard Output from Safety Group Com_erro AT %I* :BOOL; Com_Startup AT %I* :BOOL; FB_Deactive AT %I* :BOOL; FB_Err AT %I* :BOOL; FB_Run AT %I* :BOOL; In_Run AT %I* :BOOL; Other_Error AT %i* :BOOL; END_STRUCT END_TYPE |
eDUT_safeESTOP_State
こちらの構造体はFBESTOPのStateから現在の状態を示すために作られています。
{attribute ‘qualified_only’} {attribute ‘strict’} TYPE eDUT_safeESTOP_State : ( undefined :=0 ,RUN :=1 //No Error,Error=0,EStopOut=1,EStopDelOut=1 ,STOP :=2 //Stop State,Error=0,ErroStopOut=0,EStopDelOut=0 ,SAFE :=3 //Safe State,Error=0,ErroStopOut=0,EStopDelOut=0 ,ERROR :=4 //Error State,Error=1,ErroStopOut=0,EStopDelOut=0 ,RESET :=5 //Reset State,Error=0,ErroStopOut=0,EStopDelOut=0 ,START :=6 //Start State,Error=0,ErroStopOut=0,EStopDelOut=0 ,DELAYOUT :=8 //Delay Out State,Error=0,ErroStopOut=0,EStopDelOut=0 ); END_TYPE |
Function Block
FB_safeSTOP_InfoData
こちらのFunction BlockにあるsafeETOP_InfoDataは直接にFBEStopのDiagとStateをLinkします。
FUNCTION_BLOCK FB_safeSTOP_InfoData VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR safeETOP_InfoData :DUT_safeESTOP_InfoData; END_VAR |
PROPERTY DiscrepanyError : BOOL
各Channelがエラーでないかを取得します。
DiscrepanyError:= (safeETOP_InfoData.Diag AND 2#0000_1111_0011_1111 ) <>0; |
PROPERTY ESOTPState : USINT
現在のFBStop状態を取得します。
ESOTPState:=safeETOP_InfoData.State; |
MAIN
MAINプログラムはこちらです。FBEstopが正常か、エラーかを確認するだけになります。
PROGRAM MAIN VAR safeESTOP1 :FB_safeSTOP_InfoData; ESTOPNormal :BOOL; Error :BOOL; END_VAR ESTOPNormal:=safeESTOP1.ESOTPState = eDUT_safeESTOP_State.RUN; Error:=safeESTOP1.DiscrepanyError; |
GVL
次はGVLを追加する。GVL>Add>Global Variable Listをします。
GVL名を入力し>Openで追加。
TwinSAFE GroupとLinkする変数を定義します。
{attribute ‘qualified_only’} VAR_GLOBAL // TwinSafetGroup1 :DUT_SafetygroupsStatus; END_VAR |
Add Safety Group
SAFETY>右クリック>Add New ItemでSafety Groupを追加します。
今回もTwinCAT Safety Project Preconfigured ErrAckを選び>Addします。
Target SystemをHardware Safety PLCに設定しましょう。
Safety Groupが追加されました!
Set Target System
Target Systemの設定画面を開きます。
前回の記事にも紹介しましたが、Target SystemをEL6910に選択し、Physical Deviceで接続するEL6910を設定します。
実機のEL6910はいまEK1101のTerm 5なので、Term5 を選び>Okします。
Done!
Import Alias-Devices(s) from I/O-Configuration
EtherCATで接続してるSafety IO TerminalをAlias DevicesにImportします。SafetyGroup>Alias Devices>Import Alias-Device(s) from I/O-configurationします。
今回使用するのはTerm8 EL1904とTerm12 のEL2904です。
Import成功しました!
Add DI
PLCのUser ProgramにあるStandard変数と紐つけるためにDigital input/Digital Output Slotを追加します。Alias Devices>Add>New Itemします。
1 Digital Input(Standard)を選び>Addします。
BoolタイプのDigital Input(Standard) Slotが追加されました。
Group your Variables!
Moduleの数が大きくなると、FolderでSlotを管理するのはおすすめです。Alias Devices>Add>New Folderします。
Folderが追加されました。
Folderを選び>Add>New Itemすれば同じく新しいSlotを追加できます。
Add Multiple stand variables
一つずつ追加するのは面倒だと思ったら一括Slot生成も可能です。Alias Devices>Add multiple standard variablesします。
Nameは追加するSlotの名前になります。
次はTypeを設定します。例えばOutputはDigitalかAnalogに変更できます。
そしてAnalogを設定した場合はData TypeもUSINT/UINT/INT/UDINT/DINTから構築できます。
では仮にInputs/Outputsをa_in/a_out、TypeはDigital、Data TypeはBIT、10個を生成します。
このようにname_1、name_2…のようにTwinCATが変数を生成してくれます。これはすごく便利な機能です。
DIDO Signals
では、今回の記事はTwinSAFE FB Groupの状態をStandard PLCに渡したいのでいくつかのStandard Digital Input/Outputを作成しました。
Safety Program
いよいよまたSafety Programを作成します。TwinSafeGroup.salを開きます。
Add safeDecouple
ToolsからSafetDecouple Functionを追加します。
TwinSafe Connectionの信号をGroupに使用するFBDecoupleが追加されました。
Add New Variable
DecIn1を選択した状態を右クリック>Add New Variableします。
変数名を入力しOkします。
DecIn2も同じように変数を追加しましょう。
Add Etsop
右のToolboxからsafeESTOP Function BlockをSafety Programに追加します。
safeESTOP、Intance名はFBEStop1のBlockで定義されました。
Delay time
Delay Time(ms)のところで直接Delaytimeを変更できます。今回は2000(ms)に設定します。
Parameter Setting
Map Diag
先程Standard PLC ProgramでState とDiagのProcess IOを定義し、FBEStopのFuncton Blockと紐つけるといいましたね。Term5(EL6910)の中にLinkできそうなものがないんですね。
まず先程のSafety Programに戻り、FBStopをクリックすると、PropertiesではInfo Dataの項目があり、中にMap DiagとMap StateがFalseだと設定されました。
その2つをTrueにするだけで先EtherCAT EL6910からFBEStopの情報とLinkできます!
もう一度確認すると、Function Block Info Dataという新しいInputがTwinCATに追加されたか見えますか?そのFunction Block Info Dataを展開するとTwinSafeGroup.Network1.FBstop1 Info Dataの下にStateとDiagがあります。ちなみにTwinSafeGroup1.Network1.FBstop1 Info DataのNaming Formatは、
TwinSafeGroup名.診断するFuncton BlockにあるNetwork.そのInstance名のような形です。
State右クリック>Change Linkし、User Programの変数と紐つけます。
同じくDiag右クリック>Change Linkし、User Programの変数と紐つけます。
Link to Estop input
次はsafeSTOPのEStop1とEStop2をEL1904のChannel1とChannel2を繋がります。DecOut1とDecOut2の出力をEStopIn1とEStopIn2にLinkしましょう。
よし、これでDecOut1(EL1904_1_Ch1)とDecOut2(EL1904_1_Ch2)の信号がEstopのFunction Blockに流れました。
Add ESTOP OUTPUT
EStop Function Blockの出力変数を宣言します。EStopOutとEStopDelOutを右クリック>Add New Variableします。
それで変数の宣言もOK!
Add Reset
次はESTOP のFunction Blockを安全状態から正常状態にリセットする信号を作成します。Toolboxの右にあるsafeOrを追加します。
こちらは単純にOrロジックのSafety Versionなので、説明するほど難しいことがやっていません。
Add New Variables
OrIn1からAdd New Variableで新しい変数を追加します。
リセット信号を使用するのはCh3です。
Done!
Link to ESTOP Reset
OrOutをそのままsafetEstopのRestart入力と繋がります。これで準備Ok!
ADD Safety GVL
今度はSafety GVLの作成ですね。GVLs>Global Variable Listで新しいSafety GVLを追加します。
Global変数を定義し最初に追加したStandard Digital Input・Outputと紐つけましょう。
Done!
もちろんErroAcknowledgementというStandard Digital InputをUser programにLinkするのを忘れないでください。Function Blockリセットできなくなります。
Variable Mapping
View>Other Windows>Visiable MappingでMapping画面を展開します。
Mapping The Safety Input
最初に定義したしたEL1904_1_Ch1/Ch2/Ch3の変数をEL1904モジュールと割り付けます。
Assignmentの列にある…をクリックします。
EL1904のInputChannel1,2,3と繋がりましょう。
これでOK!
Mapping the Safety Output
FBESTOPの出力も同じの操作でやってください。
使用するのはEL2904のOutput Channel1,2になります。
Done!
Warning?
もしSafetyプログラムを作成するときにこのような ”A WiredLink connects the Output xx Function Block and xxx which will be executed by logic before..”のWarningがあれば、TwinCATがあなたが作成したプログラムは少し実行順番が問題あるかもしれないというお知らせです。
ではまずその実行順番というのは、各Function Blockの右上にも数字があります。その数字はあなたのTwinSAFE Groupにおける各Blockの実行の順だと示しています。
つまり、いまはまず真ん中のFBDecoupleが最初に実行(1)、実はFBEStop(2)、そして最後はSafeOrになります。確かに順番はおかしいですね。SafeOr(3)からリセットの信号をうけ、そしてTwinSAFE Connectionのすべての信号をDecoupleし、最後はFBEStopや他のSafety Programに流用するのが正しいです。
このような細やかな間違いがよくありますので、治すのも簡単です。TwinSAFE IDEの白いところを右クリック>Change Executeion Order of FBsをクリックします。
そしてCurrent VauleとNew Valueは現在の実行順番と新しく設定したい実行順番が表示されます。
Show Refernce!
最後にもう1つのTripsについて説明します。同じくIDEを右クリック>Show Referencesという機能があります。
このように各変数はどこのFunction Blockで使用されたか一覧できます。
非常に便利な機能です。
Final Flow
よし、これでSafety Programが完成です。
Download Configuration
Activate ConfigrationでHardware Configurationを先にDownloadします。
OKで進みます。
TwinCAT Runtimeを再起動し、Run Modeに切り替えます。
Download Safety Project
Download Safety Projectで安全アプリケーションをDownloadします。
Login画面が表示されます。UsernameはAdministratorです。
次はSerial Numberです。
Target Systemの画面に表示されたSerial Numberをそのまま入力してください。
今回のモジュールは1198182なのでSerial NumberのFieldは1198182にします。
最後のPasswordはDefaultはTwinSAFEです。
全部入力しNextで進みます。
入力した情報が間違えなければ、Select Project Dataの画面に進みます。
Select DataはComplete Project DataのままでNextします。
プロジェクトが無事にDownloadしました。Nextで進みます。
最後はCheckboxを入れ、Nextします。
Safety Applicationを有効にするためにPasswordをもう一度入力します。
Default PasswordはTwinSAFEです。
Login
User programをRuntime にDownloadします。
Start
最後はアプリケーションを起動すれば完成です。
Result
Show Online DataからTwinCATをMonitior Modeに切り替えます。
TwinSAFE Groupはエラーなしで動いていますね。
こちらの動画で実際の動きが見えます。
Source Project
下記のLinkからProjectをDownloadしてください。
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinSAFE_Part2.tszip