public void CreateWriteMultipleCoilsRequestMaxSize()
 {
     WriteMultipleCoilsRequest request = new WriteMultipleCoilsRequest(1, 2,
         MessageUtility.CreateDefaultCollection<DiscreteCollection, bool>(true,
             Modbus.MaximumDiscreteRequestResponseSize));
     Assert.Equal(Modbus.MaximumDiscreteRequestResponseSize, request.Data.Count);
 }
示例#2
0
        public async Task RetriesToReadResponse()
        {
            // Arrange
            var target = new Mock <ModbusTransport>(new Mock <IPipeResource>().Object, Mock.Of <ITransactionIdProvider>(), Mock.Of <ILogger <IModbusMaster> >())
            {
                CallBase = true
            };
            var request  = new WriteMultipleCoilsRequest(1, 1, new bool[] { true });
            var response = new WriteMultipleCoilsResponse();

            target.SetupWriteRequestAsync(request);
            target.SetupReadResponseAsync <WriteMultipleCoilsResponse>(response);
            target.SetupRetryReadResponse(request, response, true, false);

            // Act
            _ = await target.Object.SendAsync <WriteMultipleCoilsResponse>(request);

            // Assert
            target.Protected().As <IModbusTransportMock>()
            .Verify(x => x.WriteRequestAsync(request, It.IsAny <CancellationToken>()), Times.Exactly(1));
            target.Protected().As <IModbusTransportMock>()
            .Verify(x => x.ReadResponseAsync <WriteMultipleCoilsResponse>(It.IsAny <CancellationToken>()), Times.Exactly(2));
            target.Protected().As <IModbusTransportMock>()
            .Verify(x => x.RetryReadResponse(request, It.IsAny <IModbusResponse>()), Times.Exactly(2));
            target.Protected().As <IModbusTransportMock>()
            .Verify(x => x.Validate(request, response), Times.Once());
        }
        internal static WriteMultipleCoilsResponse WriteMultipleCoils(WriteMultipleCoilsRequest request, ModbusDataCollection<bool> dataSource)
        {
            DataStore.WriteData(request.Data, dataSource, request.StartAddress);
            WriteMultipleCoilsResponse response = new WriteMultipleCoilsResponse(request.SlaveAddress, request.StartAddress, request.NumberOfPoints);

            return response;
        }
示例#4
0
        public void CreateWriteMultipleCoilsRequestMaxSize()
        {
            WriteMultipleCoilsRequest request = new WriteMultipleCoilsRequest(1, 2,
                                                                              MessageUtility.CreateDefaultCollection <DiscreteCollection, bool>(true, Modbus.MaximumDiscreteRequestResponseSize));

            Assert.Equal(Modbus.MaximumDiscreteRequestResponseSize, request.Data.Count);
        }
示例#5
0
        internal static WriteMultipleCoilsResponse WriteMultipleCoils(WriteMultipleCoilsRequest request, DataStore dataStore, ModbusDataCollection <bool> dataSource)
        {
            DataStore.WriteData(dataStore, request.Data.Take(request.NumberOfPoints), dataSource, request.StartAddress, dataStore.SyncRoot);
            WriteMultipleCoilsResponse response = new WriteMultipleCoilsResponse(request.SlaveAddress, request.StartAddress, request.NumberOfPoints);

            return(response);
        }
        public void ToString_WriteMultipleCoilsRequest()
        {
            DiscreteCollection        col     = new DiscreteCollection(true, false, true, false, true, true, true, false, false);
            WriteMultipleCoilsRequest request = new WriteMultipleCoilsRequest(34, 45, col);

            Assert.AreEqual("Write 9 coils starting at address 45.", request.ToString());
        }
        public void ToString_WriteMultipleCoilsRequest()
        {
            DiscreteCollection col = new DiscreteCollection(true, false, true, false, true, true, true, false, false);
            WriteMultipleCoilsRequest request = new WriteMultipleCoilsRequest(34, 45, col);

            Assert.Equal("Write 9 coils starting at address 45.", request.ToString());
        }
示例#8
0
        /// <summary>
        /// Force each coil in a sequence of coils to a provided value.
        /// </summary>
        /// <param name="slaveAddress">Address of the device to write to.</param>
        /// <param name="startAddress">Address to begin writing values.</param>
        /// <param name="data">Values to write.</param>
        public void WriteMultipleCoils(byte slaveAddress, ushort startAddress, bool[] data)
        {
            ValidateData("data", data, 1968);
            WriteMultipleCoilsRequest request = new WriteMultipleCoilsRequest(slaveAddress, startAddress, new DiscreteCollection(data));

            Transport.UnicastMessage <WriteMultipleCoilsResponse>(request);
        }
        public void CreateModbusMessageWriteMultipleCoilsRequestWithInvalidFrameSize()
        {
            WriteMultipleCoilsRequest request =
                ModbusMessageFactory.CreateModbusMessage <WriteMultipleCoilsRequest>(new byte[]
                                                                                     { 17, Modbus.WriteMultipleCoils, 0, 19, 0, 10, 2 });

            Assert.Fail();
        }
