diff --git a/README.md b/README.md
index c172358d..32cbc00c 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
[![MTConnect.NET](https://github.com/TrakHound/MTConnect.NET/actions/workflows/dotnet.yml/badge.svg)](https://github.com/TrakHound/MTConnect.NET/actions/workflows/dotnet.yml)
-> **New Release 5/13/2024** : Version 6.4 Released with new Agent, Adapter, & SysML Import
+> **New Release 10/21/2024** : Version 6.5 Released with support for MTConnect v2.4
## Download
## Overview
-MTConnect.NET is a fully featured and fully Open Source **[.NET](https://dotnet.microsoft.com/)** library for **[MTConnect](https://www.mtconnect.org/)** to develop Agents, Adapters, and Clients. Supports MTConnect Versions up to 2.3. A pre-compiled Agent application is available to download as well as an Adapter application that can be easily customized.
+MTConnect.NET is a fully featured and fully Open Source **[.NET](https://dotnet.microsoft.com/)** library for **[MTConnect](https://www.mtconnect.org/)** to develop Agents, Adapters, and Clients. Supports MTConnect Versions up to 2.4. A pre-compiled Agent application is available to download as well as an Adapter application that can be easily customized.
- .NET Native MTConnect Agent
- Adapter framework used to send data to an MTConnect Agent
@@ -49,7 +49,7 @@ MTConnect.NET is a fully featured and fully Open Source **[.NET](https://dotnet.
- Module based Agent & Adapter architecture
- Supports running as Windows Service with easy to use command line arguments
- Presistent Agent Buffers that are backed up on the File System. Retains state after Agent is restarted
-- Fully compatible up to the latest MTConnect v2.3
+- Fully compatible up to the latest MTConnect v2.4
- Kept up to date by utilizing the MTConnect SysML Model to generate source files
- Supports multiple MTConnect Version output. Automatically removes data that is not compatible with the requested version
- Full client support for requesting data from any MTConnect Agent (Probe, Current, Sample Stream, Assets, etc.).
diff --git a/agent/MTConnect.NET-Agent/README.md b/agent/MTConnect.NET-Agent/README.md
index b4dc52b2..19ad0ae2 100644
--- a/agent/MTConnect.NET-Agent/README.md
+++ b/agent/MTConnect.NET-Agent/README.md
@@ -28,7 +28,7 @@
## Overview
-This project is a full implementation of an MTConnect Agent used to read data from industrial machine tools and devices. This MTConnect Agent application is fully compatible with the latest **Version 2.3 of the MTConnect Standard**.
+This project is a full implementation of an MTConnect Agent used to read data from industrial machine tools and devices. This MTConnect Agent application is fully compatible with the latest **Version 2.4 of the MTConnect Standard**.
#### Features
- Plugin architecture to support Http Server, Mqtt Server, SHDR Adapters, etc.
diff --git a/build/AssemblyInfo.cs b/build/AssemblyInfo.cs
index 71cc1129..6d8629e0 100644
--- a/build/AssemblyInfo.cs
+++ b/build/AssemblyInfo.cs
@@ -1,6 +1,6 @@
using System.Reflection;
-[assembly: AssemblyVersion("6.4.7")]
-[assembly: AssemblyFileVersion("6.4.7")]
+[assembly: AssemblyVersion("6.5.0")]
+[assembly: AssemblyFileVersion("6.5.0")]
[assembly: AssemblyCompany("TrakHound Inc.")]
[assembly: AssemblyCopyright("Copyright (c) 2024 TrakHound Inc., All Rights Reserved.")]
diff --git a/build/MTConnect.NET-SysML-Import/Program.cs b/build/MTConnect.NET-SysML-Import/Program.cs
index c5fb2e63..e5dc22f0 100644
--- a/build/MTConnect.NET-SysML-Import/Program.cs
+++ b/build/MTConnect.NET-SysML-Import/Program.cs
@@ -5,7 +5,7 @@
using System.Text.Json;
//var xmlPath = @"D:\TrakHound\MTConnect\MTConnectSysMLModel.xml";
-var xmlPath = @"D:\TrakHound\MTConnect\Standard\v2.3\MTConnectSysMLModel.xml";
+var xmlPath = @"D:\TrakHound\MTConnect\Standard\v2.4\MTConnectSysMLModel.xml";
var mtconnectModel = MTConnectModel.Parse(xmlPath);
diff --git a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/IParameter.g.cs b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/IParameter.g.cs
index 8b43b223..ae48e30e 100644
--- a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/IParameter.g.cs
+++ b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/IParameter.g.cs
@@ -4,7 +4,7 @@
namespace MTConnect.Assets.ComponentConfigurationParameters
{
///
- /// Property defining a configuration of a Component.
+ /// Property that determines the characteristic or behavior of an entity.
///
public interface IParameter
{
diff --git a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/IParameterSet.g.cs b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/IParameterSet.g.cs
index 563d3f75..912d7146 100644
--- a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/IParameterSet.g.cs
+++ b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/IParameterSet.g.cs
@@ -14,7 +14,7 @@ public interface IParameterSet
string Name { get; }
///
- /// Property defining a configuration of a Component.
+ /// Property that determines the characteristic or behavior of an entity.
///
System.Collections.Generic.IEnumerable Parameters { get; }
}
diff --git a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/Parameter.g.cs b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/Parameter.g.cs
index 621f9c0b..88962501 100644
--- a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/Parameter.g.cs
+++ b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/Parameter.g.cs
@@ -6,11 +6,11 @@
namespace MTConnect.Assets.ComponentConfigurationParameters
{
///
- /// Property defining a configuration of a Component.
+ /// Property that determines the characteristic or behavior of an entity.
///
public class Parameter : IParameter
{
- public const string DescriptionText = "Property defining a configuration of a Component.";
+ public const string DescriptionText = "Property that determines the characteristic or behavior of an entity.";
///
diff --git a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/ParameterSet.g.cs b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/ParameterSet.g.cs
index 803cffbb..33206e62 100644
--- a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/ParameterSet.g.cs
+++ b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/ParameterSet.g.cs
@@ -19,7 +19,7 @@ public class ParameterSet : IParameterSet
public string Name { get; set; }
///
- /// Property defining a configuration of a Component.
+ /// Property that determines the characteristic or behavior of an entity.
///
public System.Collections.Generic.IEnumerable Parameters { get; set; }
}
diff --git a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/ParameterSetDescriptions.g.cs b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/ParameterSetDescriptions.g.cs
index b905e16f..c707d8e8 100644
--- a/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/ParameterSetDescriptions.g.cs
+++ b/libraries/MTConnect.NET-Common/Assets/ComponentConfigurationParameters/ParameterSetDescriptions.g.cs
@@ -11,8 +11,8 @@ public static class ParameterSetDescriptions
public const string Name = "Name of the parameter set if more than one exists.";
///
- /// Property defining a configuration of a Component.
+ /// Property that determines the characteristic or behavior of an entity.
///
- public const string Parameters = "Property defining a configuration of a Component.";
+ public const string Parameters = "Property that determines the characteristic or behavior of an entity.";
}
}
\ No newline at end of file
diff --git a/libraries/MTConnect.NET-Common/Devices/Components/TankComponent.g.cs b/libraries/MTConnect.NET-Common/Devices/Components/TankComponent.g.cs
index c121ec0a..db0f3955 100644
--- a/libraries/MTConnect.NET-Common/Devices/Components/TankComponent.g.cs
+++ b/libraries/MTConnect.NET-Common/Devices/Components/TankComponent.g.cs
@@ -6,13 +6,13 @@
namespace MTConnect.Devices.Components
{
///
- /// Leaf Component composed of a receptacle or container that holds material.
+ /// Leaf Component generally composed of an enclosed container.
///
public class TankComponent : Component
{
public const string TypeId = "Tank";
public const string NameId = "tank";
- public new const string DescriptionText = "Leaf Component composed of a receptacle or container that holds material.";
+ public new const string DescriptionText = "Leaf Component generally composed of an enclosed container.";
public override string TypeDescription => DescriptionText;
diff --git a/libraries/MTConnect.NET-Common/Devices/Components/VatComponent.g.cs b/libraries/MTConnect.NET-Common/Devices/Components/VatComponent.g.cs
index 3ba3df56..1ca07e6e 100644
--- a/libraries/MTConnect.NET-Common/Devices/Components/VatComponent.g.cs
+++ b/libraries/MTConnect.NET-Common/Devices/Components/VatComponent.g.cs
@@ -6,13 +6,13 @@
namespace MTConnect.Devices.Components
{
///
- /// Leaf Component composed of a container that holds liquid or powdered materials.
+ /// Leaf Component generally composed of an open container.
///
public class VatComponent : Component
{
public const string TypeId = "Vat";
public const string NameId = "vat";
- public new const string DescriptionText = "Leaf Component composed of a container that holds liquid or powdered materials.";
+ public new const string DescriptionText = "Leaf Component generally composed of an open container.";
public override string TypeDescription => DescriptionText;
diff --git a/libraries/MTConnect.NET-Common/Devices/DataItems/LocationNarrativeDataItem.g.cs b/libraries/MTConnect.NET-Common/Devices/DataItems/LocationNarrativeDataItem.g.cs
new file mode 100644
index 00000000..d9211f67
--- /dev/null
+++ b/libraries/MTConnect.NET-Common/Devices/DataItems/LocationNarrativeDataItem.g.cs
@@ -0,0 +1,44 @@
+// Copyright (c) 2024 TrakHound Inc., All Rights Reserved.
+// TrakHound Inc. licenses this file to you under the MIT license.
+
+// MTConnect SysML v2.3 : UML ID = _19_0_3_68e0225_1712320901547_688092_333
+
+namespace MTConnect.Devices.DataItems
+{
+ ///
+ /// Textual description of the location of an object or activity.
+ ///
+ public class LocationNarrativeDataItem : DataItem
+ {
+ public const DataItemCategory CategoryId = DataItemCategory.EVENT;
+ public const string TypeId = "LOCATION_NARRATIVE";
+ public const string NameId = "locationNarrative";
+
+
+ public new const string DescriptionText = "Textual description of the location of an object or activity.";
+
+ public override string TypeDescription => DescriptionText;
+
+
+
+
+ public LocationNarrativeDataItem()
+ {
+ Category = CategoryId;
+ Type = TypeId;
+ Name = NameId;
+
+
+ }
+
+ public LocationNarrativeDataItem(string deviceId)
+ {
+ Id = CreateId(deviceId, NameId);
+ Category = CategoryId;
+ Type = TypeId;
+ Name = NameId;
+
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/MTConnect.NET-Common/Devices/DataItems/LocationSpatialGeographicDataItem.g.cs b/libraries/MTConnect.NET-Common/Devices/DataItems/LocationSpatialGeographicDataItem.g.cs
new file mode 100644
index 00000000..41d91493
--- /dev/null
+++ b/libraries/MTConnect.NET-Common/Devices/DataItems/LocationSpatialGeographicDataItem.g.cs
@@ -0,0 +1,44 @@
+// Copyright (c) 2024 TrakHound Inc., All Rights Reserved.
+// TrakHound Inc. licenses this file to you under the MIT license.
+
+// MTConnect SysML v2.3 : UML ID = _19_0_3_68e0225_1712322699365_211671_599
+
+namespace MTConnect.Devices.DataItems
+{
+ ///
+ /// Absolute geographic location defined by two coordinates, longitude and latitude and an elevation.
+ ///
+ public class LocationSpatialGeographicDataItem : DataItem
+ {
+ public const DataItemCategory CategoryId = DataItemCategory.EVENT;
+ public const string TypeId = "LOCATION_SPATIAL_GEOGRAPHIC";
+ public const string NameId = "locationSpatialGeographic";
+ public const DataItemRepresentation DefaultRepresentation = DataItemRepresentation.TABLE;
+
+ public new const string DescriptionText = "Absolute geographic location defined by two coordinates, longitude and latitude and an elevation.";
+
+ public override string TypeDescription => DescriptionText;
+
+ public override System.Version MinimumVersion => MTConnectVersions.Version23;
+
+
+ public LocationSpatialGeographicDataItem()
+ {
+ Category = CategoryId;
+ Type = TypeId;
+ Name = NameId;
+ Representation = DefaultRepresentation;
+
+ }
+
+ public LocationSpatialGeographicDataItem(string deviceId)
+ {
+ Id = CreateId(deviceId, NameId);
+ Category = CategoryId;
+ Type = TypeId;
+ Name = NameId;
+ Representation = DefaultRepresentation;
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/MTConnect.NET-Common/Devices/DataItems/ThicknessDataItem.g.cs b/libraries/MTConnect.NET-Common/Devices/DataItems/ThicknessDataItem.g.cs
new file mode 100644
index 00000000..b59b9762
--- /dev/null
+++ b/libraries/MTConnect.NET-Common/Devices/DataItems/ThicknessDataItem.g.cs
@@ -0,0 +1,102 @@
+// Copyright (c) 2024 TrakHound Inc., All Rights Reserved.
+// TrakHound Inc. licenses this file to you under the MIT license.
+
+// MTConnect SysML v2.3 : UML ID = _19_0_3_68e0225_1712321222573_635969_358
+
+namespace MTConnect.Devices.DataItems
+{
+ ///
+ /// Dimension between two surfaces of an object, usually the dimension of smallest measure, for example an additive layer, or a depth of cut.
+ ///
+ public class ThicknessDataItem : DataItem
+ {
+ public const DataItemCategory CategoryId = DataItemCategory.EVENT;
+ public const string TypeId = "THICKNESS";
+ public const string NameId = "thickness";
+ public const DataItemRepresentation DefaultRepresentation = DataItemRepresentation.VALUE;
+
+ public new const string DescriptionText = "Dimension between two surfaces of an object, usually the dimension of smallest measure, for example an additive layer, or a depth of cut.";
+
+ public override string TypeDescription => DescriptionText;
+
+
+
+
+ public enum SubTypes
+ {
+ ///
+ /// ACTUAL.
+ ///
+ ACTUAL,
+
+ ///
+ /// COMMANDED.
+ ///
+ COMMANDED,
+
+ ///
+ /// TARGET.
+ ///
+ TARGET,
+
+ ///
+ /// PROGRAMMED.
+ ///
+ PROGRAMMED
+ }
+
+
+ public ThicknessDataItem()
+ {
+ Category = CategoryId;
+ Type = TypeId;
+ Name = NameId;
+ Representation = DefaultRepresentation;
+
+ }
+
+ public ThicknessDataItem(
+ string parentId,
+ SubTypes subType
+ )
+ {
+ Id = CreateId(parentId, NameId, GetSubTypeId(subType));
+ Category = CategoryId;
+ Type = TypeId;
+ SubType = subType.ToString();
+ Name = NameId;
+ Representation = DefaultRepresentation;
+
+ }
+
+ public override string SubTypeDescription => GetSubTypeDescription(SubType);
+
+ public static string GetSubTypeDescription(string subType)
+ {
+ var s = subType.ConvertEnum();
+ switch (s)
+ {
+ case SubTypes.ACTUAL: return "ACTUAL.";
+ case SubTypes.COMMANDED: return "COMMANDED.";
+ case SubTypes.TARGET: return "TARGET.";
+ case SubTypes.PROGRAMMED: return "PROGRAMMED.";
+ }
+
+ return null;
+ }
+
+ public static string GetSubTypeId(SubTypes subType)
+ {
+ switch (subType)
+ {
+ case SubTypes.ACTUAL: return "ACTUAL";
+ case SubTypes.COMMANDED: return "COMMANDED";
+ case SubTypes.TARGET: return "TARGET";
+ case SubTypes.PROGRAMMED: return "PROGRAMMED";
+ }
+
+ return null;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/libraries/MTConnect.NET-Common/Devices/NativeUnits.g.cs b/libraries/MTConnect.NET-Common/Devices/NativeUnits.g.cs
index b41775f9..41a3ea6a 100644
--- a/libraries/MTConnect.NET-Common/Devices/NativeUnits.g.cs
+++ b/libraries/MTConnect.NET-Common/Devices/NativeUnits.g.cs
@@ -20,6 +20,11 @@ public static class NativeUnits
///
public const string CENTIPOISE = "CENTIPOISE";
+ ///
+ /// Geometric volume in feet.
+ ///
+ public const string CUBIC_FOOT = "CUBIC_FOOT";
+
///
/// Change of geometric volume in cubic foot per hour.
///
@@ -105,6 +110,11 @@ public static class NativeUnits
///
public const string INCH_PER_MINUTE = "INCH/MINUTE";
+ ///
+ /// Inch per revolution.
+ ///
+ public const string INCH_PER_REVOLUTION = "INCH/REVOLUTION";
+
///
/// Inches per second.
///
@@ -181,15 +191,20 @@ public static class NativeUnits
public const string RADIAN_PER_MINUTE = "RADIAN/MINUTE";
///
- /// Rotational acceleration in radian per second squared.
+ /// Velocity in radians per second.
///
public const string RADIAN_PER_SECOND = "RADIAN/SECOND";
///
- /// Rotational acceleration in radian per second squared.
+ /// Acceleration in radians per second squared.
///
public const string RADIAN_PER_SECOND_SQUARED = "RADIAN/SECOND^2";
+ ///
+ /// Geometric area in inches.
+ ///
+ public const string SQUARE_INCH = "SQUARE_INCH";
+
///
/// Pressure in Torr.
///
diff --git a/libraries/MTConnect.NET-Common/Devices/NativeUnitsDescriptions.g.cs b/libraries/MTConnect.NET-Common/Devices/NativeUnitsDescriptions.g.cs
index 70c9cf1d..eed6ac73 100644
--- a/libraries/MTConnect.NET-Common/Devices/NativeUnitsDescriptions.g.cs
+++ b/libraries/MTConnect.NET-Common/Devices/NativeUnitsDescriptions.g.cs
@@ -20,6 +20,11 @@ public static class NativeUnitsDescriptions
///
public const string CENTIPOISE = "Measure of viscosity.";
+ ///
+ /// Geometric volume in feet.
+ ///
+ public const string CUBIC_FOOT = "Geometric volume in feet.";
+
///
/// Change of geometric volume in cubic foot per hour.
///
@@ -105,6 +110,11 @@ public static class NativeUnitsDescriptions
///
public const string INCH_PER_MINUTE = "Inches per minute.";
+ ///
+ /// Inch per revolution.
+ ///
+ public const string INCH_PER_REVOLUTION = "Inch per revolution.";
+
///
/// Inches per second.
///
@@ -181,14 +191,19 @@ public static class NativeUnitsDescriptions
public const string RADIAN_PER_MINUTE = "Velocity in radians per minute.";
///
- /// Rotational acceleration in radian per second squared.
+ /// Velocity in radians per second.
+ ///
+ public const string RADIAN_PER_SECOND = "Velocity in radians per second.";
+
+ ///
+ /// Acceleration in radians per second squared.
///
- public const string RADIAN_PER_SECOND = "Rotational acceleration in radian per second squared.";
+ public const string RADIAN_PER_SECOND_SQUARED = "Acceleration in radians per second squared.";
///
- /// Rotational acceleration in radian per second squared.
+ /// Geometric area in inches.
///
- public const string RADIAN_PER_SECOND_SQUARED = "Rotational acceleration in radian per second squared.";
+ public const string SQUARE_INCH = "Geometric area in inches.";
///
/// Pressure in Torr.
@@ -203,6 +218,7 @@ public static string Get(string value)
case NativeUnits.AMPERE_HOUR: return "Electric charge in ampere hour.";
case NativeUnits.BAR: return "Pressure in Bar.";
case NativeUnits.CENTIPOISE: return "Measure of viscosity.";
+ case NativeUnits.CUBIC_FOOT: return "Geometric volume in feet.";
case NativeUnits.CUBIC_FOOT_PER_HOUR: return "Change of geometric volume in cubic foot per hour.";
case NativeUnits.CUBIC_FOOT_PER_MINUTE: return "Change of geometric volume in cubic foot per minute.";
case NativeUnits.DEGREE_PER_MINUTE: return "Rotational velocity in degrees per minute.";
@@ -220,6 +236,7 @@ public static string Get(string value)
case NativeUnits.INCH_3D: return "Point in space identified by X, Y, and Z positions and represented by a space-delimited set of numbers each expressed in inches.";
case NativeUnits.INCH_POUND: return "Measure of torque in inch pounds.";
case NativeUnits.INCH_PER_MINUTE: return "Inches per minute.";
+ case NativeUnits.INCH_PER_REVOLUTION: return "Inch per revolution.";
case NativeUnits.INCH_PER_SECOND: return "Inches per second.";
case NativeUnits.INCH_PER_SECOND_SQUARED: return "Acceleration in inches per second squared.";
case NativeUnits.KELVIN: return "Measurement of temperature.";
@@ -235,8 +252,9 @@ public static string Get(string value)
case NativeUnits.POUND_PER_INCH_SQUARED: return "Pressure in pounds per square inch (PSI).";
case NativeUnits.RADIAN: return "Angle in radians.";
case NativeUnits.RADIAN_PER_MINUTE: return "Velocity in radians per minute.";
- case NativeUnits.RADIAN_PER_SECOND: return "Rotational acceleration in radian per second squared.";
- case NativeUnits.RADIAN_PER_SECOND_SQUARED: return "Rotational acceleration in radian per second squared.";
+ case NativeUnits.RADIAN_PER_SECOND: return "Velocity in radians per second.";
+ case NativeUnits.RADIAN_PER_SECOND_SQUARED: return "Acceleration in radians per second squared.";
+ case NativeUnits.SQUARE_INCH: return "Geometric area in inches.";
case NativeUnits.TORR: return "Pressure in Torr.";
}
diff --git a/libraries/MTConnect.NET-Common/Devices/Units.g.cs b/libraries/MTConnect.NET-Common/Devices/Units.g.cs
index 1fb0eb17..b815f785 100644
--- a/libraries/MTConnect.NET-Common/Devices/Units.g.cs
+++ b/libraries/MTConnect.NET-Common/Devices/Units.g.cs
@@ -30,6 +30,11 @@ public static partial class Units
///
public const string COUNT_PER_SECOND = "COUNT/SECOND";
+ ///
+ /// Geometric volume in meters.
+ ///
+ public const string CUBIC_METER = "CUBIC_METER";
+
///
/// Geometric volume in millimeters.
///
@@ -220,6 +225,11 @@ public static partial class Units
///
public const string SIEMENS_PER_METER = "SIEMENS/METER";
+ ///
+ /// Geometric area in millimeters.
+ ///
+ public const string SQUARE_MILLIMETER = "SQUARE_MILLIMETER";
+
///
/// 3D Unit Vector.Space delimited list of three floating point numbers.
///
diff --git a/libraries/MTConnect.NET-Common/Devices/UnitsDescriptions.g.cs b/libraries/MTConnect.NET-Common/Devices/UnitsDescriptions.g.cs
index 21cc084f..37ce16c1 100644
--- a/libraries/MTConnect.NET-Common/Devices/UnitsDescriptions.g.cs
+++ b/libraries/MTConnect.NET-Common/Devices/UnitsDescriptions.g.cs
@@ -30,6 +30,11 @@ public static class UnitsDescriptions
///
public const string COUNT_PER_SECOND = "Counts per second.";
+ ///
+ /// Geometric volume in meters.
+ ///
+ public const string CUBIC_METER = "Geometric volume in meters.";
+
///
/// Geometric volume in millimeters.
///
@@ -220,6 +225,11 @@ public static class UnitsDescriptions
///
public const string SIEMENS_PER_METER = "Measurement of electrical conductivity.";
+ ///
+ /// Geometric area in millimeters.
+ ///
+ public const string SQUARE_MILLIMETER = "Geometric area in millimeters.";
+
///
/// 3D Unit Vector.Space delimited list of three floating point numbers.
///
@@ -260,6 +270,7 @@ public static string Get(string value)
case Units.COULOMB: return "Electric charge in coulombs (C).";
case Units.COUNT: return "Count of something.";
case Units.COUNT_PER_SECOND: return "Counts per second.";
+ case Units.CUBIC_METER: return "Geometric volume in meters.";
case Units.CUBIC_MILLIMETER: return "Geometric volume in millimeters.";
case Units.CUBIC_MILLIMETER_PER_SECOND: return "Change of geometric volume per second.";
case Units.CUBIC_MILLIMETER_PER_SECOND_SQUARED: return "Change in geometric volume per second squared.";
@@ -298,6 +309,7 @@ public static string Get(string value)
case Units.REVOLUTION_PER_SECOND_SQUARED: return "Revolutions per second squared.";
case Units.SECOND: return "Measurement of time.";
case Units.SIEMENS_PER_METER: return "Measurement of electrical conductivity.";
+ case Units.SQUARE_MILLIMETER: return "Geometric area in millimeters.";
case Units.UNIT_VECTOR_3D: return "3D Unit Vector.Space delimited list of three floating point numbers.";
case Units.VOLT: return "Volts.";
case Units.VOLT_AMPERE: return "Measurement of the apparent power in an electrical circuit, equal to the product of root-mean-square (RMS) voltage and RMS current (commonly referred to as VA).";
diff --git a/libraries/MTConnect.NET-Common/MTConnectVersions.cs b/libraries/MTConnect.NET-Common/MTConnectVersions.cs
index 0d05165f..6394d429 100644
--- a/libraries/MTConnect.NET-Common/MTConnectVersions.cs
+++ b/libraries/MTConnect.NET-Common/MTConnectVersions.cs
@@ -7,7 +7,7 @@ namespace MTConnect
{
public static class MTConnectVersions
{
- public static Version Max => Version23;
+ public static Version Max => Version24;
public static readonly Version Version10 = new Version(1, 0);
public static readonly Version Version11 = new Version(1, 1);
@@ -22,5 +22,6 @@ public static class MTConnectVersions
public static readonly Version Version21 = new Version(2, 1);
public static readonly Version Version22 = new Version(2, 2);
public static readonly Version Version23 = new Version(2, 3);
+ public static readonly Version Version24 = new Version(2, 4);
}
}
\ No newline at end of file
diff --git a/libraries/MTConnect.NET-Common/Observations/Events/LocationSpatialGeographicResult.g.cs b/libraries/MTConnect.NET-Common/Observations/Events/LocationSpatialGeographicResult.g.cs
new file mode 100644
index 00000000..114795b5
--- /dev/null
+++ b/libraries/MTConnect.NET-Common/Observations/Events/LocationSpatialGeographicResult.g.cs
@@ -0,0 +1,39 @@
+// Copyright (c) 2024 TrakHound Inc., All Rights Reserved.
+// TrakHound Inc. licenses this file to you under the MIT license.
+
+namespace MTConnect.Observations.Events
+{
+ ///
+ ///
+ ///
+ public class LocationSpatialGeographicResult : EventDataSetObservation
+ {
+
+ ///
+ /// Height relative to a reference.
+ ///
+ public string Altitude
+ {
+ get => GetValue("DataSet[Altitude]");
+ set => AddValue("DataSet[Altitude]", value);
+ }
+
+ ///
+ /// Geographic latitude.
+ ///
+ public string Latitude
+ {
+ get => GetValue("DataSet[Latitude]");
+ set => AddValue("DataSet[Latitude]", value);
+ }
+
+ ///
+ /// Geographic longitude.
+ ///
+ public string Longitude
+ {
+ get => GetValue("DataSet[Longitude]");
+ set => AddValue("DataSet[Longitude]", value);
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/MTConnect.NET-Common/Streams/ComponentStream.cs b/libraries/MTConnect.NET-Common/Streams/ComponentStream.cs
index 8884491c..4e15b870 100644
--- a/libraries/MTConnect.NET-Common/Streams/ComponentStream.cs
+++ b/libraries/MTConnect.NET-Common/Streams/ComponentStream.cs
@@ -42,7 +42,7 @@ public class ComponentStream : IComponentStream
public string NativeName { get; set; }
///
- /// Uuid of the ComponentStream element.
+ /// Uuid of the Component Associated with the ComponentStream
///
public string Uuid { get; set; }
diff --git a/libraries/MTConnect.NET-Common/Streams/IComponentStream.cs b/libraries/MTConnect.NET-Common/Streams/IComponentStream.cs
index a1555336..fc9e62b7 100644
--- a/libraries/MTConnect.NET-Common/Streams/IComponentStream.cs
+++ b/libraries/MTConnect.NET-Common/Streams/IComponentStream.cs
@@ -38,7 +38,7 @@ public interface IComponentStream
string NativeName { get; }
///
- /// Uuid of the ComponentStream element.
+ /// Uuid of the Component Associated with the ComponentStream
///
string Uuid { get; }
diff --git a/libraries/MTConnect.NET-JSON-cppagent/Streams/JsonEvents.g.cs b/libraries/MTConnect.NET-JSON-cppagent/Streams/JsonEvents.g.cs
index 5baefe65..97c48fba 100644
--- a/libraries/MTConnect.NET-JSON-cppagent/Streams/JsonEvents.g.cs
+++ b/libraries/MTConnect.NET-JSON-cppagent/Streams/JsonEvents.g.cs
@@ -267,6 +267,14 @@ public List Observations
if (!LocationAddressDataSet.IsNullOrEmpty()) foreach (var x in LocationAddressDataSet) l.Add(x.ToObservation(LocationAddressDataItem.TypeId));
if (!LocationAddressTable.IsNullOrEmpty()) foreach (var x in LocationAddressTable) l.Add(x.ToObservation(LocationAddressDataItem.TypeId));
+ if (!LocationNarrative.IsNullOrEmpty()) foreach (var x in LocationNarrative) l.Add(x.ToObservation(LocationNarrativeDataItem.TypeId));
+ if (!LocationNarrativeDataSet.IsNullOrEmpty()) foreach (var x in LocationNarrativeDataSet) l.Add(x.ToObservation(LocationNarrativeDataItem.TypeId));
+ if (!LocationNarrativeTable.IsNullOrEmpty()) foreach (var x in LocationNarrativeTable) l.Add(x.ToObservation(LocationNarrativeDataItem.TypeId));
+
+ if (!LocationSpatialGeographic.IsNullOrEmpty()) foreach (var x in LocationSpatialGeographic) l.Add(x.ToObservation(LocationSpatialGeographicDataItem.TypeId));
+ if (!LocationSpatialGeographicDataSet.IsNullOrEmpty()) foreach (var x in LocationSpatialGeographicDataSet) l.Add(x.ToObservation(LocationSpatialGeographicDataItem.TypeId));
+ if (!LocationSpatialGeographicTable.IsNullOrEmpty()) foreach (var x in LocationSpatialGeographicTable) l.Add(x.ToObservation(LocationSpatialGeographicDataItem.TypeId));
+
if (!LockState.IsNullOrEmpty()) foreach (var x in LockState) l.Add(x.ToObservation(LockStateDataItem.TypeId));
if (!LockStateDataSet.IsNullOrEmpty()) foreach (var x in LockStateDataSet) l.Add(x.ToObservation(LockStateDataItem.TypeId));
if (!LockStateTable.IsNullOrEmpty()) foreach (var x in LockStateTable) l.Add(x.ToObservation(LockStateDataItem.TypeId));
@@ -471,6 +479,10 @@ public List Observations
if (!SpindleInterlockDataSet.IsNullOrEmpty()) foreach (var x in SpindleInterlockDataSet) l.Add(x.ToObservation(SpindleInterlockDataItem.TypeId));
if (!SpindleInterlockTable.IsNullOrEmpty()) foreach (var x in SpindleInterlockTable) l.Add(x.ToObservation(SpindleInterlockDataItem.TypeId));
+ if (!Thickness.IsNullOrEmpty()) foreach (var x in Thickness) l.Add(x.ToObservation(ThicknessDataItem.TypeId));
+ if (!ThicknessDataSet.IsNullOrEmpty()) foreach (var x in ThicknessDataSet) l.Add(x.ToObservation(ThicknessDataItem.TypeId));
+ if (!ThicknessTable.IsNullOrEmpty()) foreach (var x in ThicknessTable) l.Add(x.ToObservation(ThicknessDataItem.TypeId));
+
if (!ToolAssetId.IsNullOrEmpty()) foreach (var x in ToolAssetId) l.Add(x.ToObservation(ToolAssetIdDataItem.TypeId));
if (!ToolAssetIdDataSet.IsNullOrEmpty()) foreach (var x in ToolAssetIdDataSet) l.Add(x.ToObservation(ToolAssetIdDataItem.TypeId));
if (!ToolAssetIdTable.IsNullOrEmpty()) foreach (var x in ToolAssetIdTable) l.Add(x.ToObservation(ToolAssetIdDataItem.TypeId));
@@ -1175,6 +1187,26 @@ public List Observations
public IEnumerable LocationAddressTable { get; set; }
+ [JsonPropertyName("LocationNarrative")]
+ public IEnumerable LocationNarrative { get; set; }
+
+ [JsonPropertyName("LocationNarrativeDataSet")]
+ public IEnumerable LocationNarrativeDataSet { get; set; }
+
+ [JsonPropertyName("LocationNarrativeTable")]
+ public IEnumerable LocationNarrativeTable { get; set; }
+
+
+ [JsonPropertyName("LocationSpatialGeographic")]
+ public IEnumerable LocationSpatialGeographic { get; set; }
+
+ [JsonPropertyName("LocationSpatialGeographicDataSet")]
+ public IEnumerable LocationSpatialGeographicDataSet { get; set; }
+
+ [JsonPropertyName("LocationSpatialGeographicTable")]
+ public IEnumerable LocationSpatialGeographicTable { get; set; }
+
+
[JsonPropertyName("LockState")]
public IEnumerable LockState { get; set; }
@@ -1685,6 +1717,16 @@ public List Observations
public IEnumerable SpindleInterlockTable { get; set; }
+ [JsonPropertyName("Thickness")]
+ public IEnumerable Thickness { get; set; }
+
+ [JsonPropertyName("ThicknessDataSet")]
+ public IEnumerable ThicknessDataSet { get; set; }
+
+ [JsonPropertyName("ThicknessTable")]
+ public IEnumerable ThicknessTable { get; set; }
+
+
[JsonPropertyName("ToolAssetId")]
public IEnumerable ToolAssetId { get; set; }
@@ -4189,6 +4231,80 @@ public JsonEvents(IEnumerable observations)
}
+ // Add LocationNarrative
+ typeObservations = observations.Where(o => o.Type == LocationNarrativeDataItem.TypeId && o.Representation == DataItemRepresentation.VALUE);
+ if (!typeObservations.IsNullOrEmpty())
+ {
+ var jsonObservations = new List();
+ foreach (var observation in typeObservations)
+ {
+ jsonObservations.Add(new JsonEventValue(observation));
+ }
+ LocationNarrative = jsonObservations;
+ }
+
+ // Add LocationNarrativeDataSet
+ typeObservations = observations.Where(o => o.Type == LocationNarrativeDataItem.TypeId && o.Representation == DataItemRepresentation.DATA_SET);
+ if (!typeObservations.IsNullOrEmpty())
+ {
+ var jsonObservations = new List();
+ foreach (var observation in typeObservations)
+ {
+ jsonObservations.Add(new JsonEventDataSet(observation));
+ }
+ LocationNarrativeDataSet = jsonObservations;
+ }
+
+ // Add LocationNarrativeTable
+ typeObservations = observations.Where(o => o.Type == LocationNarrativeDataItem.TypeId && o.Representation == DataItemRepresentation.TABLE);
+ if (!typeObservations.IsNullOrEmpty())
+ {
+ var jsonObservations = new List();
+ foreach (var observation in typeObservations)
+ {
+ jsonObservations.Add(new JsonEventTable(observation));
+ }
+ LocationNarrativeTable = jsonObservations;
+ }
+
+
+ // Add LocationSpatialGeographic
+ typeObservations = observations.Where(o => o.Type == LocationSpatialGeographicDataItem.TypeId && o.Representation == DataItemRepresentation.VALUE);
+ if (!typeObservations.IsNullOrEmpty())
+ {
+ var jsonObservations = new List();
+ foreach (var observation in typeObservations)
+ {
+ jsonObservations.Add(new JsonEventValue(observation));
+ }
+ LocationSpatialGeographic = jsonObservations;
+ }
+
+ // Add LocationSpatialGeographicDataSet
+ typeObservations = observations.Where(o => o.Type == LocationSpatialGeographicDataItem.TypeId && o.Representation == DataItemRepresentation.DATA_SET);
+ if (!typeObservations.IsNullOrEmpty())
+ {
+ var jsonObservations = new List();
+ foreach (var observation in typeObservations)
+ {
+ jsonObservations.Add(new JsonEventDataSet(observation));
+ }
+ LocationSpatialGeographicDataSet = jsonObservations;
+ }
+
+ // Add LocationSpatialGeographicTable
+ typeObservations = observations.Where(o => o.Type == LocationSpatialGeographicDataItem.TypeId && o.Representation == DataItemRepresentation.TABLE);
+ if (!typeObservations.IsNullOrEmpty())
+ {
+ var jsonObservations = new List();
+ foreach (var observation in typeObservations)
+ {
+ jsonObservations.Add(new JsonEventTable(observation));
+ }
+ LocationSpatialGeographicTable = jsonObservations;
+ }
+
+
// Add LockState
typeObservations = observations.Where(o => o.Type == LockStateDataItem.TypeId && o.Representation == DataItemRepresentation.VALUE);
if (!typeObservations.IsNullOrEmpty())
@@ -6076,6 +6192,43 @@ public JsonEvents(IEnumerable observations)
}
+ // Add Thickness
+ typeObservations = observations.Where(o => o.Type == ThicknessDataItem.TypeId && o.Representation == DataItemRepresentation.VALUE);
+ if (!typeObservations.IsNullOrEmpty())
+ {
+ var jsonObservations = new List();
+ foreach (var observation in typeObservations)
+ {
+ jsonObservations.Add(new JsonEventValue(observation));
+ }
+ Thickness = jsonObservations;
+ }
+
+ // Add ThicknessDataSet
+ typeObservations = observations.Where(o => o.Type == ThicknessDataItem.TypeId && o.Representation == DataItemRepresentation.DATA_SET);
+ if (!typeObservations.IsNullOrEmpty())
+ {
+ var jsonObservations = new List();
+ foreach (var observation in typeObservations)
+ {
+ jsonObservations.Add(new JsonEventDataSet(observation));
+ }
+ ThicknessDataSet = jsonObservations;
+ }
+
+ // Add ThicknessTable
+ typeObservations = observations.Where(o => o.Type == ThicknessDataItem.TypeId && o.Representation == DataItemRepresentation.TABLE);
+ if (!typeObservations.IsNullOrEmpty())
+ {
+ var jsonObservations = new List();
+ foreach (var observation in typeObservations)
+ {
+ jsonObservations.Add(new JsonEventTable(observation));
+ }
+ ThicknessTable = jsonObservations;
+ }
+
+
// Add ToolAssetId
typeObservations = observations.Where(o => o.Type == ToolAssetIdDataItem.TypeId && o.Representation == DataItemRepresentation.VALUE);
if (!typeObservations.IsNullOrEmpty())
diff --git a/libraries/MTConnect.NET-XML/MTConnectVersion.cs b/libraries/MTConnect.NET-XML/MTConnectVersion.cs
index bcf06116..5759aefe 100644
--- a/libraries/MTConnect.NET-XML/MTConnectVersion.cs
+++ b/libraries/MTConnect.NET-XML/MTConnectVersion.cs
@@ -23,6 +23,7 @@ public static Version GetByNamespace(string ns)
{
if (ns != null)
{
+ if (Namespaces.Version23.Match(ns)) return MTConnectVersions.Version24;
if (Namespaces.Version23.Match(ns)) return MTConnectVersions.Version23;
if (Namespaces.Version22.Match(ns)) return MTConnectVersions.Version22;
if (Namespaces.Version21.Match(ns)) return MTConnectVersions.Version21;
diff --git a/libraries/MTConnect.NET-XML/Namespaces.cs b/libraries/MTConnect.NET-XML/Namespaces.cs
index 108075ff..93f29673 100644
--- a/libraries/MTConnect.NET-XML/Namespaces.cs
+++ b/libraries/MTConnect.NET-XML/Namespaces.cs
@@ -81,6 +81,7 @@ public static string GetDevices(int majorVerion, int minorVersion)
case 1: return Version21.Devices;
case 2: return Version22.Devices;
case 3: return Version23.Devices;
+ case 4: return Version24.Devices;
}
break;
@@ -119,6 +120,7 @@ public static string GetStreams(int majorVerion, int minorVersion)
case 1: return Version21.Streams;
case 2: return Version22.Streams;
case 3: return Version23.Streams;
+ case 4: return Version24.Streams;
}
break;
@@ -207,6 +209,7 @@ public static string GetAssets(int majorVerion, int minorVersion)
case 1: return Version21.Assets;
case 2: return Version22.Assets;
case 3: return Version23.Assets;
+ case 4: return Version24.Assets;
}
break;
@@ -244,6 +247,7 @@ public static string GetError(int majorVerion, int minorVersion)
case 1: return Version21.Error;
case 2: return Version22.Error;
case 3: return Version23.Error;
+ case 4: return Version24.Error;
}
break;
@@ -267,6 +271,19 @@ public static string Clear(string xml)
}
+ internal static class Version24
+ {
+ public const string Assets = "urn:mtconnect.org:MTConnectAssets:2.4";
+ public const string Devices = "urn:mtconnect.org:MTConnectDevices:2.4";
+ public const string Error = "urn:mtconnect.org:MTConnectError:2.4";
+ public const string Streams = "urn:mtconnect.org:MTConnectStreams:2.4";
+
+ public static bool Match(string ns)
+ {
+ return ns == Assets || ns == Devices || ns == Error || ns == Streams;
+ }
+ }
+
internal static class Version23
{
public const string Assets = "urn:mtconnect.org:MTConnectAssets:2.3";
diff --git a/libraries/MTConnect.NET/README-Nuget.md b/libraries/MTConnect.NET/README-Nuget.md
index b2585484..d0f2c070 100644
--- a/libraries/MTConnect.NET/README-Nuget.md
+++ b/libraries/MTConnect.NET/README-Nuget.md
@@ -4,11 +4,11 @@
[![MTConnect.NET](https://github.com/TrakHound/MTConnect.NET/actions/workflows/dotnet.yml/badge.svg)](https://github.com/TrakHound/MTConnect.NET/actions/workflows/dotnet.yml)
-> **New Release 5/13/2024** : Version 6.4 Released with new Agent, Adapter, & SysML Import
+> **New Release 10/21/2024** : Version 6.5 Released with support for MTConnect v2.4
## Overview
-MTConnect.NET is a fully featured and fully Open Source **[.NET](https://dotnet.microsoft.com/)** library for **[MTConnect](https://www.mtconnect.org/)** to develop Agents, Adapters, and Clients. Supports MTConnect Versions up to 2.3. A pre-compiled Agent application is available to download as well as an Adapter application that can be easily customized.
+MTConnect.NET is a fully featured and fully Open Source **[.NET](https://dotnet.microsoft.com/)** library for **[MTConnect](https://www.mtconnect.org/)** to develop Agents, Adapters, and Clients. Supports MTConnect Versions up to 2.4. A pre-compiled Agent application is available to download as well as an Adapter application that can be easily customized.
- .NET Native MTConnect Agent
- Adapter framework used to send data to an MTConnect Agent
@@ -18,7 +18,7 @@ MTConnect.NET is a fully featured and fully Open Source **[.NET](https://dotnet.
- Module based Agent & Adapter architecture
- Supports running as Windows Service with easy to use command line arguments
- Presistent Agent Buffers that are backed up on the File System. Retains state after Agent is restarted
-- Fully compatible up to the latest MTConnect v2.3
+- Fully compatible up to the latest MTConnect v2.4
- Kept up to date by utilizing the MTConnect SysML Model to generate source files
- Supports multiple MTConnect Version output. Automatically removes data that is not compatible with the requested version
- Full client support for requesting data from any MTConnect Agent (Probe, Current, Sample Stream, Assets, etc.).