今回の記事ではSPT Frameworkを紹介します。最初はSPT FrameWorkの基本な考え方・Function Block・Interfaceを説明し、次はFB_DigitalSensorのFunction Blockを使用しSimulationモードとEtherCAT IOを実装します。
EtherCAT IOがPhoenixContactのAXL E EC DI8 DO8 M12 6Pになります。
さ、始めましょう!
Video
自分のSPTフレームワークの紹介ビデオとライブコード動画です。
SPT Application Framework?
SPT Application Frameworkは機械制御ソフトウェアを標準化するためのライブラリとパターンのコレクションで、Beckhoff USAがメンテナンスや管理を行っています。
Libraries
SPT FrameworkはPackMLライブラリを利用することで、制御プログラムを作成するための定義された状態の管理ができるようになります。制御設計で重要な要素は、適切なコマンドを適切なタイミングで与えることで、機械の他の部分と連携することであります。
Cyclic Logic vs Single Method Calls
SPT Frameworkは、M_ExtendCylider や M_ResetAxis のように、特定の制御を呼び出し実行するためにMethodを使用します。これらのMethodは場合によって一回だけの呼び出しや複数の呼び出しも可能です。(例えばMethodが実行成功になるまで)
さらに、SPT Frameworkは、特定のステート中にコマンドを呼び出すためのメソッドを使用できます。例えば、ModuleをリセットするためにResetting Methodを必要なタイミングで呼び出し状態をリセットしたりします。
また、SPT FrameworkはCyclic method callsを使用し、モジュール状態を監視し、変化するとAlarmやFaultに、他の状態に切り替えることもできます。
SPT Base Types
SPT Framework LibraryのほとんどのFunction Blockは、FB_CyclicFBを継承してI_CyclicFBを実装することによって、初期化・呼び出し方などに共通のパターンを使用します。
FB_CyclicFBでは、InitComplete Properties経由でLocal変数_InitCompleteにアクセスし、該当するFunction Blockの初期化状態を確認できます。これによって、Function Blockが必要な初期化ステップがすべて実行されたことを保証することができます。(例えば、ポインタを参照する前にポインタが初期化されていることを確認するなど)
Interface
I_BaseFB
SPT Frameworkで使用されるFunction Blockの一番基本的な機能を定義します。
Properties
Property | Type | Read/Write | Description |
Busy | BOOL | R | 1=Function BlockがTask実行中 |
Error | BOOL | R | 1=Function Blockがエラーあり |
ErrorID | UDINT | R | エラー情報 |
I_CyclicFB
こちらのInterfaceはI_BaseFBから拡張されたんです。I_CyclicFBはI_BaseFBに加え、CyclicLogic()をMethodを追加し周期で呼び出すための機能が定義されました。
Properties
Property | Type | Read/Write | Description |
InitComplete | BOOL | R | 1=Function Blockが使用可能 |
Methods
Method | Type | Return | Description |
CyclicLogic | BOOL | null | 制御プログラムを周期で実行する |
Function Block
FB_BaseFB
こちらはabstract Function BlockでI_BaseFBから実装されたものです。FB_BaseFBはすべての I_BaseFB Propertiesを含め、SPT Framework機能の最も基本的な構成要素です。
FB_CyclicFB
(abstract, extends FB_BaseFB, implements I_CyclicFB)
FB_CyclicFBはすべての I_CyclicFBのプロパティが含まれ、 CyclicLogic()を利用し周期ロジックを実行します。
SPT Components
こちらはI_ComponentBase を実装したFunction Blockです。
Interface
I_ComponentBase
SPT Components に必要な基本機能を定義するInterfaceです。
Properties
Property | Type | Read/Write | Description |
CurrentAlarmSeverity | TcEventSeverity | R | 現在アクティブなイベントの中で、最も重大度が高いものを返します。 |
InSimulation | BOOL | RW | True=該当する部品がSimulation中 |
Name | STRING | RW | 部品名 |
ParentResponseDefinitions | ARRAY[0..4] OF E_AlarmResponse | RW |
Methods
Method | Type | Return | Description |
AllowHMIControl | BOOL | null | 部品がHMI経由の外部機能を許可する |
BlockHMIControl | BOOL | null | 部品がHMI経由の外部機能をブロックする |
Reset | BOOL | null | 部品のエラーをリセットする |
I_DigitalSensorBase
SPT FrameWorkのデジタルセンサーの機能を定義するInterfaceになります。
Function Block
FB_ComponentBase
(abstract, extends FB_CyclicFB, implements I_ComponentBase)
I_ComponentBaseとFB_CycliceFBの機能が揃えられたFunction Blockで、すべてのPROTECTEDメソッドは、はSUPER^.Method()を使用して呼び出す必要があります。
FB_DigitalSensor
FUNCTION_BLOCK FB_DigitalSensor EXTENDS FB_ComponentBase IMPLEMENTS I_DigitalSensorBase
こちらはデジタル信号用の基本的なFunction Blockで、ローカル定義の HardwareInput AT %I* : ハードウェアにリンクするための BOOLも含まれています。
Download Library
下記のGithubからBeckhoff USAのSPT ライブラリをDownloadできます。
https://github.com/Beckhoff-USA-Community/SPT-Libraries
DownloadされたZIPを解凍します。
Add Library
SPTライブラリを追加するため、References>Add Libraryします。
Advancedボタンをクリックします。
Library Respository..を開きます。
Library Respositoryの設定画面が表示されました。
Edit LocationsをクリックしLibraryの格納Locationを追加します。
Add で新しいライブラリを追加します。
…をクリックします。
先程GithubからDownloadされたライブラリにSPT-Libraries-main>Library Repositoryを指定します。
Nameは特に指定する必要がありませんが、今回は仮にSPTにします。
Done!
CompanyにBeckhoff Automation LLC(つまりBeckhoff USA)が作ったライブラリが見えました。
中にSPT Driversなどのライブラリがあります。
あとはAdd Libraryを使ってSPT ライブラリをプロジェクトに追加すればOKです。
Program
こちらはFB_DigitalSensorの使用したプログラム例です。
PROGRAM MAIN VAR Sensor :FB_DigitalSensor; Simulate :BOOL; Activte :BOOL; t1,t2 :TIME; Traced :BOOL; inData :BOOL; END_VAR Sensor.SimulationMode:=E_SensorSimulationMode.InputDriven; Sensor.Name:=’My Sensor’; Sensor.InSimulation:=Simulate; Sensor.SimulationInput:=inData; Activte:=Sensor.Active; t1:=Sensor.TimeActive; t2:=Sensor.TimeInactive; Sensor.CyclicLogic(); IF t1 >= T#5S THEN IF NOT Traced THEN Traced:=TRUE; Sensor.Trace(Message:=’The sensor is on more than 5s’); END_IF ELSE Traced:=FALSE; END_IF |
Result
SensorというInstanceを展開してFBの状態を確認しましょう。
_InitCompleteがTrueになり、初期化が成功したことを示しています。
_Nameはプログラムで設定したデバイス名を示しています。
_SimulateがFalseになり、シミュレーションモードがOffになっています。
Sensor.InSimulationをTrueにすることによって、シミュレーションモードを開始します。
_SimulateがTrueになり、いまFBがシミュレーションモードに変わりました。
Sensor.SimulationInputをTrueすると、Sensor.ActiveがTrueになります。
つまりいまSensorがONになってる状態を示しています。
Connect with EtherCAT IO
次は実際のEtherCAT IOと繋がります。I/O>Deviecs>Add New ItemでEtherCAT Masterを追加します。
Done!EtherCAT Masterが追加されました。
SearchでNetwork Adapterを設定します。
EtherCAT Networkとして使用するNetwork Adapterを設定します。
Done!
Add New Slave
EtherCAT Masterを右クリック>Add New Itemで新しいEtherCAT Slaveを追加します。
今回使用するAXL E EC DI8 DO8 M12 6Pを選択し、Okで追加します。
Done!
Link Variables
Sensorと接続してるChannelを右クリック>Change Linkします。
Sensor.HardwareInputはFB_DigitalSensorのProcessIO変数です。
Result
こちらのYoutube動画で動作確認できます。
Download Sample Project
GithubからサンプルプロジェクトをDownloadできます。
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT%20_SPTFrameWork_Example01.tnzip