Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part3

前回は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 様のホームページです。

どうぞよろしくお願いします。

https://mndw.jp/

Video

English Version

Part3

Part2

Part1

Japanese Version

Part3

Part2

Part1

Reference Link

Japanese Version

Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part2
Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part1

English Version

Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part2
Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part1

Overview

TcMC2 TwinCAT Motion Control PLC LibraryはPLCOpenのMotion Control Function V2.0沿って作られ、TwinCATがそのライブラリ Supportするってことは異なるメーカでも、Motion制御のプログラムが共通化でき、開発コストが下がります。

(www.PLCopen.org).

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_CONTINOUSJOG Buttonを押し続ける限りダイナミクス速度でJOG する
MC_JOGMODE_INCHINGJOGは壮相対位置を移動する
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 NameData TypeDescription
EnableBoolAxisにSoftware Enableする
Enable_PositiveBoolTrue=正回転を有効する
Enable_NegativeBoolTrue=逆回転を有効する
OverrideLREAL最終速度の設定値、0から100%まで
BufferModeMC_BufferModeBuffer Modeは軸がリセットされるときにTriggerします。Function Blockは軸がコマンドなしになるまで待ちます。

VAR_OUPUT

Variable NameData TypeDescription
StatusBoolTrue=AxisはReady中
BusyBoolTrue=Function BlockはEnable=Trueの状態でCallされてる
ActiveBoolTrue=コマンドは実行した
ErrorBoolTrue=エラーあり
ErrorIDUDINTError=Trueのときにエラー番号が出力されます。

VAR_INOUT

Variable NameData TypeDescription
AxisAXIS_REFSystem内にあるAxis Objectです。中に位置・速度・Statusなどがあります。

MC_Reset

このFunction Blockを使用すればAxisをリセットできます。Driveの種類によって別Resetの方法が異なることもありますので実際Manualを参照してください。

VAR_INPUT

Variable NameData TypeDescription
ExecuteBool立ち上げ信号でコマンドを実行します。

VAR_OUPUT

Variable NameData TypeDescription
DoneBoolTrue=実行
BusyBoolTrue=Function BlockはEnable=Trueの状態でCallされてる
ErrorBoolTrue=エラーあり
ErrorIDUDINTError=Trueのときにエラー番号が出力されます。

VAR_INOUT

Variable NameData TypeDescription
AxisAXIS_REFSystem内にあるAxis Objectです。中に位置・速度・Statusなどがあります。

MC_ReadActualVelocity

このFunction Blockを使用すればAxisの現在速度を取得できます。

VAR_INPUT

Variable NameData TypeDescription
EnableBoolTrue=現在速度を取得する

VAR_OUPUT

Variable NameData TypeDescription
ValidBoolTrue=ActualVelocityは有効値
BusyBoolTrue=Function BlockはEnable=Trueの状態でCallされてる
ErrorBoolTrue=エラーあり
ErrorIDUDINTError=Trueのときにエラー番号が出力されます。
ActualVelocityLREAL軸の現在速度

VAR_INOUT

Variable NameData TypeDescription
AxisAXIS_REFSystem内にあるAxis Objectです。中に位置・速度・Statusなどがあります。

MC_ReadActualPosition

このFunction Blockを使用すればAxisの現在位置を取得できます。

VAR_INPUT

Variable NameData TypeDescription
EnableBoolTrue=現在位置を取得する

VAR_OUPUT

Variable NameData TypeDescription
ValidBoolTrue=ActualVelocityは有効値
BusyBoolTrue=Function BlockはEnable=Trueの状態でCallされてる
ErrorBoolTrue=エラーあり
ErrorIDUDINTError=Trueのときにエラー番号が出力されます。
PositionLREAL軸の現在位置

VAR_INOUT

Variable NameData TypeDescription
AxisAXIS_REFSystem内にあるAxis Objectです。中に位置・速度・Statusなどがあります。

MC_ReadAxisError

このFunction Blockを使用すればAxisのエラー状態を取得できます。

VAR_INPUT

Variable NameData TypeDescription
EnableBoolTrue=現在エラー情報を取得する

VAR_OUPUT

Variable NameData TypeDescription
ValidBoolTrue=AxisErrorIDは有効値
BusyBoolTrue=Function BlockはEnable=Trueの状態でCallされてる
ErrorBoolTrue=エラーあり
ErrorIDUDINTError=Trueのときにエラー番号が出力されます。
AxisErrorIDUDINTAxisのErrorID

VAR_INOUT

Variable NameData TypeDescription
AxisAXIS_REFSystem内にあるAxis Objectです。中に位置・速度・Statusなどがあります。

MC_ReadStatus

このFunction Blockを使用すればAxisの現在状態を取得できます。もちろんFunction BlockのOutputパラメタにはすでにAxisの基本状態をBit By Bitで出力されていますが、MC_ReadStatusではさらにAxis.Status axisの変数があり、Axisの状態を構造体をまとめて出力されています。

VAR_INPUT

Variable NameData TypeDescription
EnableBoolTrue=現在Axis情報を取得する

VAR_OUPUT

