diff --git a/Modbus.Net/ModBus.Net/AddressTranslator.cs b/Modbus.Net/ModBus.Net/AddressTranslator.cs index 1b53b2b..db373fb 100644 --- a/Modbus.Net/ModBus.Net/AddressTranslator.cs +++ b/Modbus.Net/ModBus.Net/AddressTranslator.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Dynamic; namespace ModBus.Net { @@ -7,6 +8,30 @@ namespace ModBus.Net /// public abstract class AddressTranslator { + protected static AddressTranslator _instance; + + public static AddressTranslator Instance + { + get + { + if (_instance == null) + { + CreateTranslator(new AddressTranslatorBase()); + } + return _instance; + } + protected set + { + if (value == null) CreateTranslator(new AddressTranslatorBase()); + _instance = value; + } + } + + public static void CreateTranslator(AddressTranslator instance) + { + Instance = instance; + } + public abstract ushort AddressTranslate(string address); } diff --git a/Modbus.Net/ModBus.Net/BaseUtility.cs b/Modbus.Net/ModBus.Net/BaseUtility.cs index ad93eea..75a0ad9 100644 --- a/Modbus.Net/ModBus.Net/BaseUtility.cs +++ b/Modbus.Net/ModBus.Net/BaseUtility.cs @@ -10,9 +10,7 @@ namespace ModBus.Net { public abstract void SetConnectionString(string connectionString); public abstract void SetConnectionType(int connectionType); - public abstract bool[] GetCoils(byte belongAddress, string startAddress, ushort getCount); - public abstract bool SetCoils(byte belongAddress, string startAddress, bool[] setContents); - public abstract ushort[] GetRegisters(byte belongAddress, string startAddress, ushort getCount); - public abstract bool SetRegisters(byte belongAddress, string startAddress, object[] setContents); + public abstract byte[] GetDatas(byte belongAddress, byte functionCode, string startAddress, ushort getCount); + public abstract bool SetDatas(byte belongAddress, byte functionCode, string startAddress, object[] setContents); } } diff --git a/Modbus.Net/ModBus.Net/ModbusProtocal.cs b/Modbus.Net/ModBus.Net/ModbusProtocal.cs index 16dedcb..2af107c 100644 --- a/Modbus.Net/ModBus.Net/ModbusProtocal.cs +++ b/Modbus.Net/ModBus.Net/ModbusProtocal.cs @@ -1,572 +1,150 @@ using System; using System.Collections.Generic; +using System.Runtime.Remoting.Messaging; -public enum ModbusProtocalReg +public enum ModbusProtocalFunctionCode +{ + +} + +internal enum ModbusProtocalTimeFunctionCode +{ + GetSystemTime = 3, + SetSystemTime = 16, +}; + +public enum ModbusProtocalReadDataFunctionCode { ReadCoilStatus = 1, ReadInputStatus = 2, ReadHoldRegister = 3, ReadInputRegister = 4, - WriteOneCoil = 5, - WriteOneRegister = 6, +} + +public enum ModbusProtocalWriteDataFunctionCode +{ WriteMultiCoil = 15, WriteMultiRegister = 16, - GetSystemTime = 3, - SetSystemTime = 16, - ReadVariable = 20, - WriteVariable = 21, -}; - +} namespace ModBus.Net { public abstract class ModbusProtocal : BaseProtocal { - + } - /// - /// 读线圈状态 - /// - public class ReadCoilStatusModbusProtocal : ProtocalUnit + public class ReadDataInputStruct : InputStruct + { + public ReadDataInputStruct(byte belongAddress, ModbusProtocalReadDataFunctionCode functionCode, string startAddress, ushort getCount) + { + BelongAddress = belongAddress; + FunctionCode = (byte)functionCode; + StartAddress = AddressTranslator.Instance.AddressTranslate(startAddress); + GetCount = getCount; + } + + public byte BelongAddress { get; private set; } + + public byte FunctionCode { get; private set; } + + public ushort StartAddress { get; private set; } + + public ushort GetCount { get; private set; } + } + + public class ReadDataOutputStruct : OutputStruct + { + public ReadDataOutputStruct(byte belongAddress, byte functionCode, + int dataCount, byte[] dataValue) + { + BelongAddress = belongAddress; + FunctionCode = functionCode; + DataCount = dataCount; + DataValue = dataValue.Clone() as byte[]; + } + + public byte BelongAddress { get; private set; } + + public byte FunctionCode { get; private set; } + + public int DataCount { get; private set; } + + public byte[] DataValue { get; private set; } + } + + public class ReadDataModbusProtocal : ProtocalUnit { public override byte[] Format(InputStruct message) { - var r_message = (ReadCoilStatusInputStruct)message; + var r_message = (ReadDataInputStruct)message; return Format(r_message.BelongAddress, r_message.FunctionCode, r_message.StartAddress, r_message.GetCount); } - public override OutputStruct Unformat(byte[] messageBytes, ref int flag) + public override OutputStruct Unformat(byte[] messageBytes, ref int pos) { - byte belongAddress = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte coilCount = ValueHelper.Instance.GetByte(messageBytes, ref flag); - var coilStatusArr = new bool[coilCount * 8]; - for (int i = 0; i < coilCount; i++) - { - byte coilStatusGet = ValueHelper.Instance.GetByte(messageBytes, ref flag); - for (int j = 0; j < 8; j++) - { - if (coilStatusGet % 2 == 0) coilStatusArr[8 * i + j] = false; - else coilStatusArr[8 * i + j] = true; - coilStatusGet /= 2; - } - } - return new ReadCoilStatusOutputStruct(belongAddress, functionCode, coilCount * 8, coilStatusArr); - } - - public class ReadCoilStatusInputStruct : InputStruct - { - public ReadCoilStatusInputStruct(byte belongAddress, string startAddress, ushort getCount) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.ReadCoilStatus; - StartAddress = _addressTranslator.AddressTranslate(startAddress); - GetCount = getCount; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort GetCount { get; private set; } - } - - public class ReadCoilStatusOutputStruct : OutputStruct - { - public ReadCoilStatusOutputStruct(byte belongAddress, byte functionCode, - int coilCount, bool[] coilStatus) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - CoilCount = coilCount; - CoilStatus = coilStatus.Clone() as bool[]; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public int CoilCount { get; private set; } - - public bool[] CoilStatus { get; private set; } + byte belongAddress = ValueHelper.Instance.GetByte(messageBytes, ref pos); + byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref pos); + byte dataCount = ValueHelper.Instance.GetByte(messageBytes, ref pos); + byte[] dataValue = new byte[dataCount]; + Array.Copy(messageBytes, 3, dataValue, 0, dataCount); + return new ReadDataOutputStruct(belongAddress, functionCode, dataCount, dataValue); } } - /// - /// 读输入状态协 - /// - public class ReadInputStatusModbusProtocal : ProtocalUnit + public class WriteDataInputStruct : InputStruct { - public override byte[] Format(InputStruct message) + public WriteDataInputStruct(byte belongAddress, ModbusProtocalWriteDataFunctionCode functionCode, string startAddress, object[] writeValue) { - var r_message = (ReadInputStatusInputStruct)message; - return Format(r_message.BelongAddress, r_message.FunctionCode, - r_message.StartAddress, r_message.GetCount); + BelongAddress = belongAddress; + FunctionCode = (byte)functionCode; + StartAddress = AddressTranslator.Instance.AddressTranslate(startAddress); + WriteCount = (ushort)writeValue.Length; + WriteByteCount = (byte)(WriteCount * 2); + WriteValue = writeValue.Clone() as object[]; } - public override OutputStruct Unformat(byte[] messageBytes, ref int flag) - { - byte belongAddress = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte inputCount = ValueHelper.Instance.GetByte(messageBytes, ref flag); - var inputStatusArr = new bool[inputCount * 8]; - for (int i = 0; i < inputCount; i++) - { - byte inputStatusGet = ValueHelper.Instance.GetByte(messageBytes, ref flag); - for (int j = 0; j < 8; j++) - { - if (inputStatusGet % 2 == 0) inputStatusArr[8 * i + j] = false; - else inputStatusArr[8 * i + j] = true; - inputStatusGet /= 2; - } - } - return new ReadInputStatusOutputStruct(belongAddress, functionCode, inputCount * 8, - inputStatusArr); - } + public byte BelongAddress { get; private set; } - public class ReadInputStatusInputStruct : InputStruct - { - public ReadInputStatusInputStruct(byte belongAddress, string startAddress, ushort getCount) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.ReadInputStatus; - StartAddress = _addressTranslator.AddressTranslate(startAddress); - GetCount = getCount; - } + public byte FunctionCode { get; private set; } + public ushort StartAddress { get; private set; } - public byte BelongAddress { get; private set; } + public ushort WriteCount { get; private set; } - public byte FunctionCode { get; private set; } + public byte WriteByteCount { get; private set; } - public ushort StartAddress { get; private set; } - - public ushort GetCount { get; private set; } - } - - public class ReadInputStatusOutputStruct : OutputStruct - { - public ReadInputStatusOutputStruct(byte belongAddress, byte functionCode, - int inputCount, bool[] inputStatus) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - InputCount = inputCount; - InputStatus = inputStatus.Clone() as bool[]; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public int InputCount { get; private set; } - - public bool[] InputStatus { get; private set; } - } + public object[] WriteValue { get; private set; } } - /// - /// 读保持型寄存器 - /// - public class ReadHoldRegisterModbusProtocal : ProtocalUnit + public class WriteDataOutputStruct : OutputStruct { - public override byte[] Format(InputStruct message) + public WriteDataOutputStruct(byte belongAddress, byte functionCode, + ushort startAddress, ushort writeCount) { - var r_message = (ReadHoldRegisterInputStruct)message; - return Format(r_message.BelongAddress, r_message.FunctionCode, - r_message.StartAddress, r_message.GetCount); + BelongAddress = belongAddress; + FunctionCode = functionCode; + StartAddress = startAddress; + WriteCount = writeCount; } - public override OutputStruct Unformat(byte[] messageBytes, ref int flag) - { - byte belongAddress = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte holdRegisterCount = ValueHelper.Instance.GetByte(messageBytes, ref flag); - var holdRegisterArr = new ushort[holdRegisterCount / 2]; - for (int i = 0; i < holdRegisterCount / 2; i++) - { - holdRegisterArr[i] = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - } - return new ReadHoldRegisterOutputStruct(belongAddress, functionCode, holdRegisterCount / 2, - holdRegisterArr); - } + public byte BelongAddress { get; private set; } - public class ReadHoldRegisterInputStruct : InputStruct - { - public ReadHoldRegisterInputStruct(byte belongAddress, string startAddress, ushort getCount) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.ReadHoldRegister; - StartAddress = _addressTranslator.AddressTranslate(startAddress); - GetCount = getCount; - } + public byte FunctionCode { get; private set; } - public byte BelongAddress { get; private set; } + public ushort StartAddress { get; private set; } - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort GetCount { get; private set; } - } - - public class ReadHoldRegisterOutputStruct : OutputStruct - { - public ReadHoldRegisterOutputStruct(byte belongAddress, byte functionCode, - int holdRegisterCount, ushort[] holdRegisterStatus) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - HoldRegisterCount = holdRegisterCount; - HoldRegisterStatus = holdRegisterStatus.Clone() as ushort[]; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public int HoldRegisterCount { get; private set; } - - public ushort[] HoldRegisterStatus { get; private set; } - } - } - - /// - /// 读输入型寄存器 - /// - public class ReadInputRegisterModbusProtocal : ProtocalUnit - { - public override byte[] Format(InputStruct message) - { - var r_message = (ReadInputRegisterInputStruct)message; - return Format(r_message.BelongAddress, r_message.FunctionCode, - r_message.StartAddress, r_message.GetCount); - } - - public override OutputStruct Unformat(byte[] messageBytes, ref int flag) - { - if (messageBytes.Length == 19 && messageBytes[15] == 0 && messageBytes[17] == 0 && messageBytes[18] == 0) - { - byte belongAddress = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte eventByteCount = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte soeProperty = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte soeEvent = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte month = ValueHelper.Instance.GetByte(messageBytes, ref flag); - int year = ValueHelper.Instance.GetByte(messageBytes, ref flag) + 2002; - byte hour = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte day = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte second = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte minute = ValueHelper.Instance.GetByte(messageBytes, ref flag); - ushort millisecond = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - ushort testPoint = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - flag += 1; - byte testValue = ValueHelper.Instance.GetByte(messageBytes, ref flag); - flag += 1; - flag += 1; - return new ReadEventOutputStruct(belongAddress, functionCode, eventByteCount, soeProperty, - soeEvent, - new DateTime(year, month == 0 ? 1 : 0, day == 0 ? 1 : 0, hour, minute, second, millisecond), - testPoint, testValue); - } - else - { - byte belongAddress = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte inputRegisterCount = ValueHelper.Instance.GetByte(messageBytes, ref flag); - var holdRegisterArr = new ushort[inputRegisterCount / 2]; - for (int i = 0; i < inputRegisterCount / 2; i++) - { - holdRegisterArr[i] = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - } - return new ReadInputRegisterOutputStruct(belongAddress, functionCode, inputRegisterCount / 2, - holdRegisterArr); - } - } - - public class ReadEventOutputStruct : OutputStruct - { - public ReadEventOutputStruct(byte belongAddress, byte functionCode, - byte eventByteCount, byte soeProperty, byte soeEvent, DateTime time, ushort testPoint, - byte testValue) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - EventByteCount = eventByteCount; - SoeProperty = soeProperty; - SoeEvent = soeEvent; - TestTime = time; - TestPoint = testPoint; - TestValue = testValue; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public byte EventByteCount { get; private set; } - - public byte SoeProperty { get; private set; } - - public byte SoeEvent { get; private set; } - - public DateTime TestTime { get; private set; } - - public ushort TestPoint { get; private set; } - - public byte TestValue { get; private set; } - } - - public class ReadInputRegisterInputStruct : InputStruct - { - public ReadInputRegisterInputStruct(byte belongAddress, string startAddress, ushort getCount) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.ReadInputRegister; - StartAddress = _addressTranslator.AddressTranslate(startAddress); - GetCount = getCount; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort GetCount { get; private set; } - } - - public class ReadInputRegisterOutputStruct : OutputStruct - { - public ReadInputRegisterOutputStruct(byte belongAddress, byte functionCode, - int inputRegisterCount, ushort[] inputRegisterStatus) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - InputRegisterCount = inputRegisterCount; - InputRegisterStatus = inputRegisterStatus.Clone() as ushort[]; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public int InputRegisterCount { get; private set; } - - public ushort[] InputRegisterStatus { get; private set; } - } - } - - /// - /// 读单个线圈状态 - /// - public class WriteOneCoilModbusProtocal : ProtocalUnit - { - public override byte[] Format(InputStruct message) - { - var r_message = (WriteOneCoilInputStruct)message; - return Format(r_message.BelongAddress, r_message.FunctionCode, - r_message.StartAddress, r_message.WriteValue ? new byte[] { 0xFF, 0x00 } : new byte[] { 0x00, 0x00 }); - } - - public override OutputStruct Unformat(byte[] messageBytes, ref int flag) - { - byte belongAddress = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref flag); - ushort startAddress = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - ushort writeValue = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - return new WriteOneCoilOutputStruct(belongAddress, functionCode, startAddress, - writeValue != 0); - } - - public class WriteOneCoilInputStruct : InputStruct - { - public WriteOneCoilInputStruct(byte belongAddress, string startAddress, bool writeValue) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.WriteOneCoil; - StartAddress = _addressTranslator.AddressTranslate(startAddress); - WriteValue = writeValue; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public bool WriteValue { get; private set; } - } - - public class WriteOneCoilOutputStruct : OutputStruct - { - public WriteOneCoilOutputStruct(byte belongAddress, byte functionCode, - ushort startAddress, bool writeValue) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - StartAddress = startAddress; - WriteValue = writeValue; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public bool WriteValue { get; private set; } - } - } - - /// - /// 写单个寄存器状态 - /// - public class WriteOneRegisterModbusProtocal : ProtocalUnit - { - public override byte[] Format(InputStruct message) - { - var r_message = (WriteOneRegisterInputStruct)message; - return Format(r_message.BelongAddress, r_message.FunctionCode, - r_message.StartAddress, r_message.WriteValue); - } - - public override OutputStruct Unformat(byte[] messageBytes, ref int flag) - { - byte belongAddress = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref flag); - ushort startAddress = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - ushort writeValue = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - return new WriteOneRegisterOutputStruct(belongAddress, functionCode, startAddress, writeValue); - } - - public class WriteOneRegisterInputStruct : InputStruct - { - public WriteOneRegisterInputStruct(byte belongAddress, string startAddress, ushort writeValue) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.WriteOneRegister; - StartAddress = _addressTranslator.AddressTranslate(startAddress); - WriteValue = writeValue; - } - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort WriteValue { get; private set; } - } - - public class WriteOneRegisterOutputStruct : OutputStruct - { - public WriteOneRegisterOutputStruct(byte belongAddress, byte functionCode, - ushort startAddress, ushort writeValue) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - StartAddress = startAddress; - WriteValue = writeValue; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort WriteValue { get; private set; } - } - } - - /// - /// 写多个线圈状态 - /// - public class WriteMultiCoilModbusProtocal : ProtocalUnit - { - public override byte[] Format(InputStruct message) - { - var r_message = (WriteMultiCoilInputStruct)message; - return Format(r_message.BelongAddress, r_message.FunctionCode, - r_message.StartAddress, r_message.WriteCount, r_message.WriteByteCount, r_message.WriteValue); - } - - public override OutputStruct Unformat(byte[] messageBytes, ref int flag) - { - byte belongAddress = ValueHelper.Instance.GetByte(messageBytes, ref flag); - byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref flag); - ushort startAddress = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - ushort writeCount = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - return new WriteMultiCoilOutputStruct(belongAddress, functionCode, startAddress, writeCount); - } - - public class WriteMultiCoilInputStruct : InputStruct - { - public WriteMultiCoilInputStruct(byte belongAddress, string startAddress, bool[] writeValue) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.WriteMultiCoil; - StartAddress = _addressTranslator.AddressTranslate(startAddress); - WriteCount = (ushort)writeValue.Length; - WriteByteCount = WriteCount % 8 > 0 ? (byte)(WriteCount / 8 + 1) : (byte)(WriteCount / 8); - WriteValue = new byte[WriteByteCount]; - for (int i = 0; i < writeValue.Length; i += 8) - { - int bytenum = 0; - for (int j = 7; j >= 0; j--) - { - int t = i + j < writeValue.Length && writeValue[i + j] ? 1 : 0; - bytenum = bytenum * 2 + t; - } - WriteValue[i / 8] = (byte)bytenum; - } - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort WriteCount { get; private set; } - - public byte WriteByteCount { get; private set; } - - public byte[] WriteValue { get; private set; } - } - - public class WriteMultiCoilOutputStruct : OutputStruct - { - public WriteMultiCoilOutputStruct(byte belongAddress, byte functionCode, - ushort startAddress, ushort writeCount) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - StartAddress = startAddress; - WriteCount = writeCount; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort WriteCount { get; private set; } - } + public ushort WriteCount { get; private set; } } /// /// 写多个寄存器状态 /// - public class WriteMultiRegisterModbusProtocal : ProtocalUnit + public class WriteDataModbusProtocal : ProtocalUnit { public override byte[] Format(InputStruct message) { - var r_message = (WriteMultiRegisterInputStruct)message; + var r_message = (WriteDataInputStruct)message; return Format(r_message.BelongAddress, r_message.FunctionCode, r_message.StartAddress, r_message.WriteCount, r_message.WriteByteCount, r_message.WriteValue); } @@ -577,54 +155,49 @@ namespace ModBus.Net byte functionCode = ValueHelper.Instance.GetByte(messageBytes, ref flag); ushort startAddress = ValueHelper.Instance.GetUShort(messageBytes, ref flag); ushort writeCount = ValueHelper.Instance.GetUShort(messageBytes, ref flag); - return new WriteMultiRegisterOutputStruct(belongAddress, functionCode, startAddress, + return new WriteDataOutputStruct(belongAddress, functionCode, startAddress, writeCount); } + } - public class WriteMultiRegisterInputStruct : InputStruct + public class GetSystemTimeInputStruct : InputStruct + { + public GetSystemTimeInputStruct(byte belongAddress) { - public WriteMultiRegisterInputStruct(byte belongAddress, string startAddress, object[] writeValue) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.WriteMultiRegister; - StartAddress = _addressTranslator.AddressTranslate(startAddress); - WriteCount = (ushort)writeValue.Length; - WriteByteCount = (byte)(WriteCount * 2); - WriteValue = writeValue.Clone() as object[]; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort WriteCount { get; private set; } - - public byte WriteByteCount { get; private set; } - - public object[] WriteValue { get; private set; } + BelongAddress = belongAddress; + FunctionCode = (byte)ModbusProtocalTimeFunctionCode.GetSystemTime; + StartAddress = 30000; + GetCount = 5; } - public class WriteMultiRegisterOutputStruct : OutputStruct + public byte BelongAddress { get; private set; } + + public byte FunctionCode { get; private set; } + + public ushort StartAddress { get; private set; } + + public ushort GetCount { get; private set; } + } + + public class GetSystemTimeOutputStruct : OutputStruct + { + public GetSystemTimeOutputStruct(byte belongAddress, byte functionCode, + byte writeByteCount, ushort year, byte day, byte month, ushort hour, byte second, byte minute, + ushort millisecond) { - public WriteMultiRegisterOutputStruct(byte belongAddress, byte functionCode, - ushort startAddress, ushort writeCount) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - StartAddress = startAddress; - WriteCount = writeCount; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort WriteCount { get; private set; } + BelongAddress = belongAddress; + FunctionCode = functionCode; + WriteByteCount = writeByteCount; + Time = new DateTime(year, month, day, hour, minute, second, millisecond); } + + public byte BelongAddress { get; private set; } + + public byte FunctionCode { get; private set; } + + public byte WriteByteCount { get; private set; } + + public DateTime Time { get; private set; } } /// @@ -654,46 +227,69 @@ namespace ModBus.Net return new GetSystemTimeOutputStruct(belongAddress, functionCode, writeByteCount, year, day, month, hour, second, minute, millisecond); } + } - public class GetSystemTimeInputStruct : InputStruct + public class SetSystemTimeInputStruct : InputStruct + { + public SetSystemTimeInputStruct(byte belongAddress, DateTime time) { - public GetSystemTimeInputStruct(byte belongAddress) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.GetSystemTime; - StartAddress = 30000; - GetCount = 5; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort GetCount { get; private set; } + BelongAddress = belongAddress; + FunctionCode = (byte)ModbusProtocalTimeFunctionCode.SetSystemTime; + StartAddress = 30000; + WriteCount = 5; + WriteByteCount = 10; + Year = (ushort)time.Year; + Day = (byte)time.Day; + Month = (byte)time.Month; + Hour = (ushort)time.Hour; + Second = (byte)time.Second; + Minute = (byte)time.Minute; + Millisecond = (ushort)time.Millisecond; } - public class GetSystemTimeOutputStruct : OutputStruct + public byte BelongAddress { get; private set; } + + public byte FunctionCode { get; private set; } + + public ushort StartAddress { get; private set; } + + public ushort WriteCount { get; private set; } + + public byte WriteByteCount { get; private set; } + + public ushort Year { get; private set; } + + public byte Day { get; private set; } + + public byte Month { get; private set; } + + public ushort Hour { get; private set; } + + public byte Second { get; private set; } + + public byte Minute { get; private set; } + + public ushort Millisecond { get; private set; } + } + + public class SetSystemTimeOutputStruct : OutputStruct + { + public SetSystemTimeOutputStruct(byte belongAddress, byte functionCode, + ushort startAddress, ushort writeCount) { - public GetSystemTimeOutputStruct(byte belongAddress, byte functionCode, - byte writeByteCount, ushort year, byte day, byte month, ushort hour, byte second, byte minute, - ushort millisecond) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - WriteByteCount = writeByteCount; - Time = new DateTime(year, month, day, hour, minute, second, millisecond); - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public byte WriteByteCount { get; private set; } - - public DateTime Time { get; private set; } + BelongAddress = belongAddress; + FunctionCode = functionCode; + StartAddress = startAddress; + WriteCount = writeCount; } + + public byte BelongAddress { get; private set; } + + public byte FunctionCode { get; private set; } + + public ushort StartAddress { get; private set; } + + public ushort WriteCount { get; private set; } } /// @@ -718,70 +314,6 @@ namespace ModBus.Net ushort writeCount = ValueHelper.Instance.GetUShort(messageBytes, ref flag); return new SetSystemTimeOutputStruct(belongAddress, functionCode, startAddress, writeCount); } - - public class SetSystemTimeInputStruct : InputStruct - { - public SetSystemTimeInputStruct(byte belongAddress, DateTime time) - { - BelongAddress = belongAddress; - FunctionCode = (int)ModbusProtocalReg.SetSystemTime; - StartAddress = 30000; - WriteCount = 5; - WriteByteCount = 10; - Year = (ushort)time.Year; - Day = (byte)time.Day; - Month = (byte)time.Month; - Hour = (ushort)time.Hour; - Second = (byte)time.Second; - Minute = (byte)time.Minute; - Millisecond = (ushort)time.Millisecond; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort WriteCount { get; private set; } - - public byte WriteByteCount { get; private set; } - - public ushort Year { get; private set; } - - public byte Day { get; private set; } - - public byte Month { get; private set; } - - public ushort Hour { get; private set; } - - public byte Second { get; private set; } - - public byte Minute { get; private set; } - - public ushort Millisecond { get; private set; } - } - - public class SetSystemTimeOutputStruct : OutputStruct - { - public SetSystemTimeOutputStruct(byte belongAddress, byte functionCode, - ushort startAddress, ushort writeCount) - { - BelongAddress = belongAddress; - FunctionCode = functionCode; - StartAddress = startAddress; - WriteCount = writeCount; - } - - public byte BelongAddress { get; private set; } - - public byte FunctionCode { get; private set; } - - public ushort StartAddress { get; private set; } - - public ushort WriteCount { get; private set; } - } - } public class ProtocalErrorException : Exception diff --git a/Modbus.Net/ModBus.Net/ModbusUtility.cs b/Modbus.Net/ModBus.Net/ModbusUtility.cs index 41aecc6..7121d0e 100644 --- a/Modbus.Net/ModBus.Net/ModbusUtility.cs +++ b/Modbus.Net/ModBus.Net/ModbusUtility.cs @@ -51,7 +51,7 @@ namespace ModBus.Net ModbusType = (ModbusType)connectionType; } - public ModbusUtility(string connectionString, int connectionType) + public ModbusUtility(int connectionType, string connectionString) { ConnectionString = connectionString; ModbusType = (ModbusType)connectionType; @@ -67,50 +67,14 @@ namespace ModBus.Net ModbusType = (ModbusType) connectionType; } - public override bool[] GetCoils(byte belongAddress, string startAddress, ushort getCount) + public override byte[] GetDatas(byte belongAddress, byte functionCode, string startAddress, ushort getCount) { try { - var inputStruct = new ReadCoilStatusModbusProtocal.ReadCoilStatusInputStruct(belongAddress, startAddress, - getCount); + var inputStruct = new ReadDataInputStruct(belongAddress, (ModbusProtocalReadDataFunctionCode)functionCode, startAddress, getCount); var outputStruct = - _wrapper.SendReceive(_wrapper["ReadCoilStatusModbusProtocal"], inputStruct) as - ReadCoilStatusModbusProtocal.ReadCoilStatusOutputStruct; - return outputStruct.CoilStatus; - } - catch (Exception) - { - return null; - } - } - - public override bool SetCoils(byte belongAddress, string startAddress, bool[] setContents) - { - try - { - var inputStruct = new WriteMultiCoilModbusProtocal.WriteMultiCoilInputStruct(belongAddress, startAddress, - setContents); - var outputStruct = - _wrapper.SendReceive(_wrapper["WriteMultiCoilModbusProtocal"], inputStruct) as - WriteMultiCoilModbusProtocal.WriteMultiCoilOutputStruct; - if (outputStruct.WriteCount != setContents.Length) return false; - return true; - } - catch (Exception) - { - return false; - } - } - - public override ushort[] GetRegisters(byte belongAddress, string startAddress, ushort getCount) - { - try - { - var inputStruct = new ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct(belongAddress, startAddress, getCount); - var outputStruct = - _wrapper.SendReceive(_wrapper["ReadHoldRegisterModbusProtocal"], inputStruct) as - ReadHoldRegisterModbusProtocal.ReadHoldRegisterOutputStruct; - return outputStruct.HoldRegisterStatus; + _wrapper.SendReceive(_wrapper["ReadDataModbusProtocal"], inputStruct) as ReadDataOutputStruct; + return outputStruct.DataValue; } catch { @@ -118,15 +82,15 @@ namespace ModBus.Net } } - public override bool SetRegisters(byte belongAddress, string startAddress, object[] setContents) + public override bool SetDatas(byte belongAddress, byte functionCode, string startAddress, object[] setContents) { try { - var inputStruct = new WriteMultiRegisterModbusProtocal.WriteMultiRegisterInputStruct(belongAddress, - startAddress, setContents); + var inputStruct = new WriteDataInputStruct(belongAddress, + (ModbusProtocalWriteDataFunctionCode) functionCode, startAddress, setContents); var outputStruct = - _wrapper.SendReceive(_wrapper["WriteMultiRegisterModbusProtocal"], inputStruct) as - WriteMultiRegisterModbusProtocal.WriteMultiRegisterOutputStruct; + _wrapper.SendReceive(_wrapper["WriteDataModbusProtocal"], inputStruct) as + WriteDataOutputStruct; if (outputStruct.WriteCount != setContents.Length) return false; return true; } diff --git a/Modbus.Net/ModBus.Net/Properties/AssemblyInfo.cs b/Modbus.Net/ModBus.Net/Properties/AssemblyInfo.cs index a1b573e..24c8a2a 100644 --- a/Modbus.Net/ModBus.Net/Properties/AssemblyInfo.cs +++ b/Modbus.Net/ModBus.Net/Properties/AssemblyInfo.cs @@ -8,9 +8,9 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle("ModBus.Net")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] +[assembly: AssemblyCompany("杭州德联科技股份有限公司")] [assembly: AssemblyProduct("ModBus.Net")] -[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyCopyright("Copyright © Chris L. 2014 HangZhou Delin Technology")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -35,5 +35,5 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("0.1.0.1008")] +[assembly: AssemblyFileVersion("0.1.0.1008")] \ No newline at end of file diff --git a/Modbus.Net/ModBus.Net/ProtocalUnit.cs b/Modbus.Net/ModBus.Net/ProtocalUnit.cs index 5136404..e6914d0 100644 --- a/Modbus.Net/ModBus.Net/ProtocalUnit.cs +++ b/Modbus.Net/ModBus.Net/ProtocalUnit.cs @@ -7,11 +7,11 @@ namespace ModBus.Net { public abstract class ProtocalUnit : IProtocalFormatting { - protected static AddressTranslator _addressTranslator = new AddressTranslatorBase(); + //protected static AddressTranslator _addressTranslator = new AddressTranslatorBase(); - public ProtocalUnit SetAddressTranslator(AddressTranslator addressTranslator) + public ProtocalUnit SetAddressTranslator(/*AddressTranslator addressTranslator*/) { - _addressTranslator = addressTranslator; + //_addressTranslator = addressTranslator; return this; } diff --git a/Modbus.Net/ModBus.Net/ValueHelper.cs b/Modbus.Net/ModBus.Net/ValueHelper.cs index 0d06988..6a17f07 100644 --- a/Modbus.Net/ModBus.Net/ValueHelper.cs +++ b/Modbus.Net/ModBus.Net/ValueHelper.cs @@ -379,6 +379,13 @@ namespace ModBus.Net return translation.ToArray(); } + public T[] ObjectArrayToDestinationArray(object[] contents) + { + T[] array = new T[contents.Length]; + Array.Copy(contents,array,contents.Length); + return array; + } + public bool GetBit(ushort number, ref int pos) { if (pos < 0 && pos > 15) throw new IndexOutOfRangeException(); diff --git a/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs b/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs index 80d81c3..0dbbd47 100644 --- a/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs +++ b/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Threading; using ModBus.Net; using System.Windows; @@ -18,9 +20,13 @@ namespace NA200H.UI.WPF private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) { - utility = new ModbusUtility((int)ModbusType.Rtu); - ushort[] getNum = utility.GetRegisters(0x02, "0", 4); - SetValue(getNum); + utility = new ModbusUtility((int) ModbusType.Tcp, "192.168.3.247"); + byte[] getNum = utility.GetDatas(0x02, (byte) ModbusProtocalReadDataFunctionCode.ReadHoldRegister, "10000", 4); + object[] getNumObjects = + ValueHelper.Instance.ByteArrayToObjectArray(getNum, + new List>(){{new KeyValuePair(typeof(ushort), 4)}}); + ushort[] getNumUshorts = ValueHelper.Instance.ObjectArrayToDestinationArray(getNumObjects); + SetValue(getNumUshorts); } private void SetValue(ushort[] getNum) @@ -37,9 +43,14 @@ namespace NA200H.UI.WPF ushort.TryParse(Add1.Text, out add1); ushort.TryParse(Add2.Text, out add2); ushort.TryParse(Add3.Text, out add3); - utility.SetRegisters(0x02, "0", new object[] {add1, add2, add3}); - ushort[] getNum = utility.GetRegisters(0x02, "0", 4); - SetValue(getNum); + utility.SetDatas(0x02, (byte)ModbusProtocalWriteDataFunctionCode.WriteMultiRegister, "10000", new object[] {add1, add2, add3}); + Thread.Sleep(100); + byte[] getNum = utility.GetDatas(0x02, (byte)ModbusProtocalReadDataFunctionCode.ReadHoldRegister, "10000", 4); + object[] getNumObjects = + ValueHelper.Instance.ByteArrayToObjectArray(getNum, + new List>() { { new KeyValuePair(typeof(ushort), 4) } }); + ushort[] getNumUshorts = ValueHelper.Instance.ObjectArrayToDestinationArray(getNumObjects); + SetValue(getNumUshorts); } } }