今回はOPTO22第4話になります。今回はOPTO22 EPIC ControllerでOPCUA Serverを立ち上げ、UaExpertとCtrlx のOPC UA Clients app経由でアクセス方法を紹介します。
さ、はじめよう!
OPC UA and OPTO22
groov EPICシステムとgroov RIOモジュールは、OT標準のOPC UAを使用して通信することができます。また、各サーバーは独立しており、EPICまたはRIOで実行されるソフトウェアによって提供されます。プロジェクトの要件を満たすために複数のサーバーを同時に使用することができます。
ネイティブの組み込みOPC UAサーバー(groov EPIC/RIOファームウェア3.4以降)- 認証されたOPC UAクライアントは、I/O値、PID値、スクラッチパッド領域、およびgroov EPICではPAC Controlストラテジーにアクセスできます。
CODESYS- groov EPICでCODESYSを実行している場合、CODESYSのサーバーを使用してCODESYSプログラムとI/OにOPC UAアクセスできます。groov Viewもこのサーバーのクライアントとして使用できます。
OPC UA Client APP and ctrlX
ctrlX OPC UA Clientは、ctrlX CORE内の個別のアプリとして実行されます。
ctrlX COREにアプリをインストールすることで、OPC UAサーバに接続し、そのデータを他のアプリに提供することができます。これにより、OPC UAを使用してネットワーク内の他のデバイス(たとえば、他の制御装置)に標準化されたアクセスが可能となります。
OPC UA Client Appによって接続された「OPC UA」サーバのデータは、ctrlXバックエンドのData Layerを使用してctrlX COREで提供されます。OPC UA Client AppのすべてのデータがctrlX COREのすべてのAppで利用可能となります。
ctrlX OPC UA Client Appは、ctrlX COREにはデフォルトでインストールされていません。したがって、まずctrlX COREにそのアプリをインストールする必要があります。
Reference Link
Opto22
Ctrlx
http://soup01.com/ja/category/bosch/ctrlx/
Implementation-1
最初の接続テストはOpto22からOPC UA Serverを立ち上げ、UaExpertからアクセスをしてみたいと思います。
Configuration
GroovManage をWeb Browserからアクセスし、Data Serviceを開きます。
OPC UA ServerのFieldから”Add OPC UA”をクリックします。
OPC UA Serverの設定画面が表示されました。
TCP Port
Groov CPUのOPC UA Server Port番号です。
Discovery Endpoint
OPC UA ClientがGroov CPUのOPC UA Serverにアクセスするときに必要なEndpoingです。
Enable
もちろん、GroovのOPC UA Server機能を有効にしてください。
Allow Anonymous Access
DefaultではAnonymousアクセスは禁止されています。その設定をDefaultのままにしましょう。
Save
Saveで設定を保存しましょう。
Result
UaExpertを起動し、Custom DiscoveryのところにGroov Manageで設定したDiscovery Endpointを入力しOPC UA Serverを検索しましょう。
Username とPasswordを入力しましょう。
証明書の認証画面が表示され、証明書を信頼し進みましょう。
Done!Groov CPUのOPC UA Serverにアクセスできました。
Implementation 2
次はBosch rexrothのCtrlxにOPC UA Client Appsをインストールし、Groov EIPC CPUのOPC UA Serverをセキュリティ接続してみます。
APP Installation
Ctrlx にOPC UA Client Appsをインストールするため、CtrlxのWeb ServerにアクセスしSettingsを開きます。
Appsをクリックします。
AppsをインストールするためにRuntime ModeをServiceに切り替えます。
Continueで進みます。
Install from fileでAppsをインストールします。
OPC UA Client Appsを選び>Openで進みます。
FileをCtrlx RuntimeにUploadします…
Installで進みます。
しばらく待ちます…
Done!Appsがインストールされました。
左のSlide BarにOPC UAのFieldが追加されました。
OPC UAのFieldを開くとClientが表示されます。つまりOPC UA Clientのことです。
そしてClientをクリックするとアクセスするOPC UA Serverの設定画面が表示されます。
Add Client
Add OPC UA ClientをクリックしGroov EIPC CPUのOPC UA 接続を設定します。
Configuration
Session name
Session nameは接続するOPC UA ServerのSession名で、わかりやすい名前にしましょう。
Authentication
Serverに接続するときの認証方法設定です。
Groov EIPC CPUにはAnonymous Loginが無効になっていると設定しました。
なので、AuthenticationはUsernameに設定してください。
Endpoint URL
Endpoint URLはGroov EIPC CPUのWeb serverにあるOPC UA Serverに合わせてください。最後はPersistentのCheckboxを入れて、Saveで設定を保存します。
Done!Groov EIPC CPUの接続が追加されました。
But..
ですが、接続失敗です。”An Error Occurredverifying security.”というエラーメッセージが表示されました。つまりセキュリティ関係に問題がある、と。
一旦Groov Managerに戻り、Data Serviceを開きます。
OPC UA Server>Client Certificatesを開きます。
Rejected Client Certificatesのところに、Groov EIPC CPUに拒否された証明書があります。
該当する証明書を調べると、Subject Alternative NameにそれはCtrlx の証明書だとわかります。
Trist Certificateをクリックしその証明書を信頼しようにしましょう。
Done!いまCtrlxの証明書がTrusted 側に移動されました。
Result
もう一回Ctrlx側をみると、State=CONNECTEDに変わりました。
Data Layerから実際アクセスしたNodeを確認しましょう。Settingsを開きます。
Data Layerを開きます。
opcuaclientというNodesがあります。
展開するとGroov EIPC CPUのモジュール状態にアクセスできるとわかります。
Implementation3
最後はOPC UA Client Appsで取ったデータをCtrlx PLCで読み取れるようにします。
でも…DataLayer_RealTimeにはOpcua Client Appsのデータがありません。それは、
ctrlX PLC EngineeringのDataLayer_Realtime Nodeは、ctrlXデータレイヤーを介して提供されるリアルタイムデータに対してのみ有効であり、OPC UAクライアントアプリは非リアルタイムデータのみを提供するためだからです。
Add Library
それならCtrlxのライブラリを利用しNon-RealtimeのNodeにアクセスしてみましょう。
Library Mangaerを開きます。
Add Libraryをクリックします。
CXA_DataLayerというライブラリをImportします。
中に今回で使用するDL_ReadNode Function Blockがあります。
DL_ReadNode
この関数ブロックは、指定されたノードから、汎用なデータ型に簡単にアクセスできるようになっています。値のパラメータとして、すべての整数型、実数型、文字列型の任意の IEC 変数を渡すことができます。
VAR_INPUT
Name | Type | Description |
Execute | BOOL | 立ち上げて実行 |
ClientId | IL_HANDLE | Data LayerのClient ID |
NodeName | REFERENCE TO STRING(255) | アクセスするNode名 |
Value | __SYSTEM.AnyType | ノードが返す値 |
VAR_OUTPUT
Name | Type | Description |
Done | BOOL | 1=実行成功 |
Active | BOOL | 1=実行中 |
Error | BOOL | 1=エラーあり |
ErrorID | ERROR_CODE | エラーのクラス |
ErrorIdent | ERROR_STRUCT | エラーの情報 |
Size | DINT | ノードのデータサイズ |
Get the NodeName
次はData Layer画面から必要なNodeのPathを取得します。
アクセスしたいNodeをダブルクリックし>Actions>Copy ICONをクリックします。
NodeのPathが表示されています。
もしくは必要なNodeを偉い、Copies pathを直接にClickしましょう。
Program
こちらはCtrlx 側のプログラムです。DL_ReadNode Function BlockとCASE文を利用しOPC UA ClientのData Layer Nodeを繰り返しでアクセスします。
PROGRAM PLC_PRG VAR DL_ReadNode :DL_ReadNode; NodeNameList :ARRAY[0..3]OF STRING(100); Analog1Value,Temperature1Value:REAL; Switch1,Switch2 :BOOL; istep:INT; END_VAR //Configure the NameList NodeNameList[0]:=’opcuaclient/opto/i=85/ns=2;s=Devices/[myid]/OptoMMP/Modules/Channels/Analog1/Value’; NodeNameList[1]:=’opcuaclient/opto/i=85/ns=2;s=Devices/[myid]/OptoMMP/Modules/Channels/Temperature1/Value’; NodeNameList[2]:=’opcuaclient/opto/i=85/ns=2;s=Devices/[myid]/OptoMMP/Modules/Channels/switch1/State’; NodeNameList[3]:=’opcuaclient/opto/i=85/ns=2;s=Devices/[myid]/OptoMMP/Modules/Channels/switch2/State’; CASE istep OF 0: DL_ReadNode(Execute:=FALSE); IF NOT DL_ReadNode.Error AND NOT DL_ReadNode.Active THEN istep:=10; END_IF 10: DL_ReadNode( Execute:=TRUE ,NodeName:=NodeNameList[0] ,Value:=Analog1Value ); IF DL_ReadNode.Done OR DL_ReadNode.Error THEN IF NOT DL_ReadNode.Error THEN DL_ReadNode(Execute:=FALSE); istep:=20; ELSE istep:=990; END_IF END_IF 20: DL_ReadNode( Execute:=TRUE ,NodeName:=NodeNameList[1] ,Value:=Temperature1Value ); IF DL_ReadNode.Done OR DL_ReadNode.Error THEN IF NOT DL_ReadNode.Error THEN DL_ReadNode(Execute:=FALSE); istep:=30; ELSE istep:=991; END_IF END_IF 30: DL_ReadNode( Execute:=TRUE ,NodeName:=NodeNameList[2] ,Value:=Switch1 ); IF DL_ReadNode.Done OR DL_ReadNode.Error THEN IF NOT DL_ReadNode.Error THEN DL_ReadNode(Execute:=FALSE); istep:=40; ELSE istep:=992; END_IF END_IF 40: DL_ReadNode( Execute:=TRUE ,NodeName:=NodeNameList[3] ,Value:=Switch2 ); IF DL_ReadNode.Done OR DL_ReadNode.Error THEN IF NOT DL_ReadNode.Error THEN DL_ReadNode(Execute:=FALSE); istep:=0; ELSE istep:=993; END_IF END_IF END_CASE |
Result
Done!Data LayerのNodeにアクセスできました!
アナログ値・温度値・デジタル入力のNodeも全部読み取れました!