2014-10-11 update 1
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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[];
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/3Add.prj
Normal file
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/3Add.prj
Normal file
Binary file not shown.
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ld
Normal file
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ld
Normal file
Binary file not shown.
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ldo
Normal file
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.ldo
Normal file
Binary file not shown.
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.nal
Normal file
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.nal
Normal file
Binary file not shown.
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.o
Normal file
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.o
Normal file
Binary file not shown.
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.tag
Normal file
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/MAIN.tag
Normal file
Binary file not shown.
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/myvar.o
Normal file
BIN
Modbus.Net/NA200H.UI.WPF/3Add_NAPro5.0/myvar.o
Normal file
Binary file not shown.
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user