From 7776495b3f97ad13c39d08e9a60dc294a3692be5 Mon Sep 17 00:00:00 2001 From: "parallelbgls@outlook.com" Date: Sat, 11 Oct 2014 15:24:07 +0800 Subject: [PATCH] 2014-10-11 update 2 --- Modbus.Net/ModBus.Net/AddressTranslator.cs | 24 --------------------- Modbus.Net/ModBus.Net/BaseProtocal.cs | 1 - Modbus.Net/ModBus.Net/BaseUtility.cs | 14 ++++++++++++ Modbus.Net/ModBus.Net/ModbusProtocal.cs | 8 +++---- Modbus.Net/ModBus.Net/ModbusUtility.cs | 4 ++-- Modbus.Net/NA200H.UI.Console/Program.cs | 10 ++++----- Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs | 2 +- 7 files changed, 26 insertions(+), 37 deletions(-) diff --git a/Modbus.Net/ModBus.Net/AddressTranslator.cs b/Modbus.Net/ModBus.Net/AddressTranslator.cs index 4647957..143ba83 100644 --- a/Modbus.Net/ModBus.Net/AddressTranslator.cs +++ b/Modbus.Net/ModBus.Net/AddressTranslator.cs @@ -9,30 +9,6 @@ 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 KeyValuePair AddressTranslate(string address, bool isRead); } diff --git a/Modbus.Net/ModBus.Net/BaseProtocal.cs b/Modbus.Net/ModBus.Net/BaseProtocal.cs index 32cdc26..d1f2232 100644 --- a/Modbus.Net/ModBus.Net/BaseProtocal.cs +++ b/Modbus.Net/ModBus.Net/BaseProtocal.cs @@ -16,7 +16,6 @@ namespace ModBus.Net /// 数据是否正确接收 protected ProtocalLinker _protocalLinker; - protected BaseProtocal() { Protocals = new Dictionary(); diff --git a/Modbus.Net/ModBus.Net/BaseUtility.cs b/Modbus.Net/ModBus.Net/BaseUtility.cs index 41ed7b9..7a7c0c9 100644 --- a/Modbus.Net/ModBus.Net/BaseUtility.cs +++ b/Modbus.Net/ModBus.Net/BaseUtility.cs @@ -12,6 +12,9 @@ namespace ModBus.Net /// 协议收发主体 /// protected BaseProtocal Wrapper; + + public AddressTranslator AddressTranslator { get; set; } + /// /// 设置连接字符串 /// @@ -39,8 +42,19 @@ namespace ModBus.Net /// 是否设置成功 public abstract bool SetDatas(byte belongAddress, string startAddress, object[] setContents); + /// + /// 获取PLC时间 + /// + /// 从站地址 + /// PLC时间 public abstract DateTime GetTime(byte belongAddress); + /// + /// 设置PLC时间 + /// + /// 从站地址 + /// 设置PLC时间 + /// 设置是否成功 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 8f3ec29..9cbc00b 100644 --- a/Modbus.Net/ModBus.Net/ModbusProtocal.cs +++ b/Modbus.Net/ModBus.Net/ModbusProtocal.cs @@ -47,10 +47,10 @@ namespace ModBus.Net #region 读PLC数据 public class ReadDataInputStruct : InputStruct { - public ReadDataInputStruct(byte belongAddress, string startAddress, ushort getCount) + public ReadDataInputStruct(byte belongAddress, string startAddress, ushort getCount, AddressTranslator addressTranslator) { BelongAddress = belongAddress; - KeyValuePair translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, true); + KeyValuePair translateAddress = addressTranslator.AddressTranslate(startAddress, true); FunctionCode = (byte)translateAddress.Value; StartAddress = (ushort)translateAddress.Key; GetCount = getCount; @@ -110,10 +110,10 @@ namespace ModBus.Net #region 写PLC数据 public class WriteDataInputStruct : InputStruct { - public WriteDataInputStruct(byte belongAddress, string startAddress, object[] writeValue) + public WriteDataInputStruct(byte belongAddress, string startAddress, object[] writeValue, AddressTranslator addressTranslator) { BelongAddress = belongAddress; - KeyValuePair translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, false); + KeyValuePair translateAddress = addressTranslator.AddressTranslate(startAddress, false); FunctionCode = (byte)translateAddress.Value; StartAddress = (ushort)translateAddress.Key; WriteCount = (ushort)writeValue.Length; diff --git a/Modbus.Net/ModBus.Net/ModbusUtility.cs b/Modbus.Net/ModBus.Net/ModbusUtility.cs index a7ceada..036183e 100644 --- a/Modbus.Net/ModBus.Net/ModbusUtility.cs +++ b/Modbus.Net/ModBus.Net/ModbusUtility.cs @@ -76,7 +76,7 @@ namespace ModBus.Net { try { - var inputStruct = new ReadDataInputStruct(belongAddress, startAddress, getCount % 2 == 0 ? (ushort)(getCount / 2) : (ushort)(getCount / 2 + 1)); + var inputStruct = new ReadDataInputStruct(belongAddress, startAddress, getCount % 2 == 0 ? (ushort)(getCount / 2) : (ushort)(getCount / 2 + 1), AddressTranslator); var outputStruct = Wrapper.SendReceive(Wrapper["ReadDataModbusProtocal"], inputStruct) as ReadDataOutputStruct; return outputStruct.DataValue; @@ -91,7 +91,7 @@ namespace ModBus.Net { try { - var inputStruct = new WriteDataInputStruct(belongAddress, startAddress, setContents); + var inputStruct = new WriteDataInputStruct(belongAddress, startAddress, setContents, AddressTranslator); var outputStruct = Wrapper.SendReceive(Wrapper["WriteDataModbusProtocal"], inputStruct) as WriteDataOutputStruct; diff --git a/Modbus.Net/NA200H.UI.Console/Program.cs b/Modbus.Net/NA200H.UI.Console/Program.cs index 26b455f..ff86d3d 100644 --- a/Modbus.Net/NA200H.UI.Console/Program.cs +++ b/Modbus.Net/NA200H.UI.Console/Program.cs @@ -56,9 +56,9 @@ namespace NA200H.UI.ConsoleApp //调用方法二:自动构造 //第一步:先生成一个输入结构体,然后向这个结构体中填写数据 - AddressTranslator.CreateTranslator(new AddressTranslatorNA200H()); + AddressTranslator addressTranslator = new AddressTranslatorNA200H(); - ReadDataInputStruct readCoilStatusInputStruct = new ReadDataInputStruct(0x02, "N1", 0x0a); + ReadDataInputStruct readCoilStatusInputStruct = new ReadDataInputStruct(0x02, "N1", 0x0a, addressTranslator); //第二步:再生成一个输出结构体,执行相应协议的发送指令,并将输出信息自动转换到输出结构体中 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, "NW1", 4); + ReadDataInputStruct readHoldRegisterInputStruct = new ReadDataInputStruct(0x02, "NW1", 4, addressTranslator); 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, "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 }, addressTranslator); 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, "NW1", new object[] { (ushort)25, (ushort)18, (ushort)17 }); + WriteDataInputStruct writeMultiRegisterInputStruct = new WriteDataInputStruct(0x02, "NW1", new object[] { (ushort)25, (ushort)18, (ushort)17 }, addressTranslator); WriteDataOutputStruct writeMultiRegisterOutputStruct = (WriteDataOutputStruct)wrapper.SendReceive(wrapper["WriteDataModbusProtocal"], writeMultiRegisterInputStruct); Console.WriteLine(writeMultiRegisterOutputStruct.StartAddress); Console.WriteLine(writeMultiRegisterOutputStruct.WriteCount); diff --git a/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs b/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs index 4debf16..9d361e2 100644 --- a/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs +++ b/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs @@ -21,7 +21,7 @@ namespace NA200H.UI.WPF private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) { utility = new ModbusUtility((int) ModbusType.Tcp, "192.168.3.247"); - AddressTranslator.CreateTranslator(new AddressTranslatorNA200H()); + utility.AddressTranslator = new AddressTranslatorNA200H(); //byte[] getNum = utility.GetDatas(0x02, "03:10000", 8); byte[] getNum = utility.GetDatas(0x02, "NW1", 8); object[] getNumObjects =