91 lines
3.9 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|