2014-10-11 update 2

This commit is contained in:
parallelbgls@outlook.com
2014-10-11 15:24:07 +08:00
parent 30895c2d1e
commit 7776495b3f
7 changed files with 26 additions and 37 deletions

View File

@@ -9,30 +9,6 @@ namespace ModBus.Net
/// </summary> /// </summary>
public abstract class AddressTranslator 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<int,int> AddressTranslate(string address, bool isRead); public abstract KeyValuePair<int,int> AddressTranslate(string address, bool isRead);
} }

View File

@@ -16,7 +16,6 @@ namespace ModBus.Net
/// <returns>数据是否正确接收</returns> /// <returns>数据是否正确接收</returns>
protected ProtocalLinker _protocalLinker; protected ProtocalLinker _protocalLinker;
protected BaseProtocal() protected BaseProtocal()
{ {
Protocals = new Dictionary<string, ProtocalUnit>(); Protocals = new Dictionary<string, ProtocalUnit>();

View File

@@ -12,6 +12,9 @@ namespace ModBus.Net
/// 协议收发主体 /// 协议收发主体
/// </summary> /// </summary>
protected BaseProtocal Wrapper; protected BaseProtocal Wrapper;
public AddressTranslator AddressTranslator { get; set; }
/// <summary> /// <summary>
/// 设置连接字符串 /// 设置连接字符串
/// </summary> /// </summary>
@@ -39,8 +42,19 @@ namespace ModBus.Net
/// <returns>是否设置成功</returns> /// <returns>是否设置成功</returns>
public abstract bool SetDatas(byte belongAddress, string startAddress, object[] setContents); public abstract bool SetDatas(byte belongAddress, string startAddress, object[] setContents);
/// <summary>
/// 获取PLC时间
/// </summary>
/// <param name="belongAddress">从站地址</param>
/// <returns>PLC时间</returns>
public abstract DateTime GetTime(byte belongAddress); public abstract DateTime GetTime(byte belongAddress);
/// <summary>
/// 设置PLC时间
/// </summary>
/// <param name="belongAddress">从站地址</param>
/// <param name="setTime">设置PLC时间</param>
/// <returns>设置是否成功</returns>
public abstract bool SetTime(byte belongAddress, DateTime setTime); public abstract bool SetTime(byte belongAddress, DateTime setTime);
} }
} }

View File