示例#10
0
        public void WriteMultipleCoilsRequestToString()
        {
            // Arrange
            var request = new WriteMultipleCoilsRequest(34, 45, new bool[] { true, false, true, false, true, true, true, false, false });

            // Act/Assert
            Assert.Equal("Write 9 coils starting at address 45 into slave 34", request.ToString());
        }
示例#11
0
        public Task WriteMultipleCoilsAsync(byte slaveAddress, ushort startAddress, bool[] data, CancellationToken token = default)
        {
            ValidateData(data, 1968);

            var request = new WriteMultipleCoilsRequest(slaveAddress, startAddress, data);

            return(Transport.SendAsync <WriteMultipleCoilsResponse>(request, token));
        }
示例#12
0
        /// <summary>
        ///    Asynchronously writes a sequence of coils.
        /// </summary>
        /// <param name="slaveAddress">Address of the device to write to.</param>
        /// <param name="startAddress">Address to begin writing values.</param>
        /// <param name="data">Values to write.</param>
        /// <returns>A task that represents the asynchronous write operation</returns>
        public Task WriteMultipleCoilsAsync(byte slaveAddress, ushort startAddress, bool[] data)
        {
            ValidateData("data", data, 1968);

            var request = new WriteMultipleCoilsRequest(slaveAddress, startAddress, new DiscreteCollection(data));

            return(PerformWriteRequestAsync <WriteMultipleCoilsResponse>(request));
        }
示例#13
0
        internal static WriteMultipleCoilsResponse WriteMultipleCoils(WriteMultipleCoilsRequest request,
            DataStore dataStore, ModbusDataCollection<bool> dataSource)
        {
            DataStore.WriteData(dataStore, request.Data.Take(request.NumberOfPoints), dataSource, request.StartAddress,
                dataStore.SyncRoot);
            var response = new WriteMultipleCoilsResponse(request.SlaveAddress, request.StartAddress, request.NumberOfPoints);

            return response;
        }
示例#14
0
        public void WriteMultipCoils_MakeSureWeDoNotWriteRemainder()
        {
            // 0, false initialized data store
            var dataStore = DataStoreFactory.CreateDefaultDataStore();

            var request = new WriteMultipleCoilsRequest(1, 0, new DiscreteCollection(Enumerable.Repeat(true, 8).ToArray())) { NumberOfPoints = 2 };
            ModbusSlave.WriteMultipleCoils(request, dataStore, dataStore.CoilDiscretes);

            Assert.AreEqual(dataStore.CoilDiscretes.Slice(1, 8).ToArray(), new [] { true, true, false, false, false, false, false, false });
        }
        public void CreateModbusMessageWriteMultipleCoilsRequest()
        {
            WriteMultipleCoilsRequest request         = ModbusMessageFactory.CreateModbusMessage <WriteMultipleCoilsRequest>(new byte[] { 17, Modbus.WriteMultipleCoils, 0, 19, 0, 10, 2, 205, 1 });
            WriteMultipleCoilsRequest expectedRequest = new WriteMultipleCoilsRequest(17, 19, new DiscreteCollection(true, false, true, true, false, false, true, true, true, false));

            AssertModbusMessagePropertiesAreEqual(expectedRequest, request);
            Assert.AreEqual(expectedRequest.StartAddress, request.StartAddress);
            Assert.AreEqual(expectedRequest.NumberOfPoints, request.NumberOfPoints);
            Assert.AreEqual(expectedRequest.ByteCount, request.ByteCount);
            Assert.AreEqual(expectedRequest.Data.NetworkBytes, request.Data.NetworkBytes);
        }
 public void CreateWriteMultipleCoilsRequest()
 {
     DiscreteCollection col = new DiscreteCollection(true, false, true, false, true, true, true, false, false);
     WriteMultipleCoilsRequest request = new WriteMultipleCoilsRequest(34, 45, col);
     Assert.Equal(Modbus.WriteMultipleCoils, request.FunctionCode);
     Assert.Equal(34, request.SlaveAddress);
     Assert.Equal(45, request.StartAddress);
     Assert.Equal(9, request.NumberOfPoints);
     Assert.Equal(2, request.ByteCount);
     Assert.Equal(col.NetworkBytes, request.Data.NetworkBytes);
 }
