编写 OPC UA Compile的模型设计文件

news2024/12/26 9:17:36

OPC Foundation 开源了一个模型编译工具-UA ModelCompiler.它接受下面两种信息模型格式:

  • NodeSet2.xml
  • ModelDesign.xml

    看来ModelDesign 是专门为UA ModelCompiler设计的,采用了分层结构描述,它比NodeSet2 可读性更好一点。适合使用普通文本编辑器手工编写。

编辑完成后,使用 UA-ModelCompiler 编译为NodeSet2.xml,C# 的数据常量和类。可以将它们结合到OPCUA 的Server中去。

例子 锅炉类型

这个例子考虑了锅炉中从水中产生蒸汽的真实过程。系统(锅炉)包括:

  • 输入和输出管道

  • 锅炉汽包

  • 控制模块

  • 传感器

锅炉如下图所示

 OPC UA 模型

 OPC UA 地址空间模型设计器中的锅炉模型

        可以使用多种工具来构建OPC UA 地址空间中的模型,设计的输出是模型的XML 描述,OPCUA Fundation 提出了XML 的格式规范,NodeSet2.xml,在ModelCompiler 项目中又提出了ModelDesign.xml 的格式。

模型设计器的输出

  • NodeSet2.xml
  • ModelDesign.xml

模型的结构

锅炉

      输入管道(Input Pipe)

                流量变送器(FlowTransmitter1)

                阀门(Valve)

     汽包(Drum)

                位指示器(LevelIndicator)

       输出管道(Output Pipe)

                流量变送器(FlowTransmitter2)

定义的类型

从上面的结构看,我们需要建立下面几种类型

BoilerType

BoilerInputPipeType

FlowTransmitter1

ValveType

BoilerDrumType

LevelIndicatorType

BoilerOutputPipeType

FlowTransmitter2

但是还需要构建一些支持类型

(1)FlowTransmitter1和FlowTransmitter2 分别是输入管道和输出管道中的流量发送器,因此,需要定义:

FlowTransmitterType

(2)FlowTransmitterType和LevelIndicatorType的基类型是通用传感器,因此定义:

GenericSensorType

(3)阀门的基类型是通用执行器类型,因此定义

GenericActuatorType

 (4)在信息模型的右边,还定义的控制部分的模型,它们包括

  流量控制器 FlowTransmitterType(FC001)

   位控制器  LevelIndicatorType(LC001)

 (5) 位控制器和流量控制器的基类型是通用控制器

    GenericControllerType

(6)还有一个定制控制器

   定制控制器CustomControllerType(CC1001)

(7) 该模型中,还定义了某厂商的流量发送器类型

AcmeFlowTransmitterType

(8) 此外定义测试数据类型

TestDataObjectType

(9) 方法

CreateBoiler

我理解该信息模型主要是为了展示Model.xml 的模型定义方法,我们并不需要去深入了解模型的实际意义。

使用文本编辑器编写ModelDesgn.xml 文档

<?xml version="1.0" encoding="utf-8" ?>
<opc:ModelDesign
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:opc="http://opcfoundation.org/UA/ModelDesign.xsd"
  xmlns:ua="http://opcfoundation.org/UA/"
  xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd"
	xmlns="http://opcfoundation.org/UA/Sample/"
  TargetNamespace="http://opcfoundation.org/UA/Sample/"
