0
0

More than 1 year has passed since last update.

日記;回すだけⅤ ④ ST言語(ファンクションブロック)でモータを回す記述<その4 独立したPOU>

Last updated at Posted at 2022-10-10

 TwinCAT3でプログラムを書くときに使えるファンクションブロックを利用する方法は、現時点で、筆者が知りえているのは三つあります。

 最初の方法は、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のプログラムの中で利用します。
e715.png

新たなPOUを作る

準備

 機器のスキャンが終わって、PLD内でソフトの開発ができるところまで準備ができているとします。
e701.png

 ReferencesにTc2_MC2ライブラリを追加します。
 GVLsの上で右クリックをしてグローバル変数一覧を選択します。
e702.png
 名前をGVLmotionにしました。
e703.png
 真ん中のプログラム・エリアにGVLmotionのタブが追加されました。
e704.png

 POUsの上で右クリックをして、追加、POUを選択します。
e705.png

 名前は、POU_movePositionにしました。型はプログラム、記述言語はファンクションブロックダイアグラムになっていること確認してOpenを押します。
e706.png

 三つのタブができました。左からタブの上で右クリックして垂直タブグループを選択し、3分割にしていきます。
e707.png
 POU_movePositionに行きます。
 e708.png

POU_movePositionにファンクションブロックダイアグラムをおいていく

 前回と同じように、fb_MC_Power、fb_MC_MoveAbsolute、fb_MC_ReadActualPositionと名前を付け、入力も、前回と同じように修正します。
e709.png
 POU_movePositionの変数エリアにある記述をはぎ取ってGVLmotionにコピペします。
e710.png
 
 POU_movePositionの名前や変数に赤いアンダラインが引かれます。変数がグローバル・エリアに移されたので、それらの先頭に、GVLmotion.を追加していきます。
e711.png

 ビルドして、エラーがないことを確認します。

MAINにswなどの操作を追加

 MAINに、sw1、LED例の記述を追加します。

e712.png

 ビルドします。
 軸関係の設定は、第2回を参照して、完了してください。

 AX1をダブルクリックして、設定のPLCにリンクが空白だったら追加します。
e713.png
 I/Oのリンクの変更を行います。
 ビルドします。
 構成の有効化をクリックします。
 実行します。

e714.png

 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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0