示例#17
0
        public byte[] BuildWriteMultipleCoilsCommand(byte slaveAddress, ushort startAddress, bool[] data, out IModbusMessage request)
        {
            ValidateData("data", data, 1968);

            request = new WriteMultipleCoilsRequest(
                slaveAddress,
                startAddress,
                new DiscreteCollection(data));

            return(Transport.BuildMessageFrame(request));
        }
        public void CreateWriteMultipleCoilsRequest()
        {
            DiscreteCollection        col     = new DiscreteCollection(true, false, true, false, true, true, true, false, false);
            WriteMultipleCoilsRequest request = new WriteMultipleCoilsRequest(34, 45, col);

            Assert.AreEqual(Modbus.WriteMultipleCoils, request.FunctionCode);
            Assert.AreEqual(34, request.SlaveAddress);
            Assert.AreEqual(45, request.StartAddress);
            Assert.AreEqual(9, request.NumberOfPoints);
            Assert.AreEqual(2, request.ByteCount);
            Assert.AreEqual(col.NetworkBytes, request.Data.NetworkBytes);
        }
示例#19
0
        public void WriteMultipCoils_MakeSureWeDoNotWriteRemainder()
        {
            // 0, false initialized data store
            var dataStore = DataStoreFactory.CreateDefaultDataStore();

            var request = new WriteMultipleCoilsRequest(1, 0, new DiscreteCollection(Enumerable.Repeat(true, 8).ToArray()))
            {
                NumberOfPoints = 2
            };

            ModbusSlave.WriteMultipleCoils(request, dataStore, dataStore.CoilDiscretes);

            Assert.AreEqual(dataStore.CoilDiscretes.Slice(1, 8).ToArray(), new [] { true, true, false, false, false, false, false, false });
        }
示例#20
0
        public WriteMultipleCoilsResponse WriteMultipleCoils(ushort startingAddress, bool[] states)
        {
            var function = new WriteMultipleCoilsRequest(startingAddress, states);

            return(CallModbusFunctionSync <WriteMultipleCoilsResponse>(function));
        }
示例#21
0
        public ushort WriteMultipleCoilsAsync(ushort startingAddress, bool[] states)
        {
            var function = new WriteMultipleCoilsRequest(startingAddress, states);

            return(CallModbusFunction(function));
        }
示例#22
0
        public override ModbusFunction WriteMultipleCoils(WriteMultipleCoilsRequest request)
        {
            var response = new WriteMultipleCoilsResponse(request.StartingAddress, request.Quantity);

            return(response);
        }
 public abstract ModbusFunction WriteMultipleCoils(WriteMultipleCoilsRequest request);
 public void CreateModbusMessageWriteMultipleCoilsRequest()
 {
     WriteMultipleCoilsRequest request =
         ModbusMessageFactory.CreateModbusMessage<WriteMultipleCoilsRequest>(new byte[]
         {17, Modbus.WriteMultipleCoils, 0, 19, 0, 10, 2, 205, 1});
     WriteMultipleCoilsRequest expectedRequest = new WriteMultipleCoilsRequest(17, 19,
         new DiscreteCollection(true, false, true, true, false, false, true, true, true, false));
     AssertModbusMessagePropertiesAreEqual(expectedRequest, request);
     Assert.AreEqual(expectedRequest.StartAddress, request.StartAddress);
     Assert.AreEqual(expectedRequest.NumberOfPoints, request.NumberOfPoints);
     Assert.AreEqual(expectedRequest.ByteCount, request.ByteCount);
     Assert.AreEqual(expectedRequest.Data.NetworkBytes, request.Data.NetworkBytes);
 }