>
  <opc:Namespaces>
    <opc:Namespace Name="OpcUa" Prefix="Opc.Ua" InternalPrefix="Opc.Ua.Server" XmlNamespace="http://opcfoundation.org/UA/2008/02/Types.xsd">http://opcfoundation.org/UA/</opc:Namespace>
    <opc:Namespace Name="Sample" Prefix="Opc.Ua.Sample">http://opcfoundation.org/UA/Sample/</opc:Namespace>
  </opc:Namespaces>

  <opc:ReferenceType SymbolicName="FlowTo" BaseType="ua:NonHierarchicalReferences">
    <opc:Description>A reference that indicates a flow between two objects.</opc:Description>
    <opc:InverseName>FlowFrom</opc:InverseName>
  </opc:ReferenceType>

  <opc:ReferenceType SymbolicName="HotFlowTo" BaseType="FlowTo">
    <opc:Description>A reference that indicates a high temperature flow between two objects.</opc:Description>
    <opc:InverseName>HotFlowFrom</opc:InverseName>
  </opc:ReferenceType>

  <opc:ReferenceType SymbolicName="SignalTo" BaseType="ua:NonHierarchicalReferences">
    <opc:Description>A reference that indicates an electrical signal between two variables.</opc:Description>
    <opc:InverseName>SignalFrom</opc:InverseName>
  </opc:ReferenceType>

  <opc:ReferenceType SymbolicName="HasVendor" BaseType="ua:NonHierarchicalReferences">
    <opc:Description>Specified the vendor for a peice of equipment.</opc:Description>
    <opc:InverseName>VendorFor</opc:InverseName>
  </opc:ReferenceType>

  <opc:ObjectType SymbolicName="GenericControllerType" BaseType="ua:BaseObjectType">
    <opc:Description>A generic PID controller</opc:Description>
    <opc:Children>
      <opc:Property SymbolicName="Measurement" DataType="ua:Double" />
      <opc:Property SymbolicName="SetPoint" DataType="ua:Double" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Property SymbolicName="ControlOut" DataType="ua:Double" />
    </opc:Children>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="GenericSensorType" BaseType="ua:BaseObjectType">
    <opc:Description>A generic sensor that read a process value.</opc:Description>
    <opc:Children>
      <opc:Variable SymbolicName="Output" DataType="ua:Double" TypeDefinition="ua:AnalogItemType">
      </opc:Variable>
    </opc:Children>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="GenericActuatorType" BaseType="ua:BaseObjectType">
    <opc:Description>Represents a piece of equipment that causes some action to occur.</opc:Description>
    <opc:Children>
      <opc:Variable SymbolicName="Input" DataType="ua:Double" TypeDefinition="ua:AnalogItemType" AccessLevel="Write" />
    </opc:Children>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="CustomControllerType" BaseType="ua:BaseObjectType">
    <opc:Description>A custom PID controller with 3 inputs</opc:Description>
    <opc:Children>
      <opc:Property SymbolicName="Input1" DataType="ua:Double" AccessLevel="Write" />
      <opc:Property SymbolicName="Input2" DataType="ua:Double" AccessLevel="Write" />
      <opc:Property SymbolicName="Input3" DataType="ua:Double" AccessLevel="Write" />
      <opc:Property SymbolicName="ControlOut" DataType="ua:Double" />
    </opc:Children>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="ValveType" BaseType="GenericActuatorType">
    <opc:Description>An actuator that controls the flow through a pipe.</opc:Description>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="LevelControllerType" BaseType="GenericControllerType">
    <opc:Description>A controller for the level of a fluid in a drum.</opc:Description>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="FlowControllerType" BaseType="GenericControllerType">
    <opc:Description>A controller for the flow of a fluid through a pipe.</opc:Description>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="LevelIndicatorType" BaseType="GenericSensorType">
    <opc:Description>A sensor that reports the level of a liquid in a tank.</opc:Description>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="FlowTransmitterType" BaseType="GenericSensorType">
    <opc:Description>A sensor that reports the flow of a liquid through a pipe.</opc:Description>
  </opc:ObjectType>                                                              

  <opc:ObjectType SymbolicName="AcmeFlowTransmitterType" BaseType="FlowTransmitterType">
    <opc:Description>A flow transmitter manufactured by Wile E. Coyote Enterprises.</opc:Description>
    <opc:Children>
      <opc:Property SymbolicName="SerialNumber" DataType="ua:String">
        <opc:DefaultValue>
          <uax:String>0000000</uax:String>
        </opc:DefaultValue>
      </opc:Property>
      <opc:Property SymbolicName="Documentation" DataType="ua:LocalizedText" ModellingRule="MandatoryShared">
        <opc:DefaultValue>
          <uax:LocalizedText>
            <uax:Locale>en</uax:Locale>
              <uax:Text>This documentation appears to be a recipe on how to cook road runners...</uax:Text>
          </uax:LocalizedText>
        </opc:DefaultValue>
      </opc:Property>
      <opc:Property SymbolicName="CalibrationParameters" DataType="ua:Double" ValueRank="Array" ModellingRule="Optional" />
      <opc:Method SymbolicName="Calibrate" ModellingRule="Mandatory">
        <opc:InputArguments>
          <opc:Argument Name="ScanRate" DataType="ua:Double">
            <opc:Description>How frequently to scan values when calibrating.</opc:Description>
          </opc:Argument>
          <opc:Argument Name="Duration" DataType="ua:Double">
            <opc:Description>The duration of the calibration cycle in seconds.</opc:Description>
          </opc:Argument>
        </opc:InputArguments>
        <opc:OutputArguments>
          <opc:Argument Name="Report" DataType="ua:String">
            <opc:Description>A text report containing the calibration parameters.</opc:Description>
          </opc:Argument>
        </opc:OutputArguments>
      </opc:Method>
    </opc:Children>
  </opc:ObjectType>

  <opc:Method SymbolicName="CreateInstance">
    <opc:Description>Creates an instance of an object or variable.</opc:Description>
    <opc:InputArguments>
      <opc:Argument Name="ParentId" DataType="ua:NodeId">
        <opc:Description>The parent of the new instance.</opc:Description>
      </opc:Argument>
      <opc:Argument Name="ReferenceTypeId" DataType="ua:NodeId">
        <opc:Description>The reference from the parent to the new instance.</opc:Description>
      </opc:Argument>
      <opc:Argument Name="BrowseName" DataType="ua:QualifiedName">
        <opc:Description>The browse name for the new instance.</opc:Description>
      </opc:Argument>
    </opc:InputArguments>
    <opc:OutputArguments>
      <opc:Argument Name="InstanceId" DataType="ua:NodeId">
        <opc:Description>The identifier assigned to the new instance.</opc:Description>
      </opc:Argument>
    </opc:OutputArguments>
  </opc:Method>

  <opc:ObjectType SymbolicName="BoilerInputPipeType" BaseType="ua:FolderType">
    <opc:Children>
      <opc:Object SymbolicName="FlowTransmitter1" TypeDefinition="FlowTransmitterType" SupportsEvents="true">
        <opc:BrowseName>FTX001</opc:BrowseName>
      </opc:Object>
      <opc:Object SymbolicName="Valve" TypeDefinition="ValveType" SupportsEvents="true">
        <opc:BrowseName>ValveX001</opc:BrowseName>
      </opc:Object>
    </opc:Children>
    <opc:References>
      <opc:Reference>
        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>
        <opc:TargetId>BoilerInputPipeType_FlowTransmitter1</opc:TargetId>
      </opc:Reference>
    </opc:References>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="BoilerDrumType" BaseType="ua:FolderType">
    <opc:Children>
      <opc:Object SymbolicName="LevelIndicator" TypeDefinition="LevelIndicatorType" SupportsEvents="true">
        <opc:BrowseName>LIX001</opc:BrowseName>
      </opc:Object>
    </opc:Children>
    <opc:References>
      <opc:Reference>
        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>
        <opc:TargetId>BoilerDrumType_LevelIndicator</opc:TargetId>
      </opc:Reference>
    </opc:References>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="BoilerOutputPipeType" BaseType="ua:FolderType">
    <opc:Children>
      <opc:Object SymbolicName="FlowTransmitter2" TypeDefinition="FlowTransmitterType" SupportsEvents="true">
        <opc:BrowseName>FTX002</opc:BrowseName>
      </opc:Object>
    </opc:Children>
    <opc:References>
      <opc:Reference>
        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>
        <opc:TargetId>BoilerOutputPipeType_FlowTransmitter2</opc:TargetId>
      </opc:Reference>
    </opc:References>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="BoilerType" BaseType="ua:BaseObjectType">
    <opc:Description>A boiler used to produce stream.</opc:Description>
    <opc:Children>
      <opc:Object SymbolicName="InputPipe" TypeDefinition="BoilerInputPipeType" SupportsEvents="true">
        <opc:BrowseName>PipeX001</opc:BrowseName>
        <opc:Children>
          <opc:Object SymbolicName="FlowTransmitter1">
            <opc:BrowseName>FTX001</opc:BrowseName>
            <opc:Children>
              <opc:Variable SymbolicName="Output" />
            </opc:Children>
          </opc:Object>
          <opc:Object SymbolicName="Valve">
            <opc:BrowseName>ValveX001</opc:BrowseName>
            <opc:Children>
              <opc:Variable SymbolicName="Input" />
            </opc:Children>
          </opc:Object>
        </opc:Children>
        <opc:References>
          <opc:Reference>
            <opc:ReferenceType>FlowTo</opc:ReferenceType>
            <opc:TargetId>BoilerType_Drum</opc:TargetId>
          </opc:Reference>
        </opc:References>
      </opc:Object>
      <opc:Object SymbolicName="Drum" TypeDefinition="BoilerDrumType" SupportsEvents="true">
        <opc:BrowseName>DrumX001</opc:BrowseName>
        <opc:Children>
          <opc:Object SymbolicName="LevelIndicator">
            <opc:BrowseName>LIX001</opc:BrowseName>
            <opc:Children>
              <opc:Variable Declaration="GenericSensorType_Output" />
            </opc:Children>
          </opc:Object>
        </opc:Children>
        <opc:References>
          <opc:Reference>
            <opc:ReferenceType>HotFlowTo</opc:ReferenceType>
            <opc:TargetId>BoilerType_OutputPipe</opc:TargetId>
          </opc:Reference>
        </opc:References>
      </opc:Object>
      <opc:Object SymbolicName="OutputPipe" TypeDefinition="BoilerOutputPipeType" SupportsEvents="true">
        <opc:BrowseName>PipeX002</opc:BrowseName>
        <opc:Children>
          <opc:Object SymbolicName="FlowTransmitter2">
            <opc:BrowseName>FTX002</opc:BrowseName>
            <opc:Children>
              <opc:Variable SymbolicName="Output" />
            </opc:Children>
          </opc:Object>
        </opc:Children>
      </opc:Object>
      <opc:Object SymbolicName="FlowController" TypeDefinition="FlowControllerType">
        <opc:BrowseName>FCX001</opc:BrowseName>
        <opc:Children>
          <opc:Property SymbolicName="Measurement">
            <opc:References>
              <opc:Reference IsInverse="true">
                <opc:ReferenceType>SignalTo</opc:ReferenceType>
                <opc:TargetId>BoilerType_InputPipe_FlowTransmitter1_Output</opc:TargetId>
              </opc:Reference>
            </opc:References>
          </opc:Property>
          <opc:Property SymbolicName="SetPoint" />
          <opc:Property SymbolicName="ControlOut">
            <opc:References>
              <opc:Reference>
                <opc:ReferenceType>SignalTo</opc:ReferenceType>
                <opc:TargetId>BoilerType_InputPipe_Valve_Input</opc:TargetId>
              </opc:Reference>
            </opc:References>
          </opc:Property>
        </opc:Children>
      </opc:Object>
      <opc:Object SymbolicName="LevelController" TypeDefinition="LevelControllerType">
        <opc:BrowseName>LCX001</opc:BrowseName>
        <opc:Children>
          <opc:Property SymbolicName="Measurement">
            <opc:References>
              <opc:Reference IsInverse="true">
                <opc:ReferenceType>SignalTo</opc:ReferenceType>
                <opc:TargetId>BoilerType_Drum_LevelIndicator_Output</opc:TargetId>
              </opc:Reference>
            </opc:References>
          </opc:Property>
          <opc:Property SymbolicName="SetPoint" />
          <opc:Property SymbolicName="ControlOut">
            <opc:References>
              <opc:Reference>
                <opc:ReferenceType>SignalTo</opc:ReferenceType>
                <opc:TargetId>BoilerType_CustomController_Input1</opc:TargetId>
              </opc:Reference>
            </opc:References>            
          </opc:Property>
        </opc:Children>
      </opc:Object>
      <opc:Object SymbolicName="CustomController" TypeDefinition="CustomControllerType">
        <opc:BrowseName>CCX001</opc:BrowseName>
        <opc:Children>
          <opc:Property SymbolicName="Input1" />
          <opc:Property SymbolicName="Input2">
            <opc:References>
              <opc:Reference IsInverse="true">
                <opc:ReferenceType>SignalTo</opc:ReferenceType>
                <opc:TargetId>BoilerType_InputPipe_FlowTransmitter1_Output</opc:TargetId>
              </opc:Reference>
            </opc:References>
          </opc:Property>
          <opc:Property SymbolicName="Input3">
            <opc:References>
              <opc:Reference IsInverse="true">
                <opc:ReferenceType>SignalTo</opc:ReferenceType>
                <opc:TargetId>BoilerType_OutputPipe_FlowTransmitter2_Output</opc:TargetId>
              </opc:Reference>
            </opc:References>
          </opc:Property>
          <opc:Property SymbolicName="ControlOut">
            <opc:References>
              <opc:Reference>
                <opc:ReferenceType>SignalTo</opc:ReferenceType>
                <opc:TargetId>BoilerType_FlowController_SetPoint</opc:TargetId>
              </opc:Reference>
            </opc:References>
          </opc:Property>
        </opc:Children>
      </opc:Object>
      <opc:Method SymbolicName="CreateBoiler" TypeDefinition="CreateInstance" ModellingRule="None">
        <opc:BrowseName>CreateBoiler</opc:BrowseName>
      </opc:Method>
    </opc:Children>
    <opc:References>
      <opc:Reference>
        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>
        <opc:TargetId>BoilerType_InputPipe</opc:TargetId>
      </opc:Reference>
      <opc:Reference>
        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>
        <opc:TargetId>BoilerType_Drum</opc:TargetId>
      </opc:Reference>
      <opc:Reference>
        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>
        <opc:TargetId>BoilerType_OutputPipe</opc:TargetId>
      </opc:Reference>
    </opc:References>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="MaintenanceEventType" BaseType="ua:BaseEventType">
    <opc:Children>
      <opc:Property SymbolicName="MustCompleteByDate" DataType="ua:DateTime">
        <opc:Description>When the maintenence must be completed.</opc:Description>
      </opc:Property>
      <opc:Property SymbolicName="IsScheduled" DataType="ua:Boolean">
        <opc:Description>True if the required maintenence is regularily scheduled.</opc:Description>
      </opc:Property>
    </opc:Children>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="Maintenance2EventType" BaseType="MaintenanceEventType">
    <opc:Children>
      <opc:Property SymbolicName="WorkorderId" DataType="ua:String">
        <opc:Description>The identifier for the work order.</opc:Description>
      </opc:Property>
    </opc:Children>
  </opc:ObjectType>

  <opc:DataType SymbolicName="AddressDataType" BaseType="ua:Structure">
    <opc:Fields>
      <opc:Field Name="Street1" DataType="ua:String" />
      <opc:Field Name="Street2" DataType="ua:String" />
      <opc:Field Name="City" DataType="ua:String" />
      <opc:Field Name="Country" DataType="ua:String" />
      <opc:Field Name="ProvinceState" DataType="ua:String" />
      <opc:Field Name="PostalCode" DataType="ua:String" />
    </opc:Fields>
  </opc:DataType>

  <opc:VariableType SymbolicName="AddressType" BaseType="ua:BaseDataVariableType" DataType="AddressDataType">
    <opc:Description>A single address.</opc:Description>
  </opc:VariableType>

  <opc:Object SymbolicName="Samples" BaseType="ua:FolderType">
    <opc:References>
      <opc:Reference IsInverse="true">
        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>
        <opc:TargetId>ua:ObjectsFolder</opc:TargetId>
      </opc:Reference>
    </opc:References>
  </opc:Object>

  <opc:ObjectType SymbolicName="VendorType" BaseType="ua:BaseObjectType">
    <opc:Description>A vendor described in the ERP system.</opc:Description>
    <opc:Children>
      <opc:Property SymbolicName="CompanyName" DataType="ua:String">
        <opc:Description>The name of the company.</opc:Description>
      </opc:Property>
      <opc:Object SymbolicName="Locations" TypeDefinition="ua:FolderType">
        <opc:Description>The locations for the company.</opc:Description>
      </opc:Object>
    </opc:Children>
  </opc:ObjectType>

  <opc:Object SymbolicName="Boiler1" TypeDefinition="BoilerType" SupportsEvents="true">
    <opc:Description>A standard boiler</opc:Description>
    <opc:Children>
      <opc:Object SymbolicName="InputPipe">
        <opc:BrowseName>PipeX001</opc:BrowseName>
        <opc:Children>
          <opc:Object SymbolicName="FlowTransmitter1">
            <opc:BrowseName>FTX001</opc:BrowseName>             
          </opc:Object>
        </opc:Children>
      </opc:Object>      
    </opc:Children>
    <opc:References>
      <opc:Reference IsInverse="true">
        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>
        <opc:TargetId>Samples</opc:TargetId>
      </opc:Reference>      
    </opc:References>
  </opc:Object>

  <opc:Method SymbolicName="GenerateValuesMethodType" ModellingRule="Mandatory">
    <opc:InputArguments>
      <opc:Argument Name="Iterations" DataType="ua:UInt32">
        <opc:Description>The number of new values to generate.</opc:Description>
      </opc:Argument>
    </opc:InputArguments>
  </opc:Method>

  <opc:ObjectType SymbolicName="GenerateValuesEventType" BaseType="ua:BaseEventType">
    <opc:Children>
      <opc:Property SymbolicName="Iterations" DataType="ua:UInt32" ModellingRule="Mandatory" />
      <opc:Property SymbolicName="NewValueCount" DataType="ua:UInt32" ModellingRule="Mandatory" />
    </opc:Children>
  </opc:ObjectType>

  <opc:ObjectType SymbolicName="TestDataObjectType" BaseType="ua:BaseObjectType">
    <opc:Children>
      <opc:Property SymbolicName="SimulationActive" DataType="ua:Boolean" ModellingRule="Mandatory">
        <opc:Description>If true the server will produce new values for each monitored variable.</opc:Description>
      </opc:Property>
      <opc:Method SymbolicName="GenerateValues" TypeDefinition="GenerateValuesMethodType" ModellingRule="Mandatory"></opc:Method>
    </opc:Children>
  </opc:ObjectType>

  <opc:DataType SymbolicName="ScalarValueDataType" BaseType="ua:Structure">
    <opc:Fields>
      <opc:Field Name="BooleanValue" DataType="ua:Boolean" />
      <opc:Field Name="SByteValue" DataType="ua:SByte" />
      <opc:Field Name="ByteValue" DataType="ua:Byte" />
      <opc:Field Name="Int16Value" DataType="ua:Int16" />
      <opc:Field Name="UInt16Value" DataType="ua:UInt16" />
      <opc:Field Name="Int32Value" DataType="ua:Int32" />
      <opc:Field Name="UInt32Value" DataType="ua:UInt32" />
      <opc:Field Name="Int64Value" DataType="ua:Int64" />
      <opc:Field Name="UInt64Value" DataType="ua:UInt64" />
      <opc:Field Name="FloatValue" DataType="ua:Float" />
      <opc:Field Name="DoubleValue" DataType="ua:Double" />
      <opc:Field Name="StringValue" DataType="ua:String" />
      <opc:Field Name="DateTimeValue" DataType="ua:DateTime" />
      <opc:Field Name="GuidValue" DataType="ua:Guid" />
      <opc:Field Name="ByteStringValue" DataType="ua:ByteString" />
      <opc:Field Name="XmlElementValue" DataType="ua:XmlElement" />
      <opc:Field Name="NodeIdValue" DataType="ua:NodeId" />
      <opc:Field Name="ExpandedNodeIdValue" DataType="ua:ExpandedNodeId" />
      <opc:Field Name="QualifiedNameValue" DataType="ua:QualifiedName" />
      <opc:Field Name="LocalizedTextValue" DataType="ua:LocalizedText" />
      <opc:Field Name="StatusCodeValue" DataType="ua:StatusCode" />
      <opc:Field Name="VariantValue" DataType="ua:BaseDataType" />
      <opc:Field Name="StructureValue" DataType="ua:Structure" />
    </opc:Fields>
  </opc:DataType>

  <opc:ObjectType SymbolicName="ScalarValueObjectType" BaseType="TestDataObjectType">
    <opc:Children>
      <opc:Variable SymbolicName="BooleanValue" DataType="ua:Boolean" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="SByteValue" DataType="ua:SByte" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="ByteValue" DataType="ua:Byte" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="Int16Value" DataType="ua:Int16" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="UInt16Value" DataType="ua:UInt16" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="Int32Value" DataType="ua:Int32" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="UInt32Value" DataType="ua:UInt32" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="Int64Value" DataType="ua:Int64" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="UInt64Value" DataType="ua:UInt64" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="FloatValue" DataType="ua:Float" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="DoubleValue" DataType="ua:Double" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="StringValue" DataType="ua:String" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="DateTimeValue" DataType="ua:DateTime" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="GuidValue" DataType="ua:Guid" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="ByteStringValue" DataType="ua:ByteString" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="XmlElementValue" DataType="ua:XmlElement" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="NodeIdValue" DataType="ua:NodeId" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="ExpandedNodeIdValue" DataType="ua:ExpandedNodeId" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="QualifiedNameValue" DataType="ua:QualifiedName" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="LocalizedTextValue" DataType="ua:LocalizedText" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="StatusCodeValue" DataType="ua:StatusCode" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="VariantValue" DataType="ua:BaseDataType" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Variable SymbolicName="StructureValue" DataType="ua:Structure" ModellingRule="Mandatory" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
    </opc:Children>
  </opc:ObjectType>

  <opc:DataType SymbolicName="ArrayValueDataType" BaseType="ua:Structure">
    <opc:Fields>
      <opc:Field Name="BooleanValue" DataType="ua:Boolean" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="SByteValue" DataType="ua:SByte" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="ByteValue" DataType="ua:Byte" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="Int16Value" DataType="ua:Int16" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="UInt16Value" DataType="ua:UInt16" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="Int32Value" DataType="ua:Int32" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="UInt32Value" DataType="ua:UInt32" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="Int64Value" DataType="ua:Int64" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="UInt64Value" DataType="ua:UInt64" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="FloatValue" DataType="ua:Float" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="DoubleValue" DataType="ua:Double" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="StringValue" DataType="ua:String" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="DateTimeValue" DataType="ua:DateTime" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="GuidValue" DataType="ua:Guid" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="ByteStringValue" DataType="ua:ByteString" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="XmlElementValue" DataType="ua:XmlElement" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="NodeIdValue" DataType="ua:NodeId" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="ExpandedNodeIdValue" DataType="ua:ExpandedNodeId" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="QualifiedNameValue" DataType="ua:QualifiedName" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="LocalizedTextValue" DataType="ua:LocalizedText" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="StatusCodeValue" DataType="ua:StatusCode" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="VariantValue" DataType="ua:BaseDataType" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
      <opc:Field Name="StructureValue" DataType="ua:Structure" ValueRank="Array" AccessLevel="ReadWrite" MinimumSamplingInterval="1" />
    </opc:Fields>
  </opc:DataType>

  <opc:ObjectType SymbolicName="ArrayValueObjectType" BaseType="TestDataObjectType">
    <opc:Children>
      <opc:Variable SymbolicName="BooleanValue" DataType="ua:Boolean" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="SByteValue" DataType="ua:SByte" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="ByteValue" DataType="ua:Byte" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="Int16Value" DataType="ua:Int16" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="UInt16Value" DataType="ua:UInt16" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="Int32Value" DataType="ua:Int32" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="UInt32Value" DataType="ua:UInt32" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="Int64Value" DataType="ua:Int64" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="UInt64Value" DataType="ua:UInt64" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="FloatValue" DataType="ua:Float" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="DoubleValue" DataType="ua:Double" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="StringValue" DataType="ua:String" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="DateTimeValue" DataType="ua:DateTime" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="GuidValue" DataType="ua:Guid" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="ByteStringValue" DataType="ua:ByteString" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="XmlElementValue" DataType="ua:XmlElement" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="NodeIdValue" DataType="ua:NodeId" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="ExpandedNodeIdValue" DataType="ua:ExpandedNodeId" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="QualifiedNameValue" DataType="ua:QualifiedName" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="LocalizedTextValue" DataType="ua:LocalizedText" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="StatusCodeValue" DataType="ua:StatusCode" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="VariantValue" DataType="ua:BaseDataType" ValueRank="Array" ModellingRule="Mandatory" />
      <opc:Variable SymbolicName="StructureValue" DataType="ua:Structure" ValueRank="Array" ModellingRule="Mandatory" />
    </opc:Children>
  </opc:ObjectType>

  <opc:Object SymbolicName="Data" TypeDefinition="ua:FolderType" SupportsEvents="true">
    <opc:Children>
      <opc:Object SymbolicName="Static" TypeDefinition="ua:FolderType" SupportsEvents="true">
        <opc:Children>
          <opc:Object SymbolicName="Scalar" TypeDefinition="ScalarValueObjectType" ModellingRule="Mandatory"/>
          <opc:Object SymbolicName="Array" TypeDefinition="ArrayValueObjectType" ModellingRule="Mandatory"/>
        </opc:Children>
      </opc:Object>
    </opc:Children>
    <opc:References>
      <opc:Reference IsInverse="true">
        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>
        <opc:TargetId>Samples</opc:TargetId>
      </opc:Reference>
    </opc:References>
  </opc:Object>

  <opc:Dictionary SymbolicId="Dictionary_XmlSchema" EncodingName="ua:DefaultXml" TypeDefinition="ua:DataTypeDictionaryType">
    <opc:BrowseName>Opc.Ua.Sample</opc:BrowseName>
    <opc:References>
      <opc:Reference IsInverse="true">
        <opc:ReferenceType>ua:HasComponent</opc:ReferenceType>
        <opc:TargetId>ua:XmlSchema_TypeSystem</opc:TargetId>
      </opc:Reference>
    </opc:References>
  </opc:Dictionary>

  <opc:Dictionary SymbolicId="Dictionary_BinarySchema" EncodingName="ua:DefaultBinary" TypeDefinition="ua:DataTypeDictionaryType">
    <opc:BrowseName>Opc.Ua.Sample</opc:BrowseName>
    <opc:References>
      <opc:Reference IsInverse="true">
        <opc:ReferenceType>ua:HasComponent</opc:ReferenceType>
        <opc:TargetId>ua:OPCBinarySchema_TypeSystem</opc:TargetId>
      </opc:Reference>
    </opc:References>
  </opc:Dictionary>

