1
1

More than 1 year has passed since last update.

日記;回すだけⅤ ③ ST言語(ファンクションブロック)でモータを回す記述<その3 アクション>

Posted at

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

  • MAINにST言語で記述
  • POUのMAINの下にアクションを追加し、ファンクションブロックダイアグラムを利用する
  • MAINのPOUと同じレベルにPOUを追加し、ファンクションブロックダイアグラムを利用する

 ここでは2番目の方法を利用します。次のような構成になります。
e628.png

プログラミング

最初は電源を入れる

 PLCでプログラミングができるところまでは、前回を参照してください。
 MAINで右クリックし、追加、アクションを選択します。

e601.png

 ACT_PowerOnと名前をつけてOKを押します。
e602.png

 MAIN.ACT_PowerOnの入力エリアが開きます。

e603.png
 ここで、ソリューションエクスプローラ内のMAINをダブル・クリックします。
e604.png
 MAINとMAIN.ACT_PowerOnの二つのタブができます。
 MAIN.ACT_PowerOnのタブの上で、右クリックします。垂直タブグループの新規作成を選択します。
e605.png

 プログラムエリアが2分割されるので、幅を調整します。
e606.png

 MAIN.ACT_PowerOnのタブに移動します。1行目で右クリックし、ボックスを挿入を選択します。

e607.png

 MC_Powerを選択し、OKを押します。
e608.png

 ボックスの上の名前をデフォルトからfb_MC_Powerに変更します。

e609.png

 自動宣言が出ます。何もせずOKを押します。
e610.png

 MAINの変数領域に記述が追加されます。
 このようすから、アクションは独立したファンクションブロックダイアグラムをおいていけるけど、プログラム的にはローカルな扱いだと思われます。

e611.png

 MAIN.ACT_PowerOnのfb_MC_Powerボックスの入出力を修正しました。
 AX1を入れると自動宣言が出ます。何もせずOKを押します。
e612.png

 MAINの変数領域にAX1の定義が追加されます。
e613.png

回転するファンクションブロックダイアグラム

 MAINで右クリックし追加、アクションを選択します。ACT_movePositionという名前にしました。
 ACT_movePositionのタブを右クリックし、垂直タブグループの新規作成を選択します。
e614.png

 ACT_movePositionのタブの1のエリアで右クリックをし、ボックスを挿入を選択します。ここではMC_MoveAbsoluteを選択し、OKを押します。

e615.png

 ボックスの名前をfb_MC_MoveAbsoluteにします。
 入出力を変更します。ExecuteとPositionはブランク(リターンを入れる)にします。
 一度ビルドしてエラーのないことを確認しておきます。
e616.png

 ACT_movePositionのタブの1のエリアで右クリックし、ネットワークを挿入(下)を選択します。
e617.png
 先ほどと同様にボックスを挿入を選択します。
 MC_ReadActualPositionを選択し、OKを押します。PDOのPositionを読み出すファンクションブロックダイアグラムです。

e618.png

 名前をfb_MC_ReadActualPositionに修正し挿入すると、MAINの変数領域に定義が書き込まれます。
e619.png
 入出力を修正します。

e620.png
 ビルドしてエラーのないことを確認しておきます。

入出力の追加

 前回のsw1とsw2のプログラムをMAINのコーディング・エリアに貼り付けます。
 自動宣言が出るので、型を修正していきます。

e621png.png

 赤色のアンダーラインが引かれているところは、文法的にエラーが発生している場所です。
 次のように修正しました。
 最初に、電源をONするアクションACT_PowerOn();を呼び出します。
 IF文内では、ExecuteとPosisionの値を記述しました。最後に回転するACT_movePosition();を実行します。

e622.png

 ビルドします。
 Din1とDout1を修正します。
 ビルドし、リンクの変更を行います(手順は前回を参照)。
e623.png
 ビルドして実行します。
 sw1、sw2を押すと、各値は変わり、LEDも正しく点灯しますが、モータは回転はしません。アクションACT_movePosition();のExecuteとPosisionの値が変化しないのです。
 修正します。
 ExecuteとPosisionを入力変数に変更しました。
e624.png

 しかし、動きません。軸を手で動かすと、軽く回ります。つまり、アクションACT_movePosition();が動作していないということです。
e625.png

 MAINのExecuteとPositionの内容がACT_movePosition();に伝わっていないようです。

 アクションACT_movePosition();の空だったExecuteとPositionの入力にfb_Executeとfb_Positionの名前を付けた変数を用意します。それに伴ってMAINも修正します。

e626.png

 うごきました。

 MAINのソースです。

PROGRAM MAIN
VAR
	fb_MC_Power: MC_Power;
	AX1: AXIS_REF;
	fb_MC_MoveAbsolute: MC_MoveAbsolute;
	fb_MC_ReadActualPosition: MC_ReadActualPosition;
	Din1  AT %I*: UDINT;
	Dout1 AT %Q*: UDINT;

END_VAR

VAR_INPUT
	fb_Execute: BOOL;
	fb_Position: LREAL;	
END_VAR
ACT_PowerOn();

IF  Din1 = 917504  THEN  // sw1
	Dout1 := 917503;
	fb_Execute  := TRUE;
	fb_Position := 10;

ELSIF Din1 = 851968  THEN  // sw2
	Dout1 := 917504;
	fb_Execute  := TRUE;
	fb_Position := -10;

ELSE
	fb_Execute  := FALSE;
	fb_Position := 1;	
		
END_IF

ACT_movePosition();

 実行中の様子です。Positionのファンクションブロックも正しく位置情報を表示しています。
e627.png

立ち上げ手順
  • EtherCAT機器の電源はOFF
  • PCの電源を入れる
  • TwinCAT3の常駐部が立ち上がる
  • TwinCAT3を立ち上げる
  • ソリューションを読み込む
  • EtherCAT機器の電源を入れる

 この順番でないと、0x0701のエラーが出て動作しません。

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