この記事ではSIMITのADS external couplingインストールから連携まで説明いたします。
SIMITがRunしてる間でそのCoupling通じてTwinCAT3と通信します。そのDriverを使用すると、TwinCAT3とVirtual CommissioningのTaskを実装できます。
注意1:SIMITとTwinCAT Runtimeは同じのPCのみ通信できます。
注意2:EtheCAT DevicesはSimulationできません。
.
Reference Link
http://soup01.com/ja/category/siemens-jp/simit/
Download
下記のLinkにアクセスし、TwinCAT Coupling のLibraryをダウンロードします。
https://support.industry.siemens.com/cs/document/109780950/simit-twincat-coupling?dti=0&lc=en-BO
このようなZip FileがシーメンスのSIOSからダウンロードしました。
Installation
次はそのLibraryをSIMITにインストールします。
まずZip FileのLockを解除します。
Zip Fileを右クリック>Properties。
SecurityのCheckboxを入れます。
(もし表示されない場合は、もうLockかかっていません。)
次はRegister Editorを起動します。
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Siemens\SIMIT\8.0にあるPathという変数にアクセスします。
ここで示すPathをCOPYします。
C:\Program Files (x86)\Siemens\Automation\SIMIT\SIMIT SF
TwinCAT Driverを先Registry EditorにあるPathのところにあるCoupling Folder内に貼り付けます。私の場合はC:\Program Files (x86)\Siemens\Automation\SIMIT\SIMIT SFです。
これで準備OKです。
Couping Set-up
SIMIT SPを起動します。(DEMO VersionではExtend Coupling使用できません)
SIMITを起動します。
Choose a aize variant for SIMITのPopupが出てきます。
ライセンスのUSBをPCに挿入し、ライセンスの種類を選び>Applyします。
SIMITが正しくライセンスを認識できればSoftwareが自動立ち上げ、New Projectの画面になります。ここで新規Projectを作成します。
新規プロジェクトを作成したら、次はCouplingを追加します。Couplings>New couplingをクリックします。
AdditionalのところにTwinCATという選択肢が増えたはずです。
TwinCATを選択し>OKします。
TwinCATのCouplingが追加されまし。
Importer
Couplingが追加されたら次は変数をImportします。そのImporterはLocal PCで動いてるTwinCAT Runtimeと自動接続します。ADS接続が成功したらすべてのIOやGlobal 変数にアクセスすることができます。(注意するのはSIMITが対応するデータ・タイプだけImportできる、なので構造体、配列を一括Importできない)
Output
Output信号をImportします。まずImporterをクリックします。
Importerの画面が表示されます。
今回はIOsを割り付けるつもりはありませんので、IOs Onlyを外します。
そうすると、現在私のPC内のTwinCAT Runtimeにいる変数が表示さます。
Can not select前にも書いておきましたが、SIMIT Supportできるデータ・タイプのみImportできますので、配列はImportできません。
そこで少し申し訳ないですが、一つずつ選んでください。
必要なOutput信号のとなりにCheckboxを入れ、”Import Signals”のボタンをクリックします。
それでOutput信号がImportされました。
Input
Input SignalをImportするのはまったくOutputと同じ操作です。
必要なのはその赤枠のINボタンをクリックするだけです。
でもなにも選んでない状態でその”IN”ボタンをクリックするとError出ます。
必要な信号をCheck入れ、Inボタンを一つずつ押して変更します。
それか一気に選んで、INボタンをクリックしても変更できます。
このような操作ですね。
Input信号もImportされました。
Test
すべての信号をImportしたら次は実際TwinCAT Runtimeと通信できるかをテストします。
まずInput信号に1,2,3,4,5,6を書き込みます。
TwinCAT3見ますと、SIMITからデータが書き込みましたね。
今度はTwinCAT3からSIMITのOutputs信号にデータを書き込みます。
SIMITがちゃんとTwinCAT3の信号を読み込んでたんすね。
Block-ReversibleMotor
こちらは今回使用するSimulation Blockで、TwinCAT3と通信テストのほうがメインなので複雑なBlockは組みません。よろしくお願いします。
こちらのReversibleMotorはDrive UnitをシミュレーションしFwdとRevのBinary信号から正回転と逆回転を制御します。
INPUT
Device | Data Type | Description |
P_Fwd | Bool | 立ち上げ=正回転 |
P_Rev | Bool | 立ち上げ=逆回転 |
Fwd | Bool | True=正回転 |
Rev | Bool | True=逆回転 |
T_Up | Real | Ramp up time |
T_Down | Real | Ramp down time |
LocalAct | Bool | |
LockAct | Bool | |
Setpoint | Real | 速度設定値 |
OUTPUT
Device | Data Type | Description |
FbkFwd | Bool | True=正回転中 |
FbkRev | Bool | True=逆回転中 |
FbkOff | Bool | True=Off |
Local | Bool | DriveはLocal Mode |
FwdLocal | Bool | DriveはLocal 正回転中 |
RevLocal | Bool | DriveはLocal逆回転中 |
StopLocal | Bool | DriveはLocal停止 |
Maint | Bool | Driveはメンテナンスモード |
Trip | Bool | DriveはTrip中 |
Y | Real | 現在速度 |
Insert in your Chart
Components>DRIVES>Motor>ReverisbleMotorを選び、Chartに追加します。
Push Button・Slider・Digital Displayなどの部品を追加し、テスト行います。
Test1- P_Fwd/P_Rev
最初はP_Fwd/P_Revの立ち上げボタンでDriveを制御します。
Test-2 Local
次はBlockをクリックしLocal 操作を行います。
Test3-Fwd/Rev
最後はFwd/Rev信号からDrive制御します。
Project
実際、先のSimulation BlockとADS Driver接続しプログラムを作成しましょう。
SIMIT Side
SIMIT側では特に難しいことなく、ReversibleMotor Blockを追加しCouplingに信号を追加します。
Main
Main Chartは単純に各パラメータとInput/Output Signalを割り付けます。
Sub1
Sub1 ChartはSIMIT側やTwinCAT3側を判断し信号を出力します。
Mode_TwinCATならTwinCAT側の信号を判断します。
Sub2
逆にMode_SIMITだとChart内のButtonから制御します。
TwinCAT Side
Chart作成したところ、次はTwinCAT側プログラムを作成します。
こちらはFunction BlockのUML 図で、InterfaceとDUTと組み合わせて使用します。
DUT
DUT_HMI_Motor1_PB
こちらのデータ・タイプはMotor のHMI操作デバイスです。
TYPE DUT_HMI_Motor1_PB : STRUCT bFW:BOOL; bBw:BOOL; bStop:BOOL; r32Setpoint:REAL; r32AutoSetpoint:REAL; r32T_Up:REAL; r32T_Down:REAL; END_STRUCT END_TYPE |
DUT_HMI_Motor1_PL
こちらのデータ・タイプはMotor HMIの表示デバイスです。
TYPE DUT_HMI_Motor1_PL : STRUCT bFbkFwd:BOOL; bFbkRev:BOOL; bLocal:BOOL; bFwdLocal:BOOL; bRevLocal:BOOL; bStopLocal:BOOL; bMaint:BOOL; bTrip:BOOL; r32Y:REAL; END_STRUCT END_TYPE |
DUT_HMI_Motor1
そのMotorのHMI操作・表示のまとめです。(PLは今回使用しません。)
TYPE DUT_HMI_Motor1 : STRUCT PB:DUT_HMI_Motor1_PB; END_STRUCT END_TYPE |
eMode
こちらはAuto/Manualを分別するDUTです。
TYPE eMode : ( Auto:=1 ,Manual:=0 ); END_TYPE |
DUT_MotorIf
こちらのDUTはReversibleMotorのSimulation Blockと統一しています。
ReversibleMotorのSimulation BlockあるIN/Outは、このDUTにも定義されています。
TYPE DUT_MotorIf : STRUCT //Input bFwd:BOOL; bRev:BOOL; r32T_Up:REAL:=1.0; r32T_Down:REAL:=1.0; r32Setpoint:REAL:=0.0; //Output bFbkFwd:BOOL; bFbkRev:BOOL; bFbkOff:BOOL; bLocal:BOOL; bFwdLocal:BOOL; bRevLocal:BOOL; bStopLocal:BOOL; bMaint:BOOL; bTrip:BOOL; r32Y:REAL; END_STRUCT END_TYPE |
GVL
GVL_HMI
HMI画面で使用する変数です。
{attribute ‘qualified_only’} VAR_GLOBAL Motor1:DUT_HMI_Motor1; bReset:BOOL; bEnable:BOOL; eMode:eMode; Mode_Manual,Mode_Auto:BOOL; END_VAR |
GVL_Motor_Interfaces
ReversibleMotor Simulation Blockと直接割付けする変数です。
{attribute ‘qualified_only’} VAR_GLOBAL Motor1:DUT_MotorIf; END_VAR |
GVLSIMIT_TEST
最初ADS Driverと通信テストする変数です。
{attribute ‘qualified_only’} VAR_GLOBAL b:ARRAY[0..99]OF BYTE; i16:ARRAY[0..15]OF INT; END_VAR |
FB_ReverMotor
こちらのFBはSIMIT ReversibleMotor Blockを制御します。
VAR
FUNCTION_BLOCK FB_ReverMotor IMPLEMENTS ITF_Motors VAR_INPUT bEnable :BOOL; RefHMI:REFERENCE TO DUT_HMI_Motor1; RefIFs :REFERENCE TO DUT_MotorIf; Mode :eMode; END_VAR VAR_OUTPUT bError:BOOL; wErrorCode:WORD; END_VAR VAR _bRefIsOK :BOOL; _bError :BOOL; END_VAR |
PROPERTY ActSpeed : REAL
FBから現在速度を取得します。
Get
IF _bRefIsOK THEN ActSpeed:=RefIFs.r32Y; ELSE ActSpeed:=0.0; END_IF |
PROPERTY Bwing : BOOL
FBから逆回転してるかの状態を取得します。
Get
Bwing:=FALSE; IF _bRefIsOK THEN Bwing:=RefIFs.bFbkRev; END_IF |
PROPERTY CmdSpeed : REAL
FBから現在の速度指令値を取得します。
Get
CmdSpeed:=0.0; IF _bRefIsOK THEN CmdSpeed:=RefIFs.r32Setpoint; END_IF |
PROPERTY Fwing : BOOL
FBから正回転してるかの状態を取得します。
Get
Fwing:=FALSE; IF _bRefIsOK THEN Fwing:=RefIFs.bFbkFwd; END_IF |
PROPERTY Maint : BOOL
FBからメンテナンスModeになっているかを取得します。
Get
Maint:=FALSE; IF _bRefIsOK THEN Maint:=RefIFs.bMaint; END_IF |
PROPERTY Stopped : BOOL
FBからDriveが停止しているかを取得します。
Get
Stopped:=FALSE; IF _bRefIsOK THEN Stopped:=RefIFs.bFbkOff; END_IF |
PROPERTY Trip : BOOL
FBからDriveがTripしているかを取得します。
Get
Trip:=FALSE; IF _bRefIsOK THEN Trip:=RefIFs.bTrip; END_IF |
METHOD CheckVaild : BOOL
HMIとMotor InterfaceのReference Inputが有効かをCheckする。
何回も言いましたが、無効なRerferenceをFBに渡すとTwinCAT Runtimeが止まります。
_bRefIsOK:=__ISVALIDREF(RefHMI) AND __ISVALIDREF(RefIFs); |
METHOD Fault : BOOL
呼び出すとTrip信号をMonitorしTrueであればError Flagをセットします。
IF _bRefIsOK THEN IF RefIFs.bTrip THEN _bError:=TRUE; wErrorCode.0:=TRUE; END_IF END_IF bError:=_bError; |
METHOD Reset : BOOL
呼び出すとErrorをリセットします。
_bError:=FALSE; bError:=FALSE; wErrorCode:=16#0; |
METHOD Run : BOOL
呼び出すとDriveにRun コマンドを発行します。
まずエラー FlagをCheckし、Auto Modeならもし速度指令値が0.0より大きであれば正回転、0.0より小さいな逆回転Flagをセットします。Manual Modeなら直接HMIのボタンから取り込み、正回転や逆回転のFlagをセットします。
注意するのはAuto Modeの場合はReversibleMotor BlockがFwd/Revと割り付けていますので、ReversibleMotorはその速度指令値がプラスなら正回転、マイナスなら逆回転。
VAR _BW:BOOL; _FW:BOOL; END_VAR IF _bRefIsOK AND bEnable AND NOT _bError THEN IF Mode = eMode.Auto THEN IF RefHMI.PB.r32AutoSetpoint <0.0 THEN RefIFs.r32Setpoint:=RefHMI.PB.r32AutoSetpoint*-1.0; _BW:=TRUE; ELSIF RefHMI.PB.r32AutoSetpoint >0.0 THEN RefIFs.r32Setpoint:=RefHMI.PB.r32AutoSetpoint; _FW:=TRUE; ELSIF RefHMI.PB.r32AutoSetpoint =0.0 THEN RefIFs.r32Setpoint:=RefHMI.PB.r32AutoSetpoint; END_IF ELSIF Mode =eMode.Manual THEN IF RefHMI.PB.bStop THEN RefHMI.PB.bFW:=FALSE; RefHMI.PB.bBw:=FALSE; RefIFs.r32Setpoint:=0.0; ELSIF RefHMI.PB.bFW THEN RefIFs.r32Setpoint:=RefHMI.PB.r32Setpoint; _FW:=TRUE; ELSIF RefHMI.PB.bBw THEN RefIFs.r32Setpoint:=RefHMI.PB.r32Setpoint*1.0; _BW:=TRUE; END_IF; END_IF RefIFs.bFwd:=FALSE; RefIFs.bRev:=FALSE; IF _FW THEN RefIFs.bFwd:=TRUE; ELSIF _BW THEN RefIFs.bRev:=TRUE; END_IF END_IF |
METHOD Stop : BOOL
呼び出すとStopコマンドを発行します。
IF _bRefIsOK THEN RefIFs.bFwd:=FALSE; RefIFs.bFbkRev:=FALSE; RefIFs.r32Setpoint:=0.0; END_IF |
POU-MAIN
MainのプログラムはReference をCheck>Fault検知する>Resetする>FB呼び出しだけです。
VAR Motor1:FB_ReverMotor; bEnable:BOOL; END_VAR GVL_HMI.Mode_Manual:=GVL_HMI.eMode=eMode.Manual; GVL_HMI.Mode_Auto:=GVL_HMI.eMode=eMode.Auto; Motor1.CheckVaild(); Motor1.Fault(); IF GVL_HMI.bReset THEN Motor1.Reset(); END_IF; Motor1( bEnable:=bEnable ,RefHMI:=GVL_HMI.Motor1 ,RefIFs:=GVL_Motor_Interfaces.Motor1 ,Mode:=GVL_HMI.eMode ); Motor1.Run(); |
Visualization
Result
Manual Mode
こちらはManual Modeの操作結果です。
ボタン操作によりReversibleMotorへコマンドを発行します。
Auto Mode
こちらはAuto Modeの操作結果です。
SliderのSetpointから直接コマンド発行します。
Source Code Download
以下のLinkからSIMITのChartとTwinCAT Projectをダウンロードしてください。
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT%20Project_WithSIMIT_ADSConnection.zip