</opc:ModelDesign>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySql】数据库的备份与恢复

文章目录 前言备份mysqldump还原source注意事项查看连接情况 前言 对与数据库的备份与恢复该怎么去做呢&#xff1f; Linux下对于文件或目录的备份&#xff0c;直接拷贝一份&#xff0c;留着备用&#xff0c;对于备份&#xff0c;比较简单的做法会就是直接打包拷贝一下&#x…

数据结构常用知识点整理(java版)(--修改中--)

目录 一、逻辑结构 1、栈 2、队列 顺序队列 循环队列 链式队列 &#xff08;相当于只能尾进头出的单链表&#xff09; 双端队列 (Deque) 3、数组 4、链表 5、树 二叉树 满二叉树 完全二叉树 二叉查找树&#xff1a; (ADT Tree) 红黑树&#xff1a; B树&#xf…

docker内无法通过域名访问外网问题解决方案一

一、问题描述 docker中有的时候需要从容器内向外网环境进行访问&#xff0c;这个时候我边出现了一个诡异的问题&#xff0c;从容器的宿主机直接通过curl命令使用域名可以正常的访问并返回正确的解决&#xff0c;但是从容器中向外调用外网环境的这个域名的时候&#xff0c;curl命…

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 内容审查

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 内容审查 https://learn.deeplearning.ai/chatgpt-building-system?_gl=114hjbho_gaMTEwNzkwNDAyMC4xNjgyNjUxMzg4_ga_PZF1GBS1R1*MTY4NTk2NTg1Ni4xNS4wLjE2ODU5NjU4NTYuNjAuMC4w 如果你正在建立一个…

