From a8156976351512fb313658f0747dc5292bbc9182 Mon Sep 17 00:00:00 2001 From: Randy Armstrong Date: Mon, 5 Feb 2024 12:51:05 -0800 Subject: [PATCH] Fixes #149 --- Opc.Ua.ModelCompiler/CSVs/DemoModel.csv | 2 + .../Design.v105/DemoModel.xml | 3 + .../Design.v105/StandardTypes.xml | 3 + .../ModelDesignerValidator.cs | 11 +- Opc.Ua.ModelCompiler/ModelGenerator2.cs | 44 +- .../Opc.Ua.ModelCompiler.Debug.csproj | 25 +- .../Opc.Ua.ModelCompiler.csproj | 23 +- Opc.Ua.ModelCompiler/OpenApiExporter.cs | 216 ++++++- Opc.Ua.ModelCompiler/Program.cs | 159 +++++ .../Templates/XmlSchema/BuiltInTypes.xsd | 2 +- .../Templates/Version2/DataTypes/Class.cs | 2 +- .../Templates/XmlSchema/BuiltInTypes.xsd | 2 +- .../DemoModel/DemoModel/DemoModel.Classes.cs | 32 +- .../DemoModel/DemoModel.Constants.cs | 19 +- .../DemoModel/DemoModel.DataTypes.cs | 92 +++ .../DemoModel/DemoModel/DemoModel.NodeIds.csv | 2 + .../DemoModel/DemoModel.NodeSet2.xml | 457 +++++++++------ .../DemoModel.PredefinedNodes.uanodes | Bin 16252 -> 17580 bytes .../DemoModel/DemoModel.PredefinedNodes.xml | 547 +++++++++++------- Tests/DemoModel/DemoModel/DemoModel.Types.bsd | 11 +- Tests/DemoModel/DemoModel/DemoModel.Types.xsd | 23 +- Tests/DemoModel/DemoModel/DemoModel.csv | 2 + Tests/DemoModel/DemoModel/DemoModel.xml | 35 +- .../DemoModel/demomodel-constants.ts | 2 + 24 files changed, 1274 insertions(+), 440 deletions(-) diff --git a/Opc.Ua.ModelCompiler/CSVs/DemoModel.csv b/Opc.Ua.ModelCompiler/CSVs/DemoModel.csv index 51621adf..e2f9b874 100644 --- a/Opc.Ua.ModelCompiler/CSVs/DemoModel.csv +++ b/Opc.Ua.ModelCompiler/CSVs/DemoModel.csv @@ -65,6 +65,8 @@ SampleUnionAllowSubtypes_Encoding_DefaultXml,64,Object SampleStructureAllowSubtypes_Encoding_DefaultXml,65,Object DemoModel_XmlSchema_Deprecated,66,Variable DemoModel_XmlSchema_SampleUnion,67,Variable +EnumUnderscoreTest,68,DataType +EnumUnderscoreTest_EnumValues,69,Variable DemoModel_XmlSchema_SampleStructureWithOptionalFields,70,Variable TestObject_Blue,71,Method DemoModel_BinarySchema_DataTypeVersion,72,Variable diff --git a/Opc.Ua.ModelCompiler/Design.v105/DemoModel.xml b/Opc.Ua.ModelCompiler/Design.v105/DemoModel.xml index 63c59072..62837fcb 100644 --- a/Opc.Ua.ModelCompiler/Design.v105/DemoModel.xml +++ b/Opc.Ua.ModelCompiler/Design.v105/DemoModel.xml @@ -66,6 +66,9 @@ + + Test_5 + diff --git a/Opc.Ua.ModelCompiler/Design.v105/StandardTypes.xml b/Opc.Ua.ModelCompiler/Design.v105/StandardTypes.xml index 2235727e..26982dad 100644 --- a/Opc.Ua.ModelCompiler/Design.v105/StandardTypes.xml +++ b/Opc.Ua.ModelCompiler/Design.v105/StandardTypes.xml @@ -1145,6 +1145,9 @@ + + + diff --git a/Opc.Ua.ModelCompiler/ModelDesignerValidator.cs b/Opc.Ua.ModelCompiler/ModelDesignerValidator.cs index 694236db..d117ad8a 100644 --- a/Opc.Ua.ModelCompiler/ModelDesignerValidator.cs +++ b/Opc.Ua.ModelCompiler/ModelDesignerValidator.cs @@ -3620,10 +3620,13 @@ private bool ImportParameters(NodeDesign node, ref Parameter[] parameters, strin } } - if (index != -1) + if (index > 0) { - id = parameter.Identifier = Convert.ToInt32(name.Substring(index+1)); - parameter.IdentifierInName = true; + if (Int32.TryParse(name.Substring(index+1), out id)) + { + parameter.Identifier = id; + parameter.IdentifierSpecified = true; + } } } @@ -6054,6 +6057,8 @@ private void CreateNodeState(NodeDesign root, NamespaceTable namespaceUris) } } + root.State.Extensions = root.Extensions; + if (root.Hierarchy != null && root is TypeDesign) { HierarchyNode hierarchyNode; diff --git a/Opc.Ua.ModelCompiler/ModelGenerator2.cs b/Opc.Ua.ModelCompiler/ModelGenerator2.cs index 6a286cd7..49e6705f 100644 --- a/Opc.Ua.ModelCompiler/ModelGenerator2.cs +++ b/Opc.Ua.ModelCompiler/ModelGenerator2.cs @@ -790,19 +790,19 @@ private void WriteTemplate_XmlExport(string filePath) AvailableNodeSets[m_model.TargetNamespace] = Path.Join(filePath, nodeSet + ".xml"); } - GenerateJsonSchema(filePath, nodeSet, false); - GenerateJsonSchema(filePath, nodeSet, true); + GenerateJsonSchema(filePath, m_model.TargetNamespaceInfo.Prefix, false); + GenerateJsonSchema(filePath, m_model.TargetNamespaceInfo.Prefix, true); if (m_model.TargetNamespace == DefaultNamespace) { var completeNodeSet = $"{m_model.TargetNamespaceInfo.Prefix}.NodeSet2.Services"; AvailableNodeSets[m_model.TargetNamespace] = Path.Join(filePath, completeNodeSet + ".xml"); - GenerateJsonSchema(filePath, completeNodeSet, false); - GenerateJsonSchema(filePath, completeNodeSet, true); + GenerateJsonSchema(filePath, m_model.TargetNamespaceInfo.Prefix + ".Services", false); + GenerateJsonSchema(filePath, m_model.TargetNamespaceInfo.Prefix + ".Services", true); - OpenApiExporter openapi = new OpenApiExporter(); + var nodeSetFilePath = String.Format(@"{0}{1}{2}.xml", filePath, Path.DirectorySeparatorChar, completeNodeSet); - var nodeSetFilePath = String.Format(@"{0}{1}{2}.NodeSet2.Services.xml", filePath, Path.DirectorySeparatorChar, m_model.TargetNamespaceInfo.Prefix); + OpenApiExporter openapi = new OpenApiExporter(true, false); using (Stream istrm = File.Open(nodeSetFilePath, FileMode.Open)) { @@ -810,7 +810,7 @@ private void WriteTemplate_XmlExport(string filePath) istrm.Close(); } - var openapiPath = Path.Join(filePath, $"{m_model.TargetNamespaceInfo.Prefix}.Services.OpenApi.json"); + var openapiPath = Path.Join(filePath, m_model.TargetNamespaceInfo.Prefix.ToLower() + ".openapi.sessionless.json"); using (Stream istrm = File.Open(openapiPath, FileMode.Create)) { @@ -822,17 +822,25 @@ private void WriteTemplate_XmlExport(string filePath) OpenApiExporter.Verify(istrm); } - //openapiPath = Path.Join(filePath, $"{m_model.TargetNamespaceInfo.Prefix}.Services.OpenApi.yaml"); + openapi = new OpenApiExporter(true, true); - //using (Stream istrm = File.Open(openapiPath, FileMode.Create)) - //{ - // openapi.Generate(istrm, generateYaml: true); - //} + using (Stream istrm = File.Open(nodeSetFilePath, FileMode.Open)) + { + openapi.Load(istrm); + istrm.Close(); + } + + openapiPath = Path.Join(filePath, m_model.TargetNamespaceInfo.Prefix.ToLower() + ".openapi.allservices.json"); - //using (Stream istrm = File.Open(openapiPath, FileMode.Open)) - //{ - // OpenApiExporter.Verify(istrm); - //} + using (Stream istrm = File.Open(openapiPath, FileMode.Create)) + { + openapi.Generate(istrm); + } + + using (Stream istrm = File.Open(openapiPath, FileMode.Open)) + { + OpenApiExporter.Verify(istrm); + } } } } @@ -843,7 +851,7 @@ private void GenerateJsonSchema(string filePath, string baseName, bool useRevers json.Load(AvailableNodeSets, m_model.TargetNamespace); - string outputFile = Path.Join(filePath, baseName + $"{((!useReversibleEncoding) ? ".nonreversible" : "")}.json"); + string outputFile = Path.Join(filePath, $"{baseName.ToLower()}.jsonschema.{((!useReversibleEncoding) ? "nonreversible" : "reversible")}.json"); using (var ostrm = File.Open(outputFile, FileMode.Create, FileAccess.ReadWrite)) { @@ -3233,6 +3241,8 @@ private bool WriteTemplate_ListOfTypes(Template template, Context context) if (dataType != null) { + template.AddReplacement("_IsAbstract_", (dataType.IsAbstract) ? "abstract ": ""); + if (!dataType.IsOptionSet) { template.AddReplacement("[Flags]", String.Empty); diff --git a/Opc.Ua.ModelCompiler/Opc.Ua.ModelCompiler.Debug.csproj b/Opc.Ua.ModelCompiler/Opc.Ua.ModelCompiler.Debug.csproj index 0d4cf480..d9e09522 100644 --- a/Opc.Ua.ModelCompiler/Opc.Ua.ModelCompiler.Debug.csproj +++ b/Opc.Ua.ModelCompiler/Opc.Ua.ModelCompiler.Debug.csproj @@ -277,9 +277,16 @@ + + + + + + + @@ -289,7 +296,13 @@ + + + + + + @@ -304,7 +317,12 @@ + + + + + @@ -312,8 +330,11 @@ + + + @@ -472,9 +493,9 @@ - + - + diff --git a/Opc.Ua.ModelCompiler/Opc.Ua.ModelCompiler.csproj b/Opc.Ua.ModelCompiler/Opc.Ua.ModelCompiler.csproj index eb8a3b3b..cfd1257f 100644 --- a/Opc.Ua.ModelCompiler/Opc.Ua.ModelCompiler.csproj +++ b/Opc.Ua.ModelCompiler/Opc.Ua.ModelCompiler.csproj @@ -319,16 +319,29 @@ + + + + + + + + + + + + + @@ -343,7 +356,12 @@ + + + + + @@ -353,6 +371,7 @@ + @@ -511,10 +530,10 @@ - + - + diff --git a/Opc.Ua.ModelCompiler/OpenApiExporter.cs b/Opc.Ua.ModelCompiler/OpenApiExporter.cs index ca82712c..23274727 100644 --- a/Opc.Ua.ModelCompiler/OpenApiExporter.cs +++ b/Opc.Ua.ModelCompiler/OpenApiExporter.cs @@ -5,7 +5,6 @@ using Microsoft.OpenApi.Readers; using Opc.Ua; using Opc.Ua.Export; -using System.Net.Http.Headers; namespace ModelCompiler { @@ -14,6 +13,8 @@ internal class OpenApiExporter private SystemContext m_context; private TypeTable m_typeTable; private NodeIdDictionary m_index; + private bool m_useV2encoding; + private bool m_allServices; readonly Dictionary m_builtInTypes = new Dictionary() { @@ -311,7 +312,7 @@ internal class OpenApiExporter }, }; - public OpenApiExporter() + public OpenApiExporter(bool useV2encoding, bool allServices) { m_context = new SystemContext(); m_context.NamespaceUris = new NamespaceTable(); @@ -319,6 +320,89 @@ public OpenApiExporter() m_typeTable = new TypeTable(m_context.NamespaceUris); m_context.TypeTable = m_typeTable; + m_useV2encoding = useV2encoding; + m_allServices = allServices; + + if (!useV2encoding) + { + m_builtInTypes["NodeId"] = new OpenApiSchema() + { + Type = "object", + Properties = new Dictionary() + { + ["IdType"] = new OpenApiSchema() + { + Type = "number" + }, + ["Id"] = new OpenApiSchema() + { + }, + ["Namespace"] = new OpenApiSchema() + { + Type = "number" + } + } + }; + + m_builtInTypes["ExpandedNodeId"] = new OpenApiSchema() + { + Type = "object", + Properties = new Dictionary() + { + ["IdType"] = new OpenApiSchema() + { + Type = "number" + }, + ["Id"] = new OpenApiSchema() + { + }, + ["Namespace"] = new OpenApiSchema() + { + }, + ["ServerUri"] = new OpenApiSchema() + { + Type = "number" + } + } + }; + + m_builtInTypes["QualifiedName"] = new OpenApiSchema() + { + Type = "object", + Properties = new Dictionary() + { + ["Name"] = new OpenApiSchema() + { + Type = "string" + }, + ["Uri"] = new OpenApiSchema() + { + } + } + }; + + m_builtInTypes["ExtensionObject"] = new OpenApiSchema() + { + Type = "object", + Properties = new Dictionary() + { + ["TypeId"] = new OpenApiSchema() + { + Reference = new OpenApiReference() { Type = ReferenceType.Schema, Id = "NodeId" } + }, + ["Encoding"] = new OpenApiSchema() + { + Type = "integer", + Format = "uint8" + }, + ["Body"] = new OpenApiSchema() + { + Type = "object", + AdditionalPropertiesAllowed = true + } + }, + }; + } m_index = new NodeIdDictionary(); } @@ -541,9 +625,8 @@ private OpenApiSchema FindFieldSchema( if (bit.NodeId == Opc.Ua.DataTypes.Structure || bit.NodeId == Opc.Ua.DataTypes.Union) { if ( - definition.StructureType == StructureType.StructureWithSubtypedValues || - definition.StructureType == StructureType.UnionWithSubtypedValues || - field.IsOptional || + (field.IsOptional && definition.StructureType == StructureType.StructureWithSubtypedValues) || + (field.IsOptional && definition.StructureType == StructureType.UnionWithSubtypedValues) || fieldType.IsAbstract) { return new OpenApiSchema() @@ -651,6 +734,30 @@ public void Generate(Stream ostrm, bool generateYaml = false) } }; + if (m_allServices) + { + document.Paths["/findservers"] = GetPathItem("FindServers"); + document.Paths["/getendpoints"] = GetPathItem("GetEndpoints"); + document.Paths["/createsession"] = GetPathItem("CreateSession"); + document.Paths["/activatesession"] = GetPathItem("ActivateSession"); + document.Paths["/closesession"] = GetPathItem("CloseSession"); + document.Paths["/cancel"] = GetPathItem("Cancel"); + document.Paths["/registernodes"] = GetPathItem("RegisterNodes"); + document.Paths["/unregisternodes"] = GetPathItem("UnregisterNodes"); + document.Paths["/createmonitoreditems"] = GetPathItem("CreateMonitoredItems"); + document.Paths["/modifymonitoreditems"] = GetPathItem("ModifyMonitoredItems"); + document.Paths["/setmonitoringmode"] = GetPathItem("SetMonitoringMode"); + document.Paths["/settriggering"] = GetPathItem("SetTriggering"); + document.Paths["/deletemonitoreditems"] = GetPathItem("DeleteMonitoredItems"); + document.Paths["/createsubscription"] = GetPathItem("CreateSubscription"); + document.Paths["/modifysubscription"] = GetPathItem("ModifySubscription"); + document.Paths["/setpublishingmode"] = GetPathItem("SetPublishingMode"); + document.Paths["/publish"] = GetPathItem("Publish"); + document.Paths["/republish"] = GetPathItem("Republish"); + document.Paths["/transfersubscriptions"] = GetPathItem("TransferSubscriptions"); + document.Paths["/deletesubscriptions"] = GetPathItem("DeleteSubscriptions"); + } + HashSet excluded = new() { Opc.Ua.BrowseNames.Boolean, @@ -668,10 +775,7 @@ public void Generate(Stream ostrm, bool generateYaml = false) Opc.Ua.BrowseNames.Guid, Opc.Ua.BrowseNames.ByteString, Opc.Ua.BrowseNames.DateTime, - Opc.Ua.BrowseNames.NodeId, - Opc.Ua.BrowseNames.ExpandedNodeId, Opc.Ua.BrowseNames.StatusCode, - Opc.Ua.BrowseNames.QualifiedName, Opc.Ua.BrowseNames.LocaleId, Opc.Ua.BrowseNames.Number, Opc.Ua.BrowseNames.Integer, @@ -684,6 +788,13 @@ public void Generate(Stream ostrm, bool generateYaml = false) Opc.Ua.BrowseNames.Index }; + if (m_useV2encoding) + { + excluded.Add(Opc.Ua.BrowseNames.NodeId); + excluded.Add(Opc.Ua.BrowseNames.ExpandedNodeId); + excluded.Add(Opc.Ua.BrowseNames.QualifiedName); + } + var schemas = new Dictionary(); foreach (var type in m_builtInTypes) @@ -725,6 +836,94 @@ public void Generate(Stream ostrm, bool generateYaml = false) CollectIncludedTypes(included, Opc.Ua.DataTypes.UpdateEventDetails); CollectIncludedTypes(included, Opc.Ua.DataTypes.UpdateStructureDataDetails); + if (m_allServices) + { + CollectIncludedTypes(included, Opc.Ua.DataTypes.FindServersRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.FindServersResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.GetEndpointsRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.GetEndpointsResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CreateSessionRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CreateSessionResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ActivateSessionRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ActivateSessionResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CloseSessionRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CloseSessionResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CancelRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CancelResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.RegisterNodesRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.RegisterNodesResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.UnregisterNodesRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.UnregisterNodesResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CreateMonitoredItemsRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CreateMonitoredItemsResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ModifyMonitoredItemsRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ModifyMonitoredItemsResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.SetMonitoringModeRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.SetMonitoringModeResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.SetTriggeringRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.SetTriggeringResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DeleteMonitoredItemsRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DeleteMonitoredItemsResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CreateSubscriptionRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.CreateSubscriptionResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ModifySubscriptionRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ModifySubscriptionResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.SetPublishingModeRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.SetPublishingModeResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.PublishRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.PublishResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.RepublishRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.RepublishResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.TransferSubscriptionsRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.TransferSubscriptionsResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DeleteSubscriptionsRequest); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DeleteSubscriptionsResponse); + CollectIncludedTypes(included, Opc.Ua.DataTypes.AnonymousIdentityToken); + CollectIncludedTypes(included, Opc.Ua.DataTypes.UserNameIdentityToken); + CollectIncludedTypes(included, Opc.Ua.DataTypes.X509IdentityToken); + CollectIncludedTypes(included, Opc.Ua.DataTypes.IssuedIdentityToken); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DataChangeNotification); + CollectIncludedTypes(included, Opc.Ua.DataTypes.EventNotificationList); + CollectIncludedTypes(included, Opc.Ua.DataTypes.StatusChangeNotification); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ElementOperand); + CollectIncludedTypes(included, Opc.Ua.DataTypes.LiteralOperand); + CollectIncludedTypes(included, Opc.Ua.DataTypes.AttributeOperand); + CollectIncludedTypes(included, Opc.Ua.DataTypes.SimpleAttributeOperand); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DataChangeFilter); + CollectIncludedTypes(included, Opc.Ua.DataTypes.EventFilter); + CollectIncludedTypes(included, Opc.Ua.DataTypes.AggregateFilter); + CollectIncludedTypes(included, Opc.Ua.DataTypes.EventFilterResult); + CollectIncludedTypes(included, Opc.Ua.DataTypes.AggregateFilterResult); + } + + + CollectIncludedTypes(included, Opc.Ua.DataTypes.PubSubConfiguration2DataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.PubSubConnectionDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.PubSubGroupDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.WriterGroupDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.WriterGroupMessageDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.WriterGroupTransportDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ReaderGroupDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ReaderGroupMessageDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.ReaderGroupTransportDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DataSetReaderDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DataSetReaderMessageDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DataSetReaderTransportDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DataSetWriterDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DataSetWriterMessageDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DataSetWriterTransportDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.DataTypeDescription); + CollectIncludedTypes(included, Opc.Ua.DataTypes.StructureDescription); + CollectIncludedTypes(included, Opc.Ua.DataTypes.EnumDescription); + CollectIncludedTypes(included, Opc.Ua.DataTypes.JsonWriterGroupMessageDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.JsonDataSetWriterMessageDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.JsonDataSetReaderMessageDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.BrokerConnectionTransportDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.BrokerDataSetReaderTransportDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.BrokerDataSetWriterTransportDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.BrokerWriterGroupTransportDataType); + CollectIncludedTypes(included, Opc.Ua.DataTypes.PubSubState); + foreach (var node in m_index.Values) { if (node is DataTypeState dt) @@ -866,6 +1065,7 @@ public void Generate(Stream ostrm, bool generateYaml = false) ostrm, OpenApiSpecVersion.OpenApi3_0, (generateYaml) ? OpenApiFormat.Yaml : OpenApiFormat.Json); + } private void CollectIncludedTypes(HashSet included, NodeId target) diff --git a/Opc.Ua.ModelCompiler/Program.cs b/Opc.Ua.ModelCompiler/Program.cs index 7d42e8cf..aee3be82 100644 --- a/Opc.Ua.ModelCompiler/Program.cs +++ b/Opc.Ua.ModelCompiler/Program.cs @@ -2,11 +2,170 @@ using McMaster.Extensions.CommandLineUtils; using System.Reflection; using System.Diagnostics; +using Newtonsoft.Json.Schema; +using Newtonsoft.Json.Linq; +using Opc.Ua; try { if (System.Diagnostics.Debugger.IsAttached) { + string[] args2 = { + "compile", + "-d2", + @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\StandardTypes.xml", + "-d2", + @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\UA Core Services.xml", + "-version", + "v105", + "-exclude", + "Draft", + "-c", + @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\CSVs\StandardTypes.csv", + "-o2", + @"D:\Work\OPC\nodesets\v105\Schema\", + "-stack", + @"D:\Work\OPC\nodesets\v105\DotNet\", + "-ansic", + @"D:\Work\OPC\nodesets\v105\AnsiC\", + "-mv", + "1.05.03", + "-pd", + "2023-11-15" + }; + + //string[] args2 = { + // "compile", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\DemoModel.xml", + // "-cg", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\CSVs\DemoModel.csv", + // "-version", + // "v105", + // "-exclude", + // "Draft", + // "-o2", + // @"D:\Work\OPC\UA-ModelCompiler\Tests\DemoModel\DemoModel" + //}; + + //string[] args2 = { + // "compile", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\OpcUaGdsModel.xml", + // "-cg", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\CSVs\OpcUaGdsModel.csv", + // "-version", + // "v105", + // "-exclude", + // "Draft", + // "-o2", + // @"D:\Work\OPC\UA-ModelCompiler\Tests\DemoModel\GDS" + //}; + + //string[] args2 = { + // "compile", + // //"-d2", + // //@"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\OpcUaOnboardingModel.xml", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\OpcUaGdsModel.xml", + // "-version", + // "v105", + // "-exclude", + // "Draft", + // "-c", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\CSVs\OpcUaGdsModel.csv", + // "-o2", + // @"D:\Work\OPC\nodesets\v105\GDS\" + //}; + + //string[] args2 = { + // "compile", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\I4AAS.IRDI.xml", + // "-version", + // "v105", + // "-exclude", + // "Draft", + // "-cg", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\CSVs\I4AAS.IRDI.csv", + // "-o2", + // @"D:\Work\OPC\UA-REST-StarterKit\I4AAS-Gateway\Server\I4AAS\" + //}; + + //string[] args2 = { + // "compile", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\I4AAS.Submodels.xml", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\I4AAS.IRDI.xml", + // "-version", + // "v105", + // "-exclude", + // "Draft", + // "-cg", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\CSVs\I4AAS.Submodels.csv", + // "-o2", + // @"D:\Work\OPC\UA-REST-StarterKit\I4AAS-Gateway\Server\I4AAS\" + //}; + + //string[] args2 = { + // "compile", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\I4AAS.DigitalNameplate.xml", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\Design.v105\I4AAS.IRDI.References.xml", + // "-version", + // "v105", + // "-exclude", + // "Draft", + // "-c", + // @"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\CSVs\I4AAS.csv", + // "-o2", + // @"D:\Work\OPC\UA-ModelCompiler\Tests\DemoModel\I4AAS" + //}; + + //string[] args2 = { + // "compile", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\Tests\DemoModel\Models\CompressorSimulationOpcUaServer\CompressorSimulationOpcUaServer.NodeSet2.xml,CompressorSimulationOpcUaServer", + // //"-cg", + // //@"D:\Work\OPC\UA-ModelCompiler\Opc.Ua.ModelCompiler\CSVs\DemoModel.csv", + // "-version", + // "v105", + // "-exclude", + // "Draft", + // "-id", + // "9521", + // "-o2", + // @"D:\Work\OPC\UA-ModelCompiler\Tests\DemoModel\Models\CompressorSimulationOpcUaServer" + //}; + + //string[] args2 = { + // "compile", + // "-d2", + // @"D:\Work\OPC\UA-ModelCompiler\StructuresWithArrays.Nodeset2\StructuresWithArrays.Nodeset2.xml,StructuresWithArrays,StructuresWithArrays", + // "-version", + // "v105", + // "-exclude", + // "Draft", + // "-o2", + // @"D:\Work\OPC\UA-ModelCompiler\Tests\DemoModel\Models" + //}; + + //string[] args2 = { + // "compile-nodesets", + // "-input", + // @"D:\Work\OPC\nodesets\v105\", + // "-o2", + // @"D:\Work\OPC\UA-ModelCompiler\Tests\DemoModel\Models", + // "-uri", + // @"http://opcfoundation.org/UA/Machinery/", + // "-prefix", + // "UAModel.Machinery", + //}; + + ModelCompilerApplication.Run(args2); + return; } for (int ii = 0; ii < args.Length; ii++) diff --git a/Opc.Ua.ModelCompiler/StackGenerator/DataTypes/Templates/XmlSchema/BuiltInTypes.xsd b/Opc.Ua.ModelCompiler/StackGenerator/DataTypes/Templates/XmlSchema/BuiltInTypes.xsd index 1dbd824c..ce0c4c3f 100644 --- a/Opc.Ua.ModelCompiler/StackGenerator/DataTypes/Templates/XmlSchema/BuiltInTypes.xsd +++ b/Opc.Ua.ModelCompiler/StackGenerator/DataTypes/Templates/XmlSchema/BuiltInTypes.xsd @@ -343,7 +343,7 @@