Variable NameData TypeDescription
ValidBoolTrue=Function Blockの出力は有効値
BusyBoolTrue=Function BlockはEnable=Trueの状態でCallされてる
ErrorBoolTrue=エラーあり
ErrorIDUDINTError=Trueのときにエラー番号が出力されます。
ErrorStopBoolAxis状態、PlcOpen stateに参照
DisabledBoolAxis状態、PlcOpen stateに参照
StoppingBoolAxis状態、PlcOpen stateに参照
StandStillBoolAxis状態、PlcOpen stateに参照
DiscreteMotionBoolAxis状態、PlcOpen stateに参照
ContinousMotionBoolAxis状態、PlcOpen stateに参照
SynchronizedMotionBoolAxis状態、PlcOpen stateに参照
HomingBoolAxis状態、PlcOpen stateに参照
ConstantVelocityBoolAxisいま固定速度で移動中
AccelerationBoolAxis加速中
DeceleratingBoolAxis減速中
StatusST_AxisStatusAxisの状態を構造体出力

VAR_INOUT

Variable NameData TypeDescription
AxisAXIS_REFSystem内にあるAxis Objectです。中に位置・速度・Statusなどがあります。

Point to point motion

MC_MoveAbsolute

MC_MoveAbsoluteを使用することにより、Axisをある”絶対”な位置に移動するコマンドを発行できます。Axisが目標値に到達するとDone=Trueでそれ以外にCommandAborted・errorになります。MC_MoveAbsoluteはLinear 軸でよく使用されます、その移動コマンドは同期されたSlave軸と同時に使用することも可能です。

VAR_INPUT

Variable NameData TypeDescription
ExecuteBool立ち上げ信号でコマンドを実行します。
PositionLREAL絶対位置決めの目標値
VelocityLREAL最大移動速度
AccelerationLREAL加速度、=0ならAxis Configurationの設定値になります。
DecelerationLREAL減速度、=0ならAxis Configurationの設定値になります。
JerkLREAL=0ならAxis Configurationの設定値になります。
BufferMode
Options

VAR_OUTPUT

Variable NameData TypeDescription
DoneBoolTrue=Function Blockの出力は有効値
BusyBoolTrue=Function BlockはEnable=Trueの状態でCallされてる
ActiveBoolTrue=Function Block実行中で、完了したらFalse
CommandAbortedBoolTrue=コマンドが中断された
ErrorBoolTrue=エラーあり
ErrorIDUDINTError=Trueのときにエラー番号が出力されます。

VAR_INOUT

Variable NameData TypeDescription
AxisAXIS_REFSystem内にあるAxis Objectです。中に位置・速度・Statusなどがあります。

MC_MoveRelative

MC_MoveRelativeを使用することにより、軸が相対位置決めを行います。例えば現在値が100だとしましょう。Distanceは250だと設定し、コマンドが実行完了したら100+250=350になります。もう一度実行すると350+250=600になります。

VAR_INPUT

Variable NameData TypeDescription
ExecuteBool立ち上げ信号でコマンドを実行します。
DistanceLREAL相対位置決めの目標値
VelocityLREAL最大移動速度
AccelerationLREAL加速度、=0ならAxis Configurationの設定値になります。
DecelerationLREAL減速度、=0ならAxis Configurationの設定値になります。
JerkLREAL=0ならAxis Configurationの設定値になります。
BufferMode
Options

VAR_OUTPUT

Variable NameData TypeDescription
DoneBoolTrue=Function Blockの出力は有効値
BusyBoolTrue=Function BlockはEnable=Trueの状態でCallされてる
ActiveBoolTrue=Function Block実行中で、完了したらFalse
CommandAbortedBoolTrue=コマンドが中断された
ErrorBoolTrue=エラーあり
ErrorIDUDINTError=Trueのときにエラー番号が出力されます。

VAR_INOUT

Variable NameData TypeDescription
AxisAXIS_REFSystem内にあるAxis Objectです。中に位置・速度・Statusなどがあります。

Manual motion

MC_Jog

MC_Jog を使用することにより軸をJog動作できます。正回転や逆回転はJogForwardやJogBackwardsのInputパラメータで制御し、PositionもJogの動作距離を設定可能です。

VAR_INPUT

Variable NameData TypeDescription
JogForwardBool立ち上げで実行、軸は正回転し、信号がFalseになるまで回転し続けます。JogForwardとJogBackwards同時Trueの場合はJogForwardが優先されます。
JogBackwardsBool立ち上げで実行、軸は逆回転し、信号がFalseになるまで回転し続けます。JogForwardとJogBackwards同時Trueの場合はJogForwardが優先されます。
ModeE_JogMode
PositionLREALMC_JOGMODE_INCHING が使用するときの移動量
VelocityLREAL軸の移動速度
AccelerationLREAL加速度、=0ならAxis Configurationの設定値になります。
DecelerationLREAL減速度、=0ならAxis Configurationの設定値になります。
JerkLREAL=0ならAxis Configurationの設定値になります。

.

VAR_OUTPUT

Variable NameData TypeDescription
DoneBoolTrue=Function Blockの出力は有効値
BusyBoolTrue=Function BlockはEnable=Trueの状態でCallされてる
ActiveBoolTrue=Function Block実行中で、完了したらFalse
CommandAbortedBoolTrue=コマンドが中断された
ErrorBoolTrue=エラーあり
ErrorIDUDINTError=Trueのときにエラー番号が出力されます。

VAR_INOUT

Variable NameData TypeDescription
AxisAXIS_REFSystem内にある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

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

シェアする

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

フォローする