Files
DevToolsAvalonia/常用工具集/Utility/Network/Modbus/SharpModbus/Commands/ModbusF01ReadCoils.cs
2025-08-26 08:37:44 +08:00

64 lines
2.3 KiB
C#

using System;
namespace SharpModbus
{
public class ModbusF01ReadCoils : IModbusCommand
{
private readonly byte slave;
private readonly ushort address;
private readonly ushort count;
public byte Code { get { return 1; } }
public byte Slave { get { return slave; } }
public ushort Address { get { return address; } }
public ushort Count { get { return count; } }
public int RequestLength { get { return 6; } }
public int ResponseLength { get { return 3 + ModbusUtils.BytesForBools(count); } }
public ModbusF01ReadCoils(byte slave, ushort address, ushort count)
{
this.slave = slave;
this.address = address;
this.count = count;
}
public void FillRequest(byte[] request, int offset)
{
request[offset + 0] = slave;
request[offset + 1] = 1;
request[offset + 2] = ModbusUtils.High(address);
request[offset + 3] = ModbusUtils.Low(address);
request[offset + 4] = ModbusUtils.High(count);
request[offset + 5] = ModbusUtils.Low(count);
}
public object ParseResponse(byte[] response, int offset)
{
var bytes = ModbusUtils.BytesForBools(count);
Tools.AssertEqual(response[offset + 0], slave, "Slave mismatch got {0} expected {1}");
Tools.AssertEqual(response[offset + 1], 1, "Function mismatch got {0} expected {1}");
Tools.AssertEqual(response[offset + 2], bytes, "Bytes mismatch got {0} expected {1}");
return ModbusUtils.DecodeBools(response, offset + 3, count);
}
public object ApplyTo(IModbusModel model)
{
return model.getDOs(slave, address, count);
}
public void FillResponse(byte[] response, int offset, object value)
{
var bytes = ModbusUtils.BytesForBools(count);
response[offset + 0] = slave;
response[offset + 1] = 1;
response[offset + 2] = bytes;
var data = ModbusUtils.EncodeBools(value as bool[]);
ModbusUtils.Copy(data, 0, response, offset + 3, bytes);
}
public override string ToString()
{
return string.Format("[ModbusF01ReadCoils Slave={0}, Address={1}, Count={2}]", slave, address, count);
}
}
}