Project#SIMIT x TwinCAT ADS Driver

この記事では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

DeviceData TypeDescription
P_FwdBool立ち上げ=正回転
P_RevBool立ち上げ=逆回転
FwdBoolTrue=正回転
RevBoolTrue=逆回転
T_UpRealRamp up time
T_DownRealRamp down time
LocalActBool
LockActBool
SetpointReal速度設定値

OUTPUT

DeviceData TypeDescription
FbkFwdBoolTrue=正回転中
FbkRevBoolTrue=逆回転中
FbkOffBoolTrue=Off
LocalBoolDriveはLocal Mode
FwdLocalBoolDriveはLocal 正回転中
RevLocalBoolDriveはLocal逆回転中
StopLocalBoolDriveはLocal停止
MaintBoolDriveはメンテナンスモード
TripBoolDriveはTrip中
YReal現在速度

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

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする