この記事ではTwinCATとSIMITをどう連携しProfiDrive1をシミュレーションするかを説明します。基本的にPROFINETやPROFIBUS通信でPROFIDRIVEを使用するのですが。
Profinet SupportするPLC>Telegram1を構築>Drive通信するのは現実世界の話ですが、今回はあえてTwinCATとOPCUAに置き換え、G120はSIMIT側に任せました。
なぜかというか、ProfiDrive1は実際通信してるのは4Bytesのデータなので、そこまでSimulation上でOPCUAやProfinetやなんでもよいので、プログラム作り終わった最後にProfinetに合わせて変更すればよいではないか?と思っています。
あとは私はライセンスとPN Simulation Modulesがないのも大きな原因です…
Tutorialはちょっと長い目になりますが、よろしくお願いしますね。
Reference Link
Siemens
TwinCAT
PROFIdrive?
ProfiDriveはPROFINETとPROFIBUSの標準なDrive Interfaceで、速度制御からHigh LevelのServo制御も使用されています。
ProfiDriveにPZD(Prozessdaten) つまり現在状態とSTW – control words [DE
Steuerwort] 制御コマンドに分かれています。
Telegramの種類によりPZDとSTWの数も違います。
In Telegram1…
STW1/STW2 と ZSW1/ZSW2 はTelegram1で使用されています。
STW1:Control Word,OnするBitによりDriveの状態が変わる
STW2:Speed 指令値
ZSW1:Status word、Driveの現在状態を示しています。
ZSW2:Speed現在値
Componet
このTutorialでは使用する部品だけを紹介します。
PROFIdrive1
PROFIdrive1 はSiemensのProfidrive Telegram1をシミュレーションします。
NSOLL_A=Speed指令値
NIST_A =現在Speed
注意するのはNOSLL_A と NIST_A は0−16384でYは0−100%のSpeed Setpointで100%=16384になります。
STW1/ZSW1をBlockをクリックすると一覧できます。
ZSW1.3とZSW1.7のFault/Warning Bitは強制的にTure/Falseできます。
Connectors-Inputs
Name | Description |
STW1 | PROFIdriveのControl word1 |
NSOLL_A | Speed指令値、0-16384 |
NIst | Process value Actual speed |
Connectors-Outputs
Name | Description |
ZSW1 | PROFIdriveのStatus word1 |
NIST_A | Speed現在値 0-16384 |
Y | Process speed setpoint from 0-100% |
NSoll | Process value Speed setpoint |
Universal
この部品はProfiDriveの拡張です。ZSW1とSTW1のBit11から15までを構成できます。
PROFIdrive1/PROFIdrive2と一緒に使用することできます。
.
Connectors
Name | Description |
ZSW1.11-15 | ZSW1.11-15 signals の割付け. |
NSOLL_A | Raw speed setpoint 0-16384 |
NIst | Process value Actual speed |
Motor
この部品はMotorをシミュレーションすることができ、スイッチONとスイッチOFFのBinary Inputなどが用意されています。
Drive ONもしStart=True。
Drive OffもしStart=False。
Connectors-Inputs
Name | Description |
P_Start | 立ち上げ=DriveON |
P_Stop | 立ち上げ=DriveOFF |
Start | Drive Switch On if Signal =1 |
T_Up | Ramp up time |
T_Donwn | Ramp Down time |
LocalAct | Local Key operation Active |
LockAct | Local Key Operation Lock |
Setpoint | Motor 速度 0~100% |
Connectors-Outputs
Name | Description |
Fbk_Run | 1=Speed到達 |
Fbk_Off | 1=Speed到達してない |
Local | Drive Switch On if Signal =1 |
StartLocal | 1=Local |
StopLocal | 1=Not Local |
LocalAct | Local Condition |
Maint | 1=in Maintanece |
Trip | 1=in Trip |
Y | Drive 現在速度0~100% |
State machine
こちらはPROFIdriveのFlowです。
SIMIT Side
では、SIMIT SoftwareからSimunlationを作成しましょう。
Coupling
今回のTutorialではOPCUAを使用し、SIMIT側はOPCUA Serverとして働き、TwinCATはOPCUA Clientの役割でデータをやりとりします。
Your Project>Couplings>Create OPC UA Serverで新しいCouplingsを作成します。
PROFIdrive1のTelegramを定義します。
TypeはIntegerです。
Create new chart
SimitのSimunlation ProcessはCharts内で動きます。
Charts>New chartで新規Chartを作成しましょう。
デモバージョンを使用してるので、このWarning Messageが常に出ています。
Basic Simulation of Profidrive1
Insert PROFIDRIVE
Components>Drives>PROFIdrive,PROFIdrive1を選びます。
PROFIdrive1の部品をChartに追加します。
よし、PROFIdrive1 Simulation Blockが追加されましたね。
Hide/Show Interface
使われていないInterfaceはSimunlation Blockで非表示することができ、あなたのChartの可視性が上がります。Simunlation Blockをクリックし>目ICONがありますので、そのICONをクリックすれば該当するInterfaceを表示・非表示することができます。
その通り、いまSTW1が非表示になりました。
Parameter
Reference Speed と Maxspeed はDriveをSimunlationするとき大事なパラメータです。
Reference Speed は16#16384のときのDrive回転数です。
Insert Sinamics
次は Basic components>Siemens でSinamicsを選びます。
Sinamics objectをChartに追加します。
このように、PROFIdrive1 Simulation BlockはSinamics Blockとグループ化できます。
Insert Universal
Basic components>PROFIdriveでUniversalを選びます。
そのUniversal BlockをSinamicsの下にDropします。
よし、これで完成。
Mapping the Connector
PROFIdriveのSimulation が構成完了したら次はSignal Mappingです。
Insert Output Connector
Components>CONNECTORS でOutputを選びます。
.
OutputをChartに追加します。
このようですね!
ここでみなさんが混乱するかもしれませんが、前のTutorialも書いてたように、SIMIT上でINPUTとOUTPUTの表現は逆で受け側からの視点になります。
つまり、OUTPUTはSIMITのINPUTで、INPUTはSIMITのOUTPUTのだと。
でも、SIMITソフト上でも信号を間違えないように色分けしています。
”Output”信号は緑で同じSignalと接続しかできません。
Insert Input Connector
次はInput Connectorsを追加します。
このようですね。
Input Connector が追加されました。
Link the Signal-Method1
Connectorは単なるConnectorのままで、実際の信号と接続する必要があります。接続方法は2つあります。まず右のTabでSignal tabをクリックします。
すべての信号もここで一覧できます。
今回は自分が定義したOPC Server Nodeと接続したいので、OPCをSource field入力します。
信号をそのままProperty>Sigual>Value FieldにDropします。
簡単明快。
Link the Signal-Method2
次は方法2を紹介します。信号をそのままShift+Dropで直接追加します。
Link the signal to Block
信号が追加されたら、その信号をBlockと接続します。
以下のGIFのような操作です。
おめでとうございます!信号はほぼMappingされました。
Spilt the Blocks
Simulation のLogicが複雑になるとChartがぐちゃぐちゃになります。
Framesなどを追加しLogicを分けることをおすすめします。
Add Rectangle
右側のGraphic Tab を開きます。
Rectangle objectを選びます。
そのObjectをSheetに追加します。
RectangleがChartに追加されました。
RectangleをクリックするとPropertyのTabが開き、Rectangleの設定を変更できます。
まずColorをFill-colorからno colorに変更します。
そしてRectangleのサイズを変更し、他のSimulation Blockと分けておきましょう。
Add Text
次はテキストを追加し、Simulation Blockに簡単な説明を書きます。
Text ObjectをSheetにDropします。
そしてTextに説明文を入力します。
Text ObjectのBackground colorを変更できます。
いまはわかりやすくなりましたね。
Testing
では、まずPROFIdrive1のBlockをテストしてみます。
あなたがBlockを右クリックするとSTW/ZSWを一覧できます。
“-”というボタンがあり、クリックすると現在値を強制変更できます。
たとえばSTW1に1234w強制的に書き込みます。
1234=010011010010
Motor Simulation
Insert Motor
次はMotor側ですね。
Drives>MotorでMotorを選びます。
Motor ObjectをChartに追加します。
Motor Simulation Blockが追加されました。
Function test
まずMotor Blockをテストしてみます。
Add Push Button
ボタンを追加します。右側のControls tabをクリックします。
Controls>InputでPushbuttonを選びます。
PushbuttonをChartに追加します。
あまりボタンっぽくないですが、その小さな四角はボタンです。
押すとTrueになり、リリースするとFalseになります。
Edit-Show names
Buttonの名前を表示します。そうするとButtonの役割がわかります。
Buttonを選び>General>Show namesのCheckboxをCheck入れます。
文字がButtonの上に表示されますね。
Edit-Name
もちろん、その文字は修正できます。
General>Nameでわかりやすい名前に変更しましょう。
いまはMotor_PStart と Motor_PStop、2つのButtonが出てきました。
Add Slider
私は3つのスライダーを追加しRamp up/down/Speed setpoint設定できるようにします。Controls>InputでスライダーをChartに追加します。
スライダーが追加されました。
Edit-Start/End Value
Start/EndのFieldでスライダーの入力・出力のリミットを設定します。
Edit-Increment
Incrementは一回スライドする際の加算値を設定します。
Edit-Default Value
Simulation起動するときのDefault値はここで設定できます。
Add Digital display
最後にDigital displayを追加しBlockの出力をMonitorできるようにします。
Controls>DisplayでDigital displayをChartに追加します。
Digital displayが追加されました。
Linking
追加された部品をMotor Blockと接続します。
Testing
以下のように、MotorはP_StartがTrueになるとSetpoint値Outputされます。
Add Mode
今回のTutorialはSIMITとTwinCATの連携ですね。なので2つModeを定義します。
Manual=SIMITのLocal Operation
Auto=TwinCATからのRemote Control
Manual ModeはスイッチONするときTriggerし、OFFするときはAuto Modeになる。
Add Connector
Basic Components>Connectorで2つ追加します。
ConnectorはProperty内ではNameだけです。実際そのNameは”変数名”です。
例えばいまConnector#1という名前のConnectorが設定されます。そのConnector#1に他のLogicで現在値を上書きされたら他のLogicにも使います。
よし、変数も追加OKです。
Add AND Gate
Connectors>STANDARD>BinaryBasicでAND Objectを追加します。
Add NOT Gate
次はNOT gateです。
Add Switch
最後にスイッチを追加します。
Controls Tabを開きます。
Controls>InputでSwitchを追加します。
Create Mode Change Flow
こちらはMode ControlのFlowです。
Add Push Button interlock
P_Start と P_StopのTrigger条件にManual ModeのAND Logicを入れます。
その P_Start と P_StopManual Modeのみになります。
Testing
下図のようにMotorはManaul modeのみ動作します。
Add AutoStart signal
よし、次はTwinCATからSTW1.0を受信したときのStart信号をMotor SimulationのStart信号として使用します。STW1.0のBitデバイスなのでDWORDからByte変換し次はBitに変換する必要があります。
Add DWord2Byte
DWord2Byte をChartに追加します。
DWがDouble Word Inputで4 Bytesに変換します。
Add Byte2Bit
次はByte2BitをChartに追加します。
BはByte inputで8Bitを分解してくれます。
Add Control Flow
STW1をDWord2ByteのDWのINPUTとして入力し分解された4ByteのB0だけをByte2BitのB Inputとしていれます。最後は0 OutputをAND Gate と接続し、Motor BlockのStart 信号と繋がります。
Add new Chart
Logicが複雑になり、Chartはまた見辛くなりましたね。今度はLogicでChartを分けます。
Charts>New chartします。
Mode 操作 と手動のStart/Stop/Setpoint は全部新しいChartに移動します。
Add Auto Start Signal again
自動Start信号も新しいChartに追加します。
もちろんそのAutoStart信号をMotor Simulation BlockのStart パラメタと接続してください。
Add Auto setpoint
Auto setpointを作成しTwinCATから速度設定値を受けとります。
The Profiedrive1_NSoll connector という変数を追加し、 NSoll outputに割り付けます。
Analog Selectorを使ってManual ModeとAuto Modeを使い分けます。
0=Manual Setpoint使用。
1=TwinCATのSpeed Command使用。
MotorSetpoint変数もMotor Simulation BlockのSetpointパラメータに割り付けましょう。
Add Feedback to Profidrive block
Feedback速度もシミュレーションし、 “ramp up/down” functionを模擬します。その “ramp up/down”の速度はMotor Simulation Blockで制御します。
Profidrive1_NSoll iはSimulation Blockから受け取た速度コマンドで0-100%にスケールします。もちろん現在の速度も0-Reference speedにスケールします。
Profidrive1_NlstをPROFIdrive1のNistと繋がります。
Flow
ここまできてお疲れ様です。
Profidrive1_SimはDriveのMain Simulationです。
System chartはModeの切り替え・Start/Stop・Speed SetpointのLogicが入っています。
TwinCAT Side
Configure OPC-UA Client
Function Block – FB_ProfiDrvie1
これはProfiDrive1制御のメインFunction Blockです。
OPCUA Clientの通信が使われていますが、Profinetを使用するときに4 Wordsに変更すればよいです。
VAR_INPUT
VAR_INPUT iRefHMI :REFERENCE TO DUT_ProfiDrive1_HMI; ir32AutoSpeedCmd :REAL; ibReset :BOOL; iMode :DUT_Mode; END_VAR |
Name | Type | Description |
iRefHMI | REFERENCE TO DUT_ProfiDrive1_HMI | HMI Interface |
ir32AutoSpeedCmd | REAL | Auto ModeのSetpoint |
ibReset | BOOL | 1=エラーリセット |
iMode | DUT_Mode | 現在ModeAuto/Manual |
VAR
STW1,NSOLL_A,ZTW1,NIST_A はProcessI/Oとして定義し、ProfiDriveのInterfaceに割り付けてください。
VAR STW1 AT %Q* :uDUT_STW; NSOLL_A AT %Q* :LINT; ZTW1 AT %I* :uDUT_ZSW; NIST_A AT %I* :LINT; OPCUA_Client :DUT_OPCUA_Client; RefIsVaild :BOOL; r32RefSpeed :REAL; w16Fault :WORD; w16Warning :WORD; TON :TON; END_VAR |
PROGRAM
こちらはFunction Block内のプログラムです。
Here is the program inside the Function block.
- OPC-UA 接続を初期化します。
- Hmi Referenceは正しいかCheck
- Drive 有効
- Reset
- Fault 検知
// OPCUA_Init(); // CheckRef(); // TON(IN:=OPCUA_Client.Status.Connected AND NOT fault,PT:=T#1S); Enable(mbEnable:=TON.Q); // Reset(mbReste:=ibReset); //Fault Fault00_FromDrive(); Fault01_RefSpeedErr(); //Warning Warning00_FromDrive(); |
Method
CheckRef
TwinCATのRuntimeは無効のreferenceを渡すと止まることになりますので、__ISVAILDREF() 関数でreferenceが正しいかどうかをCheckします。
METHOD CheckRef : BOOL RefIsVaild:=__ISVALIDREF(iRefHMI); |
Enable
HMIからのEnable信号です。
METHOD Enable : BOOL VAR_INPUT mbEnable:BOOL; END_VAR IF mbEnable AND RefIsVaild THEN STW1.stSTW.b00Off1:=iRefHMI.PB.bOFF1; END_IF; |
Fault00_FromDrive
Fault00はProfiDrive からのエラー信号です。
METHOD Fault00_FromDrive : BOOL IF ZTW1.stZSW.b03FaultActive THEN w16Fault.0:=TRUE; END_IF |
Fault01_RefSpeedErr
Fault01はReference speedが<=0のとき発生します。
METHOD Fault01_RefSpeedErr : BOOL IF RefSpeed <=0.0 THEN w16Fault.1:=TRUE; END_IF |
FB_Init
ProfiDrive のDefault構成を設定します。
METHOD FB_init : BOOL VAR_INPUT (* if TRUE, the retain variables are initialized (warm start / cold start)*) bInitRetains : BOOL; (* if TRUE, the instance afterwards gets moved into the copy code (online change)*) bInCopyCode : BOOL; END_VAR STW1.stSTW.b01Off2:=TRUE; STW1.stSTW.b02Off3:=TRUE; STW1.stSTW.b03EnableOperation:=TRUE; STW1.stSTW.b04DisableRFG:=TRUE; STW1.stSTW.b05EnableRFG:=TRUE; Stw1.stSTW.b06EnableSetpoint:=TRUE; Stw1.stSTW.b10ControlByPLC:=TRUE; |
Hmi
HMIに表示情報を転送します。
METHOD Hmi : BOOL IF RefIsVaild THEN iRefHMI.PL.i64RawDataZTW:=ZTW1.stZSW; iRefHMI.PL.i64RawDataSTW:=STW1.stSTW; iRefHMI.PL.i64RawData_NIST_A:=NIST_A; iRefHMI.PL.i64RawData_NSOLL_A:=NSOLL_A; iRefHMI.PL.bFault:=Fault; iRefHMI.PL.bWarning:=Warning; iRefHMI.PL.bReady:=Ready; iRefHMI.PL.r32ActualSpeed:=RawSpeed2Real(raw:=NIST_A); iRefHMI.PL.OPCUAControl:=OPCUA_Client.Control; iRefHMI.PL.OPCUAStatus:=OPCUA_Client.Status; END_IF |
OPCUA_Init
Write-EnableはTwinCATとOPCUA ServerとつながってるのみTrueになります。
METHOD OPCUA_Init : BOOL IF OPCUA_Client.Status.Connected THEN OPCUA_Client.Control.Write_Enable:=TRUE; ELSE OPCUA_Client.Control.Write_Enable:=FALSE; END_IF |
r32Speed2Raw
Speedを0-100% から0-16384.0に変換するMethodです。
METHOD r32Speed2Raw : LINT VAR_INPUT mr32Setpoint:REAL; END_VAR r32Speed2Raw:= REAL_TO_LINT( (mr32Setpoint/100.0)*16384.0) ; |
RawSpeed2Real
Speedを0-16384. to 0-100%に変換するMethodです。
METHOD RawSpeed2Real : REAL VAR_INPUT raw:LINT; END_VAR RawSpeed2Real:= (LINT_TO_REAL (raw)/16384.0) *100.0; |
Reset
エラーをリセットする。
METHOD Reset : BOOL VAR_INPUT mbReste:BOOL; END_VAR STW1.stSTW.b07Ack:=mbReste OR (RefIsVaild AND iRefHMI.PB.bReset) ; w16Fault:=0; w16Warning:=0; |
Run
いまDriveの状態でSpeed Setpointを書き込みしています。
METHOD Run : BOOL IF NOT Ready THEN NSOLL_A:=0; END_IF; IF Ready THEN IF RefIsVaild AND iMode = DUT_Mode.Manual THEN NSOLL_A:=r32Speed2Raw(mr32Setpoint:=iRefHMI.PB.r32SpeedSetPoint); ELSIF iMode= DUT_Mode.Auto THEN NSOLL_A:=r32Speed2Raw(mr32Setpoint:=ir32AutoSpeedCmd); END_IF; END_IF |
Stop
Speed set-pointを0に書き込みます。
METHOD Stop : BOOL NSOLL_A:=0; |
Warning00_FromDrive
DriveからのWarningを検知します。
METHOD Warning00_FromDrive : BOOL IF ZTW1.stZSW.b07AlarmActive THEN w16Warning.0:=TRUE; END_IF |
Proprety
ActSpeed
現在SpeedをReturnします。
PROPERTY ActSpeed : REAL |
CmdSpeed
コマンドSpeedをReturnします。
PROPERTY CmdSpeed : REAL |
Fault
Function BlockのFaultをReturnします。1=Faultあり。
PROPERTY Fault : BOOL |
Ready
Ready状態をReturnします。1=Ready中。
PROPERTY Ready : BOOL |
RefSpeed
Reference speedを設定します。SIMITと合わせて設定してください。
PROPERTY RefSpeed : REAL |
Warning
Function BlockのWarningをReturnします。1=Warningあり。
PROPERTY Warning : BOOL |
DUT
DUT_Mode
{attribute ‘qualified_only’} {attribute ‘strict’} TYPE DUT_Mode : ( enum_member := 0 ,Auto:=1 ,Manual:=10 ); END_TYPE |
DUT_STW
STWのBit Mappingです。TutorialのReference Linkを参考にしてください。
TYPE DUT_STW : STRUCT b00Off1 :BIT; b01Off2 :BIT; b02Off3 :BIT; b03EnableOperation :BIT; b04DisableRFG :BIT; b05EnableRFG :BIT; b06EnableSetpoint :BIT; b07Ack :BIT; b08Spare :BIT; b09Spare :BIT; b10ControlByPLC :BIT; b11Direction :BIT; b12 :BIT; b13 :BIT; b14 :BIT; b15 :BIT; _noused :ARRAY[0..2]OF INT; END_STRUCT END_TYPE |
uDUT_STW
union data typeでSTWとLINTを一つの変数としてまとめます。
TYPE uDUT_STW : UNION STW:LINT; stSTW:DUT_STW; END_UNION END_TYPE |
DUT_ZSW
ZSW1のBit Mappingです。TutorialのReference Linkを参考にしてください。
TYPE DUT_ZSW : STRUCT b00Ready2SStart :BIT; b01Ready :BIT; b02OperationEnable :BIT; b03FaultActive :BIT; b04Off2InActive :BIT; b05Off3InActive :BIT; b06LockOut :BIT; b07AlarmActive :BIT; b08SpeedDeviation :BIT; b09MasterControlRequested :BIT; b10SpeedReached :BIT; b11 :BIT; //manufactor-define b12 :BIT; //manufactor-define b13 :BIT; //manufactor-define b14 :BIT; //manufactor-define b15 :BIT; //manufactor-define _noused :ARRAY[0..2]OF INT; END_STRUCT END_TYPE |
uDIT_ZSW
union data typeでZSWとLINTを一つの変数としてまとめます。
TYPE uDUT_ZSW : UNION ZSW:LINT; stZSW:DUT_ZSW; END_UNION END_TYPE |
DUT_ProfiDrive1_HMI_PB
HMIのコマンドです。
TYPE DUT_ProfiDrive1_HMI_PB : STRUCT bOFF1:BOOL; r32SpeedSetPoint:REAL; bDriveON:BOOL; bDriveOFF:BOOL; bReset:BOOL; END_STRUCT END_TYPE |
DUT_ProfiDrive1_HMI_PL
HMIの表示です。
TYPE DUT_ProfiDrive1_HMI_PL : STRUCT bFault :BOOL; bWarning :BOOL; bReady :BOOL; i64RawDataSTW :DUT_STW; i64RawData_NSOLL_A :LINT; i64RawDataZTW :DUT_ZSW; i64RawData_NIST_A :LINT; r32ActualSpeed :REAL; OPCUAStatus :OpcUaDeviceStatus; OPCUAControl :OpcUaDeviceControl; END_STRUCT END_TYPE |
DUT_ProfiDrive1_HMI
ProfiDrive1のHMI操作Groupです。
TYPE DUT_ProfiDrive1_HMI : STRUCT PB:DUT_ProfiDrive1_HMI_PB; PL:DUT_ProfiDrive1_HMI_PL; END_STRUCT END_TYPE |
DUT_OPCUA_Client
OPCUA ClientのStatusとControlデバイスです。
TYPE DUT_OPCUA_Client : STRUCT Status AT %I*:OpcUaDeviceStatus; Control AT %Q*:OpcUaDeviceControl; END_STRUCT END_TYPE |
HMI
こちらはHMIです。
TabでDriveやOPCUAの状態が見えます。
こちらのTabにはZSWが表示されます。
Tab3ではOPCUA Clientの状態を表示しています。
MAIN
VAR
PROGRAM MAIN VAR Drive1 :FB_ProfiDrvie1; Drive1Hmis :DUT_ProfiDrive1_HMI; bEnable :BOOL; r32ActSpeed :REAL; r32CmdSpeed :REAL; hmiMode :DUT_Mode; END_VAR |
PROGRAM
Drive1.RefSpeed:=3000.0; Drive1( iRefHMI:=Drive1Hmis ,iMode:=hmiMode ); r32ActSpeed:=Drive1.ActSpeed; Drive1.Run(); Drive1.Hmi(); |
Result
Source Code Download
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT%20Project_withSIMIT_Prodrive1.zip