Beckhoff#保持タイマーを作ろう

今回の記事ではTwinCAT3で保持タイマーの作成方法を紹介します。実はSNSからの問い合わせで、TwinCAT3に保持タイマーの作り方を教えてくれませんかってきたので、その問い合わせに答えました。

さ、FAを楽しもう。

前書き

いつも私の技術ブログとYouTubeチャンネルをご覧いただき、心より感謝申し上げます。また、いまFullさん(full@桜 八重 (@fulhause) / X)と共に毎週水曜日の夜にお届けしている「高橋クリス」ラジオ番組を運営しています。

現在、私達の活動はほぼ無償で続けており、より多くのコンテンツを提供するためには、皆様の温かいご支援が大変重要です。もし可能であれば、以下のリンクから応援していただけると大変嬉しく思います。

高橋クリスのメンバーシップ

こちらはFullさん(full@桜 八重 (@fulhause) / X)と共にやっているラジオにメンバーシップを登録いただけます。

https://note.com/fulhause/membership/join

AMAZON ギフトリスト

こちらは自分のブログのコンテンツ制作や設備の充実に大いに役立てさせていただきます。

https://www.amazon.co.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share

Patreon

こちらは自分のブログのコンテンツ制作や設備の充実に対する小さな応援の気持ちのPatreonです。

https://www.patreon.com/user?u=84249391

皆様のサポートが、私たちの活動をより充実させる力となります。

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

メールアドレス(*=@)

soup01threes*gmail.com

X

https://x.com/3threes2

Implementation1

最初にPOUに直接保持タイマーのプログラムを実装します。

VAR

PROGRAM MAIN
VAR
    xIN : BOOL;
    tPT : TIME;
    xPAUSE : BOOL;
   xQ : BOOL;
    tET : TIME;

    fbPause : R_TRIG;
    tTimePaused : TIME;
    fbton : TON;
END_VAR

Program

こちらはプログラムです。

//Reset the PT
IF NOT xIN THEN
tTimePaused := T#0s;
END_IF

//Detect the Pause
fbPause(CLK := xPAUSE);

//Keep the Time
IF fbPause.Q THEN
tTimePaused := tTimePaused + fbton.ET;
END_IF
//FB
fbton(
IN := xIN AND NOT xPAUSE
,PT := tPT – tTimePaused
,Q=>xQ
);
//Output
xQ := fbton.Q;
tET := tTimePaused + fbton.ET;

xINがFALSEの場合は、タイマーの記録時間を0sにリセットします。

R_TRIG FBを使用し、xPAUSEの立ち上げ信号を検知します。

xPAUSEの立ち上げを検知した場合、現在TONの経過時間(ET)をBuffer変数(tTimePaused)にプラスします。

こちらはTON FBを呼び出しします。注意するおはPT(つまりTONの設定時間)は

tPT(設定時間)マイナスxPAUSEが立ち上げたときの時間差になります。

Result

保持タイマーが正しく動いたかを確認するために、YT Scope プロジェクトを追加し、適切なAxis Groupを定義します。

下図のように、xIN(オレンジ線)がONしてるときに、TONの中にあるeETが時間経過とともに加算しています。そしてxPAUSE(緑線)がTRUEしてるとき、eETの時間加算が止まっています。最後、eET=PTのときにxQ(青い)がONになります。

Implementation2

次はImplementation1で作成したプログラムをFB化します。

fbRetainTimer

TwinCATプロジェクトにFBを追加します。

VAR

こちらは先程作成したプログラムの変数をIN/OUT/内部変数に定義します。

  • xIn:入力、TRUE=タイマー有効
  • tPT:入力、タイマーの設定時間
  • xPause:入力、タイマーの一時停止
  • xQ:出力、TRUE=タイマーON中
FUNCTION_BLOCK fbRetainTimer
VAR_INPUT
xIn :BOOL;
tPT :TIME;
xPause :BOOL;

END_VAR
VAR_OUTPUT
xQ :BOOL;
END_VAR
VAR
tET:TIME;
fbPause : R_TRIG;
tTimePaused : TIME;
      fbton : TON;
END_VAR

Program

こちらはプログラムです。Implementation1と同じの動作です。

//Reset the PT
IF NOT xIN THEN
tTimePaused := T#0s;
END_IF

//Detect the Pause
fbPause(CLK := xPAUSE);

//Keep the Time
IF fbPause.Q THEN
tTimePaused := tTimePaused + fbton.ET;
END_IF
//FB
fbton(
IN := xIN AND NOT xPAUSE
,PT := tPT – tTimePaused
,Q=>xQ
);
//Output
xQ := fbton.Q;
tET := tTimePaused + fbton.ET;

MAIN

最後はMAINプログラムでInstnaceを宣言し、動作確認します。

VAR
fbtimers:ARRAY[0..3]OF fbRetainTimer;
END_VAR

//

fbtimers[0](tPT:=T#30S);
fbtimers[1](tPT:=T#4S);
fbtimers[2](tPT:=T#5S);
fbtimers[3](tPT:=T#6S);

Result

YT Scope プロジェクトでまた動作確認しましょう。

Done!

Download

こちらのLinkで今回の記事で作成したプロジェクトをDownloadできます。

https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT4026-RetainTimer.tszip

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

シェアする

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

フォローする