自動プロセス制御システムをテストするためのシミュレーター:例

Habrahabrの最初の記事が公開されてから経過した期間中、コミュニティと考えを共有し、自動化された機器のソフトウェアシミュレーターを作成するプロセスをより詳細に説明したいという要望がありました。 前のテキストに精通したい方のために、ここで質問します- プロセス制御システム用のソフトウェアをテストするためのシミュレーター



これで、プログラムのフルバージョンがプロジェクトのWebサイトで利用可能になりました。 少し考えてから、このクラフトを商用製品に開発することはうまくいかないとの結論に達しました。 誰かが役に立つとしたら、ワークショップで同僚からフィードバックをもらってうれしいです。



例として選択されたタスクは、プロセス制御システムよりも信号処理に関連しており、実際的な意味はまったくありません。 これは、主題領域の過度の詳細で読者の注意をそらさず、視認性を高めるために、意図的に行われます(誰もがグラフィックを愛しています)。







はじめに



TDD(テスト駆動開発)またはユニットテストについて読んだほぼすべての記事で、プロジェクトに割り当てられた時間をテストの作成に費やすことの実現可能性について説明しました。 自動プロセス制御システムソフトウェアをテストするためのシミュレーターの場合、一部の研究所または非常に真剣な専門家向けに動的生産プロセスの完全に信頼できるモデルを作成することができるため、すべてがやや複雑になります。



私自身のために、モデルの信頼性のある面を選択しました。その後、モデルの作成に費やされた時間が正当化されません。 正直なところ、私は技術、物理学、数学の知識が本当に不足しているので、通常は機器の動作のシミュレーションに限定し、自動化された機能と規制を確認するために物理パラメーターを経時的に簡単に変更します。



ミスを犯すのは人間の性質であるため、最も単純なモデルを使用する場合でも、多くのエラーが発生します。 さらに、しばらくの間システムを「いじって」みて、NDPの段階でしか考えられなかったであろう質問を開始することは価値があります。



いずれにせよ、これまでずっと、シミュレータの作成に費やした時間を後悔したことはありません。これは、巨大な監視テーブルや変数の変更よりもはるかに便利だからです。 オブジェクトに到達するときでさえ、私はしばしばそれをデバッグに使用します。 システム全体をいつでも仮想モデルに切り替えることができ、落ち着いて、緊張することなく仕事をすることができます。



挑戦する



私が示す例は、大学から保存されている電気工学に関する知識の惨めな残骸に触発されています。 おそらく、多くの人は、フルダイオードブリッジとコンデンサー上のフィルターを備えたAC電圧コンバーターの回路を覚えています(写真はwww.cqham.ru/pow2_15.htmで撮影されています )。



グラフから、ブリッジ回路が交流電圧を脈動電圧に変換し、正弦波の各半波を異なるバルブに通過させた後、コンデンサがリップルを平滑化することがわかります。

信号変換レベルでこの回路の動作のモデルを作成してみましょう。



解決策



「Process Simulator」を起動すると、すぐに変数の作成を開始できます(アイテム->アイテム辞書)。

アイテム辞書




3つの内部変数を作成します。



内部変数は、シミュレーション変数同士の通信を目的としています。 少し後で、シミュレーターが外部の世界(PLCまたは他のソフトウェア)と通信する方法を説明します。



シミュレーションオブジェクトの作成は、マネージャを使用して実行されます(シミュレーション->シミュレーションオブジェクト)。

シミュレーションオブジェクト




最初に必要なのは、元の正弦波信号です。 オブジェクト-「Analog generator」を作成し、変数「Sin」に設定します。

アナログ発生器




ユーザーインターフェイスを実装するには、作成したオブジェクトを表示する画面(視覚化->画面の追加)を作成する必要があります(視覚化-> ViewControlの追加)。

ViewControls




各タイプのオブジェクトには、いくつかの表示メソッドがあります。 「追加」ボタンをクリックすると、選択した表示タイプが、すでに作成した現在の画面に配置されます。 画面上の位置を変更するには、デザインモードに切り替え(視覚化->デザインモード)、マウスでディスプレイをドラッグする必要があります。 ディスプレイがサイズ変更をサポートしている場合、これはデザインモードでも実行できます。



