前回はS71200からShared Deviceを使用しTelegram30を経由してS210のSTOをTriggeしました。今回はBeckhoff C6920からPLCOPEN ライブラリを使用しS210 Driveを動かしてみます。よろしくお願いします。
Thanks!
この記事が出来上がるのはベッコフ日本法人ベッコフオートメーション株式会社さまとMana Design worksさまから機材を貸してくださったおかけです。誠にありがとうございます。
ベッコフ日本法人ベッコフオートメーション株式会社
IPC6920-005はベッコフ日本法人ベッコフオートメーション株式会社さまが貸してくださったものです。Beckhoff Automationは1980 年会社設立、PCベースの制御技術をベースにしたオープンオートメーションシステム導入の先頭に立つドイツ企業です。
ベッコフ日本法人ベッコフオートメーション株式会社は、2011年に横浜に本社、2017年に名古屋オフィスを設立しました。
こちらはベッコフ日本法人ベッコフオートメーション株式会社様のホームページです。
どうぞよろしくお願いします。
https://www.beckhoff.com/ja-jp/
Mana Design Works
Siemens SINAMICS S210はMana Design Worksさまが貸してくださったものです。
Mana Design Worksは大阪に本社あるSiemensの正式なソリューション パートナーで、Siemens製のCPU・HMI・Drive・Motion Controller・SCADAから国産メーカまで常に最適な提案ができます。
こちらはMana Design Works 様のホームページです。
どうぞよろしくお願いします。
Video
English Version
Part3
Part2
Part1
Japanese Version
Part3
Part2
Part1
Reference Link
Japanese Version
English Version
Overview
TcMC2 TwinCAT Motion Control PLC LibraryはPLCOpenのMotion Control Function V2.0沿って作られ、TwinCATがそのライブラリ Supportするってことは異なるメーカでも、Motion制御のプログラムが共通化でき、開発コストが下がります。
Rules
MC Function Blocksを使用するときに様々なルールや決まり事があります。PLCプログラムを作成するときはそれらのことを考えながら作りましょう。
Output
Busy・Done・Error・CommandAbortedは同時にTrueすることがありません。ExecuteのInputがTrueになったら、その4つの中に必ず1つしかTrueになりません。
*もちろん例外があります。それはMC_Stopです。軸が停止したらDoneのOutputがTrueになります。ですが、BusyとActiveは軸がロックされてるせいでTrueのままになります。
そしてMC_StopのExecuteがFalseになったら、軸のUnlock、Busy、ActiveがFalseになります。
Done
MC_Blocksの”Done”・”InVelocity”・”InGear”・”InSync”はコマンド実行に成功すればTrueになります。
CommandAborted
“CommandAborted” は他のMC_BlocksよりJobが中断されたらTrueになります。
Busy
”Busy”出力は該当するMC_BlocksがActiveしてることを示しています。MC_Blocksが実行するには、Executeの立ち上げPulseとBusy出力がFalseになってるときのみです。
MC_Blocksが実行するとBusyがただちにTrueになり、該当するMC_Blocksが実行成功や失敗したらFalseに戻ります。
Active
ActiveはMC_Blocksが実行になるとTrueになります。
Initial Status
もし該当するMC_BlocksはAcriveしてないのであれば、Done・InGear・InVelocity・Errror・ErrorIDとCommandAbortedはすべてExecuteのたち下げにリセットされます。
もしExecuteがOne-Cycle内で一回以上Triggerされても、該当するMC_BlocksはFeedbacksはしませんし、なにも実行しません。Inputのパラメーターは立ち上げ時に検知で動作します。パラメーターを変更したいのであればコマンドは必ず再Triggerする必要があります。
そして、MC_Blocksが実行するときにInputパラメータが渡されてないのなら、最後に渡された値がMC_BlocksのInputパラメータになります。
Position and Distance
Positionは装置の中にあるサポーの居場所です。そしてDistanceは現在値から目的地まで”相対位置”です。例えば、Station1はPosition200にいます、そしてStation2はPosition1000にいます。そしてStation1からStationまでのDistanceは800になります。
Positionや距離の単位はSystemにより変わります。
Error Process
すべてのMC_Blocksには2つのError出力があります。
ErrorというOutputは該当するMC_Blocksがエラー発生してるかどうかを表示してます。
ErrorIDというOutputは該当するMC_Blocksのエラー番号を表示しています。
“Done”, “InVelocity”, “InGear” と “InSync” の出力はErrorがTrueである限りずっとFalseになります。
ErrorIDの詳細はManualを参考にしてください。
Error Type
注意するにはMC_Blocksは該当するBlcokのErrorだけで軸自体のものではありません(例えばパラメータエラー、通信エラーなど)。
Axis errors (logical NC axis)
実物の動きが問題ありエラーになること(例えばなにかぶつかったり)その場合は軸がMC_BlocksをErrorに切り替えます。軸エラーはMC_Resetによってリセットできます。
Drive errors (controller)
軸エラーによって発生したことがあります。このエラーはだいたいMC_Resetによってリセットできます。
EN and ENO
MC_Blocksを実行するには、”Execute”の立ち上がりPulseが必要ですが、その前”Enable”の信号が必要です。ST言語にはないですが、LAD/FBDには”EN”というInput パラメータがあり、そのENがTrueにならないと、そもそもMC_Blocksが実行しません。
そしてMC_BlocksにあるENOのENがTrueになる限り、ENOもTrueになります。
Flow
Function Block
Data type
AXIS_REF
AXIS_REFはAXISの情報が入っており、PLCとNCのInteterfaceだとイメージしやすいでしょう。MC Blockを使用するときは、AXIS_REFが不可欠です。
PlcToNc
PlcToNcはPLCとNCに周期的に交換するデータで、MC_Blocksを使用すればPLCからAxisにコマンドを送信できます。最後にProcess Outputは自動的にPLCからAxisに送信します。
NcToPLC
NcToPLCはPLCとNCに周期的に交換するデータで、中にAxisの現在値・速度・状態なども含まれ、このData StructureからAxisの情報を取得できます。
ADS
ADS Data StructureはADS Interface経由でAxisにアクセスするために必要なInterfaceを揃えています。
Status
Status Data StructureはAxisのProcess status 情報が格納せれ、注意するのはそのStatusは周期的に更新してないのようで、MC_ReadStatusか、AXIS_REFのReadStatus Propertyを呼び出し最新Statusを取得します。
Data type E_JogMode
MC_JOGMODE_STANDARD_SLOW | 標準パラメータを使用し、低速JOGする |
MC_JOGMODE_STANDARD_FAST | 標準パラメータを使用し、高速JOGする |
MC_JOGMODE_CONTINOUS | JOG Buttonを押し続ける限りダイナミクス速度でJOG する |
MC_JOGMODE_INCHING | JOGは壮相対位置を移動する |
MC_JOGMODE_INCHING_MODULO | JOGは壮相対位置を移動する |
Axis Function
MC_Power
MC_PowerはAxisにソフトウェアのEnable信号を送信します。Enableするときは正回転・逆回転両方ともOperate OKか、片方にするかどっちでもできます(Enable_Positive・Enable_Negative)。Statusの出力から該当するAxisの現在状態を確認できます。
それ以外に、OverrideというOptionから実際の出力を制限することも可能です。
もちろんMC_PowerできるのはソフトウェアEnableだけなので、実際それ以外もDriveのハードウエアEnable信号が必要です(そのあたりはDriveのメーカを参照してください)。
最後に、MC_PowerのStatus FeedbackはあくまでもPLC側のソフト制御状態を示すだけで、実際DriveにはデジタルのFeedabckだったり色々なPatternもあります。
\
VAR_INPUT
Variable Name | Data Type | Description |
Enable | Bool | AxisにSoftware Enableする |
Enable_Positive | Bool | True=正回転を有効する |
Enable_Negative | Bool | True=逆回転を有効する |
Override | LREAL | 最終速度の設定値、0から100%まで |
BufferMode | MC_BufferMode | Buffer Modeは軸がリセットされるときにTriggerします。Function Blockは軸がコマンドなしになるまで待ちます。 |
VAR_OUPUT
Variable Name | Data Type | Description |
Status | Bool | True=AxisはReady中 |
Busy | Bool | True=Function BlockはEnable=Trueの状態でCallされてる |
Active | Bool | True=コマンドは実行した |
Error | Bool | True=エラーあり |
ErrorID | UDINT | Error=Trueのときにエラー番号が出力されます。 |
VAR_INOUT
Variable Name | Data Type | Description |
Axis | AXIS_REF | System内にあるAxis Objectです。中に位置・速度・Statusなどがあります。 |
MC_Reset
このFunction Blockを使用すればAxisをリセットできます。Driveの種類によって別Resetの方法が異なることもありますので実際Manualを参照してください。
VAR_INPUT
Variable Name | Data Type | Description |
Execute | Bool | 立ち上げ信号でコマンドを実行します。 |
VAR_OUPUT
Variable Name | Data Type | Description |
Done | Bool | True=実行 |
Busy | Bool | True=Function BlockはEnable=Trueの状態でCallされてる |
Error | Bool | True=エラーあり |
ErrorID | UDINT | Error=Trueのときにエラー番号が出力されます。 |
VAR_INOUT
Variable Name | Data Type | Description |
Axis | AXIS_REF | System内にあるAxis Objectです。中に位置・速度・Statusなどがあります。 |
MC_ReadActualVelocity
このFunction Blockを使用すればAxisの現在速度を取得できます。
VAR_INPUT
Variable Name | Data Type | Description |
Enable | Bool | True=現在速度を取得する |
VAR_OUPUT
Variable Name | Data Type | Description |
Valid | Bool | True=ActualVelocityは有効値 |
Busy | Bool | True=Function BlockはEnable=Trueの状態でCallされてる |
Error | Bool | True=エラーあり |
ErrorID | UDINT | Error=Trueのときにエラー番号が出力されます。 |
ActualVelocity | LREAL | 軸の現在速度 |
VAR_INOUT
Variable Name | Data Type | Description |
Axis | AXIS_REF | System内にあるAxis Objectです。中に位置・速度・Statusなどがあります。 |
MC_ReadActualPosition
このFunction Blockを使用すればAxisの現在位置を取得できます。
VAR_INPUT
Variable Name | Data Type | Description |
Enable | Bool | True=現在位置を取得する |
VAR_OUPUT
Variable Name | Data Type | Description |
Valid | Bool | True=ActualVelocityは有効値 |
Busy | Bool | True=Function BlockはEnable=Trueの状態でCallされてる |
Error | Bool | True=エラーあり |
ErrorID | UDINT | Error=Trueのときにエラー番号が出力されます。 |
Position | LREAL | 軸の現在位置 |
VAR_INOUT
Variable Name | Data Type | Description |
Axis | AXIS_REF | System内にあるAxis Objectです。中に位置・速度・Statusなどがあります。 |
MC_ReadAxisError
このFunction Blockを使用すればAxisのエラー状態を取得できます。
VAR_INPUT
Variable Name | Data Type | Description |
Enable | Bool | True=現在エラー情報を取得する |
VAR_OUPUT
Variable Name | Data Type | Description |
Valid | Bool | True=AxisErrorIDは有効値 |
Busy | Bool | True=Function BlockはEnable=Trueの状態でCallされてる |
Error | Bool | True=エラーあり |
ErrorID | UDINT | Error=Trueのときにエラー番号が出力されます。 |
AxisErrorID | UDINT | AxisのErrorID |
VAR_INOUT
Variable Name | Data Type | Description |
Axis | AXIS_REF | System内にあるAxis Objectです。中に位置・速度・Statusなどがあります。 |
MC_ReadStatus
このFunction Blockを使用すればAxisの現在状態を取得できます。もちろんFunction BlockのOutputパラメタにはすでにAxisの基本状態をBit By Bitで出力されていますが、MC_ReadStatusではさらにAxis.Status axisの変数があり、Axisの状態を構造体をまとめて出力されています。
VAR_INPUT
Variable Name | Data Type | Description |
Enable | Bool | True=現在Axis情報を取得する |
VAR_OUPUT
Variable Name | Data Type | Description |
Valid | Bool | True=Function Blockの出力は有効値 |
Busy | Bool | True=Function BlockはEnable=Trueの状態でCallされてる |
Error | Bool | True=エラーあり |
ErrorID | UDINT | Error=Trueのときにエラー番号が出力されます。 |
ErrorStop | Bool | Axis状態、PlcOpen stateに参照 |
Disabled | Bool | Axis状態、PlcOpen stateに参照 |
Stopping | Bool | Axis状態、PlcOpen stateに参照 |
StandStill | Bool | Axis状態、PlcOpen stateに参照 |
DiscreteMotion | Bool | Axis状態、PlcOpen stateに参照 |
ContinousMotion | Bool | Axis状態、PlcOpen stateに参照 |
SynchronizedMotion | Bool | Axis状態、PlcOpen stateに参照 |
Homing | Bool | Axis状態、PlcOpen stateに参照 |
ConstantVelocity | Bool | Axisいま固定速度で移動中 |
Acceleration | Bool | Axis加速中 |
Decelerating | Bool | Axis減速中 |
Status | ST_AxisStatus | Axisの状態を構造体出力 |
VAR_INOUT
Variable Name | Data Type | Description |
Axis | AXIS_REF | System内にあるAxis Objectです。中に位置・速度・Statusなどがあります。 |
Point to point motion
MC_MoveAbsolute
MC_MoveAbsoluteを使用することにより、Axisをある”絶対”な位置に移動するコマンドを発行できます。Axisが目標値に到達するとDone=Trueでそれ以外にCommandAborted・errorになります。MC_MoveAbsoluteはLinear 軸でよく使用されます、その移動コマンドは同期されたSlave軸と同時に使用することも可能です。
VAR_INPUT
Variable Name | Data Type | Description |
Execute | Bool | 立ち上げ信号でコマンドを実行します。 |
Position | LREAL | 絶対位置決めの目標値 |
Velocity | LREAL | 最大移動速度 |
Acceleration | LREAL | 加速度、=0ならAxis Configurationの設定値になります。 |
Deceleration | LREAL | 減速度、=0ならAxis Configurationの設定値になります。 |
Jerk | LREAL | =0ならAxis Configurationの設定値になります。 |
BufferMode | ||
Options |
VAR_OUTPUT
Variable Name | Data Type | Description |
Done | Bool | True=Function Blockの出力は有効値 |
Busy | Bool | True=Function BlockはEnable=Trueの状態でCallされてる |
Active | Bool | True=Function Block実行中で、完了したらFalse |
CommandAborted | Bool | True=コマンドが中断された |
Error | Bool | True=エラーあり |
ErrorID | UDINT | Error=Trueのときにエラー番号が出力されます。 |
VAR_INOUT
Variable Name | Data Type | Description |
Axis | AXIS_REF | System内にあるAxis Objectです。中に位置・速度・Statusなどがあります。 |
MC_MoveRelative
MC_MoveRelativeを使用することにより、軸が相対位置決めを行います。例えば現在値が100だとしましょう。Distanceは250だと設定し、コマンドが実行完了したら100+250=350になります。もう一度実行すると350+250=600になります。
VAR_INPUT
Variable Name | Data Type | Description |
Execute | Bool | 立ち上げ信号でコマンドを実行します。 |
Distance | LREAL | 相対位置決めの目標値 |
Velocity | LREAL | 最大移動速度 |
Acceleration | LREAL | 加速度、=0ならAxis Configurationの設定値になります。 |
Deceleration | LREAL | 減速度、=0ならAxis Configurationの設定値になります。 |
Jerk | LREAL | =0ならAxis Configurationの設定値になります。 |
BufferMode | ||
Options |
VAR_OUTPUT
Variable Name | Data Type | Description |
Done | Bool | True=Function Blockの出力は有効値 |
Busy | Bool | True=Function BlockはEnable=Trueの状態でCallされてる |
Active | Bool | True=Function Block実行中で、完了したらFalse |
CommandAborted | Bool | True=コマンドが中断された |
Error | Bool | True=エラーあり |
ErrorID | UDINT | Error=Trueのときにエラー番号が出力されます。 |
VAR_INOUT
Variable Name | Data Type | Description |
Axis | AXIS_REF | System内にあるAxis Objectです。中に位置・速度・Statusなどがあります。 |
Manual motion
MC_Jog
MC_Jog を使用することにより軸をJog動作できます。正回転や逆回転はJogForwardやJogBackwardsのInputパラメータで制御し、PositionもJogの動作距離を設定可能です。
VAR_INPUT
Variable Name | Data Type | Description |
JogForward | Bool | 立ち上げで実行、軸は正回転し、信号がFalseになるまで回転し続けます。JogForwardとJogBackwards同時Trueの場合はJogForwardが優先されます。 |
JogBackwards | Bool | 立ち上げで実行、軸は逆回転し、信号がFalseになるまで回転し続けます。JogForwardとJogBackwards同時Trueの場合はJogForwardが優先されます。 |
Mode | E_JogMode | |
Position | LREAL | MC_JOGMODE_INCHING が使用するときの移動量 |
Velocity | LREAL | 軸の移動速度 |
Acceleration | LREAL | 加速度、=0ならAxis Configurationの設定値になります。 |
Deceleration | LREAL | 減速度、=0ならAxis Configurationの設定値になります。 |
Jerk | LREAL | =0ならAxis Configurationの設定値になります。 |
.
VAR_OUTPUT
Variable Name | Data Type | Description |
Done | Bool | True=Function Blockの出力は有効値 |
Busy | Bool | True=Function BlockはEnable=Trueの状態でCallされてる |
Active | Bool | True=Function Block実行中で、完了したらFalse |
CommandAborted | Bool | True=コマンドが中断された |
Error | Bool | True=エラーあり |
ErrorID | UDINT | Error=Trueのときにエラー番号が出力されます。 |
VAR_INOUT
Variable Name | Data Type | Description |
Axis | AXIS_REF | System内にあるAxis Objectです。中に位置・速度・Statusなどがあります。 |
Implementation
Add Library
Tc2_MC2とTc2_MC2_DriveをReferenceに追加してください。
Program
Data Type
eDUT_Mode
enumの構造体を作成します。今回の記事で使用する自動Modeと手動Modeにあります。
{attribute ‘qualified_only’} {attribute ‘strict’} TYPE eDUT_Mode : ( Auto := 1 ,Manual:=2 ); END_TYPE |
DUT_MC_Commands_Paras
絶対位置決め・相対位置決めに必要な基本のパラメータ、移動量と速度を定義します。
TYPE DUT_MC_Commands_Paras : STRUCT Position :LREAL; Velocity :LREAL; END_STRUCT END_TYPE |
DUT_S210_HMI_PL
次はSiemens S210 ServoをHMIから表示するようなデバイスを定義します。
TYPE DUT_S210_HMI_PL : STRUCT Status :ST_AxisStatus; ActualPosition :LREAL; ActualVelocity :LREAL; ActualStation :DINT; Status_MC_Power :UDINT; Status_MC_Reset :UDINT; Status_MC_Jog :UDINT; Status_MC_Abs :UDINT; Status_MC_Rel :UDINT; ActualStationColors :ARRAY[1..9]OF BOOL; END_STRUCT END_TYPE |
DUT_S210_HMI_PB
こちらはHMIからS210 Driveを操作するための変数です。
TYPE DUT_S210_HMI_PB : STRUCT bReset :BOOL; bStart2Abs :BOOL; bStart2Rel :BOOL; bJogFw :BOOL; bJogBw :BOOL; bHome :BOOL; PosTable :ARRAY[0..9]OF LREAL; StationCmd :DINT; AbsVelocity :LREAL; RelVelocity :LREAL; RelDistance :LREAL; JogVelocity :LREAL; END_STRUCT END_TYPE |
DUT_S210_HMI
ServoDriveName・そして先程定義したS210を操作するDUT_S210_HMI_PBと現在状態を表示するDUT_S210_HMI_PLも3つの構造体をまとめます。
TYPE DUT_S210_HMI : STRUCT ServoDriveName :STRING(30); PB:DUT_S210_HMI_PB; PL:DUT_S210_HMI_PL; END_STRUCT END_TYPE |
GVL
GVLでそのS210のHMI関連変数を定義します。
{attribute ‘qualified_only’} VAR_GLOBAL RETAIN Hmis :DUT_S210_HMI; END_VAR |
Function Block
FB_PNController_Status
こちらのFBはProfinet Controllerの状態をProcess IOと紐付け・正常状態を取得します。
FUNCTION_BLOCK FB_PNController_Status VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR _DevState AT %I* :UINT; _PnIoError AT %I* :UINT; _PnIoDiag AT %I* :UINT; END_VAR |
PROPERTY DevState : UINT
こちらのPropertyはDevstateを取得します。
DevState:=_DevState; |
PROPERTY PnIoDiag : UINT
こちらのPropertyPNIO Controllerの診断情報を取得します。
PnIoDiag:=_PnIoDiag; |
PROPERTY PnIoError : UINT
PnIoError:=_PnIoError; |
こちらのPropertyはPNIO Controllerがエラーであるかを取得します。
PROPERTY PUBLIC Ready : Bool
TwinCAT Profinet Controllerの正常状態をDevState・PnIoDiag・PnIoError3つの変数も0ならTrueが戻ります。
Ready:= DevState =0 AND PnIoDiag =0 AND PnIoError=0; |
FB_PnDevices_Status
こちらのFunction BlockはProfinet DeviceのProcess IOと紐付けられます。今回の記事ではSiemensのS210 Servo Drvieに相当します。
FUNCTION_BLOCK FB_PnDevices_Status VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR _PnIoBoxState AT %I*:UINT; _PnIOBoxDiag AT %i*:UINT; END_VAR |
PROPERTY PnIoBoxDiag : uint
こちらのPropertyはProfinet Devicesの接続情報を取得できます。
PnIoBoxDiag:=_PnIOBoxDiag; |
PROPERTY PnIoBoxState : uint
こちらのPropertyはProfinet Devicesの診断情報を取得できます。
PnIoBoxState:=_PnIoBoxState; |
PROPERTY Ready : Bool
TwinCAT Profinet Devicesの正常状態PnIoBoxDiag・PnIoBoxState 2つの変数も0ならTrueが戻ります。
Ready:=PnIoBoxDiag = 2 AND PnIoBoxState =0; |
FB_Servo
こちらのFunction BlockはServoのMethod・Property・必要な変数を定義します。一回定義しておけば、次は別のFunction BlockからこちらのFB_Servoを拡張すればよいです。
FUNCTION_BLOCK FB_Servo VAR_INPUT iPNComOK :BOOL; iEnable :BOOL; END_VAR VAR_OUTPUT END_VAR VAR _Axis :AXIS_REF; END_VAR //MC_Objects VAR MC_Power :MC_Power; MC_Reset :MC_Reset; MC_Jog :MC_Jog; MC_MoveAbsolute :MC_MoveAbsolute; MC_ReadActualVelocity :MC_ReadActualVelocity; MC_ReadActualPosition :MC_ReadActualPosition; MC_ReadStatus :MC_ReadStatus; MC_ReadAxisError :MC_ReadAxisError; MC_MoveRelative :MC_MoveRelative; MC_Home :MC_Home; END_VAR |
PROPERTY ActualPosition : LReal
こちらのPropertyはMC_ReadActualPosition Function Blockを使用しAxisの現在位置を取得します。もしエラーの場合は-9999.9を返します。
MC_ReadActualPosition( Axis:=_Axis ,Enable:=iPNComOK ); IF MC_ReadActualPosition.Valid AND NOT MC_ReadActualPosition.Error THEN ActualPosition:=MC_ReadActualPosition.Position; END_IF IF MC_ReadActualPosition.Error THEN ActualPosition:=-99999.9; END_IF |
PROPERTY ActualVelocity : LReal
こちらのPropertyはMC_ReadActualVelocity Function Blockを使用しAxisの現在速度を取得します。もしエラーの場合は-9999.9を返します。
MC_ReadActualVelocity( Axis:=_Axis ,Enable:=iPNComOK ); IF MC_ReadActualVelocity.Valid AND NOT MC_ReadActualVelocity.Error THEN ActualVelocity:=MC_ReadActualVelocity.ActualVelocity; END_IF IF MC_ReadActualVelocity.Error THEN ActualVelocity:=-99999.9; END_IF |
PROPERTY AxisError : UDINT
こちらのPropertyはMC_ReadAxisError Function Blockを使用しAxisの現在状態を取得します。もしエラーの場合はMC_ReadAxisErrorのErrorIDそのままを返します。
MC_ReadAxisError( Axis:=_Axis ,Enable:=iPNComOK ); IF MC_ReadAxisError.Valid AND NOT MC_ReadAxisError.Error THEN AxisError:=0; END_IF IF MC_ReadAxisError.Error THEN AxisError:=MC_ReadAxisError.AxisErrorID; END_IF |
METHOD CmdAllow2Execute : BOOL
こちらのMethodはコマンドの実行Interlockになります、必要なパラメータはiEnableとiPNCOMokです。iPNCOMokはProfinet通信OKの信号になります。
METHOD CmdAllow2Execute : BOOL VAR_INPUT END_VAR CmdAllow2Execute:=iEnable AND iPNComOK ; |
METHOD DriveAbsolutePositioning : UDINT
こちらのMethodは絶対位置決めコマンドを発行します。Return値は、
2=実行始まりる
3=実行中
1=実行成功
METHOD DriveAbsolutePositioning : UDINT VAR_INPUT Execute :BOOL; Parameters :DUT_MC_Commands_Paras; END_VAR VAR_INST R_TRIG :R_TRIG; END_VAR MC_MoveAbsolute( Axis:=_Axis ,Execute:=Execute AND CmdAllow2Execute() AND MotionJobAllow2Execute() ,Position:=Parameters.Position ,Velocity:=Parameters.Velocity ); R_TRIG(CLK:=MC_MoveAbsolute.Execute); IF R_TRIG.Q THEN DriveAbsolutePositioning:=2; END_IF; IF MC_MoveAbsolute.Busy THEN DriveAbsolutePositioning:=3; END_IF IF MC_MoveAbsolute.Done THEN DriveAbsolutePositioning:=1; END_IF |
METHOD DriveHome : UDINT
こちらのFunction BlockはMC_Homeを使用しHome コマンドを発行します。
2=実行始まりる
3=実行中
1=実行成功
Function BlockエラーならMC_HomeのErrorIDを返します。
METHOD DriveHome : UDINT VAR_INPUT Execute :BOOL; END_VAR VAR_INST R_TRIG :R_TRIG; END_VAR MC_Home( Axis:=_Axis ,Execute:=Execute AND CmdAllow2Execute() ,Position:=0.0 ,HomingMode:=MC_HomingMode.MC_Direct ); R_TRIG(CLK:=MC_Home.Execute); IF R_TRIG.Q THEN DriveHome:=2; END_IF IF MC_Home.Busy THEN DriveHome:=3; END_IF IF MC_Home.Done THEN DriveHome:=1; END_IF IF MC_Home.Error THEN DriveHome:=MC_Home.ErrorID; END_IF |
METHOD DriveJog : UDINT
こちらのFunction BlockはMC_Jogを使用しJogコマンドを発行します。Return値は、
1=実行、
Function BlockエラーならMC_JogのErrorIDを返します。
METHOD DriveJog : UDINT VAR_INPUT JogForward,JogBackwards :BOOL; Parameters :DUT_MC_Commands_Paras; END_VAR DriveJog:=0; MC_Jog( Axis:=_Axis ,JogForward:=JogForward AND NOT JogBackwards AND CmdAllow2Execute() ,JogBackwards:=JogBackwards AND NOT JogForward AND CmdAllow2Execute() ,Velocity:=Parameters.Velocity ); IF MC_Jog.Active AND NOT MC_Jog.Error THEN DriveJog:=1; END_IF IF MC_Jog.Error THEN DriveJog:=MC_Jog.ErrorID; END_IF |
METHOD DriveRelateivePostioning : UDINT
こちらのFunction BlockはMC_MoveRelativeを使用し相対位置決めコマンドを発行します。
2=実行始まりる
3=実行中
1=実行成功
Function BlockエラーならMC_MoveRelativeのErrorIDを返します。
METHOD DriveRelateivePostioning : UDINT VAR_INPUT Execute :BOOL; Parameters :DUT_MC_Commands_Paras; END_VAR VAR_INST R_TRIG :R_TRIG; END_VAR MC_MoveRelative( Axis:=_Axis ,Execute:=Execute AND CmdAllow2Execute() AND MotionJobAllow2Execute() ,Distance:=Parameters.Position ,Velocity:=Parameters.Velocity ); R_TRIG(CLK:=MC_MoveRelative.Execute); IF R_TRIG.Q THEN DriveRelateivePostioning:=2; END_IF; IF MC_MoveRelative.Busy THEN DriveRelateivePostioning:=3; END_IF IF MC_MoveRelative.Done THEN DriveRelateivePostioning:=1; END_IF IF MC_MoveRelative.Error THEN DriveRelateivePostioning:=MC_MoveRelative.ErrorID; END_IF |
METHOD Enable : UDINT
こちらのFunction BlockはMC_Powerを使用し、Servo ONコマンドを発行します。
1=実行成功で、
Function BlockエラーならMC_PowerのErrorIDを返します。
METHOD Enable : UDINT VAR_INPUT Execute :BOOL; END_VAR VAR_INST R_TRIG :R_TRIG; END_VAR Enable:=0; MC_Power( Axis:=_Axis ,Enable:=Execute AND CmdAllow2Execute() ,Enable_Positive:=TRUE ,Enable_Negative:=TRUE ,Override:=100.0 ); IF MC_Power.Active AND MC_Power.Status AND NOT MC_Power.Error THEN Enable:=16#1; END_IF; IF MC_Power.Error THEN Enable:=MC_Power.ErrorID; END_IF |
METHOD MotionJobAllow2Execute : BOOL
こちらのMethodからAxisの移動コマンドのInterlockを取得します。
METHOD MotionJobAllow2Execute : BOOL VAR_INPUT END_VAR VAR Status:ST_AxisStatus; END_VAR Status:=ReadStatus(TRUE); MotionJobAllow2Execute:=Status.NotMoving AND Status.Operational AND NOT Status.HasJob; |
METHOD ReadStatus : ST_AxisStatus
こちらのMethodはMC_ReadStatusを使用しAxisの状態を取得します。
METHOD ReadStatus : ST_AxisStatus VAR_INPUT Enable :BOOL; END_VAR MC_ReadStatus( Axis:=_Axis ,Enable:=Enable AND iPNComOK ); IF MC_ReadStatus.Valid THEN ReadStatus:=MC_ReadStatus.Status; END_IF |
METHOD Reset : UDINT
こちらのMethodはMC_Resetを使用しAxisをリセットします。
1=Reset成功で、
Function BlockエラーならMC_ResetのErrorIDを返します。
METHOD Reset : UDINT VAR_INPUT Execute :BOOL; END_VAR VAR_INST R_TRIG :R_TRIG; END_VAR MC_Reset( Axis:=_Axis ,Execute:=Execute AND CmdAllow2Execute() ); R_TRIG(CLK:=MC_Reset.Execute); IF R_TRIG.Q THEN Reset:=0; END_IF; IF MC_Reset.Done THEN Reset:=16#1; ELSIF MC_Reset.Error THEN Reset:=MC_Reset.ErrorID; END_IF |
FB_MyS210
こちらのFBはS210を制御するFunction Blockです。先程定義したFB_Servoから拡張します。Axisのリセット>Enable>パラメータ初期化>Jog Operation>絶対位置決め>相対位置決めのプログラムを作成しました。
FUNCTION_BLOCK FB_MyS210 EXTENDS FB_Servo VAR_INPUT bServoON :BOOL; bReset :BOOL; bAutoAbsCmd :BOOL; iAutoStationCmd :UDINT; Mode :eDUT_Mode; bILJog :BOOL; bILAbs,bILRel :BOOL; END_VAR VAR_OUTPUT qActualStation :UDINT; qActualVelocity :LREAL; qActualPosition :LREAL; qStatus :ST_AxisStatus; END_VAR VAR_IN_OUT Hmis :DUT_S210_HMI; END_VAR VAR RelateiveParameters :DUT_MC_Commands_Paras; AbssoluteParameters :DUT_MC_Commands_Paras; JogParameters :DUT_MC_Commands_Paras; Status :ST_AxisStatus; AbsCmdBackup :UDINT; AbsManualCmd :UDINT; AbsManualExe :BOOL; AbsReturnValue :UDINT; AbsAutoCmd :UDINT; i :INT; TON :TON; END_VAR //Reset Reset(Execute:=bReset); //Enable Enable(Execute:=bServoON); //Parameters RelateiveParameters.Position:=Hmis.PB.RelDistance; RelateiveParameters.Velocity:=Hmis.PB.RelVelocity; AbssoluteParameters.Velocity:=Hmis.PB.AbsVelocity; JogParameters.Velocity:=Hmis.PB.JogVelocity; //ReadStatus Status:=ReadStatus(TRUE); IF Mode = eDUT_Mode.Manual THEN AbsAutoCmd:=0; DriveJog( JogBackwards:=Hmis.PB.bJogBw AND NOT Hmis.PB.bJogFw AND bILJog ,JogForward:=Hmis.PB.bJogFw AND NOT Hmis.PB.bJogBw AND bILJog ,Parameters:=JogParameters ); AbsManualExe:=Hmis.PB.bStart2Abs AND bILAbs AND NOT status.HasJob; IF AbsManualExe THEN IF Hmis.PB.StationCmd <> 0 AND Hmis.PB.StationCmd <> AbsCmdBackup THEN AbssoluteParameters.Position:= Hmis.PB.PosTable[Hmis.PB.StationCmd]; AbsCmdBackup:=Hmis.PB.StationCmd; AbsManualCmd:=Hmis.PB.StationCmd; END_IF; END_IF; DriveHome( Execute:=Hmis.PB.bHome AND NOT status.HasJob ); END_IF; IF Mode = eDUT_Mode.Auto THEN HmiCmdReset(); IF iAutoStationCmd <> 0 AND bILAbs AND NOT status.HasJob THEN AbssoluteParameters.Position:= Hmis.PB.PosTable[iAutoStationCmd]; AbsCmdBackup:=iAutoStationCmd; AbsAutoCmd:=iAutoStationCmd; END_IF END_IF AbsReturnValue:=DriveAbsolutePositioning( Execute:=AbsManualCmd <> 0 OR AbsAutoCmd <>0 ,Parameters:=AbssoluteParameters ); DriveRelateivePostioning( Execute:=Hmis.PB.bStart2Rel AND bILRel AND NOT Status.HasJob ,Parameters:=RelateiveParameters ); TON(IN:=Status.InTargetPosition,PT:=T#0.1S); IF Status.Moving THEN Hmis.PL.ActualStation:=0; END_IF IF AbsManualCmd <>0 OR AbsAutoCmd <>0 THEN IF TON.Q AND AbsReturnValue = 1 THEN IF AbsManualCmd <> 0 THEN Hmis.PL.ActualStation:=AbsManualCmd; AbsManualCmd:=0; Hmis.PB.StationCmd:=0; END_IF; IF AbsAutoCmd <> 0 THEN Hmis.PL.ActualStation:=AbsAutoCmd; AbsAutoCmd:=0; END_IF END_IF; IF AbsReturnValue >100 THEN AbsManualCmd:=0; AbsAutoCmd:=0; Hmis.PB.StationCmd:=0; END_IF END_IF; FOR i:=0 TO 9 DO Hmis.PL.ActualStationColors[i]:=FALSE; END_FOR Hmis.PL.ActualStationColors[Hmis.PL.ActualStation]:=TRUE; OutputFlash(TRUE); Hmis.PL.ActualPosition:=ActualPosition; Hmis.PL.ActualVelocity:=ActualVelocity; Hmis.PL.Status:=Status; |
METHOD HmiCmdReset : BOOL
こちらのMethodはHmiのコマンドをリセットします。
METHOD HmiCmdReset : BOOL Hmis.PB.bJogBw:=FALSE; Hmis.PB.bJogFw:=FALSE; Hmis.PB.bStart2Abs:=FALSE; Hmis.PB.bStart2Rel:=FALSE; Hmis.PB.StationCmd:=0; |
METHOD OutputFlash : BOOL
こちらのMethodは出力状態を更新します。
METHOD OutputFlash : BOOL VAR_INPUT Flash:BOOL; END_VAR qActualPosition:=ActualPosition; qActualStation:=Hmis.PL.ActualStation; qActualVelocity:=Hmis.PL.ActualVelocity; qStatus:=Hmis.PL.Status; |
MAIN
最後はMainプログラムですね。AXIS_REF・FB_PNController_Status・FB_PnDevices_StatusとFB_MyS210のInstanceなどを定義し、最後はAuto・Manualの動作を作成するだけです。
PROGRAM MAIN VAR Axis :AXIS_REF; PowerOn,Reset :BOOL; END_VAR VAR PNController :FB_PNController_Status; PNDevices_S210 :FB_PnDevices_Status; S210 :FB_MyS210; Mode :eDUT_Mode; autocmd:BOOL; autosst :DINT; istep:DINT; TON :TON; END_VAR IF Mode=eDUT_Mode.Auto THEN CASE istep OF 0: TON(IN:=TRUE,PT:=T#1S); IF TON.Q THEN istep:=10; TON(in:=False); END_IF 10: autosst:=1; IF S210.qActualStation = 1 THEN istep:=15; autosst:=0; END_IF 15: TON(in:=TRUE,PT:=T#1S); IF TON.Q THEN TON(in:=FALSE); istep:=20; END_IF; 20: autosst:=2; IF S210.qActualStation = 2 THEN istep:=0; autosst:=0; END_IF END_CASE ELSE istep:=0; END_IF S210( iPNComOK:=PNController.Ready AND PNDevices_S210.Ready ,iEnable:=TRUE ,bServoON:=PowerOn ,bReset:=Reset ,Mode:=Mode ,bILAbs:=TRUE ,bILJog:=TRUE ,bILAbs:=TRUE ,bAutoAbsCmd:=autocmd ,iAutoStationCmd:=autosst ,Hmis:=GVL.Hmis ); |
Configuration
AxisをPLC ProgramのAXIS_REFとLinkします。
Settings Tab>Link to PLCでPLC ProgramのAXIS_REFと紐つけましょう。
位置決めにTargetPosition到達したときのFlagを取得したいならParameters TabからPosition Range MonitorとTarget Positio Monitoringの設定をTrueにしてください。
Screen
いよいよ画面を作ります。今回のS210 Drive1つだけですが、複数の場合は画面の部品をCOPY>貼り付け>HMIの変数を変更も問題ありませんが、手間かかりますし、画面変更あれば全部一つずつ変えないといけないので効率悪いです。今回はその手間をかからない手法、構造化画面の作り方を紹介します。
Faceplate_DUT_S210_HMI
まずScreenを作成、Interface Editorのところに実はVAR_IN_OUTのエリアがあると分かりますか。これでINOUTパラメータを定義できます。今回はS210のHMI操作や表示が目的なので、DUT_S210_HMIを宣言します。
次は表示やButtonなどを配置し画面を作りましょう。
Text Variableのところに直接PLC変数より、hmis.PB.RelVelocityのようにINOUTパラメータに割り付けます。
Main Screen
構造化画面の作成が終わったら次はその画面をMain Screenに追加します。Toolbox>Current Projectで先程作成したFaceplate_DUT_S210_HMIがありますね。
そのままMain Screenにひっばります。
次はPLCの変数と紐つけます。
今回は最初に定義したGVLs>GVL>Hmisを選びましょう。
Download Source File
https://github.com/soup01Threes/TwinCAT3/blob/main/Beckhoff%20TwinCAT%20S210_Part3.tnzip