ふたつぼし inside

制作・活動内容、機材の使い方、作り方などなど

ユーザ用ツール

サイト用ツール


サイドバー

**ふたつぼしHomeに戻る**
**ふたつぼしストアを覗く**

コンテンツマップ



a crow's nest

最近更新されたページ

howto:open_plc:digitally_analogout

アナログ出力をデジタルに使う

展示物の電飾を始めたら、展示スペースのPLCに使っているUniPi1.1の出力チャンネル数が足りなくなってきたため、使っていないアナログ出力(PWM)をLEDのON/OFFに使おうとしたら、うまくいきません。デジタルとアナログの機能の認識の違いもあって、試行錯誤してやっとデジタル的にも使えるように設定できました。

経緯

アナログ出力の設定方法

  • さて、OpenPLCでのPLCプログラムのアナログ出力の使い方ですが、検索して探してもあまり情報が見つからず、見つかったサンプルの使い方でラダー図に書き加えてみて、はたと困りました。
  • アナログ出力のレベルを0~65535(0~100%)の数値で設定して、MOVEという機能ブロックでその数値をアナログ出力チャンネルに渡してやるのですが、そこには上流からのON/OFFを受け付ける入り口がありません。プログラムを動かすとただ設定値に応じた出力で点灯し続けるだけです。
    考えてみると、出力をON/OFFするということそのものがデジタル的な動作なので、アナログ出力の動作とは本質的に違うのだと思います。


ON/OFF動作の設定1

  • なんとか出来ないかと調べてみると、OpenPLCフォーラムの投稿でプロックの機能自体を有効/無効にするイネーブル機能(Execution Control)を使うという案がありました。
    これだとON入力があるまでは出力をOFF状態にしておくことができます。出力レベルを100%に設定しておいてイネーブル入力をON/OFFすれば、デジタル出力と同等、かつ出力レベルも自由に設定出来るはずです。
  • と思ってそのようにプログラムを直して、シミュレーションしデバッグ画面でチェックしてみると、エディター内のデバッグ用の2つの画面で結果が異なって出ています。イネーブルONで出力もONになるのですが、その後イネーブルOFFになると、1つの画面ではMOVEの出力は0になっていますがもう一方の画面ではアナログ出力が65535のまま。どっちが正しいのかわかりません。

    (MOVEにイネーブル制御(EN/ENO)を追加)


    (MOVE/ENがON(緑線)で、LT_AB(LED用アナログ出力)は65535(点灯))

    (MOVE/ENがOFF(黒線)になっても、LT_ABは65535(点灯)のまま。但しMOVE/OUTは0(紫))
  • 一見プログラムのバグにも思えるこの辺の動作については、OpenPLCフォーラムのここの投稿で考察されています。
    アナログ出力に数値を送る機能ブロックがイネーブル機能で停止したときに、アナログ出力にOFF相当の0を上書きするかどうかが、PLCソフトウェア(OpenPLCとCODESYS)によって異なっているという課題提起です。OpenPLCは0の上書き派です。PLCの国際基準(IEC61131-3)の解釈の仕方から生まれた動作の違いとのことですが、機能ブロックが停止の際に0を上書きする仕様は間違った解釈という結論になりました。
    そうするとイネーブル機能を使うこのやり方では、アナログ出力を0にできないことになります。その後のバージョンアップを経て、現行のOpenPLCは0を上書きしない仕様になっています。
  • 上記のシミュレーションでも、機能ブロックの停止時にアナログ出力に0が上書きされないので、停止前の値65535が保持されたままになっているということでしょう。
  • 後で実機でもこのプログラムを流して試して見ましたが、LEDは点きっぱなしになり消灯しませんでした。


ON/OFF動作の設定2

  • アナログ出力では、送られてきた数値に比例して出力を増減させます。数値が0のときが出力0で、OFFと同じことになります。
  • そのため、別のやり方としてSEL(2値選択)という機能ブロックを使えばよいのではと思いつき、入力がOFFのときは0(0%)、ONのときは65535(100%)を選んでアナログ出力に送ってやる形にしてみたらうまくいきました。これだと機能ブロックはずっと動作し続けています。
    こちらの方が処理としても自然であり、採用することにしました。

    (SEL/GがON(緑線)で、LT_AB(LED用アナログ出力)は65535(点灯))


    (SEL/GがOFF(黒線)で、LT_ABは0(消灯))


    (使用したOpenPLCのバージョンは1.3


結論と今後の対応

  • ON/OFF動作のラダープログラム中にアナログ出力を入れてON/OFFさせたいときは、SEL機能ブロックでON/OFF数値を選択するように設定すればできます。
  • 機能ブロックのイネーブル制御を使うときは、出力先の動作に要注意。機能を停止したからといってその先のアナログ出力が0になるわけではありません。
  • この先は、アナログ出力に与える数値をいろいろに変化させるやり方を検討します。


howto/open_plc/digitally_analogout.txt · 最終更新: 2022/09/20 14:19 by Staff_Ujiie