diff --git a/src/AasxPackageExplorer.sln b/src/AasxPackageExplorer.sln index d268877f..815d2c34 100644 --- a/src/AasxPackageExplorer.sln +++ b/src/AasxPackageExplorer.sln @@ -154,7 +154,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginProductChangeNoti EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginSmdExporter", "AasxPluginSmdExporter\AasxPluginSmdExporter.csproj", "{621D9B9C-1723-48CB-AE2D-3C17390B7F4B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AasxOpcUa2Client", "AasxOpcUa2Client\AasxOpcUa2Client.csproj", "{6B8BDF03-9C9B-492B-8904-9756B498B9B7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxOpcUa2Client", "AasxOpcUa2Client\AasxOpcUa2Client.csproj", "{6B8BDF03-9C9B-492B-8904-9756B498B9B7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/AasxPluginAssetInterfaceDesc/AidInterfaceStatus.cs b/src/AasxPluginAssetInterfaceDesc/AidInterfaceStatus.cs index 4f00087b..d492efaa 100644 --- a/src/AasxPluginAssetInterfaceDesc/AidInterfaceStatus.cs +++ b/src/AasxPluginAssetInterfaceDesc/AidInterfaceStatus.cs @@ -27,6 +27,8 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Windows.Media.Animation; using AasxIntegrationBase.AdminShellEvents; using System.IO; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json; namespace AasxPluginAssetInterfaceDescription { @@ -68,6 +70,11 @@ public class AidIfxItemStatus /// public CD_Forms FormData = null; + /// + /// To help map object payloads(JSON, XML or Octet-stream that is complex) + /// + public string payloadType = null; + /// /// String data for value incl. unit information. /// @@ -121,6 +128,17 @@ public class AidInterfaceStatus /// public string EndpointBase = ""; + + /// + /// Used by byteStream payload for decoding, presently, mainly used by Modbus but other protocols will also be using it + /// + public string mostSignificantByte = ""; + + /// + /// Used by byteStream payload for decoding, presently, mainly used by Modbus but other protocols will also be using it + /// + public string mostSignificantWord = ""; + /// /// Actual summary of the status of the interface. /// @@ -239,6 +257,16 @@ public class AidBaseConnection /// public string Password = null; + /// + /// Used by byteStream payload for decoding, presently, mainly used by Modbus but other protocols will also be using it + /// + public string mostSignificantByte = ""; + + /// + /// Used by byteStream payload for decoding, presently, mainly used by Modbus but other protocols will also be using it + /// + public string mostSignificantWord = ""; + /// /// If greater 10, specifies the time rate in milli seconds for polling the /// respective subscriptions. @@ -310,27 +338,70 @@ public void NotifyOutputItems(AidIfxItemStatus item, string strval) foreach (var moi in item.MapOutputItems) { // valid? - if (moi?.MapRelation?.Second == null - || !(moi.MapRelation.SecondHint is Aas.Property prop)) + if (moi?.MapRelation?.Second == null) continue; - // set here - prop.Value = strval; + // For literal payloads + else if (moi.MapRelation.SecondHint is Aas.Property prop) + { + // set here + prop.Value = strval; + + // create + var evi = new AasPayloadUpdateValueItem( + path: (prop)?.GetModelReference()?.Keys, + value: prop.ValueAsText()); - // create - var evi = new AasPayloadUpdateValueItem( - path: (prop)?.GetModelReference()?.Keys, - value: prop.ValueAsText()); + evi.ValueId = prop.ValueId; - evi.ValueId = prop.ValueId; + evi.FoundReferable = prop; - evi.FoundReferable = prop; + // add to the aas element itself + DiaryDataDef.AddAndSetTimestamps(prop, evi, isCreate: false); - // add to the aas element itself - DiaryDataDef.AddAndSetTimestamps(prop, evi, isCreate: false); + // give upwards for animation + AnimateSingleValueChange?.Invoke(prop); + } + + // for object payloads--only JSON for now. + else if (moi.MapRelation.SecondHint is Aas.SubmodelElementCollection coll) + { + //run complex mappping here + + JObject payloadJObject; + + using (var tdStringReader = new StringReader(strval)) + using (var jsonTextReader = new JsonTextReader(tdStringReader) + { DateParseHandling = DateParseHandling.None }) + { + payloadJObject = JObject.FromObject(JToken.ReadFrom(jsonTextReader)); + } + foreach (var internalProperty in coll.Value) + { + if ((internalProperty is Aas.Property internalProp) && payloadJObject.ContainsKey(internalProperty.IdShort)) + { + // set The value related to the json key found here + internalProp.Value = payloadJObject[internalProperty.IdShort].ToString(); + + // create + var evi = new AasPayloadUpdateValueItem( + path: (internalProp)?.GetModelReference()?.Keys, + value: internalProp.ValueAsText()); - // give upwards for animation - AnimateSingleValueChange?.Invoke(prop); + evi.ValueId = internalProp.ValueId; + + evi.FoundReferable = internalProp; + + // add to the aas element itself + DiaryDataDef.AddAndSetTimestamps(internalProp, evi, isCreate: false); + + // give upwards for animation + AnimateSingleValueChange?.Invoke(internalProp); + } + } + } + + } } } @@ -762,6 +833,8 @@ public void PrepareAidInformation(Aas.ISubmodel smAid, Aas.ISubmodel smMapping = DisplayName = $"{dn}", Info = $"{ifx.EndpointMetadata?.Base}", EndpointBase = "" + ifx.EndpointMetadata?.Base, + mostSignificantByte = "" + ifx.EndpointMetadata?.Modv_mostSignificantByte, + mostSignificantWord = "" + ifx.EndpointMetadata?.Modv_mostSignificantWord, Tag = ifx }; InterfaceStatus.Add(aidIfx); @@ -780,7 +853,7 @@ public void PrepareAidInformation(Aas.ISubmodel smAid, Aas.ISubmodel smMapping = FormData = propName.Forms, Value = "???" }; - aidIfx.AddItem(ifcItem); + // does (some) mapping have a source with this property name? var lst = new List(); @@ -797,19 +870,26 @@ public void PrepareAidInformation(Aas.ISubmodel smAid, Aas.ISubmodel smMapping = MapRelation = mr }); if (lst.Count > 0) + { + aidIfx.AddItem(ifcItem); ifcItem.MapOutputItems = lst; + } + // directly recurse? - /* if (propName?.Properties?.Property != null) foreach (var child in propName.Properties.Property) + { + //added this to cater for internal object mapping. + child.Forms = propName.Forms; recurseProp(location + " . " + ifcItem.DisplayName, child); - */ + } + }; - if (ifx.InterfaceMetadata?.Properties?.Property == null) + if (ifx.InteractionMetadata?.Properties?.Property == null) continue; - foreach (var propName in ifx.InterfaceMetadata?.Properties?.Property) + foreach (var propName in ifx.InteractionMetadata?.Properties?.Property) recurseProp("\u2302", propName); } } @@ -869,12 +949,12 @@ public void SetAidInformationForUpdateAndTimeout( // polltimes SetDoubleOnDefaultOrAvgOfIntList( ref ifc.UpdateFreqMs, 10.0, defaultUpdateFreqMs, - SelectValuesToIntList(ifc?.Items?.Values, (it) => it.FormData?.Modbus_pollingTime)); + SelectValuesToIntList(ifc?.Items?.Values, (it) => it.FormData?.Modv_pollingTime)); // time out SetDoubleOnDefaultOrAvgOfIntList( ref ifc.TimeOutMs, 10.0, defaultTimeOutMs, - SelectValuesToIntList(ifc?.Items?.Values, (it) => it.FormData?.Modbus_timeout)); + SelectValuesToIntList(ifc?.Items?.Values, (it) => it.FormData?.Modv_timeout)); } // for OPC UA, analyze update frequency and timeout diff --git a/src/AasxPluginAssetInterfaceDesc/AidModbusConnection.cs b/src/AasxPluginAssetInterfaceDesc/AidModbusConnection.cs index 02d03e09..9820c24f 100644 --- a/src/AasxPluginAssetInterfaceDesc/AidModbusConnection.cs +++ b/src/AasxPluginAssetInterfaceDesc/AidModbusConnection.cs @@ -72,7 +72,7 @@ override public int UpdateItemValue(AidIfxItemStatus item) { // access if (item?.FormData?.Href?.HasContent() != true - || item.FormData.Modbus_function?.HasContent() != true) + || item.FormData.Modv_function?.HasContent() != true) return 0; int res = 0; @@ -90,10 +90,15 @@ override public int UpdateItemValue(AidIfxItemStatus item) // perform function (id = in data) byte[] id = null; - if (item.FormData.Modbus_function.Trim().ToLower() == "readholdingregisters") + if (item.FormData.Modv_function.Trim().ToLower() == "readholdingregisters") { + //Get device unitID + int.TryParse(TargetUri.LocalPath.Replace("/", ""), out var unitID); + // readHoldingRegisters - id = (Client.ReadHoldingRegisters(99, address, 2 * quantity)).ToArray(); + id = (Client.ReadHoldingRegisters(unitID, address, 2 * quantity)).ToArray(); + if (BitConverter.IsLittleEndian) + Array.Reverse(id); // time LastActive = DateTime.Now; } @@ -104,90 +109,128 @@ override public int UpdateItemValue(AidIfxItemStatus item) // swapping (od = out data) // https://doc.iobroker.net/#de/adapters/adapterref/iobroker.modbus/README.md?wp - var mbtp = item.FormData.Modbus_type?.ToLower().Trim(); + var mbtp = item.FormData.Modv_type?.ToLower(); + var byteSequence = item.FormData.Modv_mostSignificantByte; + var wordSequence = item.FormData.Modv_mostSignificantWord; byte[] od = id.ToArray(); if (quantity == 2) { - // 32bit operation on AABBCCDD - if (mbtp.EndsWith("be")) - { - // big endian AABBCCDD => AABBCCDD - od[3] = id[3]; od[2] = id[2]; od[1] = id[1]; od[0] = id[0]; - } - else - if (mbtp.EndsWith("le")) - { - // little endian AABBCCDD => DDCCBBAA - od[3] = id[0]; od[2] = id[1]; od[1] = id[2]; od[0] = id[3]; - } - else - if (mbtp.EndsWith("sw")) - { - // Big Endian Word Swap AABBCCDD => CCDDAABB - od[3] = id[2]; od[2] = id[3]; od[1] = id[0]; od[0] = id[1]; - } - else - if (mbtp.EndsWith("sb")) - { - // Big Endian Byte Swap AABBCCDD => DDCCBBAA - od[3] = id[0]; od[2] = id[1]; od[1] = id[2]; od[0] = id[3]; - } + if (byteSequence == "" && wordSequence == "") // //byte sequence defined at the local level + + //byte sequence defined at the global level + if ((mostSignificantByte == "" && mostSignificantWord == "") || + (mostSignificantByte == "true" && mostSignificantWord == "") || + (mostSignificantByte == "" && mostSignificantWord == "true") || + (mostSignificantByte == "true" && mostSignificantWord == "true")) + { + //use default, byte == true and word == true (Big endian and no word swapping) + } + + else if ((mostSignificantByte == "" && mostSignificantWord == "false") || + (mostSignificantByte == "true" && mostSignificantWord == "false")) + { + //big endian wordswap AABBCCDD => CCDDAABB + od[3] = id[1]; od[2] = id[0]; od[1] = id[3]; od[0] = id[2]; + } + else if ((mostSignificantByte == "false" && mostSignificantWord == "true") || + (mostSignificantByte == "false" && mostSignificantWord == "")) + { + // Little Endian AABBCCDD => DDCCBBAA + Array.Reverse(od); + } + + //byte sequence defined at the global level + else if ((byteSequence == "true" && wordSequence == "") || + (byteSequence == "" && wordSequence == "true") || + (byteSequence == "true" && wordSequence == "true")) + { + //use default, byte == true and word == true (Big endian and no word swapping) + } + + //byte sequence defined at the global level + else if ((byteSequence == "true" && wordSequence == "false") || + (byteSequence == "" && wordSequence == "false")) + { + //big endian wordswap AABBCCDD => CCDDAABB + od[3] = id[1]; od[2] = id[0]; od[1] = id[3]; od[0] = id[2]; + } + + //byte sequence defined at the global level + else if ((byteSequence == "false" && wordSequence == "true") || + (byteSequence == "false" && wordSequence == "")) + { + // Little Endian little endian AABBCCDD => DDCCBBAA + Array.Reverse(od); + } + + + } else if (quantity == 1) { - // 16bit operation on AABB - if (mbtp.EndsWith("le")) + + if (byteSequence == "" && mostSignificantByte == "false") //byte sequence defined at the global level + { + // little endian AABB => BBAA + od[1] = id[0]; od[0] = id[1]; + } + + else if (byteSequence != "" && byteSequence.ToLower() == "false") //byte sequence defined at local level, it overrides gloabal level { // little endian AABB => BBAA od[1] = id[0]; od[0] = id[1]; } + else + { + // big endian AABB => AABB + } } // conversion to value // idea: (1) convert to binary type, (2) convert to adequate string representation var strval = ""; - if (mbtp.StartsWith("uint32") && quantity >= 2) + if (mbtp == "xsd:unsignedint" && quantity >= 2) { strval = BitConverter.ToUInt32(od).ToString(); } else - if (mbtp.StartsWith("int32") && quantity >= 2) + if (mbtp == "xsd:integer" && quantity >= 2) { strval = BitConverter.ToInt32(od).ToString(); } else - if (mbtp.StartsWith("uint16") && quantity >= 1) + if (mbtp == "xsd:int" && quantity >= 1) { strval = BitConverter.ToUInt16(od).ToString(); } else - if (mbtp.StartsWith("int16") && quantity >= 1) + if (mbtp == "xsd:int" && quantity >= 1) { strval = BitConverter.ToInt16(od).ToString(); } else - if (mbtp.StartsWith("uint8") && quantity >= 1) + if (mbtp == "xsd:unsignedshort" && quantity >= 1) { strval = Convert.ToByte(od[0]).ToString(); } else - if (mbtp.StartsWith("int8") && quantity >= 1) + if (mbtp == "xsd:short" && quantity >= 1) { strval = Convert.ToSByte(od[0]).ToString(); } else - if (mbtp.StartsWith("float") && quantity >= 2) + if (mbtp == "xsd:float" && quantity >= 2) { strval = BitConverter.ToSingle(od).ToString("R", CultureInfo.InvariantCulture); } else - if (mbtp.StartsWith("double") && quantity >= 4) + if (mbtp == "xsd:double" && quantity >= 4) { strval = BitConverter.ToDouble(od).ToString("R", CultureInfo.InvariantCulture); } else - if (mbtp.StartsWith("string") && quantity >= 1) + if (mbtp == "xsd:string" && quantity >= 1) { strval = BitConverter.ToString(od); } diff --git a/src/AasxPredefinedConcepts/Mappings/MappingsAssetInterfacesDescription.cs b/src/AasxPredefinedConcepts/Mappings/MappingsAssetInterfacesDescription.cs index f6f78a18..b4d97890 100644 --- a/src/AasxPredefinedConcepts/Mappings/MappingsAssetInterfacesDescription.cs +++ b/src/AasxPredefinedConcepts/Mappings/MappingsAssetInterfacesDescription.cs @@ -31,20 +31,20 @@ public class CD_GenericInterface [AasConcept(Cd = "https://www.w3.org/2019/wot/td#title", Card = AasxPredefinedCardinality.One)] public string Title; - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#created", Card = AasxPredefinedCardinality.ZeroToOne)] + [AasConcept(Cd = "http://purl.org/dc/terms/created", Card = AasxPredefinedCardinality.ZeroToOne)] public DateTime? Created; - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#modified", Card = AasxPredefinedCardinality.ZeroToOne)] + [AasConcept(Cd = "http://purl.org/dc/terms/modified", Card = AasxPredefinedCardinality.ZeroToOne)] public DateTime? Modified; - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#support", Card = AasxPredefinedCardinality.ZeroToOne)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/td#supportContact", Card = AasxPredefinedCardinality.ZeroToOne)] public string Support; [AasConcept(Cd = "https://admin-shell.io/idta/AssetInterfacesDescription/1/0/EndpointMetadata", Card = AasxPredefinedCardinality.One)] public CD_EndpointMetadata EndpointMetadata = new CD_EndpointMetadata(); - [AasConcept(Cd = "https://admin-shell.io/idta/AssetInterfacesDescription/1/0/InterfaceMetadata", Card = AasxPredefinedCardinality.One)] - public CD_InterfaceMetadata InterfaceMetadata = new CD_InterfaceMetadata(); + [AasConcept(Cd = "https://admin-shell.io/idta/AssetInterfacesDescription/1/0/InteractionMetadata", Card = AasxPredefinedCardinality.One)] + public CD_InterfaceMetadata InteractionMetadata = new CD_InterfaceMetadata(); [AasConcept(Cd = "https://admin-shell.io/idta/AssetInterfacesDescription/1/0/ExternalDescriptor", Card = AasxPredefinedCardinality.ZeroToOne)] public CD_ExternalDescriptor ExternalDescriptor = null; @@ -56,12 +56,18 @@ public class CD_GenericInterface [AasConcept(Cd = "https://admin-shell.io/idta/AssetInterfacesDescription/1/0/EndpointMetadata")] public class CD_EndpointMetadata { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#base", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/td#baseURI", Card = AasxPredefinedCardinality.One)] public string Base; [AasConcept(Cd = "https://www.w3.org/2019/wot/hypermedia#forContentType", Card = AasxPredefinedCardinality.One)] public string ContentType; + [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasMostSignificantByte", Card = AasxPredefinedCardinality.ZeroToOne)] + public string Modv_mostSignificantByte = ""; + + [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasMostSignificantWord", Card = AasxPredefinedCardinality.ZeroToOne)] + public string Modv_mostSignificantWord = ""; + [AasConcept(Cd = "https://www.w3.org/2019/wot/td#hasSecurityConfiguration", Card = AasxPredefinedCardinality.One)] public CD_Security Security = new CD_Security(); @@ -117,7 +123,7 @@ public class CD_SecurityDefinitions [AasConcept(Cd = "https://www.w3.org/2019/wot/security#NoSecurityScheme")] public class CD_Nosec_sc { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#definesSecurityScheme", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/security#SecurityScheme", Card = AasxPredefinedCardinality.One)] public string Scheme; // auto-generated informations @@ -127,7 +133,7 @@ public class CD_Nosec_sc [AasConcept(Cd = "https://www.w3.org/2019/wot/security#AutoSecurityScheme")] public class CD_Auto_sc { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#definesSecurityScheme", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/security#SecurityScheme", Card = AasxPredefinedCardinality.One)] public string Scheme; [AasConcept(Cd = "https://www.w3.org/2019/wot/security#proxy", Card = AasxPredefinedCardinality.ZeroToOne)] @@ -140,7 +146,7 @@ public class CD_Auto_sc [AasConcept(Cd = "https://www.w3.org/2019/wot/security#BasicSecurityScheme")] public class CD_Basic_sc { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#definesSecurityScheme", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/security#SecurityScheme", Card = AasxPredefinedCardinality.One)] public string Scheme; [AasConcept(Cd = "https://www.w3.org/2019/wot/security#name", Card = AasxPredefinedCardinality.ZeroToOne)] @@ -159,7 +165,7 @@ public class CD_Basic_sc [AasConcept(Cd = "https://www.w3.org/2019/wot/security#ComboSecurityScheme")] public class CD_Combo_sc { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#definesSecurityScheme", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/security#SecurityScheme", Card = AasxPredefinedCardinality.One)] public string Scheme; [AasConcept(Cd = "https://www.w3.org/2019/wot/json-schema#oneOf", Card = AasxPredefinedCardinality.One)] @@ -194,7 +200,7 @@ public class CD_AllOf [AasConcept(Cd = "https://www.w3.org/2019/wot/security#APIKeySecurityScheme")] public class CD_Apikey_sc { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#definesSecurityScheme", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/security#SecurityScheme", Card = AasxPredefinedCardinality.One)] public string Scheme; [AasConcept(Cd = "https://www.w3.org/2019/wot/security#name", Card = AasxPredefinedCardinality.ZeroToOne)] @@ -213,7 +219,7 @@ public class CD_Apikey_sc [AasConcept(Cd = "https://www.w3.org/2019/wot/security#PSKSecurityScheme")] public class CD_Psk_sc { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#definesSecurityScheme", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/security#SecurityScheme", Card = AasxPredefinedCardinality.One)] public string Scheme; [AasConcept(Cd = "https://www.w3.org/2019/wot/security#identity", Card = AasxPredefinedCardinality.ZeroToOne)] @@ -229,7 +235,7 @@ public class CD_Psk_sc [AasConcept(Cd = "https://www.w3.org/2019/wot/security#DigestSecurityScheme")] public class CD_Digest_sc { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#definesSecurityScheme", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/security#SecurityScheme", Card = AasxPredefinedCardinality.One)] public string Scheme; [AasConcept(Cd = "https://www.w3.org/2019/wot/security#name", Card = AasxPredefinedCardinality.ZeroToOne)] @@ -250,7 +256,7 @@ public class CD_Digest_sc [AasConcept(Cd = "https://www.w3.org/2019/wot/security#BearerSecurityScheme")] public class CD_Bearer_sc { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#definesSecurityScheme", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/security#SecurityScheme", Card = AasxPredefinedCardinality.One)] public string Scheme; [AasConcept(Cd = "https://www.w3.org/2019/wot/security#name", Card = AasxPredefinedCardinality.ZeroToOne)] @@ -278,7 +284,7 @@ public class CD_Bearer_sc [AasConcept(Cd = "https://www.w3.org/2019/wot/security#OAuth2SecurityScheme")] public class CD_Oauth2_sc { - [AasConcept(Cd = "https://www.w3.org/2019/wot/td#definesSecurityScheme", Card = AasxPredefinedCardinality.One)] + [AasConcept(Cd = "https://www.w3.org/2019/wot/security#SecurityScheme", Card = AasxPredefinedCardinality.One)] public string Scheme; [AasConcept(Cd = "https://www.w3.org/2019/wot/security#token", Card = AasxPredefinedCardinality.ZeroToOne)] @@ -441,23 +447,29 @@ public class CD_Forms [AasConcept(Cd = "https://www.w3.org/2019/wot/http#timeout", Card = AasxPredefinedCardinality.ZeroToOne)] public string Htv_timeout; - [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#Function", Card = AasxPredefinedCardinality.ZeroToOne)] - public string Modbus_function; + [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasFunction", Card = AasxPredefinedCardinality.ZeroToOne)] + public string Modv_function; - [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#Entity", Card = AasxPredefinedCardinality.ZeroToOne)] - public string Modbus_entity; + [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasEntity", Card = AasxPredefinedCardinality.ZeroToOne)] + public string Modv_entity; [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasZeroBasedAddressingFlag", Card = AasxPredefinedCardinality.ZeroToOne)] - public string Modbus_zeroBasedAddressing; + public string Modv_zeroBasedAddressing; + + [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasPollingTime", Card = AasxPredefinedCardinality.ZeroToOne)] + public string Modv_pollingTime; + + [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasTimeout", Card = AasxPredefinedCardinality.ZeroToOne)] + public string Modv_timeout; - [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#pollingTime", Card = AasxPredefinedCardinality.ZeroToOne)] - public string Modbus_pollingTime; + [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasPayloadDataType", Card = AasxPredefinedCardinality.ZeroToOne)] + public string Modv_type; - [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#timeout", Card = AasxPredefinedCardinality.ZeroToOne)] - public string Modbus_timeout; + [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasMostSignificantByte", Card = AasxPredefinedCardinality.ZeroToOne)] + public string Modv_mostSignificantByte = ""; - [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#type", Card = AasxPredefinedCardinality.ZeroToOne)] - public string Modbus_type; + [AasConcept(Cd = "https://www.w3.org/2019/wot/modbus#hasMostSignificantWord", Card = AasxPredefinedCardinality.ZeroToOne)] + public string Modv_mostSignificantWord = ""; [AasConcept(Cd = "https://www.w3.org/2019/wot/mqtt#hasRetainFlag", Card = AasxPredefinedCardinality.ZeroToOne)] public string Mqv_retain;