示例#25
0
        static void TestMessage()
        {
            ModbusMessage fc01Req = new ReadCoilsRequest(0x13, 0x13);
            ModbusMessage fc01Res = new ReadCoilsResponse(true, false, true, true, false, false, true, true, true, true, false, true, false, true, true, false, true, false, true, false);
            ModbusMessage fc02Req = new ReadDiscreteInputsRequest(0xc4, 0x16);
            ModbusMessage fc02Res = new ReadDiscreteInputsResponse(false, false, true, true, false, true, false, true, true, true, false, true, true, false, true, true, true, false, true, false, true, true);
            ModbusMessage fc03Req = new ReadHoldingRegistersRequest(0x6b, 0x03);
            ModbusMessage fc03Res = new ReadHoldingRegistersResponse(0x022b, 0x0000, 0x0064);
            ModbusMessage fc04Req = new ReadInputRegistersRequest(0x08, 0x01);
            ModbusMessage fc04Res = new ReadInputRegistersResponse(0x000a);
            ModbusMessage fc05Req = new WriteSingleCoilRequest(0xac, true);
            ModbusMessage fc05Res = new WriteSingleCoilResponse(0xac, true);
            ModbusMessage fc06Req = new WriteSingleRegisterRequest(0x01, 0x0003);
            ModbusMessage fc06Res = new WriteSingleRegisterResponse(0x01, 0x0003);
            ModbusMessage fc0fReq = new WriteMultipleCoilsRequest(0x13, true, false, true, true, false, false, true, true, true, false);
            ModbusMessage fc0fRes = new WriteMultipleCoilsResponse(0x13, 0x0a);
            ModbusMessage fc10Req = new WriteMultipleRegistersRequest(0x01, 0x000a, 0x0102);
            ModbusMessage fc10Res = new WriteMultipleRegistersResponse(0x01, 0x02);

            PrintMessagePDU(fc01Req);
            PrintMessagePDU(fc01Res);
            PrintMessagePDU(fc02Req);
            PrintMessagePDU(fc02Res);
            PrintMessagePDU(fc03Req);
            PrintMessagePDU(fc03Res);
            PrintMessagePDU(fc04Req);
            PrintMessagePDU(fc04Res);
            PrintMessagePDU(fc05Req);
            PrintMessagePDU(fc05Res);
            PrintMessagePDU(fc06Req);
            PrintMessagePDU(fc06Res);
            PrintMessagePDU(fc0fReq);
            PrintMessagePDU(fc0fRes);
            PrintMessagePDU(fc10Req);
            PrintMessagePDU(fc10Res);

            Assert(MessagePDU(fc01Req) == "Req.: 01 00 13 00 13", $"{nameof(fc01Req)} Fail");
            Assert(MessagePDU(fc01Res) == "Res.: 01 03 cd 6b 05", $"{nameof(fc01Res)} Fail");
            Assert(MessagePDU(fc02Req) == "Req.: 02 00 c4 00 16", $"{nameof(fc02Req)} Fail");
            Assert(MessagePDU(fc02Res) == "Res.: 02 03 ac db 35", $"{nameof(fc02Res)} Fail");
            Assert(MessagePDU(fc03Req) == "Req.: 03 00 6b 00 03", $"{nameof(fc03Req)} Fail");
            Assert(MessagePDU(fc03Res) == "Res.: 03 06 02 2b 00 00 00 64", $"{nameof(fc03Res)} Fail");
            Assert(MessagePDU(fc04Req) == "Req.: 04 00 08 00 01", $"{nameof(fc04Req)} Fail");
            Assert(MessagePDU(fc04Res) == "Res.: 04 02 00 0a", $"{nameof(fc04Res)} Fail");
            Assert(MessagePDU(fc05Req) == "Req.: 05 00 ac ff 00", $"{nameof(fc05Req)} Fail");
            Assert(MessagePDU(fc05Res) == "Res.: 05 00 ac ff 00", $"{nameof(fc05Res)} Fail");
            Assert(MessagePDU(fc06Req) == "Req.: 06 00 01 00 03", $"{nameof(fc06Req)} Fail");
            Assert(MessagePDU(fc06Res) == "Res.: 06 00 01 00 03", $"{nameof(fc06Res)} Fail");
            Assert(MessagePDU(fc0fReq) == "Req.: 0f 00 13 00 0a 02 cd 01", $"{nameof(fc0fReq)} Fail");
            Assert(MessagePDU(fc0fRes) == "Res.: 0f 00 13 00 0a", $"{nameof(fc0fRes)} Fail");
            Assert(MessagePDU(fc10Req) == "Req.: 10 00 01 00 02 04 00 0a 01 02", $"{nameof(fc10Req)} Fail");
            Assert(MessagePDU(fc10Res) == "Res.: 10 00 01 00 02", $"{nameof(fc10Res)} Fail");

            Assert(fc01Req.FunctionCode == (FunctionCode)0x01);
            Assert(fc01Res.FunctionCode == (FunctionCode)0x01);
            Assert(fc02Req.FunctionCode == (FunctionCode)0x02);
            Assert(fc02Res.FunctionCode == (FunctionCode)0x02);
            Assert(fc03Req.FunctionCode == (FunctionCode)0x03);
            Assert(fc03Res.FunctionCode == (FunctionCode)0x03);
            Assert(fc04Req.FunctionCode == (FunctionCode)0x04);
            Assert(fc04Res.FunctionCode == (FunctionCode)0x04);
            Assert(fc05Req.FunctionCode == (FunctionCode)0x05);
            Assert(fc05Res.FunctionCode == (FunctionCode)0x05);
            Assert(fc06Req.FunctionCode == (FunctionCode)0x06);
            Assert(fc06Res.FunctionCode == (FunctionCode)0x06);
            Assert(fc0fReq.FunctionCode == (FunctionCode)0x0f);
            Assert(fc0fRes.FunctionCode == (FunctionCode)0x0f);
            Assert(fc10Req.FunctionCode == (FunctionCode)0x10);
            Assert(fc10Res.FunctionCode == (FunctionCode)0x10);
        }