Opto22#Groov EPIC ControllerでOPC UA Server使ってみよう

今回は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

Opto22#Groov EPIC ControllerにCodesysを入れよう
Opto22#Groov EPIC ControllerをModbusTCP経由でIOデータを取ってみよう
Opto22#Groov EPIC ControllerでMQTTを使ってみよう

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

NameTypeDescription
ExecuteBOOL立ち上げて実行
ClientIdIL_HANDLEData LayerのClient ID
NodeNameREFERENCE TO STRING(255)アクセスするNode名
Value__SYSTEM.AnyTypeノードが返す値

VAR_OUTPUT

NameTypeDescription
DoneBOOL1=実行成功
ActiveBOOL1=実行中
ErrorBOOL1=エラーあり
ErrorIDERROR_CODEエラーのクラス
ErrorIdentERROR_STRUCTエラーの情報
SizeDINTノードのデータサイズ

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も全部読み取れました!

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする