public void FC06Test() { // Arrange var endpoint = EndpointSource.GetNext(); var server = new ModbusTcpServer(); server.Start(endpoint); var client = new ModbusTcpClient(); client.Connect(endpoint); // Act client.WriteSingleRegister(0, 02, 259); client.WriteSingleRegister(0, 10, 125); client.WriteSingleRegister(0, 11, 16544); client.WriteSingleRegister(0, 12, 4848); // Assert var expected = new short[] { 0, 0, 259, 0, 0, 0, 0, 0, 0, 0, 125, 16544, 4848 }; lock (server.Lock) { var actual = server.GetHoldingRegisterBuffer <short>().Slice(0, 13); Assert.True(expected.SequenceEqual(actual.ToArray())); } }
public async void ServerRespectsMaxClientConnectionLimit() { // Arrange var endpoint = EndpointSource.GetNext(); var server = new ModbusTcpServer() { MaxConnections = 2 }; server.Start(endpoint); // Act var client1 = new ModbusTcpClient(); var client2 = new ModbusTcpClient(); var client3 = new ModbusTcpClient(); await Task.Run(() => { client1.Connect(endpoint); client1.WriteSingleRegister(1, 2, 3); client2.Connect(endpoint); client2.WriteSingleRegister(1, 2, 3); client3.Connect(endpoint); try { client3.WriteSingleRegister(1, 2, 3); } // Windows catch (IOException) { } // Linux catch (InvalidOperationException) { } server.MaxConnections = 3; client3.Connect(endpoint); client3.WriteSingleRegister(1, 2, 3); }); server.Stop(); // Assert }
static void DoClientWork(ModbusTcpClient client, ILogger logger) { Span <byte> data; var sleepTime = TimeSpan.FromMilliseconds(100); var unitIdentifier = (byte)0xFF; var startingAddress = (ushort)0; var registerAddress = (ushort)0; // ReadHoldingRegisters = 0x03, // FC03 data = client.ReadHoldingRegisters(unitIdentifier, startingAddress, 10); logger.LogInformation("FC03 - ReadHoldingRegisters: Done"); Thread.Sleep(sleepTime); // WriteMultipleRegisters = 0x10, // FC16 client.WriteMultipleRegisters(unitIdentifier, startingAddress, new byte[] { 10, 00, 20, 00, 30, 00, 255, 00, 255, 01 }); logger.LogInformation("FC16 - WriteMultipleRegisters: Done"); Thread.Sleep(sleepTime); // ReadCoils = 0x01, // FC01 data = client.ReadCoils(unitIdentifier, startingAddress, 10); logger.LogInformation("FC01 - ReadCoils: Done"); Thread.Sleep(sleepTime); // ReadDiscreteInputs = 0x02, // FC02 data = client.ReadDiscreteInputs(unitIdentifier, startingAddress, 10); logger.LogInformation("FC02 - ReadDiscreteInputs: Done"); Thread.Sleep(sleepTime); // ReadInputRegisters = 0x04, // FC04 data = client.ReadInputRegisters(unitIdentifier, startingAddress, 10); logger.LogInformation("FC04 - ReadInputRegisters: Done"); Thread.Sleep(sleepTime); // WriteSingleCoil = 0x05, // FC05 client.WriteSingleCoil(unitIdentifier, registerAddress, true); logger.LogInformation("FC05 - WriteSingleCoil: Done"); Thread.Sleep(sleepTime); // WriteSingleRegister = 0x06, // FC06 client.WriteSingleRegister(unitIdentifier, registerAddress, new byte[] { 65, 67 }); logger.LogInformation("FC06 - WriteSingleRegister: Done"); }