2014-10-11 update 1

This commit is contained in:
parallelbgls@outlook.com
2014-10-11 14:57:10 +08:00
parent 66d2123730
commit 30895c2d1e
14 changed files with 126 additions and 51 deletions

View File

@@ -17,7 +17,7 @@ namespace CrossLampControl.WebApi.Controllers
public Lamp GetLamp() public Lamp GetLamp()
{ {
Lamp light = new Lamp(); 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 = bool[] lamps =
ValueHelper.Instance.ObjectArrayToDestinationArray<bool>( ValueHelper.Instance.ObjectArrayToDestinationArray<bool>(
ValueHelper.Instance.ByteArrayToObjectArray(lampsbyte, ValueHelper.Instance.ByteArrayToObjectArray(lampsbyte,

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Dynamic; using System.Dynamic;
namespace ModBus.Net namespace ModBus.Net
@@ -32,7 +33,7 @@ namespace ModBus.Net
Instance = instance; Instance = instance;
} }
public abstract ushort AddressTranslate(string address); public abstract KeyValuePair<int,int> AddressTranslate(string address, bool isRead);
} }
/// <summary> /// <summary>
@@ -40,27 +41,50 @@ namespace ModBus.Net
/// </summary> /// </summary>
public class AddressTranslatorNA200H : AddressTranslator public class AddressTranslatorNA200H : AddressTranslator
{ {
public Dictionary<string, short> TransDictionary; protected Dictionary<string, int> TransDictionary;
protected Dictionary<string, int> ReadFunctionCodeDictionary;
protected Dictionary<string, int> WriteFunctionCodeDictionary;
public AddressTranslatorNA200H() public AddressTranslatorNA200H()
{ {
TransDictionary = new Dictionary<string, short>(); TransDictionary = new Dictionary<string, int>
TransDictionary.Add("Q", 0); {
TransDictionary.Add("M", 10000); {"Q", 0},
TransDictionary.Add("N", 20000); {"M", 10000},
TransDictionary.Add("I", 0); {"N", 20000},
TransDictionary.Add("S", 10000); {"I", 0},
TransDictionary.Add("IW", 0); {"S", 10000},
TransDictionary.Add("SW", 5000); {"IW", 0},
TransDictionary.Add("E", 10000); {"SW", 5000},
TransDictionary.Add("MW", 0); {"MW", 0},
TransDictionary.Add("NW", 10000); {"NW", 10000},
TransDictionary.Add("QW", 20000); {"QW", 20000},
TransDictionary.Add("CLOCK", 30000); };
TransDictionary.Add("V", 0); ReadFunctionCodeDictionary = new Dictionary<string, int>
{
{"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<string, int>
{
{"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<int, int> AddressTranslate(string address, bool isRead)
{ {
address = address.ToUpper(); address = address.ToUpper();
int i = 0; int i = 0;
@@ -69,10 +93,14 @@ namespace ModBus.Net
{ {
i++; i++;
} }
if (i == 0) return ushort.Parse(address); if (i == 0 || i >= address.Length) throw new FormatException();
string head = address.Substring(0, i); string head = address.Substring(0, i);
string tail = address.Substring(i); string tail = address.Substring(i);
return (ushort) (TransDictionary[head] + ushort.Parse(tail) - 1); return isRead
? new KeyValuePair<int, int>(TransDictionary[head] + int.Parse(tail) - 1,
ReadFunctionCodeDictionary[head])
: new KeyValuePair<int, int>(TransDictionary[head] + int.Parse(tail) - 1,
WriteFunctionCodeDictionary[head]);
} }
} }
@@ -81,14 +109,16 @@ namespace ModBus.Net
/// </summary> /// </summary>
public class AddressTranslatorBase : AddressTranslator public class AddressTranslatorBase : AddressTranslator
{ {
public override ushort AddressTranslate(string address) public override KeyValuePair<int, int> AddressTranslate(string address, bool isRead)
{ {
ushort num; int num1,num2;
if (ushort.TryParse(address, out num)) 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<int, int>(num2, num1);
} }
return 0; throw new FormatException();
} }
} }
} }

View File

@@ -26,19 +26,21 @@ namespace ModBus.Net
/// 获取数据 /// 获取数据
/// </summary> /// </summary>
/// <param name="belongAddress">从站地址</param> /// <param name="belongAddress">从站地址</param>
/// <param name="functionCode">功能码</param>
/// <param name="startAddress">开始地址</param> /// <param name="startAddress">开始地址</param>
/// <param name="getCount">接收个数</param> /// <param name="getCount">接收个数</param>
/// <returns>接收到的byte数据</returns> /// <returns>接收到的byte数据</returns>
public abstract byte[] GetDatas(byte belongAddress, byte functionCode, string startAddress, ushort getCount); public abstract byte[] GetDatas(byte belongAddress, string startAddress, int getCount);
/// <summary> /// <summary>
/// 设置数据 /// 设置数据
/// </summary> /// </summary>
/// <param name="belongAddress">从站地址</param> /// <param name="belongAddress">从站地址</param>
/// <param name="functionCode">功能码</param>
/// <param name="startAddress">开始地址</param> /// <param name="startAddress">开始地址</param>
/// <param name="setContents">设置数</param> /// <param name="setContents">设置数</param>
/// <returns>是否设置成功</returns> /// <returns>是否设置成功</returns>
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);
} }
} }