次に、正弦波信号を脈動信号に変換する必要があります。 これを行うには、C#-“ CSharpScript”でスクリプトを記述できるオブジェクトを作成できます。

スクリプトテキストを含むCSharpScript




スクリプトはプリミティブではなく、コメントを必要としません。ただし、変数「Sin」および「Positive」は、C#オブジェクトであり、事前に宣言する必要があるエイリアス「var0」および「var1」を介してアクセスします。 。



このオブジェクトのタイプについて少し説明します。 .Netプラットフォームの標準機能を使用して、作成したスクリプトはMSILにコンパイルされるため、実行速度は非常に良好です。 スクリプトの頻度は調整できます(トリガー時間)。 コンパイル段階でエラーが発生すると、オブジェクトを作成できません。 実行段階でエラーが発生した場合、または実行時間が許容値(ウォッチドッグ)を超えた場合、オブジェクトは非アクティブ化され、エラーテキストがログに書き込まれます。 ところで、マネージャー([シミュレーション]-> [シミュレーションオブジェクト]-> [アクティブ化/非アクティブ化])または画面にオブジェクトを表示するためのコンテキストメニューを使用して、いつでも任意のタイプのオブジェクトをアクティブ化または非アクティブ化できます。



最終段階はろ過です。 これを行うには、入力変数「Positive」および出力「Filter」を使用してオブジェクト「First-order lag」を作成します。

一次遅れ






結果



いくつかの補助オブジェクトを追加し、画面にディスプレイを配置すると、次の結果が得られます。



これで、たとえば、信号の振幅、周期、またはその他のパラメーターを変更して、すぐに変更を確認できます。



XML形式で保存されたプロジェクト
<ProcessSimulator WindowState="Normal" Top="152" Left="272" Height="703" Width="1463" Split="354"> <Items OPC_Host="" OPC_Server="" UseAccessPath="False" Separator="." IgnoreRoot="False" UpdateRate="0" UseASyncWrite="False" ReducedOPCItemIDs="False" S7PLCSim="False" S7ProSimInstance="1"> <Item Type="Internal" DataType="System.Double" Value="-76.1457525570486" ID="Sin" Comment=" " /> <Item Type="Internal" DataType="System.Double" Value="77.117550442077" ID="Positive" Comment=" " /> <Item Type="Internal" DataType="System.Double" Value="152.754176188765" ID="Filter" Comment="  " /> </Items> <SimulationObjects RefreshRate="0"> <SimulationObject Name="Filter" Active="True" Type="First-order lag" InValueItemID="Positive" OutValueItemID="Filter" LagMS="20000" Gain="1" /> <SimulationObject Name="Positive" Active="True" Type="CSharpScript" Watchdog="1000" TriggerTime="1"> <ItemIDs> <Var Value="Sin" /> <Var Value="Positive" /> </ItemIDs> <Script><![CDATA[if((double)var0 >= 0.0D) { var1 = (double)var0; } else { var1 = -(double)var0; }]]></Script> </SimulationObject> <SimulationObject Name="Positive Output" Active="True" Type="Analog sensor" RawValueItemID="" PhysicalValueItemID="Positive" MaxPhysicalValue="220" MinPhysicalValue="-220" MaxRawValue="27648" MinRawValue="0" Units="" /> <SimulationObject Name="Sine" Active="True" Type="Analog generator" ValueItemID="Sin" Signal="Sine" Bias="-220" Amplitude="220" Period="20000" Turn="0" /> </SimulationObjects> <Screens> <Screen Name="Rectifier" Open="true"> <ViewControl SimulationObject="Positive" Type="Items" X="615" Y="370" Width="230" Height="96" FirstColumnWidth="78" /> <ViewControl SimulationObject="Positive Output" Type="Trend" X="481" Y="0" Width="481" Height="324" UpdateRate="100" TimeFrame="1" Color="FF0000C0" /> <ViewControl SimulationObject="Filter" Type="Trend" X="966" Y="0" Width="481" Height="324" UpdateRate="100" TimeFrame="1" Color="FF000000" /> <ViewControl SimulationObject="Filter" Type="Simple" X="1110" Y="369" /> <ViewControl SimulationObject="Sine" Type="Trend" X="0" Y="0" Width="481" Height="324" UpdateRate="100" TimeFrame="1" Color="FFFF0000" /> <ViewControl SimulationObject="Sine" Type="Simple" X="112" Y="324" /> </Screen> </Screens> </ProcessSimulator>
      
      









