From f14dc1dbc7b1968f81f167635b836d298494d80a Mon Sep 17 00:00:00 2001 From: VadimZezyotkoATP Date: Wed, 22 May 2024 12:29:04 +0300 Subject: [PATCH 1/9] Add new device G --- src/Device/DeviceSubTypeEnum.cs | 6 ++ src/Device/DeviceTypeEnum.cs | 1 + src/Device/IODevices/G.cs | 131 ++++++++++++++++++++++++++++++++ src/EasyEPlanner.csproj | 1 + 4 files changed, 139 insertions(+) create mode 100644 src/Device/IODevices/G.cs diff --git a/src/Device/DeviceSubTypeEnum.cs b/src/Device/DeviceSubTypeEnum.cs index 4f63f97d..567420f3 100644 --- a/src/Device/DeviceSubTypeEnum.cs +++ b/src/Device/DeviceSubTypeEnum.cs @@ -115,6 +115,12 @@ public enum DeviceSubType HLA_VIRT, ///< Виртуальная сигнальная колонна (без привязки к модулям). HLA_IOLINK, ///< Сигнальная колонна IO-Link (настраиваемая) + //G + G = 1, ///< IO-Link блок питания с автоматическим выключателем. + G_IOL_4, ///< Phoenix Contact 4 канала. + G_IOL_8, ///< Phoenix Contact 8 каналов. + G_VIRT, ///< Виртуальный блок питания с автоматическим выключателем (без привязки к модулям). + //GS /// Датчик положения. GS = 1, diff --git a/src/Device/DeviceTypeEnum.cs b/src/Device/DeviceTypeEnum.cs index 16053ccc..8afd0236 100644 --- a/src/Device/DeviceTypeEnum.cs +++ b/src/Device/DeviceTypeEnum.cs @@ -11,6 +11,7 @@ public enum DeviceType LS, ///< Уровень (есть/нет). TE, ///< Температура. FS, ///< Расход (есть/нет). + G, ///< Блок питания с автоматическим выключателем. GS, ///< Датчик положения. FQT, ///< Счетчик. LT, ///< Уровень (значение). diff --git a/src/Device/IODevices/G.cs b/src/Device/IODevices/G.cs new file mode 100644 index 00000000..6ed4be89 --- /dev/null +++ b/src/Device/IODevices/G.cs @@ -0,0 +1,131 @@ +using System.Collections.Generic; + +namespace EplanDevice +{ + /// + /// Технологическое устройство - блок питания с автоматическим выключателем. + /// + sealed public class G : IODevice + { + public G(string name, string eplanName, string description, + int deviceNumber, string objectName, int objectNumber, + string articleName) : base(name, eplanName, description, + deviceNumber, objectName, objectNumber) + { + dSubType = DeviceSubType.NONE; + dType = DeviceType.G; + ArticleName = articleName; + } + + public override string SetSubType(string subtype) + { + base.SetSubType(subtype); + + string errStr = string.Empty; + switch (subtype) + { + case "G": + case "": + dSubType = DeviceSubType.G; + + AI.Add(new IOChannel("AI", -1, -1, -1, "")); + AO.Add(new IOChannel("AO", -1, -1, -1, "")); + + SetIOLinkSizes(ArticleName); + break; + + case "G_VIRT": + break; + + default: + errStr = string.Format("\"{0}\" - неверный тип" + + " (пустая строка, G, G_VIRT).\n", + Name); + break; + } + + return errStr; + } + + public override string Check() + { + string res = base.Check(); + + bool emptyArticle = ArticleName == string.Empty; + bool needCheckArticle = DeviceSubType != DeviceSubType.G_VIRT; + if (needCheckArticle && emptyArticle) + { + res += $"\"{name}\" - не задано изделие.\n"; + } + + return res; + } + + public override string GetDeviceSubTypeStr(DeviceType dt, + DeviceSubType dst) + { + switch (dt) + { + case DeviceType.G: + switch (dst) + { + case DeviceSubType.G: + return "G"; + case DeviceSubType.G_VIRT: + return "G_VIRT"; + } + break; + } + + return string.Empty; + } + + public override Dictionary GetDeviceProperties( + DeviceType dt, DeviceSubType dst) + { + switch (dt) + { + case DeviceType.G: + switch (dst) + { + case DeviceSubType.G_IOL_4: + return new Dictionary() + { + {Tag.M, 1}, + {Tag.V, 1}, + {Tag.ST, 1}, + {Tag.ERR, 1}, + {Tag.ST_CH, 4}, + {Tag.NOMINAL_CURRENT_CH, 4}, + {Tag.LOAD_CURRENT_CH, 4}, + {Tag.ERR_CH, 4}, + }; + + case DeviceSubType.G_IOL_8: + return new Dictionary() + { + {Tag.M, 1}, + {Tag.V, 1}, + {Tag.ST, 1}, + {Tag.ERR, 1}, + {Tag.ST_CH, 8}, + {Tag.NOMINAL_CURRENT_CH, 8}, + {Tag.LOAD_CURRENT_CH, 8}, + {Tag.ERR_CH, 8}, + }; + + case DeviceSubType.G_VIRT: + return new Dictionary() + { + {Tag.M, 1}, + {Tag.ST, 1}, + {Tag.V, 1}, + }; + } + break; + } + + return null; + } + } +} diff --git a/src/EasyEPlanner.csproj b/src/EasyEPlanner.csproj index d2b67fd6..5d26ea75 100644 --- a/src/EasyEPlanner.csproj +++ b/src/EasyEPlanner.csproj @@ -119,6 +119,7 @@ + From b66d06746323e4ac01b5a690a9fd363b192214a5 Mon Sep 17 00:00:00 2001 From: VadimZezyotkoATP Date: Wed, 22 May 2024 14:43:11 +0300 Subject: [PATCH 2/9] add changes --- src/Device/DeviceTypeEnum.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Device/DeviceTypeEnum.cs b/src/Device/DeviceTypeEnum.cs index 8afd0236..747bd364 100644 --- a/src/Device/DeviceTypeEnum.cs +++ b/src/Device/DeviceTypeEnum.cs @@ -11,7 +11,6 @@ public enum DeviceType LS, ///< Уровень (есть/нет). TE, ///< Температура. FS, ///< Расход (есть/нет). - G, ///< Блок питания с автоматическим выключателем. GS, ///< Датчик положения. FQT, ///< Счетчик. LT, ///< Уровень (значение). @@ -31,6 +30,7 @@ public enum DeviceType CAM, ///< Камера. PDS, ///< Сигнальный датчик перепада давления TS, ///< Сигнальный датчик температуры + G, ///< Блок питания с автоматическим выключателем. // Эти устройства всегда в конце т.к их нет в контроллере. Y, ///< Пневмоостров Festo From 64180be0b5c9d09ceaf05b1f7148bb334f0950e4 Mon Sep 17 00:00:00 2001 From: VadimZezyotkoATP Date: Wed, 22 May 2024 16:21:34 +0300 Subject: [PATCH 3/9] changed SybType --- src/Device/DeviceSubTypeEnum.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Device/DeviceSubTypeEnum.cs b/src/Device/DeviceSubTypeEnum.cs index 567420f3..5ffc3608 100644 --- a/src/Device/DeviceSubTypeEnum.cs +++ b/src/Device/DeviceSubTypeEnum.cs @@ -116,10 +116,10 @@ public enum DeviceSubType HLA_IOLINK, ///< Сигнальная колонна IO-Link (настраиваемая) //G - G = 1, ///< IO-Link блок питания с автоматическим выключателем. - G_IOL_4, ///< Phoenix Contact 4 канала. - G_IOL_8, ///< Phoenix Contact 8 каналов. - G_VIRT, ///< Виртуальный блок питания с автоматическим выключателем (без привязки к модулям). + /// Phoenix Contact 4 канала. + G_IOL_4 = 1, + /// Phoenix Contact 8 каналов. + G_IOL_8, //GS /// Датчик положения. From 3300099a081cfbcff382bc73d5d9861280ef88aa Mon Sep 17 00:00:00 2001 From: VadimZezyotkoATP Date: Wed, 22 May 2024 16:32:25 +0300 Subject: [PATCH 4/9] changed device G --- src/Device/DeviceSubTypeEnum.cs | 4 ++-- src/Device/IODevices/G.cs | 38 +++++++++++++++------------------ 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/Device/DeviceSubTypeEnum.cs b/src/Device/DeviceSubTypeEnum.cs index 5ffc3608..fa0ddda0 100644 --- a/src/Device/DeviceSubTypeEnum.cs +++ b/src/Device/DeviceSubTypeEnum.cs @@ -116,9 +116,9 @@ public enum DeviceSubType HLA_IOLINK, ///< Сигнальная колонна IO-Link (настраиваемая) //G - /// Phoenix Contact 4 канала. + /// Phoenix Contact 4 канала. G_IOL_4 = 1, - /// Phoenix Contact 8 каналов. + /// Phoenix Contact 8 каналов. G_IOL_8, //GS diff --git a/src/Device/IODevices/G.cs b/src/Device/IODevices/G.cs index 6ed4be89..d2ad7601 100644 --- a/src/Device/IODevices/G.cs +++ b/src/Device/IODevices/G.cs @@ -24,9 +24,8 @@ public override string SetSubType(string subtype) string errStr = string.Empty; switch (subtype) { - case "G": - case "": - dSubType = DeviceSubType.G; + case "G_IOL_4": + dSubType = DeviceSubType.G_IOL_4; AI.Add(new IOChannel("AI", -1, -1, -1, "")); AO.Add(new IOChannel("AO", -1, -1, -1, "")); @@ -34,12 +33,18 @@ public override string SetSubType(string subtype) SetIOLinkSizes(ArticleName); break; - case "G_VIRT": + case "G_IOL_8": + dSubType = DeviceSubType.G_IOL_8; + + AI.Add(new IOChannel("AI", -1, -1, -1, "")); + AO.Add(new IOChannel("AO", -1, -1, -1, "")); + + SetIOLinkSizes(ArticleName); break; default: errStr = string.Format("\"{0}\" - неверный тип" + - " (пустая строка, G, G_VIRT).\n", + " (пустая строка, G ).\n", Name); break; } @@ -51,9 +56,7 @@ public override string Check() { string res = base.Check(); - bool emptyArticle = ArticleName == string.Empty; - bool needCheckArticle = DeviceSubType != DeviceSubType.G_VIRT; - if (needCheckArticle && emptyArticle) + if (ArticleName == string.Empty) { res += $"\"{name}\" - не задано изделие.\n"; } @@ -69,17 +72,18 @@ public override string GetDeviceSubTypeStr(DeviceType dt, case DeviceType.G: switch (dst) { - case DeviceSubType.G: - return "G"; - case DeviceSubType.G_VIRT: - return "G_VIRT"; + case DeviceSubType.G_IOL_4: + return "G_IOL_4"; + + case DeviceSubType.G_IOL_8: + return "G_IOL_8"; } break; } return string.Empty; } - + public override Dictionary GetDeviceProperties( DeviceType dt, DeviceSubType dst) { @@ -113,14 +117,6 @@ public override Dictionary GetDeviceProperties( {Tag.LOAD_CURRENT_CH, 8}, {Tag.ERR_CH, 8}, }; - - case DeviceSubType.G_VIRT: - return new Dictionary() - { - {Tag.M, 1}, - {Tag.ST, 1}, - {Tag.V, 1}, - }; } break; } From 6d57de2a4b034c2adb3d5589d65c8ff368553f10 Mon Sep 17 00:00:00 2001 From: VadimZezyotkoATP Date: Thu, 23 May 2024 09:50:32 +0300 Subject: [PATCH 5/9] Add G device tests --- .../EplanDevice.Test/IODevice.Test/G.Test.cs | 306 ++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs diff --git a/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs b/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs new file mode 100644 index 00000000..653a0881 --- /dev/null +++ b/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs @@ -0,0 +1,306 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using EplanDevice; + +namespace Tests.EplanDevices +{ + public class GTest + { + const string Incorrect = "Incorrect"; + const string G_IOL_4 = "G_IOL_4"; + const string G_IOL_8 = "G_IOL_8"; + + const string AI = IODevice.IOChannel.AI; + const string AO = IODevice.IOChannel.AO; + const string DI = IODevice.IOChannel.DI; + const string DO = IODevice.IOChannel.DO; + + /// + /// Тест установки подтипа устройства + /// + /// Ожидаемый подтип + /// Актуальный подтип + /// Тестируемое устройство + [TestCaseSource(nameof(SetSubTypeTestData))] + public void SetSubType_NewDev_ReturnsExpectedSubType( + DeviceSubType expectedSubType, string subType, + IODevice device) + { + device.SetSubType(subType); + Assert.AreEqual(expectedSubType, device.DeviceSubType); + } + + /// + /// 1 - Ожидаемое перечисление подтипа, + /// 2 - Задаваемое значение подтипа, + /// 3 - Устройство для тестов + /// + /// + private static object[] SetSubTypeTestData() + { + return new object[] + { + new object[] { DeviceSubType.G_IOL_4, string.Empty, + GetRandomFDevice() }, + new object[] { DeviceSubType.G_IOL_4, G_IOL_4, + GetRandomFDevice() }, + new object[] { DeviceSubType.NONE, Incorrect, + GetRandomFDevice() }, + new object[] { DeviceSubType.G_IOL_8, G_IOL_8, + GetRandomFDevice() }, + }; + } + + /// + /// Тест получения подтипа устройства + /// + /// Ожидаемый подтип + /// Актуальный подтип + /// Тестируемое устройство + [TestCaseSource(nameof(GetDeviceSubTypeStrTestData))] + public void GetDeviceSubTypeStr_NewDev_ReturnsExpectedTypeStr( + string expectedType, string subType, IODevice device) + { + device.SetSubType(subType); + Assert.AreEqual(expectedType, device.GetDeviceSubTypeStr( + device.DeviceType, device.DeviceSubType)); + } + + /// + /// 1 - Ожидаемое значение подтипа, + /// 2 - Задаваемое значение подтипа, + /// 3 - Устройство для тестов + /// + /// + private static object[] GetDeviceSubTypeStrTestData() + { + return new object[] + { + new object[] { G_IOL_4, string.Empty, GetRandomFDevice() }, + new object[] { G_IOL_4, G_IOL_4, GetRandomFDevice() }, + new object[] { G_IOL_8, G_IOL_8, GetRandomFDevice() }, + new object[] { string.Empty, Incorrect, GetRandomFDevice() }, + }; + } + + /// + /// Тест свойств устройств в зависимости от подтипа + /// + /// Ожидаемый список свойств + /// Актуальный подтип + /// Тестируемое устройство + [TestCaseSource(nameof(GetDevicePropertiesTestData))] + public void GetDeviceProperties_NewDev_ReturnsExpectedDictOfProperties( + Dictionary expectedProperties, string subType, + IODevice device) + { + device.SetSubType(subType); + Assert.AreEqual(expectedProperties, device.GetDeviceProperties( + device.DeviceType, device.DeviceSubType)); + } + + /// + /// 1 - Ожидаемый список свойств для экспорта, + /// 2 - Задаваемый подтип устройства, + /// 3 - Устройство для тестов + /// + /// + private static object[] GetDevicePropertiesTestData() + { + var exportForG_IOL_4 = new Dictionary() + { + {IODevice.Tag.M, 1}, + {IODevice.Tag.V, 1}, + {IODevice.Tag.ST, 1}, + {IODevice.Tag.ERR, 1}, + {IODevice.Tag.ST_CH, 4}, + {IODevice.Tag.NOMINAL_CURRENT_CH, 4}, + {IODevice.Tag.LOAD_CURRENT_CH, 4}, + {IODevice.Tag.ERR_CH, 4}, + }; + + var exportForG_IOL_8 = new Dictionary() + { + {IODevice.Tag.M, 1}, + {IODevice.Tag.V, 1}, + {IODevice.Tag.ST, 1}, + {IODevice.Tag.ERR, 1}, + {IODevice.Tag.ST_CH, 8}, + {IODevice.Tag.NOMINAL_CURRENT_CH, 8}, + {IODevice.Tag.LOAD_CURRENT_CH, 8}, + {IODevice.Tag.ERR_CH, 8}, + }; + + return new object[] + { + new object[] {exportForG_IOL_4, string.Empty, GetRandomFDevice()}, + new object[] {exportForG_IOL_4, G_IOL_4, GetRandomFDevice()}, + new object[] {null, Incorrect, GetRandomFDevice()}, + new object[] {exportForG_IOL_8, G_IOL_8, GetRandomFDevice()}, + }; + } + + /// + /// Тестирование параметров устройства + /// + /// Ожидаемые параметры + /// Актуальный подтип + /// Тестируемое устройство + [TestCaseSource(nameof(ParametersTestData))] + public void Parameters_NewDev_ReturnsExpectedArrayWithParameters( + string[] parametersSequence, string subType, + IODevice device) + { + device.SetSubType(subType); + string[] actualParametersSequence = device.Parameters + .Select(x => (string)x.Key) + .ToArray(); + Assert.AreEqual(parametersSequence, actualParametersSequence); + } + + /// + /// 1 - Параметры в том порядке, который нужен + /// 2 - Подтип устройства + /// 3 - Устройство + /// + /// + private static object[] ParametersTestData() + { + return new object[] + { + new object[] + { + new string[0], + string.Empty, + GetRandomFDevice() + }, + new object[] + { + new string[0], + G_IOL_4, + GetRandomFDevice() + }, + new object[] + { + new string[0], + Incorrect, + GetRandomFDevice() + }, + new object[] + { + new string[0], + G_IOL_8, + GetRandomFDevice() + }, + }; + } + + /// + /// Тестирование каналов устройства + /// + /// Ожидаемое количество каналов + /// в словаре с названием каналов + /// Актуальный подтип + /// Тестируемое устройство + [TestCaseSource(nameof(ChannelsTestData))] + public void Channels_NewDev_ReturnsExpectedCount( + Dictionary expectedChannelsCount, string subType, + IODevice device) + { + device.SetSubType(subType); + int actualAI = device.Channels.Where(x => x.Name == AI).Count(); + int actualAO = device.Channels.Where(x => x.Name == AO).Count(); + int actualDI = device.Channels.Where(x => x.Name == DI).Count(); + int actualDO = device.Channels.Where(x => x.Name == DO).Count(); + + Assert.Multiple(() => + { + Assert.AreEqual(expectedChannelsCount[AI], actualAI); + Assert.AreEqual(expectedChannelsCount[AO], actualAO); + Assert.AreEqual(expectedChannelsCount[DI], actualDI); + Assert.AreEqual(expectedChannelsCount[DO], actualDO); + }); + } + + /// + /// Данные для тестирования каналов устройств по подтипам. + /// 1. Словарь с количеством каналов и их типами + /// 2. Подтип устройства + /// 3. Устройство + /// + /// + private static object[] ChannelsTestData() + { + var iolinkDeviceChannels = new Dictionary() + { + { AI, 1 }, + { AO, 1 }, + { DI, 0 }, + { DO, 0 }, + }; + + var emptyChannels = new Dictionary() + { + { AI, 0 }, + { AO, 0 }, + { DI, 0 }, + { DO, 0 }, + }; + + return new object[] + { + new object[] + { + iolinkDeviceChannels, + string.Empty, + GetRandomFDevice() + }, + new object[] + { + iolinkDeviceChannels, + G_IOL_4, + GetRandomFDevice() + }, + new object[] + { + emptyChannels, + Incorrect, + GetRandomFDevice() + }, + new object[] + { + emptyChannels, + G_IOL_8, + GetRandomFDevice() + }, + }; + } + + /// + /// Генератор AI устройств + /// + /// + private static IODevice GetRandomFDevice() + { + var randomizer = new Random(); + int value = randomizer.Next(1, 3); + switch (value) + { + case 1: + return new F("KOAG4F1", "+KOAG4-F1", + "Test device", 1, "KOAG", 4, string.Empty); + case 2: + return new F("LINE1F2", "+LINE1-F2", + "Test device", 2, "LINE", 1, string.Empty); + case 3: + return new F("TANK2F1", "+TANK2-F1", + "Test device", 1, "TANK", 2, string.Empty); + default: + return new F("CW_TANK3F3", "+CW_TANK3-F3", + "Test device", 3, "CW_TANK", 3, string.Empty); + } + } + } +} From fe340edbd9292c29deff34e31eb9a840c7ccd17c Mon Sep 17 00:00:00 2001 From: VadimZezyotkoATP Date: Thu, 23 May 2024 09:58:09 +0300 Subject: [PATCH 6/9] Add changes to tests --- .../EplanDevice.Test/IODevice.Test/G.Test.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs b/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs index 653a0881..4ba1aa32 100644 --- a/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs +++ b/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs @@ -289,16 +289,16 @@ private static IODevice GetRandomFDevice() switch (value) { case 1: - return new F("KOAG4F1", "+KOAG4-F1", + return new G("KOAG4G1", "+KOAG4-G1", "Test device", 1, "KOAG", 4, string.Empty); case 2: - return new F("LINE1F2", "+LINE1-F2", + return new G("LINE1G2", "+LINE1-G2", "Test device", 2, "LINE", 1, string.Empty); case 3: - return new F("TANK2F1", "+TANK2-F1", + return new G("TANK2G1", "+TANK2-G1", "Test device", 1, "TANK", 2, string.Empty); default: - return new F("CW_TANK3F3", "+CW_TANK3-F3", + return new G("CW_TANK3G3", "+CW_TANK3-G3", "Test device", 3, "CW_TANK", 3, string.Empty); } } From edeac0e947fc1bd9a425df8276aa5fecf17fcf18 Mon Sep 17 00:00:00 2001 From: VadimZezyotkoATP Date: Mon, 27 May 2024 10:56:51 +0300 Subject: [PATCH 7/9] Changes to tests --- .../EplanDevice.Test/IODevice.Test/G.Test.cs | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs b/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs index 4ba1aa32..c637d63f 100644 --- a/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs +++ b/EasyEplanner.Tests/EplanDevice.Test/IODevice.Test/G.Test.cs @@ -42,14 +42,14 @@ private static object[] SetSubTypeTestData() { return new object[] { - new object[] { DeviceSubType.G_IOL_4, string.Empty, - GetRandomFDevice() }, + new object[] { DeviceSubType.NONE, string.Empty, + GetRandomGDevice() }, new object[] { DeviceSubType.G_IOL_4, G_IOL_4, - GetRandomFDevice() }, + GetRandomGDevice() }, new object[] { DeviceSubType.NONE, Incorrect, - GetRandomFDevice() }, + GetRandomGDevice() }, new object[] { DeviceSubType.G_IOL_8, G_IOL_8, - GetRandomFDevice() }, + GetRandomGDevice() }, }; } @@ -78,10 +78,10 @@ private static object[] GetDeviceSubTypeStrTestData() { return new object[] { - new object[] { G_IOL_4, string.Empty, GetRandomFDevice() }, - new object[] { G_IOL_4, G_IOL_4, GetRandomFDevice() }, - new object[] { G_IOL_8, G_IOL_8, GetRandomFDevice() }, - new object[] { string.Empty, Incorrect, GetRandomFDevice() }, + new object[] { string.Empty, string.Empty, GetRandomGDevice() }, + new object[] { G_IOL_4, G_IOL_4, GetRandomGDevice() }, + new object[] { G_IOL_8, G_IOL_8, GetRandomGDevice() }, + new object[] { string.Empty, Incorrect, GetRandomGDevice() }, }; } @@ -135,10 +135,10 @@ private static object[] GetDevicePropertiesTestData() return new object[] { - new object[] {exportForG_IOL_4, string.Empty, GetRandomFDevice()}, - new object[] {exportForG_IOL_4, G_IOL_4, GetRandomFDevice()}, - new object[] {null, Incorrect, GetRandomFDevice()}, - new object[] {exportForG_IOL_8, G_IOL_8, GetRandomFDevice()}, + new object[] {null, string.Empty, GetRandomGDevice()}, + new object[] {exportForG_IOL_4, G_IOL_4, GetRandomGDevice()}, + new object[] {null, Incorrect, GetRandomGDevice()}, + new object[] {exportForG_IOL_8, G_IOL_8, GetRandomGDevice()}, }; } @@ -174,25 +174,25 @@ private static object[] ParametersTestData() { new string[0], string.Empty, - GetRandomFDevice() + GetRandomGDevice() }, new object[] { new string[0], G_IOL_4, - GetRandomFDevice() + GetRandomGDevice() }, new object[] { new string[0], Incorrect, - GetRandomFDevice() + GetRandomGDevice() }, new object[] { new string[0], G_IOL_8, - GetRandomFDevice() + GetRandomGDevice() }, }; } @@ -253,27 +253,27 @@ private static object[] ChannelsTestData() { new object[] { - iolinkDeviceChannels, + emptyChannels, string.Empty, - GetRandomFDevice() + GetRandomGDevice() }, new object[] { iolinkDeviceChannels, G_IOL_4, - GetRandomFDevice() + GetRandomGDevice() }, new object[] { emptyChannels, Incorrect, - GetRandomFDevice() + GetRandomGDevice() }, new object[] { - emptyChannels, + iolinkDeviceChannels, G_IOL_8, - GetRandomFDevice() + GetRandomGDevice() }, }; } @@ -282,7 +282,7 @@ private static object[] ChannelsTestData() /// Генератор AI устройств /// /// - private static IODevice GetRandomFDevice() + private static IODevice GetRandomGDevice() { var randomizer = new Random(); int value = randomizer.Next(1, 3); From 3a16d77a465d2f7587ed6529f6d62ca908791203 Mon Sep 17 00:00:00 2001 From: VadimZezyotkoATP Date: Tue, 28 May 2024 09:15:16 +0300 Subject: [PATCH 8/9] Add to device manager --- src/Device/DeviceManager.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Device/DeviceManager.cs b/src/Device/DeviceManager.cs index b91f8481..592e9cc0 100644 --- a/src/Device/DeviceManager.cs +++ b/src/Device/DeviceManager.cs @@ -437,6 +437,7 @@ public bool CheckDeviceName(string fullDevName, out string devName, "CAM", "PDS", "TS", + "G", }; public IODevice AddDeviceAndEFunction(string devName, string description, @@ -636,6 +637,11 @@ private IODevice AddDevice(string devName, string description, objectName, objectNumber, articleName); break; + case "G": + dev = new G(name, eplanName, description, deviceNumber, + objectName, objectNumber, articleName); + break; + default: break; } From 28b915a9f6e3b5e982e2cc9487c31f0c782050d4 Mon Sep 17 00:00:00 2001 From: VadimZezyotkoATP Date: Wed, 29 May 2024 12:13:55 +0300 Subject: [PATCH 9/9] canges for ReadMe.md --- docs/user_manual/ReadMe.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/user_manual/ReadMe.md b/docs/user_manual/ReadMe.md index fcf59836..b8d47ea7 100644 --- a/docs/user_manual/ReadMe.md +++ b/docs/user_manual/ReadMe.md @@ -62,6 +62,7 @@ + [CAM. Камера](#6224-CAM-Камера) + [PDS. Сигнальный датчик разницы давления](#6225-pds-сигнальный-датчик-разницы-давления) + [TS. Сигнальный датчик температуры](#6226-ts-сигнальный-датчик-температуры) + + [G. Блок питания с автоматическим выключателем](#6227-G-Блок-питания-с-автоматическим-выключателем) + [Дополнительные параметры](#63-Дополнительные-параметры) + [Описание устройства](#631-Описание-устройства) + [Назначение дополнительных полей](#632-Назначение-дополнительных-полей) @@ -774,6 +775,11 @@ Phoenix Contact | AXC F 3152 Каналы ввода/вывода: **DI** – *1*. Пример: **+OBJ2-TS1**. Объект №2. Сигнальный датчик температуры. +#### 6.2.27 G. Блок питания с автоматическим выключателем #### +Обозначение: **G**. +Каналы ввода/вывода: **AI** - *1*, **AO** - *1* (AOAI) +Пример: **OBJ1+CAB1-G1**. Проект OBJ1, шкаф №1, устройство автоматический выключатель. + ### 6.3 Дополнительные параметры ### Дополнительные параметры указываются через свойства устройства. @@ -901,6 +907,8 @@ TS | Сигнальный датчик температуры. TS_VIRT | Виртуальный сигнальный датчик температуры. C_PID | ПИД-регулятор. C_THLD | Пороговый регулятор. +G_IOL_4 | **IO-Link** блок питания на 4 канала с автоматическим выключателем. +G_IOL_8 | **IO-Link** блок питания на 8 канала с автоматическим выключателем. Пример приведен ниже: @@ -2207,6 +2215,25 @@ _Примечание:_ для корректного экспорта базы * **TS_VIRT** * ST - состояние; * M - ручной режим; +26. Устройство - **G** + * **G_IOL_4** + * ST - состояние; + * M - ручной режим; + * V - аналоговое значение; + * NOMINAL_CURRENT_CH - Заданный ток канала (_4 канала_); + * LOAD_CURRENT_CH - Текущий ток канала (_4 канала_); + * ST_CH - Состояние канала (_4 канала_); + * ERR - Авария устройства; + * ERR_CH - Авария канала (_4 канала_); + * **G_IOL_8** + * ST - состояние; + * M - ручной режим; + * V - аналоговое значение; + * NOMINAL_CURRENT_CH - Заданный ток канала (_8 каналов_); + * LOAD_CURRENT_CH - Текущий ток канала (_8 каналов_); + * ST_CH - Состояние канала (_8 каналов_); + * ERR - Авария устройства; + * ERR_CH - Авария канала (_8 каналов_); Протоколируются: TE_V, QT_V, FQT_F, PT_V, VC_V, M_V, M_ST, LT_CLEVEL, V_ST, LS_ST, FS_ST, GS_ST, SB_ST, DI_ST, DO_ST, SB_ST, HL_ST, HA_ST, AO_V, AI_V.