View File

@@ -2,6 +2,12 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting.Messaging;
internal enum ModbusProtocalVariableFunctionCode : byte
{
ReadVariable = 20,
WriteVariable = 21,
}
/// <summary> /// <summary>
/// 跟时间有关的功能码 /// 跟时间有关的功能码
/// </summary> /// </summary>
@@ -9,7 +15,7 @@ internal enum ModbusProtocalTimeFunctionCode : byte
{ {
GetSystemTime = 3, GetSystemTime = 3,
SetSystemTime = 16, SetSystemTime = 16,
}; }
/// <summary> /// <summary>
/// 跟读数据有关的功能码 /// 跟读数据有关的功能码
@@ -41,11 +47,12 @@ namespace ModBus.Net
#region PLC数据 #region PLC数据
public class ReadDataInputStruct : InputStruct public class ReadDataInputStruct : InputStruct
{ {
public ReadDataInputStruct(byte belongAddress, ModbusProtocalReadDataFunctionCode functionCode, string startAddress, ushort getCount) public ReadDataInputStruct(byte belongAddress, string startAddress, ushort getCount)
{ {
BelongAddress = belongAddress; BelongAddress = belongAddress;
FunctionCode = (byte)functionCode; KeyValuePair<int, int> translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, true);
StartAddress = AddressTranslator.Instance.AddressTranslate(startAddress); FunctionCode = (byte)translateAddress.Value;
StartAddress = (ushort)translateAddress.Key;
GetCount = getCount; GetCount = getCount;
} }
@@ -103,11 +110,12 @@ namespace ModBus.Net
#region PLC数据 #region PLC数据
public class WriteDataInputStruct : InputStruct public class WriteDataInputStruct : InputStruct
{ {
public WriteDataInputStruct(byte belongAddress, ModbusProtocalWriteDataFunctionCode functionCode, string startAddress, object[] writeValue) public WriteDataInputStruct(byte belongAddress, string startAddress, object[] writeValue)
{ {
BelongAddress = belongAddress; BelongAddress = belongAddress;
FunctionCode = (byte)functionCode; KeyValuePair<int, int> translateAddress = AddressTranslator.Instance.AddressTranslate(startAddress, false);
StartAddress = AddressTranslator.Instance.AddressTranslate(startAddress); FunctionCode = (byte)translateAddress.Value;
StartAddress = (ushort)translateAddress.Key;
WriteCount = (ushort)writeValue.Length; WriteCount = (ushort)writeValue.Length;
WriteByteCount = 0; WriteByteCount = 0;
WriteValue = writeValue.Clone() as object[]; WriteValue = writeValue.Clone() as object[];

View File

@@ -72,11 +72,11 @@ namespace ModBus.Net
ModbusType = (ModbusType) connectionType; 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 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 = var outputStruct =
Wrapper.SendReceive(Wrapper["ReadDataModbusProtocal"], inputStruct) as ReadDataOutputStruct; Wrapper.SendReceive(Wrapper["ReadDataModbusProtocal"], inputStruct) as ReadDataOutputStruct;
return outputStruct.DataValue; 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 try
{ {
var inputStruct = new WriteDataInputStruct(belongAddress, var inputStruct = new WriteDataInputStruct(belongAddress, startAddress, setContents);
(ModbusProtocalWriteDataFunctionCode) functionCode, startAddress, setContents);
var outputStruct = var outputStruct =
Wrapper.SendReceive(Wrapper["WriteDataModbusProtocal"], inputStruct) as Wrapper.SendReceive(Wrapper["WriteDataModbusProtocal"], inputStruct) as
WriteDataOutputStruct; WriteDataOutputStruct;
@@ -104,5 +103,37 @@ namespace ModBus.Net
return false; 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;
}
}
} }
} }

View File

@@ -58,7 +58,7 @@ namespace NA200H.UI.ConsoleApp
//第一步:先生成一个输入结构体,然后向这个结构体中填写数据 //第一步:先生成一个输入结构体,然后向这个结构体中填写数据
AddressTranslator.CreateTranslator(new AddressTranslatorNA200H()); 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); 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, ModbusProtocalReadDataFunctionCode.ReadHoldRegister, "NW1", 4); ReadDataInputStruct readHoldRegisterInputStruct = new ReadDataInputStruct(0x02, "NW1", 4);
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, 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); 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, 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); WriteDataOutputStruct writeMultiRegisterOutputStruct = (WriteDataOutputStruct)wrapper.SendReceive(wrapper["WriteDataModbusProtocal"], writeMultiRegisterInputStruct);
Console.WriteLine(writeMultiRegisterOutputStruct.StartAddress); Console.WriteLine(writeMultiRegisterOutputStruct.StartAddress);
Console.WriteLine(writeMultiRegisterOutputStruct.WriteCount); Console.WriteLine(writeMultiRegisterOutputStruct.WriteCount);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -21,7 +21,9 @@ 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");
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 = object[] getNumObjects =
ValueHelper.Instance.ByteArrayToObjectArray(getNum, ValueHelper.Instance.ByteArrayToObjectArray(getNum,
new List<KeyValuePair<Type, int>>(){{new KeyValuePair<Type, int>(typeof(ushort), 4)}}); new List<KeyValuePair<Type, int>>(){{new KeyValuePair<Type, int>(typeof(ushort), 4)}});
@@ -43,9 +45,11 @@ namespace NA200H.UI.WPF
ushort.TryParse(Add1.Text, out add1); ushort.TryParse(Add1.Text, out add1);
ushort.TryParse(Add2.Text, out add2); ushort.TryParse(Add2.Text, out add2);
ushort.TryParse(Add3.Text, out add3); 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); 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 = object[] getNumObjects =
ValueHelper.Instance.ByteArrayToObjectArray(getNum, new KeyValuePair<Type, int>(typeof(ushort), 4)); ValueHelper.Instance.ByteArrayToObjectArray(getNum, new KeyValuePair<Type, int>(typeof(ushort), 4));
ushort[] getNumUshorts = ValueHelper.Instance.ObjectArrayToDestinationArray<ushort>(getNumObjects); ushort[] getNumUshorts = ValueHelper.Instance.ObjectArrayToDestinationArray<ushort>(getNumObjects);