ふたつぼし inside

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

ユーザ用ツール

サイト用ツール


howto:open_plc:digitally_analogout

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
howto:open_plc:digitally_analogout [2022/09/20 13:17]
Staff_Ujiie [アナログ出力をデジタルに使う]
howto:open_plc:digitally_analogout [2022/09/20 14:19] (現在)
Staff_Ujiie [今後の対応]
行 6: 行 6:
 ==== アナログ出力の設定方法 ==== ==== アナログ出力の設定方法 ====
  
-  * さて、OpenPLCでのPLCプログラムのアナログ出力ですが、検索して探してもあまり情報が見つからず、見つかったサンプルの使い方でラダー図に書き加えてみて、はたと困りました。+  * さて、OpenPLCでのPLCプログラムのアナログ出力の使い方ですが、検索して探してもあまり情報が見つからず、見つかったサンプルの使い方でラダー図に書き加えてみて、はたと困りました。
  
-  * {{ :howto:open_plc:sc2022-09-19_16.42.02_w600.png?direct&200|}}アナログ出力のレベルを0(0%)65535(100%)の数値で設定して、**MOVE**という機能ブロックでその数値をアナログ出力チャンネルに渡してやるのですが、そこには上流からのON/OFFを受け付ける入り口がありません。プログラムを動かすとただ設定値出力で点灯し続けるだけです。\\ 考えてみると、出力をON/OFFするということそのものがデジタル的な動作なので、アナログ出力の動作とは本質的に違うのだと思います。+  * {{ :howto:open_plc:sc2022-09-19_16.42.02_w600.png?direct&200|}}アナログ出力のレベルを0~65535(0~100%)の数値で設定して、**MOVE**という機能ブロックでその数値をアナログ出力チャンネルに渡してやるのですが、そこには上流からのON/OFFを受け付ける入り口がありません。プログラムを動かすとただ設定値に応じた出力で点灯し続けるだけです。\\ 考えてみると、出力をON/OFFするということそのものがデジタル的な動作なので、アナログ出力の動作とは本質的に違うのだと思います。
 \\  \\ 
 ==== ON/OFF動作の設定1 ==== ==== ON/OFF動作の設定1 ====
