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>
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);
}

View File

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

View File

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

View File

@@ -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<int, int> translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, true);
KeyValuePair<int, int> 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<int, int> translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, false);
KeyValuePair<int, int> translateAddress = addressTranslator.AddressTranslate(startAddress, false);
FunctionCode = (byte)translateAddress.Value;
StartAddress = (ushort)translateAddress.Key;
WriteCount = (ushort)writeValue.Length;

View File

@@ -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;

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);
//第三步:读取这个输出结构体的信息。
@@ -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<ushort>(
@@ -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);

View File

@@ -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 =