糖酵解反应动力学方程的微分方程建模

糖酵解反应动力学方程的微分方程建模 题目 对于下面的糖酵解反应&#xff1a; 设其满足如下动力学方程&#xff1a; { d d t Glucose v 1 − v 2 d d t Gluc 6 P v 2 − v 3 d d t Fruc 6 P v 3 − v 4 v 5 d d t Fruc 1 , 6 P 2 v 4 − v 5 − v 6 d d t ATP −…

electron+vue3全家桶+vite项目搭建【19】集成微信登录

文章目录 引入实现思路实现步骤 引入 electron中实际就是嵌入了一个浏览器内核&#xff0c;所以在electron中集成微信登录实际和web端的集成方式是一样的。 demo项目地址 实现思路 这里参考这篇文章的 electron之微信扫码登陆&#xff08;不使用轮询&#xff09; 实现思路&a…

【数据结构】常见排序算法——常见排序介绍、选择排序(直接选择排序、堆排序)交换排序(冒泡排序)

文章目录 1.常见排序2.选择排序2.1直接选择排序2.2堆排序 3.交换排序3.1冒泡排序 1.常见排序 2.选择排序 选择排序是一种简单但不高效的排序算法&#xff0c;其基本思想是从待排序的数据中选择最小&#xff08;或最大&#xff09;的元素放到已排序的数据末尾。具体操作步骤如下…