外の世界とのつながり





背景
このプロジェクトを始めたばかりの頃、いくつかのジレンマを解決しなければなりませんでした。 まず、SCADAパッケージを使用してシミュレーターを作成するというアイデアがありました。 したがって、通信の主な問題はなくなりました。 その時点で利用可能なシーメンスWinCC 6.2には、OPCやS7-PLCSimを含む多くのドライバーが必要でした。 少し後に、純粋なWinCCで私が計画していたことを実装することが不可能であることが判明しました。 たとえば、バルブストロークが開いてから閉じるまで、すべてが時間制御に基づいています。 次に、WinCCを、シミュレーションを実装する.Net要素(.Netコントロール)を操作するためのコンテナとして使用することを考えました。



たぶんそれは曲がった手にありますが、WinCCで.Net要素を正常に動作させることができませんでした。 インターネットは役に立たなかったので、私はこのベンチャーを放棄することにしました。 WinCC 7の最新バージョンではすべてが機能しているのかもしれませんが、私は知りませんでした。



既製のOPCクライアントライブラリを使用する機会が現れた後、バイクを作成することにしました。次に、外部変数からアクセスするために、内部変数、S7-PLCSimへの接続、そして最後にOPCサーバー機能を追加しました。





上記の例では、内部変数のみが使用されます。 もちろん、これは意味がありません。シミュレータの主なアイデアは、PLCプログラムの実際の機器での作業をシミュレートすることです。



シミュレーターを実行しているコンピューターにSiemens SIMATIC S7-PLCSim(V5.4 + SP4)がインストールされている場合、正弦波を任意の(有効な)PLCシミュレーターメモリに変換した結果を簡単に記録できます。



最初に接続する必要があります(アイテム-> S7 PLCSimの接続)。 インスタンス選択ウィンドウで、1〜8の番号を選択できます。これは、接続するインスタンス番号S7-PLCSim(ウィンドウタイトルに書き込まれます)です。 最新バージョンでは、同じマシンで8つのインスタンスを同時に実行できます。



タイプS7 PLCSimで新しい変数「FilterS7」を作成し、アドレス、たとえばMD0(メモリタイプ= M;データタイプ= S7_DoubleWord;バイト= 0;浮動小数点= true)を指定します。 オブジェクトの「Filter」変数を「FilterS7」に変更するだけで十分です。



OPC接続では、すべてが同じ順序になります。 外部サーバーに接続し([アイテム]-> [OPCの接続])、サーバーで使用可能な変数を作成し、シミュレーションオブジェクトで使用します。



内部変数とは異なり、S7 PLCSimおよびOPC変数は常に読み書き可能ではないことに注意してください。 たとえば、PLCシミュレータのQ領域には出力領域があるため、何も書き込むことができません。



最後に言及したいのは、シミュレーターがOPCサーバーとしてすべての変数にアクセスできることです。 すべての変数は名前の下に表示され、MatrikonOPC ExplorerなどのすべてのOPCクライアントで使用できます。



この機能は、たとえば、S7PLCSimをSCADAまたはOPCをサポートする別のパッケージに接続するために使用できます。 もちろん、以前は、すべての変数をProcess Simulatorに追加する必要があります。



おわりに



自分の仕事に本当に役立つツールを作ることができました。 おそらくそれは他の誰かに役立つでしょう、私はレビューとバグレポートさえ喜んでいます:)。 何かが足りない場合-書いてください。 おそらく、終わりのない出張の合間に、プログラムで利用可能なオブジェクトのライブラリを少し拡張する時間があります。



All Articles