Added performance improvements for cyclic polling by using single frame building of multiple registers

- cleaned and refactored codebase
This commit is contained in:
Felix Weiß
2023-06-27 20:44:11 +02:00
parent 7be52efb7e
commit a9bd2962b4
34 changed files with 1099 additions and 958 deletions

View File

@@ -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");
}
//}
}

View File

@@ -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; }
}

View 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; }
}

View File

@@ -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());
}

View File

@@ -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();
// }
//}
}

View File

@@ -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());
}

View File

@@ -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);
});