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()
{
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<bool>(
ValueHelper.Instance.ByteArrayToObjectArray(lampsbyte,

View File

@@ -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<int,int> AddressTranslate(string address, bool isRead);
}
/// <summary>
@@ -40,27 +41,50 @@ namespace ModBus.Net
/// </summary>
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()
{
TransDictionary = new Dictionary<string, short>();
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<string, int>
{
{"Q", 0},
{"M", 10000},
{"N", 20000},
{"I", 0},
{"S", 10000},
{"IW", 0},
{"SW", 5000},
{"MW", 0},
{"NW", 10000},
{"QW", 20000},
};
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();
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<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>
public class AddressTranslatorBase : AddressTranslator
{
public override ushort AddressTranslate(string address)
public override KeyValuePair<int, int> 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<int, int>(num2, num1);
}
return 0;
throw new FormatException();
}
}
}

View File

@@ -26,19 +26,21 @@ namespace ModBus.Net
/// 获取数据
/// </summary>
/// <param name="belongAddress">从站地址</param>
/// <param name="functionCode">功能码</param>
/// <param name="startAddress">开始地址</param>
/// <param name="getCount">接收个数</param>
/// <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>
/// <param name="belongAddress">从站地址</param>
/// <param name="functionCode">功能码</param>
/// <param name="startAddress">开始地址</param>
/// <param name="setContents">设置数</param>
/// <param name="setContents">设置数</param>
/// <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.Runtime.Remoting.Messaging;
internal enum ModbusProtocalVariableFunctionCode : byte
{
ReadVariable = 20,
WriteVariable = 21,
}
/// <summary>
/// 跟时间有关的功能码
/// </summary>
@@ -9,7 +15,7 @@ internal enum ModbusProtocalTimeFunctionCode : byte
{
GetSystemTime = 3,
SetSystemTime = 16,
};
}
/// <summary>
/// 跟读数据有关的功能码
@@ -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<int, int> 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<int, int> 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[];

View File

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

View File

@@ -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<ushort>(
@@ -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);

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)
{
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<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(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<Type, int>(typeof(ushort), 4));
ushort[] getNumUshorts = ValueHelper.Instance.ObjectArrayToDestinationArray<ushort>(getNumObjects);