前回はBeckhoff TwinCAT SFCの部品を説明しましたが、今回はSFC Flagsについて説明したいと思います。SFC flgasはTwinCATから事前生成される変数です。それらの変数を使用しSFCプログラムを制御したり現在状態を取得したりできます(例えばTimeoutエラー・リセット動作など)。
ですが、それらの変数を使用する前にVAR_INPUT内で先に定義する必要があります。
Reference Link
こちらはBeckhoff TwinCAT SFCの部品のTutorialです↓
Enable the SFC Flags
Project>Your Project Name Propertiesをクリックします。
SFCをクリックします。
そして必要なFlagsをCheck入れます。
最後はProjectを再コンパイルすれば、SFCプログラムにアクセスできる変数が増えるとわかります。
Flags
SFCInit:Bool
True=TwinCATがSFCシーケンスをInit StepとSFC Flags含めてリセットします。SFCInitがTrueに限り、Init Stepがずっと有効のままで”Action実行しない”になります。実行するにはSFCInitがTrue>Falseに戻ったときだけです。
SFCInitを使用するには、VAR_INPUTでSFCInit変数を定義する必要があります。
そしてMainプログラムでSFC.SFCInitにTrueやFalseを与えておけばよいです。
このように、いまSFC.SFCInitがTrueになると、シーケンスはずっとInitのStepのStepままになっています。
SFCReset:Bool
True=TwinCATがSFCシーケンスをInit StepとSFC Flags含めてリセットします。そしてInit Stepが有効になるだけではなく、”Actionも実行する”になります。User ProgramでそのSFCResetをリセットしたあとにFalseに戻す必要があります。
SFCResetを使用するには、VAR_INPUTにSFCReset変数を定義する必要があります。
そしてMainプログラムでSFC.SFCResetにTrueやFalseを与えておけばよいです。
このように、いまSFC.SFCResetがTrueになると、シーケンスはずっとInitのStepのStepままになっています。
Difference Between SFCInit/SFCReset?
ではSFCInitとSFCResetの違いを実際に説明します。わかりやすくするため、一つのN ActionをInit Stepに追加します。N Actionは前回の記事でも説明しましたが、Stepが有効な限りTrue、無効になったらFalseの動作です。
そこで、まずSFCInitをTrueにします。
そうすると、Init Stepが有効になっていますが、N ActionがTriggerされていません。
SFCInitをTrue>Falseに書き込みます。
Init StepのN ActionがTriggerされるとわかります。これはSFCInitの動作です。
次はSFCResetの動作をみてみましょう。
先のSFCInitと違って、SFCResetがTrueになるとN ActionもTriggerされます。
SFCEnableLimit
TRUE=StepのTimeoutエラーを検知するようにします。
FALSE=StepのTimeoutエラーを検知しないようにします。
SFCInitを使用するには、VAR_INPUTにSFCEnableLimit変数を定義する必要があります。
そしてMainプログラムでSFC.SFCEnableLimitにTrueやFalseを与えておけばよいです。
SFCError:Bool
TRUE=SFCプログラム内にTimeoutするStepがあります。そのSFCErrorは他のSFCErrorStep、 SFCErrorPOU, SFCQuitErrorの変数と一緒に詳しいエラー情報を取得できます。
SFCErrorStep:String
Timeoutエラーが発生してるStep名を出力します。SFCErrorも同時にTrueになります。
例えばいまStep2でTimeoutのエラーが発生してます。
文字列Step2がそのままSFC3.SFCErrorStepに出力します。
SFCErrorPOU:String
Timeout エラーが発生するときPOUの名前を出力します。
例えば以下の例だとSFCのStep2です。
そのときSFCErrorPOUは”SFC3″という文字列が出力されます。
SFCQuitError:Bool
TRUE=TwinCATがSFCシーケンスが止まり、Timeoutエラーがリセットされます。そしてTrue=>FalseになるとStepの時間もリセットされます。
SFCQuitErrorを使用するには、VAR_INPUTにSFCQuitError変数を定義する必要があります。
そしてMainプログラムでSFC.SFCQuitErrorにTrueやFalseを与えておけばよいです。
SFCQuitErrorがTrueになり、SFCErrorがリセットされ、SFCErrorStep・SFCErrorPOUもリセットするとよいでしょう。
そしてSFCシーケンスをMonitorすると、現在はStep2に止まっており、StepTimeの加算も止まっています。
SFCQuitErrorがFalseに戻ります。
SFCシーケンスがまた動き始め、StepのTime Countも再開します。
SFCPause:Bool
True=TwinCATがSFCシーケンスを一時停止します。
SFCQuitErrorを使用するには、VAR_INPUTにSFCPause変数を定義する必要があります。
そしてMainプログラムでSFC.SFCPauseにTrueやFalseを与えておけばよいです。
SFC3.SFCPauseがTrueになると、SFCシーケンスが一時停止になりますが、Stepの時間加算が止まってるがN Actionは動作します。
SFCTrans:String
TRUE立ち上げ=Transitionが成立した。
立ち上げは少し難しいので、足す1のCoutnerをつけます。
Trans4の成立条件をTrueにします。
StepがStep4に移行になりますが、iCoutnerが足す1されましたので、SFC3.SFCTransがTrueになったことがあるとわかります。
SFCCurrentStep:String
現在有効なStep名を出力します。もしParallel Branchだと一番右のStep名が出力になります。
たとえば現在 SFCシーケンスがInit Stepになっています。
SFC3.SFCCurrentStepが”Init”文字列が出力されます。
SFCTip SFCTipMode:Bool
Tip Modeを有効にするかのOptionです。
SFCTipMode=TRUEになるとStep移行するにはSFCTip がFalse>Trueする必要があります。
SFCTip SFCTipModeを使用するには、VAR_INPUTその2つの変数を定義する必要があります。
そしてMainプログラムでSFC.SFCTipMode、SFCTip にTrueやFalseを与えておけばよいです。
以下のExampleですが、SFCTipModeがTrueになりますとInit StepのTransition条件が成立しもSFCシーケンスがStep4に移行しないのです。そしてSFCTipがFalse->Trueの立ち上げをするInit Step>Step4に移行します。
SFCErrorAnalyzation
SFCErrorが発生するときにError情報を文字列として回答します。SFCErrorAnalyzationを呼び出すとき、TwinCATが暗黙のルール Tc2_SystemライブラリのAnaylzeExpression Function blockを使っています。
Tc2_System.AnaylzeExpression
Project>Referencesをクリックします。
TC2_System>>Tc3_module>Tc2_Systemを展開すると、SFC+AnalyzationのFolderがあります。
Folderを開くとAnalyzeExpressionのFunction Blockがあります。
Outputは文字列だけです。
Implementation
このように直接SFC3.SFCErrorAnalyzationを使えばよいです。
例えばおまStep2がTimeout エラーが発生します。
Error発生の原因はTrans4条件が成立してない原因なので、SFC3.SFCErrorAnalyzationがTrans4文字列出力されています。
SFCErrorAnalyzationTable
SFCErrorが発生するときにError情報配列で回答しますSFCErrorAnalyzationTableを呼び出すとき、TwinCATが暗黙のルール Tc2_SystemライブラリAnaylzeExpressionTable Function blockを使っています。
Tc2_System.AnaylzeExpressionTable
Project>Referencesをクリックします。
TC2_System>>Tc3_module>Tc2_Systemを展開すると、SFC+AnalyzationのFolderがあります。
Folderを開くとAnalyzeExpressionTableのFunction Blockがあります。
OutputTableは配列のExpressionResultなので、VAR内でそのまま宣言すればよいです。
Implementation
VARでOutTableの変数を定義します。
このように直接SFC3.SFCErrorAnalyzationTableを使えばよいです。
例えばおまStep2がTimeout エラーが発生します。
Error発生の原因はTrans4条件が成立してない原因なので、SFC3.SFCErrorAnalyzationがTrans4文字列出力されています。
FailedがTrueになり、NameにはTrans4が格納されます。それはいまTrans4が成立してないのが原因でTimeoutエラー発生したので。