12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- using System;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Net;
- using NModbus.Data;
- using NModbus.Unme.Common;
- namespace NModbus.Message
- {
- public class WriteSingleCoilRequestResponse : AbstractModbusMessageWithData<RegisterCollection>, IModbusRequest
- {
- public WriteSingleCoilRequestResponse()
- {
- }
- public WriteSingleCoilRequestResponse(byte slaveAddress, ushort startAddress, bool coilState)
- : base(slaveAddress, ModbusFunctionCodes.WriteSingleCoil)
- {
- StartAddress = startAddress;
- Data = new RegisterCollection(coilState ? Modbus.CoilOn : Modbus.CoilOff);
- }
- public override int MinimumFrameSize => 6;
- public ushort StartAddress
- {
- get => MessageImpl.StartAddress.Value;
- set => MessageImpl.StartAddress = value;
- }
- public override string ToString()
- {
- Debug.Assert(Data != null, "Argument Data cannot be null.");
- Debug.Assert(Data.Count() == 1, "Data should have a count of 1.");
- string msg = $"Write single coil {(Data.First() == Modbus.CoilOn ? 1 : 0)} at address {StartAddress}.";
- return msg;
- }
- public void ValidateResponse(IModbusMessage response)
- {
- var typedResponse = (WriteSingleCoilRequestResponse)response;
- if (StartAddress != typedResponse.StartAddress)
- {
- string msg = $"Unexpected start address in response. Expected {StartAddress}, received {typedResponse.StartAddress}.";
- throw new IOException(msg);
- }
- if (Data.First() != typedResponse.Data.First())
- {
- string msg = $"Unexpected data in response. Expected {Data.First()}, received {typedResponse.Data.First()}.";
- throw new IOException(msg);
- }
- }
- protected override void InitializeUnique(byte[] frame)
- {
- StartAddress = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(frame, 2));
- Data = new RegisterCollection(frame.Slice(4, 2).ToArray());
- }
- }
- }
|