可能是 Python 中最火的第三方开源测试框架 pytest

一、介绍 本篇文章是《聊聊 Python 的单元测试框架》的第三篇&#xff0c;前两篇分别介绍了标准库 unittest 和第三方单元测试框架 nose。作为本系列的最后一篇&#xff0c;压轴出场的是Python 世界中最火的第三方单元测试框架&#xff1a;pytest。 pytest 项目地址&#xff1…

预见未来:超强元AI诞生,抓住这个机会,利用AI变现也变得更加容易

目录 一、引言 二、介绍 三、技术展现 四、元AI架构图展现 五、元AI变现技巧—商业版说明 六、后期规划 一、引言 如何利用AI变现已经成为了当今各个行业亟需解决的问题。随着人工智能技术的快速发展和普及&#xff0c;越来越多的企业开始将其应用于产品研发、销售流程优化、客…

一学就会---移除链表相同元素

文章目录 题目描述思路一&#xff1a;思路二&#xff1a; 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例&#xff1a; 思路一&#xff1a; 要移除链表中值为val的结…

Lecture 3 N-gram Language Models

目录 Probabilities: Joint to Conditional 概率&#xff1a;联合概率到条件概率The Markov Assumption 马尔可夫假设Maximum Likelihood Estimation 最大似然估计Book-ending Sequences 序列的开头和结尾Problems with N-gram models N-gram模型的问题Smoothing 平滑处理In Pr…

