今回の記事では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
皆様のサポートが、私たちの活動をより充実させる力となります。
どうぞよろしくお願いします。
メールアドレス(*=@)
X
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