TwinCAT3でプログラムを書くときに使えるファンクションブロックを利用する方法は、三つあります。
- MAINにST言語で記述
- POUのMAINの下にアクションを追加し、ファンクションブロックダイアグラムを利用する
- MAINのPOUと同じレベルにPOUを追加し、ファンクションブロックダイアグラムを利用する
プログラムを記述するのは、PLCの項目です。
モータを動かすのはMOTIONの項目です。入出力はI/Oの中のドライブ4(EPOS4)に情報が入っています。
MAINにST言語でファンクションブロックを記述
軸関係の設定
スキャンで検出されたBLDCコントローラのEPOS4は、MOTIONの軸の項目に表示されます。軸1という名称がデフォルトで割り当てられますが、プログラミングでは使えないのでAX1と変更しました。
EPOS4特有の設定をします。パラメータ・タブのその他の設定の中にあるデッドタイム補正を、デフォルトの0から6msに変更します。
AX1の下にあるエンコーダEncのパラメータ・タブにあるスケーリング係数計算機は、1000パルスがデフォルトだと思われます。今回512パルスのエンコーダを使っているので、0.005に変更しました。正しい係数の算出でないかもしれません。ほとんど動作に影響はないです。
その下のスケーリング係数の母数をデフォルトの1から20に変更しました。これは、指定する速度や加速度が粗い指定になります。細かな位置決めは、デフォルトのままがよいでしょう。
すべてを保存します。
MAINの場所
PLCがプログラミング関係の設定エリアです。POUsがソース・エリアです。デフォルトでMAINがあります。
MAINをダブルクリックすると、右の領域にソースを記述エリアが表示されます。上側が変数宣言、下側が本体です。
モーションのライブラリを追加
Referencesの上で右クリックをしてライブラリの追加を選びます。
検索欄にMC2と入れ、Tc2_MC2を選択してOKを押します。
デフォルトの三つに、Tc2_MC2が追加されました。モーション関係はこのTc2_MC2ライブラリにあるファンクションブロックを使います。
プログラムの記述を開始
MAINのプログラム本体のエリアで右クリックし、入力アシスタントを選択します。
入力アシスタントのパネルが出ます。カテゴリからファンクションブロックを選び、折りたたまれたTc2_MC2をクリックしていき、MC_Powerを見つけて、右下のOKを押します。
自動宣言のパネルが出るので、名前をPower_Onにして、OKをクリックします。
ST言語によるモーションの記述が張り込まれました。
ソースを修正していきます。
Axis:=にAX1を代入します。すぐに自動宣言が出ます。何もせず、OKを押します。
Enable:= TRUE,
Enable_Positive:= TRUE,
Enable_Negative:= TRUE,
Override:= 99,
と入力します。Overrideは入力しないと100のようです。テスト時には低い数値を入れるとどこかで読みました。
メニューのビルドをクリックします。
続けて、一番下の行で、右クリックして入力アシスタントを選択します。
Motionの下あたりみある MC_MoveAbsoluteを選択してOKを押します。
自動宣言が出るので、名前をfb_MoveAbsoluteにしました。
値を追加していきます。
ビルドしてエラーがないことを確認します。
構成の有効化をクリックします。TwinCATが再起動します。
AX1をダブルクリックして設定のタブを開きます。
PLCにリンクをクリックして出てきたパネルから、MAIN.AX1を選択してOKを押します。
再度ビルドします。
AX1をダブルクリックして、オンラインのタブを開きます。有効化の設定を三つ全部チェックします。
動作を確認します。エラーにないことを確認します。エラーになるときは、構成の有効化でエラーをクリアできることが多いです。エラーになるときは、原因を探して修正をしないといけません。とても時間がかかることがあります。
モータ単体のチューナップがすんでいてぴたっと停止するような状態でも、TwinCAT3のMotionでもPID制御が行われるので、停止位置が微妙に修正される場合があります。
スイッチ入力部
プログラムを追加していきます。
最初に、fb_MoveAbsoluteの入力ExecuteとPositionを修正します。どちらも何も入れません。
四つあるディジタル入力は、I/Oのドライブ4、CSP InputsのDigital Inputsに反映されます。
最下行に移動します。
IF Din1 = 917504 THEN // sw1
を入力すると自動宣言が出ます。INTではなくUDINTに修正してOKを押します。
Dout1 := 917503;
を入力すると自動宣言が出ます。INTではなくDUINTに修正してOKを押します。
続けて条件文を完成させます。
Din1が917504=sw1が押されたら、ExecuteをTRUEにし、Positionに10を代入します。
Din1が851968=sw2が押されたら、ExecuteをTRUEにし、Positionに-10を代入します。
それ以外の状態ならば、ExecuteをFALSEにして回転させません。
つぎに、物理的なスイッチとプログラムを関連づけます。
変数領域のDin1とDout1を修正します。
ビルドします。
CSP InputsのDigital Inputsを右クリックしてリンクを変更をクリックすると、変数Digital Inputsのアタッチ(入力)パネルが出て、該当するプログラムの変数を選択してOKを押します。
CSP OutputsのDigital Oututsも同様にリンクを変更してDout1と関連付けます。
ビルドします。
この関連付けは、プログラムを修正していると簡単に外れてしまうので、再度関連付けをします。
実行します。sw1、sw2を押すと、それぞれの方向で回転し、LEDが点灯します。
回転する距離はPositionの値、速度はVelocity、台形駆動の立ち上がりはAcceleration、立ち下がりはDecelerationの値を変更すれば変化します。モータに合わせて値を変更します。
ソースです。
PROGRAM MAIN
VAR
Power_On: MC_Power;
AX1: AXIS_REF;
fb_MoveAbsolute: MC_MoveAbsolute;
Din1 AT %I*: UDINT;
Dout1 AT %Q*: UDINT;
END_VAR
Power_On(
Axis:= AX1,
Enable:= TRUE,
Enable_Positive:= TRUE,
Enable_Negative:= TRUE,
Override:= 99,
BufferMode:= ,
Options:= ,
Status=> ,
Busy=> ,
Active=> ,
Error=> ,
ErrorID=> );
fb_MoveAbsolute(
Axis:= AX1,
Execute:= ,
Position:= ,
Velocity:= 20,
Acceleration:= 30,
Deceleration:= 20,
Jerk:= 200,
BufferMode:= ,
Options:= ,
Done=> ,
Busy=> ,
Active=> ,
CommandAborted=> ,
Error=> ,
ErrorID=> );
IF Din1 = 917504 THEN // sw1
Dout1 := 917503;
fb_MoveAbsolute.Execute := TRUE;
fb_MoveAbsolute.Position := 10;
ELSIF Din1 = 851968 THEN // sw2
Dout1 := 917504;
fb_MoveAbsolute.Execute := TRUE;
fb_MoveAbsolute.Position := -10;
ELSE
fb_MoveAbsolute.Execute := FALSE;
fb_MoveAbsolute.Position := 1;
END_IF