@@ -47,10 +47,10 @@ namespace ModBus.Net
#region PLC数据 #region PLC数据
public class ReadDataInputStruct : InputStruct public class ReadDataInputStruct : InputStruct
{ {
public ReadDataInputStruct(byte belongAddress, string startAddress, ushort getCount) public ReadDataInputStruct(byte belongAddress, string startAddress, ushort getCount, AddressTranslator addressTranslator)
{ {
BelongAddress = belongAddress; BelongAddress = belongAddress;
KeyValuePair<int, int> translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, true); KeyValuePair<int, int> translateAddress = addressTranslator.AddressTranslate(startAddress, true);
FunctionCode = (byte)translateAddress.Value; FunctionCode = (byte)translateAddress.Value;
StartAddress = (ushort)translateAddress.Key; StartAddress = (ushort)translateAddress.Key;
GetCount = getCount; GetCount = getCount;
@@ -110,10 +110,10 @@ namespace ModBus.Net
#region PLC数据 #region PLC数据
public class WriteDataInputStruct : InputStruct public class WriteDataInputStruct : InputStruct
{ {
public WriteDataInputStruct(byte belongAddress, string startAddress, object[] writeValue) public WriteDataInputStruct(byte belongAddress, string startAddress, object[] writeValue, AddressTranslator addressTranslator)
{ {
BelongAddress = belongAddress; BelongAddress = belongAddress;
KeyValuePair<int, int> translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, false); KeyValuePair<int, int> translateAddress = addressTranslator.AddressTranslate(startAddress, false);
FunctionCode = (byte)translateAddress.Value; FunctionCode = (byte)translateAddress.Value;
StartAddress = (ushort)translateAddress.Key; StartAddress = (ushort)translateAddress.Key;
WriteCount = (ushort)writeValue.Length; WriteCount = (ushort)writeValue.Length;

View File

@@ -76,7 +76,7 @@ namespace ModBus.Net
{ {
try 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 = var outputStruct =
Wrapper.SendReceive(Wrapper["ReadDataModbusProtocal"], inputStruct) as ReadDataOutputStruct; Wrapper.SendReceive(Wrapper["ReadDataModbusProtocal"], inputStruct) as ReadDataOutputStruct;
return outputStruct.DataValue; return outputStruct.DataValue;
@@ -91,7 +91,7 @@ namespace ModBus.Net
{ {
try try
{ {
var inputStruct = new WriteDataInputStruct(belongAddress, startAddress, setContents); var inputStruct = new WriteDataInputStruct(belongAddress, startAddress, setContents, AddressTranslator);
var outputStruct = var outputStruct =
Wrapper.SendReceive(Wrapper["WriteDataModbusProtocal"], inputStruct) as Wrapper.SendReceive(Wrapper["WriteDataModbusProtocal"], inputStruct) as
WriteDataOutputStruct; WriteDataOutputStruct;

View File

@@ -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); ReadDataOutputStruct readCoilStatusOutputStruct = (ReadDataOutputStruct)wrapper.SendReceive(wrapper["ReadDataModbusProtocal"], readCoilStatusInputStruct);
//第三步:读取这个输出结构体的信息。 //第三步:读取这个输出结构体的信息。
@@ -74,7 +74,7 @@ namespace NA200H.UI.ConsoleApp
Console.Read(); Console.Read();
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); ReadDataOutputStruct readHoldRegisterOutputStruct = (ReadDataOutputStruct)wrapper.SendReceive(wrapper["ReadDataModbusProtocal"], readHoldRegisterInputStruct);
ushort[] array2 = ushort[] array2 =
ValueHelper.Instance.ObjectArrayToDestinationArray<ushort>( ValueHelper.Instance.ObjectArrayToDestinationArray<ushort>(
@@ -88,7 +88,7 @@ namespace NA200H.UI.ConsoleApp
Console.Read(); Console.Read();
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); WriteDataOutputStruct writeMultiCoilOutputStruct = (WriteDataOutputStruct)wrapper.SendReceive(wrapper["WriteDataModbusProtocal"], writeMultiCoilInputStruct);
Console.WriteLine(writeMultiCoilOutputStruct.StartAddress); Console.WriteLine(writeMultiCoilOutputStruct.StartAddress);
Console.WriteLine(writeMultiCoilOutputStruct.WriteCount); Console.WriteLine(writeMultiCoilOutputStruct.WriteCount);
@@ -96,7 +96,7 @@ namespace NA200H.UI.ConsoleApp
Console.Read(); Console.Read();
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); WriteDataOutputStruct writeMultiRegisterOutputStruct = (WriteDataOutputStruct)wrapper.SendReceive(wrapper["WriteDataModbusProtocal"], writeMultiRegisterInputStruct);
Console.WriteLine(writeMultiRegisterOutputStruct.StartAddress); Console.WriteLine(writeMultiRegisterOutputStruct.StartAddress);
Console.WriteLine(writeMultiRegisterOutputStruct.WriteCount); Console.WriteLine(writeMultiRegisterOutputStruct.WriteCount);

View File

@@ -21,7 +21,7 @@ namespace NA200H.UI.WPF
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{ {
utility = new ModbusUtility((int) ModbusType.Tcp, "192.168.3.247"); 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, "03:10000", 8);
byte[] getNum = utility.GetDatas(0x02, "NW1", 8); byte[] getNum = utility.GetDatas(0x02, "NW1", 8);
object[] getNumObjects = object[] getNumObjects =