TwinCAT3でプログラムを書くときに使えるファンクションブロックを利用する方法は、現時点で、筆者が知りえているのは三つあります。
- MAINにST言語で記述
- POUのMAINの下にアクションを追加し、ファンクションブロックダイアグラムを利用する
- MAINのPOUと同じレベルにPOUを追加し、ファンクションブロックダイアグラムを利用する
最初の方法は、MAINにすべて書かれるので、ファンクションブロックの入力(今回はExecuteとPosition)は、MAINのプログラムの中でそのまま利用できました。
2番目のMAINの中に作ったアクションでは、ExecuteとPositionは、変数を別途、fb_Executeとfb_Positionとして定義し、INPUT変数として扱うことで、MAINのプログラムの中で扱えました。
今回は、MAINと同列のPOUを新たに作り、その中にファンクションブロックダイアグラムを張り付けていきます。そのファンクションブロックダイアグラムにあるExecuteとPositionをアクセスするために、外部変数GVLsを利用して、変数を別途、fb_Executeとfb_Positionとして定義し、INPUT変数として扱い、MAINのプログラムの中で利用します。
新たなPOUを作る
準備
機器のスキャンが終わって、PLD内でソフトの開発ができるところまで準備ができているとします。
ReferencesにTc2_MC2ライブラリを追加します。
GVLsの上で右クリックをしてグローバル変数一覧を選択します。
名前をGVLmotionにしました。
真ん中のプログラム・エリアにGVLmotionのタブが追加されました。
名前は、POU_movePositionにしました。型はプログラム、記述言語はファンクションブロックダイアグラムになっていること確認してOpenを押します。
三つのタブができました。左からタブの上で右クリックして垂直タブグループを選択し、3分割にしていきます。
POU_movePositionに行きます。
POU_movePositionにファンクションブロックダイアグラムをおいていく
前回と同じように、fb_MC_Power、fb_MC_MoveAbsolute、fb_MC_ReadActualPositionと名前を付け、入力も、前回と同じように修正します。
POU_movePositionの変数エリアにある記述をはぎ取ってGVLmotionにコピペします。
POU_movePositionの名前や変数に赤いアンダラインが引かれます。変数がグローバル・エリアに移されたので、それらの先頭に、GVLmotion.
を追加していきます。
ビルドして、エラーがないことを確認します。
MAINにswなどの操作を追加
MAINに、sw1、LED例の記述を追加します。
ビルドします。
軸関係の設定は、第2回を参照して、完了してください。
AX1をダブルクリックして、設定のPLCにリンクが空白だったら追加します。
I/Oのリンクの変更を行います。
ビルドします。
構成の有効化をクリックします。
実行します。
MAINのソースです。
PROGRAM MAIN
VAR
Digital_inputs AT %I*: UDINT; // sw1,sw2
Digital_outputs AT %Q*: UDINT; // LED
END_VAR
IF Digital_inputs = 917504 THEN // sw1
Digital_outputs := 851968;
GVLmotion.fb_Execute := TRUE;
GVLmotion.fb_Position := 10;
POU_movePosition();
ELSIF Digital_inputs = 851968 THEN // sw2
Digital_outputs := 917504;
GVLmotion.fb_Execute := TRUE;
GVLmotion.fb_Position := -10;
POU_movePosition();
ELSE
GVLmotion.fb_Execute := FALSE;
GVLmotion.fb_Position := 1;
POU_movePosition();
END_IF
GVLmotionです。
{attribute 'qualified_only'}
VAR_GLOBAL
fb_MC_Power: MC_Power;
AX1: AXIS_REF;
fb_MC_MoveAbsolute: MC_MoveAbsolute;
fb_Execute: BOOL;
fb_Position: LREAL;
fb_MC_ReadActualPosition: MC_ReadActualPosition;
END_VAR