diff --git a/Modbus.Net/CrossLampControl.WebApi/Controllers/CrossLampController.cs b/Modbus.Net/CrossLampControl.WebApi/Controllers/CrossLampController.cs index 07d5a21..13ace08 100644 --- a/Modbus.Net/CrossLampControl.WebApi/Controllers/CrossLampController.cs +++ b/Modbus.Net/CrossLampControl.WebApi/Controllers/CrossLampController.cs @@ -17,7 +17,7 @@ namespace CrossLampControl.WebApi.Controllers public Lamp GetLamp() { Lamp light = new Lamp(); - byte[] lampsbyte = _utility.GetDatas(2, (byte)ModbusProtocalReadDataFunctionCode.ReadCoilStatus, "0", 6); + byte[] lampsbyte = _utility.GetDatas(2, ((byte)ModbusProtocalReadDataFunctionCode.ReadCoilStatus).ToString()+":0", 6); bool[] lamps = ValueHelper.Instance.ObjectArrayToDestinationArray( ValueHelper.Instance.ByteArrayToObjectArray(lampsbyte, diff --git a/Modbus.Net/ModBus.Net/AddressTranslator.cs b/Modbus.Net/ModBus.Net/AddressTranslator.cs index b564681..4647957 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; +using System.Collections.Generic; using System.Dynamic; namespace ModBus.Net @@ -32,7 +33,7 @@ namespace ModBus.Net Instance = instance; } - public abstract ushort AddressTranslate(string address); + public abstract KeyValuePair AddressTranslate(string address, bool isRead); } /// @@ -40,27 +41,50 @@ namespace ModBus.Net /// public class AddressTranslatorNA200H : AddressTranslator { - public Dictionary TransDictionary; - + protected Dictionary TransDictionary; + protected Dictionary ReadFunctionCodeDictionary; + protected Dictionary WriteFunctionCodeDictionary; + public AddressTranslatorNA200H() { - TransDictionary = new Dictionary(); - TransDictionary.Add("Q", 0); - TransDictionary.Add("M", 10000); - TransDictionary.Add("N", 20000); - TransDictionary.Add("I", 0); - TransDictionary.Add("S", 10000); - TransDictionary.Add("IW", 0); - TransDictionary.Add("SW", 5000); - TransDictionary.Add("E", 10000); - TransDictionary.Add("MW", 0); - TransDictionary.Add("NW", 10000); - TransDictionary.Add("QW", 20000); - TransDictionary.Add("CLOCK", 30000); - TransDictionary.Add("V", 0); + TransDictionary = new Dictionary + { + {"Q", 0}, + {"M", 10000}, + {"N", 20000}, + {"I", 0}, + {"S", 10000}, + {"IW", 0}, + {"SW", 5000}, + {"MW", 0}, + {"NW", 10000}, + {"QW", 20000}, + }; + ReadFunctionCodeDictionary = new Dictionary + { + {"Q", (int)ModbusProtocalReadDataFunctionCode.ReadCoilStatus}, + {"M", (int)ModbusProtocalReadDataFunctionCode.ReadCoilStatus}, + {"N", (int)ModbusProtocalReadDataFunctionCode.ReadCoilStatus}, + {"I", (int)ModbusProtocalReadDataFunctionCode.ReadInputStatus}, + {"S", (int)ModbusProtocalReadDataFunctionCode.ReadInputStatus}, + {"IW", (int)ModbusProtocalReadDataFunctionCode.ReadInputRegister}, + {"SW", (int)ModbusProtocalReadDataFunctionCode.ReadInputRegister}, + {"MW", (int)ModbusProtocalReadDataFunctionCode.ReadHoldRegister}, + {"NW", (int)ModbusProtocalReadDataFunctionCode.ReadHoldRegister}, + {"QW", (int)ModbusProtocalReadDataFunctionCode.ReadHoldRegister}, + }; + WriteFunctionCodeDictionary = new Dictionary + { + {"Q", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiCoil}, + {"M", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiCoil}, + {"N", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiCoil}, + {"MW", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiRegister}, + {"NW", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiRegister}, + {"QW", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiRegister}, + }; } - public override ushort AddressTranslate(string address) + public override KeyValuePair AddressTranslate(string address, bool isRead) { address = address.ToUpper(); int i = 0; @@ -69,10 +93,14 @@ namespace ModBus.Net { i++; } - if (i == 0) return ushort.Parse(address); + if (i == 0 || i >= address.Length) throw new FormatException(); string head = address.Substring(0, i); string tail = address.Substring(i); - return (ushort) (TransDictionary[head] + ushort.Parse(tail) - 1); + return isRead + ? new KeyValuePair(TransDictionary[head] + int.Parse(tail) - 1, + ReadFunctionCodeDictionary[head]) + : new KeyValuePair(TransDictionary[head] + int.Parse(tail) - 1, + WriteFunctionCodeDictionary[head]); } } @@ -81,14 +109,16 @@ namespace ModBus.Net /// public class AddressTranslatorBase : AddressTranslator { - public override ushort AddressTranslate(string address) + public override KeyValuePair AddressTranslate(string address, bool isRead) { - ushort num; - if (ushort.TryParse(address, out num)) + int num1,num2; + string[] split = address.Split(':'); + if (split.Length != 2) throw new FormatException(); + if (int.TryParse(split[0], out num1) && int.TryParse(split[1], out num2)) { - return num; + return new KeyValuePair(num2, num1); } - return 0; + throw new FormatException(); } } } \ No newline at end of file diff --git a/Modbus.Net/ModBus.Net/BaseUtility.cs b/Modbus.Net/ModBus.Net/BaseUtility.cs index cbb2708..41ed7b9 100644 --- a/Modbus.Net/ModBus.Net/BaseUtility.cs +++ b/Modbus.Net/ModBus.Net/BaseUtility.cs @@ -26,19 +26,21 @@ namespace ModBus.Net /// 获取数据 /// /// 从站地址 - /// 功能码 /// 开始地址 /// 接收个数 /// 接收到的byte数据 - public abstract byte[] GetDatas(byte belongAddress, byte functionCode, string startAddress, ushort getCount); + public abstract byte[] GetDatas(byte belongAddress, string startAddress, int getCount); /// /// 设置数据 /// /// 从站地址 - /// 功能码 /// 开始地址 - /// 设置个数 + /// 设置数据 /// 是否设置成功 - public abstract bool SetDatas(byte belongAddress, byte functionCode, string startAddress, object[] setContents); + public abstract bool SetDatas(byte belongAddress, string startAddress, object[] setContents); + + public abstract DateTime GetTime(byte belongAddress); + + public abstract bool SetTime(byte belongAddress, DateTime setTime); } } diff --git a/Modbus.Net/ModBus.Net/ModbusProtocal.cs b/Modbus.Net/ModBus.Net/ModbusProtocal.cs index 02f1a61..8f3ec29 100644 --- a/Modbus.Net/ModBus.Net/ModbusProtocal.cs +++ b/Modbus.Net/ModBus.Net/ModbusProtocal.cs @@ -2,6 +2,12 @@ using System.Collections.Generic; using System.Runtime.Remoting.Messaging; +internal enum ModbusProtocalVariableFunctionCode : byte +{ + ReadVariable = 20, + WriteVariable = 21, +} + /// /// 跟时间有关的功能码 /// @@ -9,7 +15,7 @@ internal enum ModbusProtocalTimeFunctionCode : byte { GetSystemTime = 3, SetSystemTime = 16, -}; +} /// /// 跟读数据有关的功能码 @@ -41,11 +47,12 @@ namespace ModBus.Net #region 读PLC数据 public class ReadDataInputStruct : InputStruct { - public ReadDataInputStruct(byte belongAddress, ModbusProtocalReadDataFunctionCode functionCode, string startAddress, ushort getCount) + public ReadDataInputStruct(byte belongAddress, string startAddress, ushort getCount) { BelongAddress = belongAddress; - FunctionCode = (byte)functionCode; - StartAddress = AddressTranslator.Instance.AddressTranslate(startAddress); + KeyValuePair translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, true); + FunctionCode = (byte)translateAddress.Value; + StartAddress = (ushort)translateAddress.Key; GetCount = getCount; } @@ -103,11 +110,12 @@ namespace ModBus.Net #region 写PLC数据 public class WriteDataInputStruct : InputStruct { - public WriteDataInputStruct(byte belongAddress, ModbusProtocalWriteDataFunctionCode functionCode, string startAddress, object[] writeValue) + public WriteDataInputStruct(byte belongAddress, string startAddress, object[] writeValue) { BelongAddress = belongAddress; - FunctionCode = (byte)functionCode; - StartAddress = AddressTranslator.Instance.AddressTranslate(startAddress); + KeyValuePair translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, false); + FunctionCode = (byte)translateAddress.Value; + StartAddress = (ushort)translateAddress.Key; WriteCount = (ushort)writeValue.Length; WriteByteCount = 0; WriteValue = writeValue.Clone() as object[]; diff --git a/Modbus.Net/ModBus.Net/ModbusUtility.cs b/Modbus.Net/ModBus.Net/ModbusUtility.cs index abb5ee9..a7ceada 100644 --- a/Modbus.Net/ModBus.Net/ModbusUtility.cs +++ b/Modbus.Net/ModBus.Net/ModbusUtility.cs @@ -72,11 +72,11 @@ namespace ModBus.Net ModbusType = (ModbusType) connectionType; } - public override byte[] GetDatas(byte belongAddress, byte functionCode, string startAddress, ushort getCount) + public override byte[] GetDatas(byte belongAddress, string startAddress, int getCount) { try { - var inputStruct = new ReadDataInputStruct(belongAddress, (ModbusProtocalReadDataFunctionCode)functionCode, startAddress, getCount); + var inputStruct = new ReadDataInputStruct(belongAddress, startAddress, getCount % 2 == 0 ? (ushort)(getCount / 2) : (ushort)(getCount / 2 + 1)); var outputStruct = Wrapper.SendReceive(Wrapper["ReadDataModbusProtocal"], inputStruct) as ReadDataOutputStruct; return outputStruct.DataValue; @@ -87,12 +87,11 @@ namespace ModBus.Net } } - public override bool SetDatas(byte belongAddress, byte functionCode, string startAddress, object[] setContents) + public override bool SetDatas(byte belongAddress, string startAddress, object[] setContents) { try { - var inputStruct = new WriteDataInputStruct(belongAddress, - (ModbusProtocalWriteDataFunctionCode) functionCode, startAddress, setContents); + var inputStruct = new WriteDataInputStruct(belongAddress, startAddress, setContents); var outputStruct = Wrapper.SendReceive(Wrapper["WriteDataModbusProtocal"], inputStruct) as WriteDataOutputStruct; @@ -104,5 +103,37 @@ namespace ModBus.Net return false; } } + + public override DateTime GetTime(byte belongAddress) + { + try + { + var inputStruct = new GetSystemTimeInputStruct(belongAddress); + var outputStruct = + Wrapper.SendReceive(Wrapper["GetSystemTimeModbusProtocal"], inputStruct) as + GetSystemTimeOutputStruct; + return outputStruct.Time; + } + catch (Exception) + { + return DateTime.MinValue; + } + } + + public override bool SetTime(byte belongAddress, DateTime setTime) + { + try + { + var inputStruct = new SetSystemTimeInputStruct(belongAddress, setTime); + var outputStruct = + Wrapper.SendReceive(Wrapper["SetSystemTimeModbusProtocal"], inputStruct) as + SetSystemTimeOutputStruct; + return outputStruct.WriteCount > 0; + } + catch (Exception) + { + return false; + } + } } } diff --git a/Modbus.Net/NA200H.UI.Console/Program.cs b/Modbus.Net/NA200H.UI.Console/Program.cs index d0e70c9..26b455f 100644 --- a/Modbus.Net/NA200H.UI.Console/Program.cs +++ b/Modbus.Net/NA200H.UI.Console/Program.cs @@ -58,7 +58,7 @@ namespace NA200H.UI.ConsoleApp //第一步:先生成一个输入结构体,然后向这个结构体中填写数据 AddressTranslator.CreateTranslator(new AddressTranslatorNA200H()); - ReadDataInputStruct readCoilStatusInputStruct = new ReadDataInputStruct(0x02, ModbusProtocalReadDataFunctionCode.ReadCoilStatus, "N1", 0x0a); + ReadDataInputStruct readCoilStatusInputStruct = new ReadDataInputStruct(0x02, "N1", 0x0a); //第二步:再生成一个输出结构体,执行相应协议的发送指令,并将输出信息自动转换到输出结构体中 ReadDataOutputStruct readCoilStatusOutputStruct = (ReadDataOutputStruct)wrapper.SendReceive(wrapper["ReadDataModbusProtocal"], readCoilStatusInputStruct); //第三步:读取这个输出结构体的信息。 @@ -74,7 +74,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - ReadDataInputStruct readHoldRegisterInputStruct = new ReadDataInputStruct(0x02, ModbusProtocalReadDataFunctionCode.ReadHoldRegister, "NW1", 4); + ReadDataInputStruct readHoldRegisterInputStruct = new ReadDataInputStruct(0x02, "NW1", 4); ReadDataOutputStruct readHoldRegisterOutputStruct = (ReadDataOutputStruct)wrapper.SendReceive(wrapper["ReadDataModbusProtocal"], readHoldRegisterInputStruct); ushort[] array2 = ValueHelper.Instance.ObjectArrayToDestinationArray( @@ -88,7 +88,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - WriteDataInputStruct writeMultiCoilInputStruct = new WriteDataInputStruct(0x02, ModbusProtocalWriteDataFunctionCode.WriteMultiCoil, "Q20", new object[] { true, false, true, true, false, false, true, true, true, false }); + WriteDataInputStruct writeMultiCoilInputStruct = new WriteDataInputStruct(0x02, "Q20", new object[] { true, false, true, true, false, false, true, true, true, false }); WriteDataOutputStruct writeMultiCoilOutputStruct = (WriteDataOutputStruct)wrapper.SendReceive(wrapper["WriteDataModbusProtocal"], writeMultiCoilInputStruct); Console.WriteLine(writeMultiCoilOutputStruct.StartAddress); Console.WriteLine(writeMultiCoilOutputStruct.WriteCount); @@ -96,7 +96,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - WriteDataInputStruct writeMultiRegisterInputStruct = new WriteDataInputStruct(0x02, ModbusProtocalWriteDataFunctionCode.WriteMultiRegister, "NW1", new object[] { (ushort)25, (ushort)18, (ushort)17 }); + WriteDataInputStruct writeMultiRegisterInputStruct = new WriteDataInputStruct(0x02, "NW1", new object[] { (ushort)25, (ushort)18, (ushort)17 }); WriteDataOutputStruct writeMultiRegisterOutputStruct = (WriteDataOutputStruct)wrapper.SendReceive(wrapper["WriteDataModbusProtocal"], writeMultiRegisterInputStruct); Console.WriteLine(writeMultiRegisterOutputStruct.StartAddress); Console.WriteLine(writeMultiRegisterOutputStruct.WriteCount); diff --git a/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/3Add.prj b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/3Add.prj new file mode 100644 index 0000000..b9e0819 Binary files /dev/null and b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/3Add.prj differ diff --git a/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ld b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ld new file mode 100644 index 0000000..82212f5 Binary files /dev/null and b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ld differ diff --git a/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ldo b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ldo new file mode 100644 index 0000000..d790084 Binary files /dev/null and b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ldo differ diff --git a/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.nal b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.nal new file mode 100644 index 0000000..80872b4 Binary files /dev/null and b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.nal differ diff --git a/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.o b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.o new file mode 100644 index 0000000..9ca0f0a Binary files /dev/null and b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.o differ diff --git a/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.tag b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.tag new file mode 100644 index 0000000..59e3da9 Binary files /dev/null and b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.tag differ diff --git a/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/myvar.o b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/myvar.o new file mode 100644 index 0000000..35368fc Binary files /dev/null and b/Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/myvar.o differ diff --git a/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs b/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs index 1aed2da..4debf16 100644 --- a/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs +++ b/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs @@ -21,7 +21,9 @@ namespace NA200H.UI.WPF private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) { utility = new ModbusUtility((int) ModbusType.Tcp, "192.168.3.247"); - byte[] getNum = utility.GetDatas(0x02, (byte) ModbusProtocalReadDataFunctionCode.ReadHoldRegister, "10000", 4); + AddressTranslator.CreateTranslator(new AddressTranslatorNA200H()); + //byte[] getNum = utility.GetDatas(0x02, "03:10000", 8); + byte[] getNum = utility.GetDatas(0x02, "NW1", 8); object[] getNumObjects = ValueHelper.Instance.ByteArrayToObjectArray(getNum, new List>(){{new KeyValuePair(typeof(ushort), 4)}}); @@ -43,9 +45,11 @@ namespace NA200H.UI.WPF ushort.TryParse(Add1.Text, out add1); ushort.TryParse(Add2.Text, out add2); ushort.TryParse(Add3.Text, out add3); - utility.SetDatas(0x02, (byte)ModbusProtocalWriteDataFunctionCode.WriteMultiRegister, "10000", new object[] {add1, add2, add3}); + //utility.SetDatas(0x02, "16:10000", new object[] {add1, add2, add3}); + utility.SetDatas(0x02, "NW1", new object[] { add1, add2, add3 }); Thread.Sleep(100); - byte[] getNum = utility.GetDatas(0x02, (byte)ModbusProtocalReadDataFunctionCode.ReadHoldRegister, "10000", 4); + //byte[] getNum = utility.GetDatas(0x02, "03:10000", 8); + byte[] getNum = utility.GetDatas(0x02, "NW1", 8); object[] getNumObjects = ValueHelper.Instance.ByteArrayToObjectArray(getNum, new KeyValuePair(typeof(ushort), 4)); ushort[] getNumUshorts = ValueHelper.Instance.ObjectArrayToDestinationArray(getNumObjects);