...
Parameter Name | Parameter Description |
ConnectionConfig | A def containing all the information about connection and security parameters of OPCUA server, it has the following fields ServerUri, SecurityConfig and SecurityMode (0-6). Security Mode Description 0 None 1 128-bit RSA Sign 2 128-bit RSA Sign and encrypt 3 256-bit Basic Sign 4 256-bit Basic Sign and encrypt 5 256-bit SHA Sign 6 256-bit SHA Sign and encrypt |
SecurityConfig | A def containing information about security parameters of the server, it has the following fields UserName, Password, ApplicationIdentity and CertificationParameters. |
ApplicationIdentity | A def Containing information about the client’s Idenitiy, it has following fields AppName, AppUri and ProductUri. |
CertificationParameters | A def containing information about the connection’s certificate parameters, it has following parameters OrgName, Path, PrivateKeyPwd, ValidityInDay, AutoCertificateRenewal and KeySize. |
Operation | This field specifies the operation to be performed, the operation are subscription and write. |
NodeID | This parameter is used in case of write Operation, the Node ID on which the write operation is to be performed. |
AttributeID | This parameter is used in case of write Operation, the Attribute ID of the respective Node ID on which the write operation is to be performed. |
OpcData | This parameter is used in case of write Operation, and this specifies the write value. |
OPCUaSubscribe | A def specific to subscribe operation, It has fields like NodeID: the Node Id to which we need to subscribe. AttributeID: attribute ID is optional for subscription. SubscribeChild: Whether you want to subscribe to child nodes also. PublishingInterval: The frequency at which the OPCUA Server will publish data to this subscriber. NotificationBufferSize: The Buffer size that stores incoming subscription data, increase this value if you see buffer overflows and data misses. |
Usage of opcua protocol handler:
Opcua Write:
Code Block language xml title Opcua Write Facet linenumbers true <ThingFacet Name="OPCWriteFacet"> <String KnownBy="OPCWriteAction" Name="OpcData"/> <String Name="NodeID"/> <Integer Name="AttribueID"/> <ConnectionConfig Name="OPCSubscribeConnectionConfig"/> <Action Name="OPCWriteAction"> <Workflow Limit="1" Live="1" Timeout="-1"> <Task name="Main"> <Event as="ActionArgument" name="Argument"/> <Invoke name="InvokeOPCWrite" post="opcua://?ServerUri=[%:Event.Argument.OPCSubscribeConnectionConfig.ServerUri.Value:%]& SecurityMode=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityMode.Value:%]& UserName=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.UserName.Value:%]& Password=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.Password.Value:%]& Path=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.Path.Value:%]& ValidityInDay=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.ValidityInDay.Value:%]& AutoCertificateRenewal= [%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.AutoCertificateRenewal.Value:%]& PrivateKeyPwd=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.PrivateKeyPwd.Value:%]& OrgName=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.OrgName.Value:%]& KeySize=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.KeySize.Value:%]& AppUri=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.ApplicationIdentity.AppUri.Value:%]& AppName=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.ApplicationIdentity.AppName.Value:%]& ProductUri=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.ApplicationIdentity.ProductUri.Value:%]& Operation=[%:Event.Argument.Operation.Value:%]" scope="local" waitFor="Argument"> <Message> <Value> <Payload> [%:Event.Argument.OpcData.Value:%] </Payload> <NodeID> [%:Event.Argument.NodeID.Value:%] </NodeID> <AttributeID> [%:Event.Argument.AttributeID.Value:%] </AttributeID> </Value> </Message> </Invoke> <Output As="ActionResult" Name="Result"> <Value> <OpcData> <Include> Invoke.InvokeOPCWrite.Message.Value </Include> </OpcData> </Value> </Output> </Task> </Workflow> </Action> </ThingFacet>
Code Block language xml title write Initialization Query linenumbers true <Query> <DeleteAll> <OPCWriteModel> <writeId ne=""/> </OPCWriteModel> </DeleteAll> <Create> <OPCWriteModel> <Operation> write </Operation> <NodeID> Atomiton.OilAndGas.Test.Device1.TankData.Test.Tank1.Tank_1_FCU_Temperature </NodeID> <AttributeID> $Null() </AttributeID> <OPCSubscribeConnectionConfig> <ServerUri> opc.tcp://MSEDGEWIN10:49320 </ServerUri> <SecurityMode> 2 </SecurityMode> <SecurityOptions> <UserName/> <Password/> <ApplicationIdentity> <AppName> atomitonClient@localhost </AppName> <AppUri> urn:localhost:OPCUATQL </AppUri> <ProductUri> urn:atomiton.com:OPCUA </ProductUri> </ApplicationIdentity> <CertificationParameters> <OrgName> atomiton </OrgName> <Path> /atomiton/certs </Path> <PrivateKeyPwd> tql123# </PrivateKeyPwd> <ValidityInDay> 3650 </ValidityInDay> <AutoCertificateRenewal> true </AutoCertificateRenewal> <KeySize> 2048 </KeySize> </CertificationParameters> </SecurityOptions> </OPCSubscribeConnectionConfig> <OpcData> 50 </OpcData> </OPCWriteModel> </Create> </Query>
Code Block language xml title Write Update query linenumbers true <Query> <Find format="version,known"> <OPCWriteModel> <writeId ne=""/> </OPCWriteModel> </Find> <if condition="$Response.Message.Value/Find/Status eq 'Success'"> <then> <SetResponseData> <key> Message.Value.Find.Result.OPCWriteModel.OpcData.Value </key> <value> 200 </value> </SetResponseData> <Update> <from> Result </from> <Include> $Response.Message.Value.Find </Include> </Update> </then> </if> </Query>
Opcua Subscription:
Code Block language xml title Opcua Subscription Facet linenumbers true <Def Name="CertificationParams"> <String Name="OrgName"/> <String Name="Path"/> <String Name="PrivateKeyPwd"/> <String Name="ValidityInDay"/> <String Name="AutoCertificateRenewal"/> <Integer Name="KeySize"/> </Def> <Def Name="AppIdentity"> <String Name="AppName"/> <String Name="AppUri"/> <String Name="ProductUri"/> </Def> <Def Name="SecurityConfig"> <String Name="UserName"/> <String Name="Password"/> <AppIdentity Name="ApplicationIdentity"/> <CertificationParams Name="CertificationParameters"/> </Def> <Def Name="ConnectionConfig"> <String Name="ServerUri"/> <Integer Name="SecurityMode"/> <SecurityConfig Name="SecurityOptions"/> </Def> <Def Name="OPCUaSubscribe"> <String <String Name="NodeID" Cardinality="0..m" Name="NodeID"/> <String Name="AttributeID"/> <String Name="SubscribeChild"/> <String Name="SamplingRatePublishingInterval"/> <String Name="NotificationBufferSize"/> </Def> <ThingFacet Name="OPCSubscriberFacet"> <String Format="$ObjectFormat(xml)" KnownBy="OPCSubscriberAction" Name="SubscriptionData" update="auto"/> <String Name="Operation"/> <ConnectionConfig Name="OPCSubscribeConnectionConfig"/> <OPCUaSubscribe Name="OPCSubscriptionConfig"/> <Action Name="OPCSubscriberAction"> <Workflow Limit="1" Live="1" Timeout="-1"> <Task name="Main" while="true"> <Event as="ActionArgument" name="Argument"/> <Invoke name="InvokeOPCSubscription" post="opcua://?ServerUri=[%:Event.Argument.OPCSubscribeConnectionConfig.ServerUri.Value:%]& SecurityMode=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityMode.Value:%]& UserName=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.UserName.Value:%]& Password=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.Password.Value:%]& Path=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.Path.Value:%]& ValidityInDay=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.ValidityInDay.Value:%]& AutoCertificateRenewal= [%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.AutoCertificateRenewal.Value:%]& PrivateKeyPwd=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.PrivateKeyPwd.Value:%]& OrgName=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.OrgName.Value:%]& KeySize=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.CertificationParameters.KeySize.Value:%]& AppUri=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.ApplicationIdentity.AppUri.Value:%]& AppName=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.ApplicationIdentity.AppName.Value:%]& ProductUri=[%:Event.Argument.OPCSubscribeConnectionConfig.SecurityOptions.ApplicationIdentity.ProductUri.Value:%]& Operation=[%:Event.Argument.Operation.Value:%]" scope="process" waitFor="Argument"> <Message> <Value> <OPCSubscriptionConfig> [:Event.Argument.OPCSubscriptionConfig:] </OPCSubscriptionConfig> </Value> </Message> </Invoke> <Output As="ActionResult" Name="Result"> <Value> <SubscriptionData> <Include> Invoke.InvokeOPCSubscription.Message.Value </Include> </SubscriptionData> </Value> </Output> </Task> </Workflow> </Action> </ThingFacet>
Code Block language xml title Subscription Initialization Query linenumbers true <Query> <DeleteAll> <OPCSubscriberModel> <subscribeId ne=""/> </OPCSubscriberModel> </DeleteAll> <Create> <OPCSubscriberModel> <Operation> subscription </Operation> <OPCSubscribeConnectionConfig> <ServerUri> opc.tcp://MSEDGEWIN10:49320 </ServerUri> <SecurityMode> 2 </SecurityMode> <SecurityOptions> <UserName/> <Password/> <ApplicationIdentity> <AppName> atomitonClient@localhost </AppName> <AppUri> urn:localhost:OPCUATQL </AppUri> <ProductUri> urn:atomiton.com:OPCUA </ProductUri> </ApplicationIdentity> <CertificationParameters> <OrgName> atomiton </OrgName> <Path> /atomiton/certs <certs</Path> <PrivateKeyPwd> tql123# </PrivateKeyPwd> <ValidityInDay> 3650 </ValidityInDay> <AutoCertificateRenewal> true </AutoCertificateRenewal> <KeySize> 2048 </KeySize> </CertificationParameters> </SecurityOptions> </OPCSubscribeConnectionConfig> <OPCSubscriptionConfig> <NodeID> ns=2;s=Atomiton.OilAndGas.TestVopak.Device1.TankData.TestUSSAV1S01HST.Tank1 </NodeID> <NodeID> ns=2;s=Atomiton.OilAndGas.TestVopak.Device1.TankData.TestUSSAV1S01HST.Tank2 </NodeID> <AttributeID/> <SamplingRate><PublishingInterval>1000</PublishingInterval> 1000 </SamplingRate><NotificationBufferSize>5000</NotificationBufferSize> <SubscribeChild> true </SubscribeChild> </OPCSubscriptionConfig> <SubscriptionData><SubscriptionData>$Null()</SubscriptionData> $Null<SubscriptionPayload>$Null() </SubscriptionData>SubscriptionPayload> </OPCSubscriberModel> </Create> </Query>
Code Block language xml title Subscription Deletion Query linenumbers true <Query> <DeleteAll> <OPCSubscriberModel> <subscribeId ne=""/> </OPCSubscriberModel> </DeleteAll> </Query>
Note: It is possible to subscribe to multiple root nodes using a single facet, use multiple Node ID's as shown in above subscription query
Code Block language xml title Multiple topics subscription linenumbers true <NodeID> ns=2;s=Atomiton.OilAndGas.Test.Device1.TankData.Test.Tank1 </NodeID> <NodeID> ns=2;s=Atomiton.OilAndGas.Test.Device1.TankData.Test.Tank2 </NodeID>
...