Mujoco210 Ubuntu 22.04配置安装

.1 下载 1.1 解压 先是下载软件包 然后 mkdir ~/.mujoco缩包所在位置&#xff08;一般在下载目录下&#xff09;在终端打开&#xff0c;输入以下命令将压缩包解压到.mujoco文件夹中&#xff1a; tar -zxvf mujoco210-linux-x86_64.tar.gz -C ~/.mujoco1.2 许可问题 有说mu…

concrt140.dll丢失怎么修复?concrt140.dll丢失的最新修复教程

今天准备打开电脑软件时候&#xff0c;当打开我自己的软件后&#xff0c;弹出了一个对话框&#xff0c;内容是&#xff1a;由于找不到concrt140.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题。 我很纳闷&#xff0c;前几天还好好着呢。于是我上网上查了一下…

八、EGL实践

第一部分基础概念 1&#xff09;引入 之前的OpenGLes应用的开发都是使用类GLSurfaceView &#xff0c;然而GLSurfaceView 是内部已经实现了EGL的封装&#xff0c;也就是对Display&#xff0c;surface&#xff0c;context的管理。因此我们也很方便的利用GLSurfaceView.Rendere…

零基础入门网络安全/Web安全,收藏这一篇就够了

前言 由于我之前写了不少网络安全技术相关的文章和回答&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f;要学哪些东西&#xff1f;有哪些方向&#xff1f;怎么选&…

