mirror of
https://github.com/OpenLogics/MewtocolNet.git
synced 2025-12-06 03:01:24 +00:00
Added performance improvements for cyclic polling by using single frame building of multiple registers
- cleaned and refactored codebase
This commit is contained in:
@@ -91,7 +91,7 @@ namespace MewtocolTests {
|
||||
|
||||
}
|
||||
|
||||
private void TestBasicGeneration(IRegister reg, string propName, object expectValue, int expectAddr, string expectPlcName) {
|
||||
private void TestBasicGeneration(IRegisterInternal reg, string propName, object expectValue, int expectAddr, string expectPlcName) {
|
||||
|
||||
Assert.NotNull(reg);
|
||||
Assert.Equal(propName, reg.Name);
|
||||
@@ -115,7 +115,7 @@ namespace MewtocolTests {
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestBool1));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestBool1), false, 85, "R85");
|
||||
TestBasicGeneration((IRegisterInternal)register, nameof(TestRegisterCollection.TestBool1), false, 85, "R85");
|
||||
|
||||
}
|
||||
|
||||
@@ -128,7 +128,7 @@ namespace MewtocolTests {
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestBoolInputXD));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestBoolInputXD), false, 0, "XD");
|
||||
TestBasicGeneration((IRegisterInternal)register, nameof(TestRegisterCollection.TestBoolInputXD), false, 0, "XD");
|
||||
|
||||
}
|
||||
|
||||
@@ -141,7 +141,7 @@ namespace MewtocolTests {
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestInt16));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestInt16), (short)0, 899, "DT899");
|
||||
TestBasicGeneration((IRegisterInternal)register, nameof(TestRegisterCollection.TestInt16), (short)0, 899, "DT899");
|
||||
|
||||
}
|
||||
|
||||
@@ -154,7 +154,7 @@ namespace MewtocolTests {
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestUInt16));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestUInt16), (ushort)0, 342, "DT342");
|
||||
TestBasicGeneration((IRegisterInternal)register, nameof(TestRegisterCollection.TestUInt16), (ushort)0, 342, "DT342");
|
||||
|
||||
}
|
||||
|
||||
@@ -167,7 +167,7 @@ namespace MewtocolTests {
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestInt32));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestInt32), (int)0, 7001, "DDT7001");
|
||||
TestBasicGeneration((IRegisterInternal)register, nameof(TestRegisterCollection.TestInt32), (int)0, 7001, "DDT7001");
|
||||
|
||||
}
|
||||
|
||||
@@ -180,7 +180,7 @@ namespace MewtocolTests {
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestUInt32));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestUInt32), (uint)0, 765, "DDT765");
|
||||
TestBasicGeneration((IRegisterInternal)register, nameof(TestRegisterCollection.TestUInt32), (uint)0, 765, "DDT765");
|
||||
|
||||
}
|
||||
|
||||
@@ -193,70 +193,7 @@ namespace MewtocolTests {
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestFloat32));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestFloat32), (float)0, 7003, "DDT7003");
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "String generation")]
|
||||
public void StringGen() {
|
||||
|
||||
var interf = new MewtocolInterface("192.168.0.1");
|
||||
interf.WithRegisterCollection(new TestRegisterCollection()).WithPoller();
|
||||
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestString2));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestString2), null!, 7005, "DT7005");
|
||||
|
||||
Assert.Equal(5, ((BytesRegister<string>)register).ReservedSize);
|
||||
Assert.Equal(4, ((BytesRegister<string>)register).MemoryLength);
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "BitArray 16bit generation")]
|
||||
public void BitArray16Gen() {
|
||||
|
||||
var interf = new MewtocolInterface("192.168.0.1");
|
||||
interf.WithRegisterCollection(new TestRegisterCollection()).WithPoller();
|
||||
|
||||
var register = interf.GetRegister($"Auto_Bitwise_DT7010");
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, "Auto_Bitwise_DT7010", (short)0, 7010, "DT7010");
|
||||
|
||||
Assert.True(((NumberRegister<short>)register).isUsedBitwise);
|
||||
Assert.Equal(0, ((NumberRegister<short>)register).MemoryLength);
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "BitArray 32bit generation")]
|
||||
public void BitArray32Gen() {
|
||||
|
||||
var interf = new MewtocolInterface("192.168.0.1");
|
||||
interf.WithRegisterCollection(new TestRegisterCollection()).WithPoller();
|
||||
|
||||
var register = interf.GetRegister($"Auto_Bitwise_DDT8010");
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, "Auto_Bitwise_DDT8010", (int)0, 8010, "DDT8010");
|
||||
|
||||
Assert.True(((NumberRegister<int>)register).isUsedBitwise);
|
||||
Assert.Equal(1, ((NumberRegister<int>)register).MemoryLength);
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "BitArray single bool generation")]
|
||||
public void BitArraySingleBool16Gen() {
|
||||
|
||||
var interf = new MewtocolInterface("192.168.0.1");
|
||||
interf.WithRegisterCollection(new TestRegisterCollection()).WithPoller();
|
||||
|
||||
var register = interf.GetRegister($"Auto_Bitwise_DT1204");
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, "Auto_Bitwise_DT1204", (short)0, 1204, "DT1204");
|
||||
|
||||
Assert.True(((NumberRegister<short>)register).isUsedBitwise);
|
||||
TestBasicGeneration((IRegisterInternal)register, nameof(TestRegisterCollection.TestFloat32), (float)0, 7003, "DDT7003");
|
||||
|
||||
}
|
||||
|
||||
@@ -269,35 +206,25 @@ namespace MewtocolTests {
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestTime));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestTime), TimeSpan.Zero, 7012, "DDT7012");
|
||||
TestBasicGeneration((IRegisterInternal)register, nameof(TestRegisterCollection.TestTime), TimeSpan.Zero, 7012, "DDT7012");
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Enum16 generation")]
|
||||
public void Enum16Gen() {
|
||||
//[Fact(DisplayName = "String generation")]
|
||||
//public void StringGen() {
|
||||
|
||||
var interf = new MewtocolInterface("192.168.0.1");
|
||||
interf.WithRegisterCollection(new TestRegisterCollection()).WithPoller();
|
||||
// var interf = new MewtocolInterface("192.168.0.1");
|
||||
// interf.WithRegisterCollection(new TestRegisterCollection()).WithPoller();
|
||||
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestEnum16));
|
||||
// var register = interf.GetRegister(nameof(TestRegisterCollection.TestString2));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestEnum16), (short)TestRegisterCollection.CurrentState.Undefined, 50, "DT50");
|
||||
// //test generic properties
|
||||
// TestBasicGeneration(register, nameof(TestRegisterCollection.TestString2), null!, 7005, "DT7005");
|
||||
|
||||
}
|
||||
// Assert.Equal(5, ((BytesRegister<string>)register).ReservedSize);
|
||||
// Assert.Equal(4, ((BytesRegister<string>)register).MemoryLength);
|
||||
|
||||
[Fact(DisplayName = "Enum32 generation")]
|
||||
public void Enum32Gen() {
|
||||
|
||||
var interf = new MewtocolInterface("192.168.0.1");
|
||||
interf.WithRegisterCollection(new TestRegisterCollection()).WithPoller();
|
||||
|
||||
var register = interf.GetRegister(nameof(TestRegisterCollection.TestEnum32));
|
||||
|
||||
//test generic properties
|
||||
TestBasicGeneration(register, nameof(TestRegisterCollection.TestEnum32), (int)TestRegisterCollection.CurrentState.Undefined, 51, "DDT51");
|
||||
|
||||
}
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
using MewtocolNet;
|
||||
|
||||
namespace MewtocolTests.EncapsulatedTests;
|
||||
|
||||
public class ExpectedPlcInformationData {
|
||||
|
||||
public string PLCName { get; set; }
|
||||
|
||||
public string PLCIP { get; set; }
|
||||
|
||||
public int PLCPort { get; set; }
|
||||
|
||||
public CpuType Type { get; set; }
|
||||
|
||||
public int ProgCapacity { get; set; }
|
||||
|
||||
}
|
||||
20
MewtocolTests/EncapsulatedTests/RegisterReadWriteTest.cs
Normal file
20
MewtocolTests/EncapsulatedTests/RegisterReadWriteTest.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using MewtocolNet;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MewtocolTests.EncapsulatedTests;
|
||||
|
||||
internal class RegisterReadWriteTest {
|
||||
|
||||
public IRegister TargetRegister { get; set; }
|
||||
|
||||
public object IntialValue { get; set; }
|
||||
|
||||
public object AfterWriteValue { get; set; }
|
||||
|
||||
public string RegisterPlcAddressName { get; set; }
|
||||
|
||||
}
|
||||
@@ -43,7 +43,7 @@ namespace MewtocolTests {
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = nameof(MewtocolHelpers.ToHexASCIIBytes))]
|
||||
[Fact(DisplayName = nameof(MewtocolHelpers.BytesFromHexASCIIString))]
|
||||
public void ToHexASCIIBytesGeneration() {
|
||||
|
||||
string test = "Hello, world!";
|
||||
@@ -62,7 +62,7 @@ namespace MewtocolTests {
|
||||
0x4C,
|
||||
0x44,
|
||||
0x21
|
||||
}, test.ToHexASCIIBytes());
|
||||
}, test.BytesFromHexASCIIString());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,17 +1,21 @@
|
||||
using MewtocolNet;
|
||||
using MewtocolNet.Logging;
|
||||
using MewtocolNet.RegisterBuilding;
|
||||
using MewtocolNet.Registers;
|
||||
using MewtocolTests.EncapsulatedTests;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace MewtocolTests {
|
||||
namespace MewtocolTests
|
||||
{
|
||||
|
||||
public class TestLivePLC {
|
||||
|
||||
private readonly ITestOutputHelper output;
|
||||
|
||||
private List<ExpectedTestData> testData = new() {
|
||||
private List<ExpectedPlcInformationData> testPlcInformationData = new() {
|
||||
|
||||
new ExpectedTestData {
|
||||
new ExpectedPlcInformationData {
|
||||
|
||||
PLCName = "FPX-H C30T",
|
||||
PLCIP = "192.168.115.210",
|
||||
@@ -20,7 +24,7 @@ namespace MewtocolTests {
|
||||
ProgCapacity = 32,
|
||||
|
||||
},
|
||||
new ExpectedTestData {
|
||||
new ExpectedPlcInformationData {
|
||||
|
||||
PLCName = "FPX-H C14R",
|
||||
PLCIP = "192.168.115.212",
|
||||
@@ -32,12 +36,29 @@ namespace MewtocolTests {
|
||||
|
||||
};
|
||||
|
||||
private List<RegisterReadWriteTest> testRegisterRW = new() {
|
||||
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = new BoolRegister(IOType.R, 0xA, 10),
|
||||
RegisterPlcAddressName = "R10A",
|
||||
IntialValue = false,
|
||||
AfterWriteValue = true,
|
||||
},
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = new NumberRegister<int>(3000),
|
||||
RegisterPlcAddressName = "DT3000",
|
||||
IntialValue = (int)0,
|
||||
AfterWriteValue = (int)-513,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
public TestLivePLC(ITestOutputHelper output) {
|
||||
|
||||
this.output = output;
|
||||
|
||||
Logger.LogLevel = LogLevel.Verbose;
|
||||
Logger.OnNewLogMessage((d, m) => {
|
||||
Logger.OnNewLogMessage((d, l, m) => {
|
||||
|
||||
output.WriteLine($"Mewtocol Logger: {d} {m}");
|
||||
|
||||
@@ -48,7 +69,7 @@ namespace MewtocolTests {
|
||||
[Fact(DisplayName = "Connection cycle client to PLC")]
|
||||
public async void TestClientConnection() {
|
||||
|
||||
foreach (var plc in testData) {
|
||||
foreach (var plc in testPlcInformationData) {
|
||||
|
||||
output.WriteLine($"Testing: {plc.PLCName}");
|
||||
|
||||
@@ -69,7 +90,7 @@ namespace MewtocolTests {
|
||||
[Fact(DisplayName = "Reading basic information from PLC")]
|
||||
public async void TestClientReadPLCStatus() {
|
||||
|
||||
foreach (var plc in testData) {
|
||||
foreach (var plc in testPlcInformationData) {
|
||||
|
||||
output.WriteLine($"Testing: {plc.PLCName}\n");
|
||||
|
||||
@@ -90,19 +111,38 @@ namespace MewtocolTests {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
//[Fact(DisplayName = "Reading basic information from PLC")]
|
||||
//public async void TestRegisterReadWriteAsync () {
|
||||
|
||||
public class ExpectedTestData {
|
||||
// foreach (var plc in testPlcInformationData) {
|
||||
|
||||
public string PLCName { get; set; }
|
||||
// output.WriteLine($"Testing: {plc.PLCName}\n");
|
||||
|
||||
public string PLCIP { get; set; }
|
||||
// var client = new MewtocolInterface(plc.PLCIP, plc.PLCPort);
|
||||
|
||||
public int PLCPort { get; set; }
|
||||
// foreach (var testRW in testRegisterRW) {
|
||||
|
||||
public CpuType Type { get; set; }
|
||||
// client.AddRegister(testRW.TargetRegister);
|
||||
|
||||
public int ProgCapacity { get; set; }
|
||||
// }
|
||||
|
||||
// await client.ConnectAsync();
|
||||
// Assert.True(client.IsConnected);
|
||||
|
||||
// foreach (var testRW in testRegisterRW) {
|
||||
|
||||
// client.AddRegister(testRW.TargetRegister);
|
||||
|
||||
// }
|
||||
|
||||
// Assert.Equal(client.PlcInfo.CpuInformation.Cputype, plc.Type);
|
||||
// Assert.Equal(client.PlcInfo.CpuInformation.ProgramCapacity, plc.ProgCapacity);
|
||||
|
||||
// client.Disconnect();
|
||||
|
||||
// }
|
||||
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -122,20 +122,12 @@ public class TestRegisterBuilder {
|
||||
|
||||
foreach (var item in dict) {
|
||||
|
||||
try {
|
||||
output.WriteLine($"Expected: {item.Key}");
|
||||
|
||||
output.WriteLine($"Expected: {item.Key}");
|
||||
var built = RegBuilder.Factory.FromPlcRegName(item.Key).AsPlcType(PlcVarType.BOOL).Build();
|
||||
|
||||
var built = RegBuilder.Factory.FromPlcRegName(item.Key).AsPlcType(PlcVarType.BOOL).Build();
|
||||
|
||||
output.WriteLine($"{(built?.ToString(true) ?? "null")}\n");
|
||||
Assert.Equivalent(item.Value, built);
|
||||
|
||||
} catch (Exception ex) {
|
||||
|
||||
output.WriteLine(ex.Message.ToString());
|
||||
|
||||
}
|
||||
output.WriteLine($"{(built?.ToString(true) ?? "null")}\n");
|
||||
Assert.Equivalent(item.Value, built);
|
||||
|
||||
}
|
||||
|
||||
@@ -204,11 +196,9 @@ public class TestRegisterBuilder {
|
||||
[Fact(DisplayName = "Parsing as Bytes Register (Casted)")]
|
||||
public void TestRegisterBuildingByteRangeCasted() {
|
||||
|
||||
var expect = new BytesRegister<byte[]>(303, 5);
|
||||
var expect = new BytesRegister(303, 5);
|
||||
|
||||
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("DT303").AsPlcType(PlcVarType.INT).Build());
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("DT303").AsType<short>().Build());
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("DT303").AsBytes(5).Build());
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -16,13 +16,15 @@ namespace MewtocolTests {
|
||||
[Fact(DisplayName = "Numeric mewtocol query building")]
|
||||
public void NumericRegisterMewtocolIdentifiers() {
|
||||
|
||||
List<IRegister> registers = new List<IRegister> {
|
||||
new NumberRegister<short>(50, _name: null),
|
||||
new NumberRegister<ushort>(50, _name: null),
|
||||
new NumberRegister<int>(50, _name : null),
|
||||
new NumberRegister<uint>(50, _name : null),
|
||||
new NumberRegister<float>(50, _name : null),
|
||||
new NumberRegister<TimeSpan>(50, _name : null),
|
||||
List<IRegisterInternal> registers = new List<IRegisterInternal> {
|
||||
new NumberRegister<short>(50),
|
||||
new NumberRegister<ushort>(50),
|
||||
new NumberRegister<int>(50),
|
||||
new NumberRegister<uint>(50),
|
||||
new NumberRegister<float>(50),
|
||||
new NumberRegister<TimeSpan>(50),
|
||||
new BytesRegister(50, 30),
|
||||
new BytesRegister(50, 31),
|
||||
};
|
||||
|
||||
List<string> expectedIdents = new List<string> {
|
||||
@@ -32,12 +34,14 @@ namespace MewtocolTests {
|
||||
"D0005000051", //double word register
|
||||
"D0005000051", //double word register
|
||||
"D0005000051", //double word register
|
||||
"D0005000065", //variable len register even bytes
|
||||
"D0005000066", //variable len register odd bytes
|
||||
};
|
||||
|
||||
//test mewtocol idents
|
||||
for (int i = 0; i < registers.Count; i++) {
|
||||
|
||||
IRegister? reg = registers[i];
|
||||
IRegisterInternal? reg = registers[i];
|
||||
string expect = expectedIdents[i];
|
||||
|
||||
Assert.Equal(expect, reg.BuildMewtocolQuery());
|
||||
@@ -49,7 +53,7 @@ namespace MewtocolTests {
|
||||
[Fact(DisplayName = "PLC register naming convention test")]
|
||||
public void PLCRegisterIdentifiers() {
|
||||
|
||||
List<IRegister> registers = new List<IRegister> {
|
||||
List<IRegisterInternal> registers = new List<IRegisterInternal> {
|
||||
//numeric ones
|
||||
new NumberRegister<short>(50, _name: null),
|
||||
new NumberRegister<ushort>(60, _name : null),
|
||||
@@ -67,7 +71,7 @@ namespace MewtocolTests {
|
||||
new BoolRegister(IOType.Y, 0xC, 75),
|
||||
|
||||
//string
|
||||
new BytesRegister<string>(999, 5),
|
||||
new BytesRegister(999, 5),
|
||||
};
|
||||
|
||||
List<string> expcectedIdents = new List<string> {
|
||||
@@ -96,7 +100,7 @@ namespace MewtocolTests {
|
||||
//test mewtocol idents
|
||||
for (int i = 0; i < registers.Count; i++) {
|
||||
|
||||
IRegister? reg = registers[i];
|
||||
IRegisterInternal? reg = registers[i];
|
||||
string expect = expcectedIdents[i];
|
||||
|
||||
Assert.Equal(expect, reg.GetRegisterPLCName());
|
||||
@@ -134,7 +138,7 @@ namespace MewtocolTests {
|
||||
|
||||
var ex3 = Assert.Throws<NotSupportedException>(() => {
|
||||
|
||||
new BytesRegister<string>(100000, 5);
|
||||
new BytesRegister(100000, 5);
|
||||
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user