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

91 lines
3.9 KiB
C#

using System;
namespace SharpModbus
{
public static class ModbusParser
{
public static IModbusCommand Parse(byte[] request, int offset)
{
var slave = request[offset + 0];
var code = request[offset + 1];
var address = ModbusUtils.GetUShort(request, offset + 2);
switch (code)
{
case 1:
return Parse01(slave, code, address, request, offset);
case 2:
return Parse02(slave, code, address, request, offset);
case 3:
return Parse03(slave, code, address, request, offset);
case 4:
return Parse04(slave, code, address, request, offset);
case 5:
return Parse05(slave, code, address, request, offset);
case 6:
return Parse06(slave, code, address, request, offset);
case 15:
return Parse15(slave, code, address, request, offset);
case 16:
return Parse16(slave, code, address, request, offset);
}
throw Tools.Make("Unsupported function code {0}", code);
}
private static IModbusCommand Parse01(byte slave, byte code, ushort address, byte[] request, int offset)
{
var count = ModbusUtils.GetUShort(request, offset + 4);
return new ModbusF01ReadCoils(slave, address, count);
}
private static IModbusCommand Parse02(byte slave, byte code, ushort address, byte[] request, int offset)
{
var count = ModbusUtils.GetUShort(request, offset + 4);
return new ModbusF02ReadInputs(slave, address, count);
}
private static IModbusCommand Parse03(byte slave, byte code, ushort address, byte[] request, int offset)
{
var count = ModbusUtils.GetUShort(request, offset + 4);
return new ModbusF03ReadHoldingRegisters(slave, address, count);
}
private static IModbusCommand Parse04(byte slave, byte code, ushort address, byte[] request, int offset)
{
var count = ModbusUtils.GetUShort(request, offset + 4);
return new ModbusF04ReadInputRegisters(slave, address, count);
}
private static IModbusCommand Parse05(byte slave, byte code, ushort address, byte[] request, int offset)
{
var value = ModbusUtils.DecodeBool(request[offset + 4]);
var zero = request[offset + 5];
Tools.AssertEqual(zero, 0, "Zero mismatch got {0} expected {1}");
return new ModbusF05WriteCoil(slave, address, value);
}
private static IModbusCommand Parse06(byte slave, byte code, ushort address, byte[] request, int offset)
{
var value = ModbusUtils.GetUShort(request, offset + 4);
return new ModbusF06WriteRegister(slave, address, value);
}
private static IModbusCommand Parse15(byte slave, byte code, ushort address, byte[] request, int offset)
{
var count = ModbusUtils.GetUShort(request, offset + 4);
var values = ModbusUtils.DecodeBools(request, offset + 7, count);
var bytes = request[offset + 6];
Tools.AssertEqual(ModbusUtils.BytesForBools(count), bytes, "Byte count mismatch got {0} expected {1}");
return new ModbusF15WriteCoils(slave, address, values);
}
private static IModbusCommand Parse16(byte slave, byte code, ushort address, byte[] request, int offset)
{
var count = ModbusUtils.GetUShort(request, offset + 4);
var values = ModbusUtils.DecodeWords(request, offset + 7, count);
var bytes = request[offset + 6];
Tools.AssertEqual(ModbusUtils.BytesForWords(count), bytes, "Byte count mismatch got {0} expected {1}");
return new ModbusF16WriteRegisters(slave, address, values);
}
}
}