HIL SCADAベースのクライアントを備えたOPC
HIL SCADA内の1つのHILデバイスで2つのOPC UAサーバーを構成およびシミュレートする方法のデモンストレーション
導入
オープンプラットフォームコミュニケーション(OPC)は、産業用デバイスおよびアプリケーションの通信とデータ交換のための相互運用性規格です。UAは「Unified Architecture(統合アーキテクチャ)」の略で、プラットフォームに依存せず、複数ベンダーのデバイス間でのデータ交換を可能にする、この規格の最新バージョンを指します。
Typhoon HIL Control Center Schematic Editor のOPC UA Serverコンポーネントを使用すると、HIL デバイス内の OPC UA サーバーインスタンスをリアルタイムでシミュレートできます。通常、OPC UA サーバーはプラントに接続され、OPC UA クライアントは SCADA システムのリモート制御および監視によく使用されます。そこで、THCC で完全な OPC UA ネットワーク例をシミュレートするために、OPC UA クライアントは Python を使用して Typhoon HIL SCADA に実装し、OPC UA Server コンポーネントは HIL デバイス内のサーバー側をシミュレートするために使用されました。このアプリケーションノートでは、外部のサードパーティ製ソフトウェアを必要とせずに、Typhoon HIL で OPC UA クライアントとサーバーを表示および操作する方法を示します。
Python opcua-asyncio は、Typhoon HIL SCADA アプリケーションで OPC UA クライアントをシミュレートするために使用される Python オープンソースライブラリです。opcua -asyncioは、python-opcua (OPC UA バイナリプロトコル実装) をベースにした非同期 OPC UA クライアントおよびサーバーライブラリです。このライブラリは様々な OPC UA スタックでテストされており、OPC UA 実装のテストにおいて優れたカバレッジを提供します。このライブラリの詳細については、次のリンクを参照してください: https://github.com/FreeOpcUa/opcua-asyncio 。
このライブラリは Typhoon HIL Control Center のインストールと一緒に出荷されるため、事前の設定は必要ありません。
モデルの説明
このサンプルモデルは、1つのHILデバイスで2つのOPC UAサーバーを構成およびシミュレーションする方法を示します。このサンプルモデルは、同じIPアドレスを持ちながら異なるポートを持つ2つのOPC UAサーバーで構成されており、1つの固定DC電圧源と2つの抵抗器で構成されるシンプルな回路(図1 )から電圧と電流を測定します。OPC UAサーバーコンポーネントは、回路図エディターのライブラリエクスプローラーの「通信プロトコル」カテゴリから直接使用できます。

2 つの OPC UA サーバー コンポーネントは、2 番目の抵抗器を回路に接続する単一のスイッチを制御します。これにより負荷が増加し、それに応じて OPC UA クライアントの SCADA パネルに表示される電流が増加します。
設定は初期化スクリプト内で行われ、OPC UAサーバーに関するすべての設定を行うことができます。この設定には、IPアドレス、ポート番号、入出力変数の設定が含まれます。このモデルに採用されている設定を以下に示します。
config1 = {
'ip_addr': '192.168.42.79',
'port': 16664,
'netmask': '255.255.255.0',
'nodes_in' : {
'current_in': (0, 'real'),
'voltage_in': (1, 'real'),
'current_voltage':([0,1], 'real')
},
'nodes_out' : {
'cmd_out': (0, 'int'),
},
}
config2 = {
'ip_addr': '192.168.42.79',
'port': 16665,
'netmask': '255.255.255.0',
'nodes': {
'Measurements':
{
'Current in': (0, 'real', 'in'),
'Voltage in': (1, 'real', 'in'),
'Current and voltage': ([0, 1], 'real', 'in'),
},
'Outputs':{
'Cmd out': (0, 'int', 'out'),
}
}
}
この例を実行するには、IPアドレスの設定に注意してください。OPC UAクライアントはSCADAで実行されるため、コンピュータネットワークは192.168.42.XXのIP範囲( XXは2 ~254の任意の値(サーバーのIPを除く))内に配置されている必要があります。ネットワークを静的IPとして設定し、このIPが使用可能かどうかを確認してください(WindowsのコマンドプロンプトからPINGコマンドを実行するなど)。
シミュレーション
この例には、あらかじめ構築されたSCADAパネル(図2 )が付属しています。このパネルには、実行時にシミュレーションを監視および操作するための最も重要なユーザーインターフェース要素(ウィジェット)が用意されています。ニーズに合わせて自由にカスタマイズできます。このアプリケーションでは、提供されるSCADAパネルは非常にシンプルで、クライアントのステータスをオン/オフに設定できるコンボボックスと、電流と電圧の測定値を表示するウィジェットが含まれています。

