今回はMATLABを使ってOPCUA Clientしシーメンス側のOPCUA Serverをアクセスと考えています。
事前準備
シーメンスのS7-1500でOPCUA Serverを立ち上げ方法はもうすでにのっていますので詳しく説明しません。下記で参考お願いします。
ちなみに、今回用意したのはこの3つの変数です。
MATLAB
MATLABからOPCUAの使い方は下記のLINK詳しい説明がありますが、ここで使えそうな関数などを簡単に説明したいと思います。
https://www.mathworks.com/help/opc/ug/opcua.html
opchdaserverinfo
HostNameはIPアドレスやServer名でもOKで、Dataタイプが文字列・Vector可能になります。sが”OPC HDA ServerInfo”としてOPC ServerからRead-onlyのプロパティが戻り値になります。
s = opchdaserverinfo(‘HostName’) |
https://www.mathworks.com/help/opc/ug/opcserverinfo.html
opcua
この関数を使ってOPCUA Clientを作成します。入力可能パラメータは:
- ServerInfoObj #opchdaserverinfo関数で取得したもの
- ServerUrl #OPCUA ServerのURL
- Hostname,Portnum #OPCUA ServerのServer名とPort番号
そしてOPC Client Objectが戻ってきます。
UaClient = opcua(ServerInfoObj) UaClient = opcua(ServerUrl) UaClient = opcua(Hostname,Portnum) |
https://www.mathworks.com/help/opc/ug/opcua.html
Connect
OPC Serverと接続する関数です。ObjはOPC Client Objectです。つまり先opcua関数で作成されたObjectをそのまま入れればOkです。
connect(Obj) |
https://www.mathworks.com/help/opc/ug/opcda.connect.html
isConnected
もしOPC Client ObjectがOPC Serverと繋がってるのであればTrue返して来ます。
isConnected(hdaObj) |
https://www.mathworks.com/help/opc/ug/opc.hda.client.isconnected.html
disconnect
OPC Client Objectが接続しるOPC Serverを切ります。
disconnect(Obj) da.Status |
https://www.mathworks.com/help/opc/ug/opcda.disconnect.html
findNodeByName
名前からServer Nodeを検索する関数です。
1列目はNodeNameのプロパティと合ってるすべでのNodeを探します。
2列目はNodeNameのプロパティと合ってる最初1つのNodeを探します。
3列目はすべてNodeNameのプロパティと同じ始まってるのNodeを探します。
4列目はすべてNodeNameのプロパティと同じ始まってる最初1つのNodeを探します。
FoundNodes = findNodeByName(NodeList,NodeName) FoundNodes = findNodeByName(NodeList,NodeName,’-once’) FoundNodes = findNodeByName(NodeList,NodeName,’-partial’) FoundNodes = findNodeByName(NodeList,NodeName,’-once’,’-partial’) |
https://www.mathworks.com/help/opc/ug/opc.ua.node.findnodebyname.html
findNodeById
IndexとIdentifierからServer Nodeを検索する関数です。
FoundNode = findNodeById(NodeList,NsInd,Id) |
https://www.mathworks.com/help/opc/ug/opc.ua.node.findnodebyid.html
Example
では、まずOpcua Serverの情報をいただきます。
>> uaClient = opc.ua.Client(‘opc.tcp://192.168.0.1:4840’) uaClient = OPC UA Client: Server Information: Name: ‘SIMATIC.S7-1500.OPC-UA.Application:PLC_1’ Hostname: ‘192.168.0.1’ Port: 4840 EndpointUrl: ‘opc.tcp://192.168.0.1:4840’ Connection Information: Timeout: 10 Status: ‘Disconnected’ ServerState: ‘<Not connected>’ Security Information: MessageSecurityMode: None ChannelSecurityPolicy: None Endpoints: [1×1 opc.ua.EndpointDescription] |
次はuaClient Objectの状態を確認します。
Disconnectedしてますね。
>> status=uaClient.Status status = ‘Disconnected’ |
Serverを接続します。
>> connect(uaClient) >> |
もう一度Statusを確認したら、もうConnectedに変わりましたね。
>> status=uaClient.Status status = ‘Connected’ |
いまServerのNodeを確認しましょう。
OPCUA Nodeの配列がかえってきます。Indexが1,2,3があり、Indexの数字によってアクセスNode Objectを変わることできます。
>> topNodes=uaClient.Namespace topNodes = 1×3 OPC UA Node array: index Name NsInd Identifier NodeType —– ——— —– ———- ——– 1 Server 0 2253 Object 2 DeviceSet 2 5001 Object 3 PLC_1 3 PLC Object |
次はIndex3のChildren Nodeを見てみましょう。
ちなみに3番はPLC_1、つまりCPUの中身になります。
多分一番情報知りたいのは7のOperate Mode、14と15番のDBかな?
>> serverChildren = topNodes(3).Children serverChildren = 1×19 OPC UA Node array: index Name NsInd Identifier NodeType —– ——————- —– ——————- ——– 1 DeviceManual 3 DeviceManual Variable 2 DeviceRevision 3 DeviceRevision Variable 3 EngineeringRevision 3 EngineeringRevision Variable 4 HardwareRevision 3 HardwareRevision Variable 5 Manufacturer 3 Manufacturer Variable 6 Model 3 Model Variable 7 OperatingMode 3 OperatingMode Variable 8 OrderNumber 3 OrderNumber Variable 9 RevisionCounter 3 RevisionCounter Variable 10 SerialNumber 3 SerialNumber Variable 11 SoftwareRevision 3 SoftwareRevision Variable 12 Icon 3 5201 Variable 13 Counters 3 Counters Object 14 DataBlocksGlobal 3 DataBlocksGlobal Object 15 DataBlocksInstance 3 DataBlocksInstance Object 16 Inputs 3 Inputs Object 17 Memory 3 Memory Object 18 Outputs 3 Outputs Object 19 Timers 3 Timers Object |
それから少し便利の方法を教えます。
browseNamespace()というFunctionを使えばUIでのNodeを検索することができます。
ではdb_OPCuaの中にある3つのNodeを入れましょう。
serverNodes = browseNamespace(uaClient)
OKを押すだけで先選択した3つのNodesを自動的にOPCUA Node Arrayに変換し返してくれます。
serverNodes = 1×3 OPC UA Node array: index Name NsInd Identifier NodeType —– —– —– —————— ——– 1 sw1 3 “db_OPCua”.”sw1″ Variable 2 real1 3 “db_OPCua”.”real1″ Variable 3 int1 3 “db_OPCua”.”int1″ Variable |
そしてreadValue()のFunctionでNode値・TimeStamp・Quality IDをいただきます。
>> [v,t,q]=readValue(uaClient,serverNodes)
v =
3×1 cell array
{[ 1]}
{[4.9920]}
{[ 981]}
t =
3×1 datetime array
13-Jul-2021 17:23:59
13-Jul-2021 17:23:59
13-Jul-2021 17:23:59
q =
OPC UA Quality ID:
‘Good’
‘Good’
‘Good’
もし配列vの中にどある値だけほしいときは{}を使えましょう。
>> v{2} ans = single 4.9920 |
Cellの変換
下記のLinkはCell array変換について説明があります。
https://jp.mathworks.com/help/matlab/cell-arrays.html
はーい、お疲れ様ですー