初始化上传
This commit is contained in:
90
常用工具集/Utility/Network/Modbus/SharpModbus/ModbusParser.cs
Normal file
90
常用工具集/Utility/Network/Modbus/SharpModbus/ModbusParser.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user