高频面试八股文用法篇(八) == 和 equals 的区别

目录 区别 如何对equals重写 为何重写equals方法就得重写hashCode方法 扩展延伸 1、使用HashSet存储自定义类对象时为什么要重写equals和hashCode方法&#xff1f; 2、HashMap为什么要同时重写hashCode和equals方法 区别 一、对象类型不同 1、equals()&#xff1a;是超类…

第二章:MySQL环境搭建

第二章&#xff1a;MySQL环境搭建 2.1&#xff1a;MySQL的下载、安装、配置 MySQL的四大版本 MySQL Community Server社区版本&#xff1a;开源免费、自由下载&#xff0c;但不提供官方技术支持&#xff0c;适用于大多数普通用户。MySQL Enterprise Edition企业版本&#xff1…

SpringBoot个人博客系统(含源码+数据库)

一、作品设计理念 个人博客系统是一个让个人可以通过互联网自由表达、交流和分享的平台&#xff0c;是个人展示自己思想、感受和经验的品牌。设计理念对于任何一个个人博客系统来说都非常重要&#xff0c;它直接影响到用户的使用体验和网站的整体感觉。 好的设计理念应该着眼于…

小红书热搜榜TOP1,多巴胺时尚爆火,怎么抄作业?

今夏时尚&#xff0c;明媚与简约并存。要说今年夏天什么最火&#xff1f;多巴胺必须拥有姓名。无论男女、老少、人宠&#xff0c;都被这股快乐风带飞。 “多巴胺”有多火&#xff1f;就只是彩色穿搭吗&#xff1f;各大博主、品牌若想加入&#xff0c;要怎么玩&#xff1f;今儿&…

Python如何解决“京东滑块验证码”(5)

前言 本文是该专栏的第51篇,后面会持续分享python爬虫干货知识,记得关注。 多数情况下使用模拟登录会遇到滑块验证码的问题,对于普通的滑块验证码,使用selenium可以轻松解决。但是对于滑块缺失验证码,比如京东的滑块验证要怎么解决呢?京东滑块验证的这个滑块缺口,每次刷…