行 14: 行 14:
   * {{ :howto:open_plc:sc2022-09-19_16.42.33_w600.png?200&direct}}なんとか出来ないかと調べてみると、OpenPLCフォーラムの投稿でプロックの機能自体を有効/無効にする[[https://openplc.discussion.community/post/type-of-analog-outputs-8565217?highlight=analog&pid=1296265215|イネーブル機能(Execution Control)を使うという案]]がありました。\\ これだとON入力があるまでは出力をOFF状態にしておくことができます。出力レベルを100%に設定しておいてイネーブル入力をON/OFFすれば、デジタル出力と同等、かつ出力レベルも自由に設定出来るはずです。   * {{ :howto:open_plc:sc2022-09-19_16.42.33_w600.png?200&direct}}なんとか出来ないかと調べてみると、OpenPLCフォーラムの投稿でプロックの機能自体を有効/無効にする[[https://openplc.discussion.community/post/type-of-analog-outputs-8565217?highlight=analog&pid=1296265215|イネーブル機能(Execution Control)を使うという案]]がありました。\\ これだとON入力があるまでは出力をOFF状態にしておくことができます。出力レベルを100%に設定しておいてイネーブル入力をON/OFFすれば、デジタル出力と同等、かつ出力レベルも自由に設定出来るはずです。
  
-  * と思ってそのようにプログラムを作成して、デバッグでチェックしてみると、エディター内のデバッグ用の2つの画面で結果が異なって出ています。イネーブルONで出力もONになるのですが、その後イネーブルOFFになると1つの画面ではMOVEの出力は0になっていますがもう一方の画面ではアナログ出力が65535のまま。どっちが正しいのかわかりません。\\ \\ <fs small>(MOVEにイネーブル制御を追加)</fs>\\ {{:howto:open_plc:sc2022-09-02_23.03.29r2.png?600&direct}}\\ \\ <fs small>(MOVE/EN:ON(緑線)で、LT_AB(LED):65535(点灯))</fs>{{:howto:open_plc:sc2022-09-02_23.04.04r.png?600&direct}}\\ \\ <fs small>(MOVE/EN:OFF(黒線)になっても、LT_AB(LED):65535(点灯)のまま。但しMOVE/OUTは0(紫))</fs>{{:howto:open_plc:sc2022-09-02_23.04.24r.png?600&direct}}+  * と思ってそのようにプログラムをして、シミュレーションしデバッグ画面でチェックしてみると、エディター内のデバッグ用の2つの画面で結果が異なって出ています。イネーブルONで出力もONになるのですが、その後イネーブルOFFになると1つの画面ではMOVEの出力は0になっていますがもう一方の画面ではアナログ出力が65535のまま。どっちが正しいのかわかりません。\\ \\ <fs small>(MOVEにイネーブル制御(**EN**/**ENO**)を追加)</fs>\\ {{:howto:open_plc:sc2022-09-02_23.03.29r2.png?600&direct}}\\ \\ <fs small>(MOVE/**ENON**(緑線)で、**LT_AB**(LED用アナログ出力)**は65535**(点灯))</fs>{{:howto:open_plc:sc2022-09-02_23.04.04r.png?600&direct}}\\ \\ <fs small>(MOVE/**ENOFF**(黒線)になっても、**LT_AB65535**(点灯)のまま。但しMOVE/**OUTは0**(紫))</fs>\\ {{:howto:open_plc:sc2022-09-02_23.04.24r.png?600&direct}}
  
-  * 一見プログラムのバグにも思えるこの辺の動作については、OpenPLCフォーラムの[[https://openplc.discussion.community/post/unipi-ladder-problem-8515424?highlight=execution%20control&pid=1304581537|ここの投稿]]で考察されています。\\ アナログ出力に数値を送る機能ブロックがイネーブル機能で停止したときに、アナログ出力にOFF相当の0を上書きするかどうかが、PLCソフトウェア(OpenPLCとCODESYS)によって異なっているという課題提起です。OpenPLCは0の上書き派です。PLCの国際基準(IEC61131-3)の解釈の仕方から生まれた食い違いとのことですが、機能ブロックが停止の際に0を上書きする仕様は間違った解釈という結論になりました。\\ そうするとイネーブル機能を使うこのやり方では、アナログ出力を0にできないことになります。その後のバージョンアップを経て、現行のOpenPLCは0を上書きしない仕様になっています。+  * 一見プログラムのバグにも思えるこの辺の動作については、OpenPLCフォーラムの[[https://openplc.discussion.community/post/unipi-ladder-problem-8515424?highlight=execution%20control&pid=1304581537|ここの投稿]]で考察されています。\\ アナログ出力に数値を送る機能ブロックがイネーブル機能で停止したときに、アナログ出力にOFF相当の0を上書きするかどうかが、PLCソフトウェア(OpenPLCとCODESYS)によって異なっているという課題提起です。OpenPLCは0の上書き派です。PLCの国際基準(IEC61131-3)の解釈の仕方から生まれた動作の違いとのことですが、機能ブロックが停止の際に0を上書きする仕様は間違った解釈という結論になりました。\\ そうするとイネーブル機能を使うこのやり方では、アナログ出力を0にできないことになります。その後のバージョンアップを経て、現行のOpenPLCは0を上書きしない仕様になっています。 
 + 
 +  * 上記のシミュレーションでも、機能ブロックの停止時にアナログ出力に0が上書きされないので、停止前の値65535が保持されたままになっているということでしょう
  
   * 後で実機でもこのプログラムを流して試して見ましたが、LEDは点きっぱなしになり消灯しませんでした。   * 後で実機でもこのプログラムを流して試して見ましたが、LEDは点きっぱなしになり消灯しませんでした。
行 27: 行 29:
   * アナログ出力では、送られてきた数値に比例して出力を増減させます。数値が0のときが出力0で、OFFと同じことになります。   * アナログ出力では、送られてきた数値に比例して出力を増減させます。数値が0のときが出力0で、OFFと同じことになります。
  
-  * そのため、別のやり方として**SEL**(2値選択)という機能ブロックを使えばよいのではと思いつき、入力がOFFのときは0(0%)、ONのときは65535(100%)を選んでアナログ出力に送ってやる形にしてみたらうまくいきました。これだと機能ブロックはずっと動作し続けています。\\ こちらの方が処理としても自然であり、採用することにしました。\\ \\ <fs small>(SEL/G:ON(緑線)で、LT_AB(LED)は65535(点灯))</fs>\\ {{:howto:open_plc:sc2022-09-02_23.51.51r.png?direct&600|}}\\ \\ <fs small>(SEL/G:OFF(黒線)で、LT_AB(LED)は0(消灯))</fs>\\ {{:howto:open_plc:sc2022-09-02_23.52.09r.png?direct&600|}}\\ \\ <fs small>(OpenPLCのバージョンは1.3)</fs>\\ {{:howto:open_plc:sc2022-09-02_23.06.07r.png?direct&600|}}+  * そのため、別のやり方として**SEL**(2値選択)という機能ブロックを使えばよいのではと思いつき、入力がOFFのときは0(0%)、ONのときは65535(100%)を選んでアナログ出力に送ってやる形にしてみたらうまくいきました。これだと機能ブロックはずっと動作し続けています。\\ こちらの方が処理としても自然であり、採用することにしました。\\ \\ <fs small>(SEL/**GON**(緑線)で、**LT_AB**(LED用アナログ出力)**は65535**(点灯))</fs>\\ {{:howto:open_plc:sc2022-09-02_23.51.51r.png?direct&600|}}\\ \\ <fs small>(SEL/**GOFF**(黒線)で、**LT_ABは0**(消灯))</fs>\\ {{:howto:open_plc:sc2022-09-02_23.52.09r.png?direct&600|}}\\ \\ <fs small>使用したOpenPLCのバージョンは**1.3**)</fs>\\ {{:howto:open_plc:sc2022-09-02_23.06.07r.png?direct&600|}}
 \\  \\ 
-===== 今後の対応 =====+===== 結論と今後の対応 ===== 
 + 
 +  * ON/OFF動作のラダープログラム中に__アナログ出力を入れてON/OFFさせたいときは、__**SEL機能ブロック**__でON/OFF数値を選択__するように設定すればできます。 
 + 
 +  * 機能ブロックの**イネーブル制御**を使うときは、出力先の動作に要注意。__機能を停止したからといってその先のアナログ出力が0になるわけではありません。__
  
-  * アナログ出力チャンネルでON/OFFの切り替ができようになったので、後はONの際の数値をいろいろに変化させるやり方を検討します。+  * この先は、アナログ出力に与える数値をいろいろに変化させるやり方を検討します。
 \\  \\ 
howto/open_plc/digitally_analogout.1663647455.txt.gz · 最終更新: 2022/09/20 13:17 by Staff_Ujiie