クライアントの実装は、以下に示すように、 python-asyncuaライブラリを使用して、初期化スクリプト内および SCADA ウィジェット内で行われます。
コードの簡単な説明は以下になります。import asyncua
import asyncio
from asyncua import Client,ua
import time
global cl
global url
global url2
global cl2
server_ip_address = '192.168.42.79'
port_number = 16664
netmask = '255.255.255.0'
url = 'opc.tcp://{}:{}'.format(server_ip_address, port_number)
server_ip_address2 = '192.168.42.79'
port_number2 = 16665
netmask2 = '255.255.255.0'
url2 = 'opc.tcp://{}:{}'.format(server_ip_address2, port_number2)
cl2 = Client(url2)
async def get_voltage(url):
async with Client(url) as cl:
voltage_in = cl.get_node("ns=1;s=voltage_in")
voltage = await voltage_in.get_value()
return voltage
async def get_current(url):
async with Client(url) as cl:
current_in = cl.get_node("ns=1;s=current_in")
current = await current_in.get_value()
return current
async def set_cmd(url,variable):
async with Client(url) as cl:
cmd_out = cl.get_node("ns=1;s=cmd_out")
await cmd_out.set_value(ua.Variant(variable, ua.VariantType.Int32))
return 0
async def get_voltage_v2(url2):
async with Client(url2) as cl:
voltage_in = cl.get_node("ns=1;s=Voltage in")
voltage = await voltage_in.get_value()
return voltage
async def get_current_v2(url2):
async with Client(url2) as cl:
current_in = cl.get_node("ns=1;s=Current in")
current = await current_in.get_value()
return current
async def set_cmd_v2(url1,variable):
async with Client(url2) as cl2:
cmd_out = cl.get_node("ns=1;s=Cmd out")
await cmd_out.set_value(ua.Variant(variable, ua.VariantType.Int32))
return 0
hil.set_source_constant_value('Vs1', value=10.0)
このスクリプトは、 asyncuaライブラリをインポートし、OPC UAサーバーへの読み取りおよび書き込み操作を実行するために必要なすべての関数を宣言することから始まります。最初に、サーバーのIPアドレスとポートをエンドポイントURLとしてこのスクリプトに指定する必要があります。これは、OPC UAクライアントがOPC UAサーバーを見つけて接続するために使用するネットワーク上の場所です。
OPC UAサーバーから変数を読み取るには、変数が配置されているノードを指定したget_node()プロパティを使用し、次にget_value()プロパティを使用して対象の変数の値を取得する必要があります。すべての変数において、名前空間(ns)は1にする必要があります。
任意の OPC UA サーバーに書き込むには、 get_node()およびset_value()プロパティを呼び出して、書き込みたい変数を引数として渡す必要があります。
クライアントの初期化後、シミュレーション実行時に実行するアクションを定義する必要があります。そのためには、SCADAライブラリのウィジェットを使用し、それらのウィジェット内でOPC UAクライアント関数を呼び出すことができます。以下は、Va1ウィジェット内でサーバー内の変数を読み書きする関数を呼び出し、その結果を表示する例です。
グローバルURL displayValue = asyncio.run(get_voltage(url))
さらに、以下はクライアント ステータス ウィジェットで同じことを実行する方法の例です。
if inputValue == 'On': # 'Case 1' が選択されたときに何かする asyncio.run(set_cmd(url,1)) pass elif inputValue == 'Off': # 'Case 2' が選択されたときに何かする asyncio.run(set_cmd(url,0)) pass
適切な関数とウィジェットを使用して OPC UA クライアントを設定したら、モデルを HIL デバイスまたは VHIL にロードしてシミュレーションを実行できます。
シミュレーションを実行すると、OPC UAクライアントが接続し、サーバーから電圧と電流の測定値を読み取り始めます。すべてが順調に進んだ場合、電圧測定値は10V、電流測定値は100Aとなるはずです。

クライアントステータスコンボボックスウィジェットをオフからオンに変更すると、OPC UAサーバーによって制御されるモデル内のコンタクタS2を閉じるコマンドが送信されます。コンタクタが正しく閉じられると、LED cmd_out が点灯し、電流測定値が100Aから200Aに増加することが期待できます。

このアプリケーションノートでは、スケマティックエディタでOPC UAネットワークを設定する方法を説明しました。OPC UAサーバーは、スケマティックエディタのOPC UAサーバーコンポーネントを使用してHILデバイス内でシミュレートされ、OPC UAクライアントは、Python OPC UAオープンソース実装を使用してHIL SCADAアプリケーション内でシミュレートされます。
このサンプル モデルを使用すると、クライアントを OPA UA と互換性のある他のデバイスに置き換えることで、OPC UA ネットワークのテストとトラブルシューティングを実行できます。
ファイル | |
---|---|
Typhoon HILファイル |
examples\models\communication protocols\opc ua\OPC UA SCADA セットアップ.tse, SCADAクライアント.cus |
最小ハードウェア要件 | |
HILデバイス数 | 1 |
HILデバイスモデル | HIL101 |
デバイス構成 | 1 |
テスト自動化
この例のテスト自動化はまだありません。ご協力いただける場合はお知らせください。アプリケーションノートへの署名を喜んで承ります。
著者
[1] ヨヴァナ・マルコビッチ