2017-12-22 Update 1 MatchController

This commit is contained in:
parallelbgls
2017-12-22 11:49:25 +08:00
parent 8614905006
commit 7d82d647d1
48 changed files with 555 additions and 450 deletions

View File

@@ -70,7 +70,7 @@ namespace Modbus.Net.Modbus
"Q", "Q",
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalReadDataFunctionCode.ReadCoilStatus, Code = (int) ModbusProtocolReadDataFunctionCode.ReadCoilStatus,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -78,7 +78,7 @@ namespace Modbus.Net.Modbus
"M", "M",
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalReadDataFunctionCode.ReadCoilStatus, Code = (int) ModbusProtocolReadDataFunctionCode.ReadCoilStatus,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -86,7 +86,7 @@ namespace Modbus.Net.Modbus
"N", "N",
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalReadDataFunctionCode.ReadCoilStatus, Code = (int) ModbusProtocolReadDataFunctionCode.ReadCoilStatus,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -94,7 +94,7 @@ namespace Modbus.Net.Modbus
"I", "I",
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalReadDataFunctionCode.ReadInputStatus, Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputStatus,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -102,29 +102,29 @@ namespace Modbus.Net.Modbus
"S", "S",
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalReadDataFunctionCode.ReadInputStatus, Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputStatus,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
{ {
"IW", "IW",
new AreaOutputDef {Code = (int) ModbusProtocalReadDataFunctionCode.ReadInputRegister, AreaWidth = 2} new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputRegister, AreaWidth = 2}
}, },
{ {
"SW", "SW",
new AreaOutputDef {Code = (int) ModbusProtocalReadDataFunctionCode.ReadInputRegister, AreaWidth = 2} new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputRegister, AreaWidth = 2}
}, },
{ {
"MW", "MW",
new AreaOutputDef {Code = (int) ModbusProtocalReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2} new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2}
}, },
{ {
"NW", "NW",
new AreaOutputDef {Code = (int) ModbusProtocalReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2} new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2}
}, },
{ {
"QW", "QW",
new AreaOutputDef {Code = (int) ModbusProtocalReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2} new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2}
} }
}; };
WriteFunctionCodeDictionary = new Dictionary<(string, bool), AreaOutputDef> WriteFunctionCodeDictionary = new Dictionary<(string, bool), AreaOutputDef>
@@ -133,7 +133,7 @@ namespace Modbus.Net.Modbus
("Q", false), ("Q", false),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteMultiCoil, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiCoil,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -141,7 +141,7 @@ namespace Modbus.Net.Modbus
("M", false), ("M", false),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteMultiCoil, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiCoil,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -149,7 +149,7 @@ namespace Modbus.Net.Modbus
("N", false), ("N", false),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteMultiCoil, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiCoil,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -157,7 +157,7 @@ namespace Modbus.Net.Modbus
("MW", false), ("MW", false),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteMultiRegister, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiRegister,
AreaWidth = 2 AreaWidth = 2
} }
}, },
@@ -165,7 +165,7 @@ namespace Modbus.Net.Modbus
("NW", false), ("NW", false),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteMultiRegister, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiRegister,
AreaWidth = 2 AreaWidth = 2
} }
}, },
@@ -173,7 +173,7 @@ namespace Modbus.Net.Modbus
("QW", false), ("QW", false),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteMultiRegister, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiRegister,
AreaWidth = 2 AreaWidth = 2
} }
}, },
@@ -181,7 +181,7 @@ namespace Modbus.Net.Modbus
("Q", true), ("Q", true),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteSingleCoil, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleCoil,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -189,7 +189,7 @@ namespace Modbus.Net.Modbus
("M", true), ("M", true),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteSingleCoil, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleCoil,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -197,7 +197,7 @@ namespace Modbus.Net.Modbus
("N", true), ("N", true),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteSingleCoil, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleCoil,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -205,7 +205,7 @@ namespace Modbus.Net.Modbus
("MW", true), ("MW", true),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteSingleRegister, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleRegister,
AreaWidth = 2 AreaWidth = 2
} }
}, },
@@ -213,7 +213,7 @@ namespace Modbus.Net.Modbus
("NW", true), ("NW", true),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteSingleRegister, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleRegister,
AreaWidth = 2 AreaWidth = 2
} }
}, },
@@ -221,7 +221,7 @@ namespace Modbus.Net.Modbus
("QW", true), ("QW", true),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteSingleRegister, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleRegister,
AreaWidth = 2 AreaWidth = 2
} }
} }
@@ -306,7 +306,7 @@ namespace Modbus.Net.Modbus
"0X", "0X",
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalReadDataFunctionCode.ReadCoilStatus, Code = (int) ModbusProtocolReadDataFunctionCode.ReadCoilStatus,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -314,17 +314,17 @@ namespace Modbus.Net.Modbus
"1X", "1X",
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalReadDataFunctionCode.ReadInputStatus, Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputStatus,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
{ {
"3X", "3X",
new AreaOutputDef {Code = (int) ModbusProtocalReadDataFunctionCode.ReadInputRegister, AreaWidth = 2} new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadInputRegister, AreaWidth = 2}
}, },
{ {
"4X", "4X",
new AreaOutputDef {Code = (int) ModbusProtocalReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2} new AreaOutputDef {Code = (int) ModbusProtocolReadDataFunctionCode.ReadHoldRegister, AreaWidth = 2}
} }
}; };
WriteFunctionCodeDictionary = new Dictionary<(string, bool), AreaOutputDef> WriteFunctionCodeDictionary = new Dictionary<(string, bool), AreaOutputDef>
@@ -333,7 +333,7 @@ namespace Modbus.Net.Modbus
("0X", false), ("0X", false),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteMultiCoil, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiCoil,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -341,7 +341,7 @@ namespace Modbus.Net.Modbus
("4X", false), ("4X", false),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteMultiRegister, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteMultiRegister,
AreaWidth = 2 AreaWidth = 2
} }
}, },
@@ -349,7 +349,7 @@ namespace Modbus.Net.Modbus
("0X", true), ("0X", true),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteSingleCoil, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleCoil,
AreaWidth = 0.125 AreaWidth = 0.125
} }
}, },
@@ -357,7 +357,7 @@ namespace Modbus.Net.Modbus
("4X", true), ("4X", true),
new AreaOutputDef new AreaOutputDef
{ {
Code = (int) ModbusProtocalWriteDataFunctionCode.WriteSingleRegister, Code = (int) ModbusProtocolWriteDataFunctionCode.WriteSingleRegister,
AreaWidth = 2 AreaWidth = 2
} }
} }

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus/Ascii码协议 /// Modbus/Ascii码协议
/// </summary> /// </summary>
public class ModbusAsciiInTcpProtocal : ModbusProtocal public class ModbusAsciiInTcpProtocol : ModbusProtocol
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
@@ -13,7 +13,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusAsciiInTcpProtocal(byte slaveAddress, byte masterAddress, Endian endian) public ModbusAsciiInTcpProtocol(byte slaveAddress, byte masterAddress, Endian endian)
: this(ConfigurationManager.AppSettings["IP"], slaveAddress, masterAddress, endian) : this(ConfigurationManager.AppSettings["IP"], slaveAddress, masterAddress, endian)
{ {
} }
@@ -25,10 +25,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusAsciiInTcpProtocal(string ip, byte slaveAddress, byte masterAddress, Endian endian) public ModbusAsciiInTcpProtocol(string ip, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusAsciiInTcpProtocalLinker(ip, slaveAddress); ProtocolLinker = new ModbusAsciiInTcpProtocolLinker(ip, slaveAddress);
} }
/// <summary> /// <summary>
@@ -39,10 +39,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusAsciiInTcpProtocal(string ip, int port, byte slaveAddress, byte masterAddress, Endian endian) public ModbusAsciiInTcpProtocol(string ip, int port, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusTcpProtocalLinker(ip, port); ProtocolLinker = new ModbusTcpProtocolLinker(ip, port);
} }
} }
} }

View File

@@ -6,13 +6,13 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus/Ascii码协议连接器Tcp透传 /// Modbus/Ascii码协议连接器Tcp透传
/// </summary> /// </summary>
public class ModbusAsciiInTcpProtocalLinker : TcpProtocalLinker public class ModbusAsciiInTcpProtocolLinker : TcpProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="ip">IP地址</param> /// <param name="ip">IP地址</param>
public ModbusAsciiInTcpProtocalLinker(string ip) public ModbusAsciiInTcpProtocolLinker(string ip)
: base(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502")) : base(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502"))
{ {
} }
@@ -22,10 +22,10 @@ namespace Modbus.Net.Modbus
/// </summary> /// </summary>
/// <param name="ip">ip地址</param> /// <param name="ip">ip地址</param>
/// <param name="port">端口号</param> /// <param name="port">端口号</param>
public ModbusAsciiInTcpProtocalLinker(string ip, int port) public ModbusAsciiInTcpProtocolLinker(string ip, int port)
: base(ip, port) : base(ip, port)
{ {
((BaseConnector)BaseConnector).AddController(new FIFOController(500)); ((BaseConnector)BaseConnector).AddController(new FifoController(500));
} }
/// <summary> /// <summary>
@@ -35,15 +35,15 @@ namespace Modbus.Net.Modbus
/// <returns>校验是否正确</returns> /// <returns>校验是否正确</returns>
public override bool? CheckRight(byte[] content) public override bool? CheckRight(byte[] content)
{ {
//ProtocalLinker不会返回null //ProtocolLinker不会返回null
if (!base.CheckRight(content).Value) return false; if (!base.CheckRight(content).Value) return false;
//CRC校验失败 //CRC校验失败
var contentString = Encoding.ASCII.GetString(content); var contentString = Encoding.ASCII.GetString(content);
if (!Crc16.GetInstance().LrcEfficacy(contentString)) if (!Crc16.GetInstance().LrcEfficacy(contentString))
throw new ModbusProtocalErrorException(501); throw new ModbusProtocolErrorException(501);
//Modbus协议错误 //Modbus协议错误
if (byte.Parse(contentString.Substring(3, 2)) > 127) if (byte.Parse(contentString.Substring(3, 2)) > 127)
throw new ModbusProtocalErrorException(byte.Parse(contentString.Substring(5, 2))); throw new ModbusProtocolErrorException(byte.Parse(contentString.Substring(5, 2)));
return true; return true;
} }
} }

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus/Ascii码协议 /// Modbus/Ascii码协议
/// </summary> /// </summary>
public class ModbusAsciiProtocal : ModbusProtocal public class ModbusAsciiProtocol : ModbusProtocol
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
@@ -13,7 +13,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusAsciiProtocal(byte slaveAddress, byte masterAddress, Endian endian) public ModbusAsciiProtocol(byte slaveAddress, byte masterAddress, Endian endian)
: this(ConfigurationManager.AppSettings["COM"], slaveAddress, masterAddress, endian) : this(ConfigurationManager.AppSettings["COM"], slaveAddress, masterAddress, endian)
{ {
} }
@@ -25,10 +25,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusAsciiProtocal(string com, byte slaveAddress, byte masterAddress, Endian endian) public ModbusAsciiProtocol(string com, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusAsciiProtocalLinker(com, slaveAddress); ProtocolLinker = new ModbusAsciiProtocolLinker(com, slaveAddress);
} }
} }
} }

View File

@@ -1,4 +1,5 @@
using System.IO.Ports; using System.Collections.Generic;
using System.IO.Ports;
using System.Text; using System.Text;
namespace Modbus.Net.Modbus namespace Modbus.Net.Modbus
@@ -6,17 +7,17 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus/Ascii码协议连接器 /// Modbus/Ascii码协议连接器
/// </summary> /// </summary>
public class ModbusAsciiProtocalLinker : ComProtocalLinker public class ModbusAsciiProtocolLinker : ComProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="com">串口地址</param> /// <param name="com">串口地址</param>
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
public ModbusAsciiProtocalLinker(string com, int slaveAddress) public ModbusAsciiProtocolLinker(string com, int slaveAddress)
: base(com, 9600, Parity.None, StopBits.One, 8, slaveAddress) : base(com, 9600, Parity.None, StopBits.One, 8, slaveAddress)
{ {
((BaseConnector)BaseConnector).AddController(new FIFOController(500)); ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<int>[] { new List<int> { 0, 1 }}, 500));
} }
/// <summary> /// <summary>
@@ -26,15 +27,15 @@ namespace Modbus.Net.Modbus
/// <returns>校验是否正确</returns> /// <returns>校验是否正确</returns>
public override bool? CheckRight(byte[] content) public override bool? CheckRight(byte[] content)
{ {
//ProtocalLinker不会返回null //ProtocolLinker不会返回null
if (!base.CheckRight(content).Value) return false; if (!base.CheckRight(content).Value) return false;
//CRC校验失败 //CRC校验失败
var contentString = Encoding.ASCII.GetString(content); var contentString = Encoding.ASCII.GetString(content);
if (!Crc16.GetInstance().LrcEfficacy(contentString)) if (!Crc16.GetInstance().LrcEfficacy(contentString))
throw new ModbusProtocalErrorException(501); throw new ModbusProtocolErrorException(501);
//Modbus协议错误 //Modbus协议错误
if (byte.Parse(contentString.Substring(3, 2)) > 127) if (byte.Parse(contentString.Substring(3, 2)) > 127)
throw new ModbusProtocalErrorException(byte.Parse(contentString.Substring(5, 2))); throw new ModbusProtocolErrorException(byte.Parse(contentString.Substring(5, 2)));
return true; return true;
} }
} }

View File

@@ -7,7 +7,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// 变量功能码 /// 变量功能码
/// </summary> /// </summary>
internal enum ModbusProtocalVariableFunctionCode : byte internal enum ModbusProtocolVariableFunctionCode : byte
{ {
/// <summary> /// <summary>
/// 读变量 /// 读变量
@@ -23,7 +23,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// 跟时间有关的功能码 /// 跟时间有关的功能码
/// </summary> /// </summary>
public enum ModbusProtocalTimeFunctionCode : byte public enum ModbusProtocolTimeFunctionCode : byte
{ {
/// <summary> /// <summary>
/// 读时间 /// 读时间
@@ -39,7 +39,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// 跟读数据有关的功能码 /// 跟读数据有关的功能码
/// </summary> /// </summary>
public enum ModbusProtocalReadDataFunctionCode : byte public enum ModbusProtocolReadDataFunctionCode : byte
{ {
/// <summary> /// <summary>
/// 读线圈 /// 读线圈
@@ -65,7 +65,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// 跟写数据有关的功能码 /// 跟写数据有关的功能码
/// </summary> /// </summary>
internal enum ModbusProtocalWriteDataFunctionCode : byte internal enum ModbusProtocolWriteDataFunctionCode : byte
{ {
/// <summary> /// <summary>
/// 写单个线圈 /// 写单个线圈
@@ -91,7 +91,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus协议 /// Modbus协议
/// </summary> /// </summary>
public abstract class ModbusProtocal : BaseProtocal public abstract class ModbusProtocol : BaseProtocol
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
@@ -99,7 +99,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站地址</param> /// <param name="slaveAddress">从站地址</param>
/// <param name="masterAddress">主站地址</param> /// <param name="masterAddress">主站地址</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
protected ModbusProtocal(byte slaveAddress, byte masterAddress, Endian endian) protected ModbusProtocol(byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
} }
@@ -110,7 +110,7 @@ namespace Modbus.Net.Modbus
/// <returns>是否连接成功</returns> /// <returns>是否连接成功</returns>
public override async Task<bool> ConnectAsync() public override async Task<bool> ConnectAsync()
{ {
return await ProtocalLinker.ConnectAsync(); return await ProtocolLinker.ConnectAsync();
} }
} }
@@ -205,7 +205,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// 读数据协议 /// 读数据协议
/// </summary> /// </summary>
public class ReadDataModbusProtocal : ProtocalUnit public class ReadDataModbusProtocol : ProtocolUnit
{ {
/// <summary> /// <summary>
/// 格式化 /// 格式化
@@ -343,7 +343,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// 写多个寄存器协议 /// 写多个寄存器协议
/// </summary> /// </summary>
public class WriteDataModbusProtocal : ProtocalUnit public class WriteDataModbusProtocol : ProtocolUnit
{ {
/// <summary> /// <summary>
/// 格式化 /// 格式化
@@ -398,7 +398,7 @@ namespace Modbus.Net.Modbus
StartAddress = (ushort) translateAddress.Address; StartAddress = (ushort) translateAddress.Address;
int a = 0, b = 0; int a = 0, b = 0;
var writeByteValue = var writeByteValue =
FunctionCode == (byte) ModbusProtocalWriteDataFunctionCode.WriteSingleCoil FunctionCode == (byte) ModbusProtocolWriteDataFunctionCode.WriteSingleCoil
? ((bool) writeValue ? ((bool) writeValue
? new byte[] {0xFF, 0x00} ? new byte[] {0xFF, 0x00}
: new byte[] {0x00, 0x00}) : new byte[] {0x00, 0x00})
@@ -473,7 +473,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// 写多个寄存器协议 /// 写多个寄存器协议
/// </summary> /// </summary>
public class WriteSingleDataModbusProtocal : ProtocalUnit public class WriteSingleDataModbusProtocol : ProtocolUnit
{ {
/// <summary> /// <summary>
/// 格式化 /// 格式化
@@ -501,7 +501,7 @@ namespace Modbus.Net.Modbus
var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag); var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag); var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
var writeValue = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag); var writeValue = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
var returnValue = functionCode == (byte)ModbusProtocalWriteDataFunctionCode.WriteSingleCoil var returnValue = functionCode == (byte)ModbusProtocolWriteDataFunctionCode.WriteSingleCoil
? (object)(writeValue == 0xFF00) : writeValue; ? (object)(writeValue == 0xFF00) : writeValue;
return new WriteSingleDataModbusOutputStruct(slaveAddress, functionCode, startAddress, return new WriteSingleDataModbusOutputStruct(slaveAddress, functionCode, startAddress,
returnValue); returnValue);
@@ -524,7 +524,7 @@ namespace Modbus.Net.Modbus
public GetSystemTimeModbusInputStruct(byte slaveAddress) public GetSystemTimeModbusInputStruct(byte slaveAddress)
{ {
SlaveAddress = slaveAddress; SlaveAddress = slaveAddress;
FunctionCode = (byte) ModbusProtocalTimeFunctionCode.GetSystemTime; FunctionCode = (byte) ModbusProtocolTimeFunctionCode.GetSystemTime;
StartAddress = 30000; StartAddress = 30000;
GetCount = 5; GetCount = 5;
} }
@@ -602,7 +602,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// 读系统时间协议 /// 读系统时间协议
/// </summary> /// </summary>
public class GetSystemTimeModbusProtocal : ProtocalUnit public class GetSystemTimeModbusProtocol : ProtocolUnit
{ {
/// <summary> /// <summary>
/// 格式化 /// 格式化
@@ -656,7 +656,7 @@ namespace Modbus.Net.Modbus
public SetSystemTimeModbusInputStruct(byte slaveAddress, DateTime time) public SetSystemTimeModbusInputStruct(byte slaveAddress, DateTime time)
{ {
SlaveAddress = slaveAddress; SlaveAddress = slaveAddress;
FunctionCode = (byte) ModbusProtocalTimeFunctionCode.SetSystemTime; FunctionCode = (byte) ModbusProtocolTimeFunctionCode.SetSystemTime;
StartAddress = 30000; StartAddress = 30000;
WriteCount = 5; WriteCount = 5;
WriteByteCount = 10; WriteByteCount = 10;
@@ -775,7 +775,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// 写系统时间协议 /// 写系统时间协议
/// </summary> /// </summary>
public class SetSystemTimeModbusProtocal : ProtocalUnit public class SetSystemTimeModbusProtocol : ProtocolUnit
{ {
/// <summary> /// <summary>
/// 格式化 /// 格式化
@@ -812,9 +812,9 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus协议错误表 /// Modbus协议错误表
/// </summary> /// </summary>
public class ModbusProtocalErrorException : ProtocalErrorException public class ModbusProtocolErrorException : ProtocolErrorException
{ {
private static readonly Dictionary<int, string> ProtocalErrorDictionary = new Dictionary<int, string> private static readonly Dictionary<int, string> ProtocolErrorDictionary = new Dictionary<int, string>
{ {
{1, "ILLEGAL_FUNCTION"}, {1, "ILLEGAL_FUNCTION"},
{2, "ILLEGAL_DATA_ACCESS"}, {2, "ILLEGAL_DATA_ACCESS"},
@@ -830,8 +830,8 @@ namespace Modbus.Net.Modbus
/// Modbus错误 /// Modbus错误
/// </summary> /// </summary>
/// <param name="messageNumber">Modbus错误号</param> /// <param name="messageNumber">Modbus错误号</param>
public ModbusProtocalErrorException(int messageNumber) public ModbusProtocolErrorException(int messageNumber)
: base(ProtocalErrorDictionary[messageNumber]) : base(ProtocolErrorDictionary[messageNumber])
{ {
ErrorMessageNumber = messageNumber; ErrorMessageNumber = messageNumber;
} }

View File

@@ -5,12 +5,12 @@ using System.Text;
namespace Modbus.Net.Modbus namespace Modbus.Net.Modbus
{ {
public class ModbusRtuInTcpProtocalLinkerBytesExtend : ModbusRtuProtocalLinkerBytesExtend public class ModbusRtuInTcpProtocolLinkerBytesExtend : ModbusRtuProtocolLinkerBytesExtend
{ {
} }
public class ModbusAsciiInTcpProtocalLinkerBytesExtend : ModbusAsciiProtocalLinkerBytesExtend public class ModbusAsciiInTcpProtocolLinkerBytesExtend : ModbusAsciiProtocolLinkerBytesExtend
{ {
} }
@@ -18,7 +18,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Tcp协议字节伸缩 /// Tcp协议字节伸缩
/// </summary> /// </summary>
public class ModbusTcpProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend public class ModbusTcpProtocolLinkerBytesExtend : IProtocolLinkerBytesExtend
{ {
/// <summary> /// <summary>
/// 协议扩展,协议内容发送前调用 /// 协议扩展,协议内容发送前调用
@@ -54,7 +54,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Rtu协议字节伸缩 /// Rtu协议字节伸缩
/// </summary> /// </summary>
public class ModbusRtuProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend public class ModbusRtuProtocolLinkerBytesExtend : IProtocolLinkerBytesExtend
{ {
/// <summary> /// <summary>
/// 协议扩展,协议内容发送前调用 /// 协议扩展,协议内容发送前调用
@@ -89,7 +89,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Ascii协议字节伸缩 /// Ascii协议字节伸缩
/// </summary> /// </summary>
public class ModbusAsciiProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend public class ModbusAsciiProtocolLinkerBytesExtend : IProtocolLinkerBytesExtend
{ {
/// <summary> /// <summary>
/// 协议扩展,协议内容发送前调用 /// 协议扩展,协议内容发送前调用

View File

@@ -6,7 +6,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus/Rtu协议tcp透传 /// Modbus/Rtu协议tcp透传
/// </summary> /// </summary>
public class ModbusRtuInTcpProtocal : ModbusProtocal public class ModbusRtuInTcpProtocol : ModbusProtocol
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
@@ -14,7 +14,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusRtuInTcpProtocal(byte slaveAddress, byte masterAddress, Endian endian) public ModbusRtuInTcpProtocol(byte slaveAddress, byte masterAddress, Endian endian)
: this(ConfigurationManager.AppSettings["IP"], slaveAddress, masterAddress, endian) : this(ConfigurationManager.AppSettings["IP"], slaveAddress, masterAddress, endian)
{ {
} }
@@ -26,10 +26,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusRtuInTcpProtocal(string ip, byte slaveAddress, byte masterAddress, Endian endian) public ModbusRtuInTcpProtocol(string ip, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusTcpProtocalLinker(ip); ProtocolLinker = new ModbusTcpProtocolLinker(ip);
} }
/// <summary> /// <summary>
@@ -39,10 +39,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusRtuInTcpProtocal(string ip, int port, byte slaveAddress, byte masterAddress, Endian endian) public ModbusRtuInTcpProtocol(string ip, int port, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusRtuInTcpProtocalLinker(ip, port); ProtocolLinker = new ModbusRtuInTcpProtocolLinker(ip, port);
} }
} }
} }

View File

@@ -5,13 +5,13 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus/Rtu协议连接器 /// Modbus/Rtu协议连接器
/// </summary> /// </summary>
public class ModbusRtuInTcpProtocalLinker : TcpProtocalLinker public class ModbusRtuInTcpProtocolLinker : TcpProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="ip">IP地址</param> /// <param name="ip">IP地址</param>
public ModbusRtuInTcpProtocalLinker(string ip) public ModbusRtuInTcpProtocolLinker(string ip)
: base(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502")) : base(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502"))
{ {
} }
@@ -21,10 +21,10 @@ namespace Modbus.Net.Modbus
/// </summary> /// </summary>
/// <param name="ip">IP地址</param> /// <param name="ip">IP地址</param>
/// <param name="port">端口号</param> /// <param name="port">端口号</param>
public ModbusRtuInTcpProtocalLinker(string ip, int port) public ModbusRtuInTcpProtocolLinker(string ip, int port)
: base(ip, port) : base(ip, port)
{ {
((BaseConnector)BaseConnector).AddController(new FIFOController(500)); ((BaseConnector)BaseConnector).AddController(new FifoController(500));
} }
/// <summary> /// <summary>
@@ -34,14 +34,14 @@ namespace Modbus.Net.Modbus
/// <returns>数据是否正确</returns> /// <returns>数据是否正确</returns>
public override bool? CheckRight(byte[] content) public override bool? CheckRight(byte[] content)
{ {
//ProtocalLinker的CheckRight不会返回null //ProtocolLinker的CheckRight不会返回null
if (!base.CheckRight(content).Value) return false; if (!base.CheckRight(content).Value) return false;
//CRC校验失败 //CRC校验失败
if (!Crc16.GetInstance().CrcEfficacy(content)) if (!Crc16.GetInstance().CrcEfficacy(content))
throw new ModbusProtocalErrorException(501); throw new ModbusProtocolErrorException(501);
//Modbus协议错误 //Modbus协议错误
if (content[1] > 127) if (content[1] > 127)
throw new ModbusProtocalErrorException(content[2]); throw new ModbusProtocolErrorException(content[2]);
return true; return true;
} }
} }

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus/Rtu协议 /// Modbus/Rtu协议
/// </summary> /// </summary>
public class ModbusRtuProtocal : ModbusProtocal public class ModbusRtuProtocol : ModbusProtocol
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
@@ -13,7 +13,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusRtuProtocal(byte slaveAddress, byte masterAddress, Endian endian) public ModbusRtuProtocol(byte slaveAddress, byte masterAddress, Endian endian)
: this(ConfigurationManager.AppSettings["COM"], slaveAddress, masterAddress, endian) : this(ConfigurationManager.AppSettings["COM"], slaveAddress, masterAddress, endian)
{ {
} }
@@ -25,10 +25,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusRtuProtocal(string com, byte slaveAddress, byte masterAddress, Endian endian) public ModbusRtuProtocol(string com, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusRtuProtocalLinker(com, slaveAddress); ProtocolLinker = new ModbusRtuProtocolLinker(com, slaveAddress);
} }
} }
} }

View File

@@ -1,21 +1,22 @@
using System.IO.Ports; using System.Collections.Generic;
using System.IO.Ports;
namespace Modbus.Net.Modbus namespace Modbus.Net.Modbus
{ {
/// <summary> /// <summary>
/// Modbus/Rtu协议连接器 /// Modbus/Rtu协议连接器
/// </summary> /// </summary>
public class ModbusRtuProtocalLinker : ComProtocalLinker public class ModbusRtuProtocolLinker : ComProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="com">串口地址</param> /// <param name="com">串口地址</param>
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
public ModbusRtuProtocalLinker(string com, int slaveAddress) public ModbusRtuProtocolLinker(string com, int slaveAddress)
: base(com, 9600, Parity.None, StopBits.One, 8, slaveAddress) : base(com, 9600, Parity.None, StopBits.One, 8, slaveAddress)
{ {
((BaseConnector)BaseConnector).AddController(new FIFOController(500)); ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<int>[]{new List<int>{0}}, 500));
} }
/// <summary> /// <summary>
@@ -25,14 +26,14 @@ namespace Modbus.Net.Modbus
/// <returns>数据是否正确</returns> /// <returns>数据是否正确</returns>
public override bool? CheckRight(byte[] content) public override bool? CheckRight(byte[] content)
{ {
//ProtocalLinker的CheckRight不会返回null //ProtocolLinker的CheckRight不会返回null
if (!base.CheckRight(content).Value) return false; if (!base.CheckRight(content).Value) return false;
//CRC校验失败 //CRC校验失败
if (!Crc16.GetInstance().CrcEfficacy(content)) if (!Crc16.GetInstance().CrcEfficacy(content))
throw new ModbusProtocalErrorException(501); throw new ModbusProtocolErrorException(501);
//Modbus协议错误 //Modbus协议错误
if (content[1] > 127) if (content[1] > 127)
throw new ModbusProtocalErrorException(content[2]); throw new ModbusProtocolErrorException(content[2]);
return true; return true;
} }
} }

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus/Tcp协议 /// Modbus/Tcp协议
/// </summary> /// </summary>
public class ModbusTcpProtocal : ModbusProtocal public class ModbusTcpProtocol : ModbusProtocol
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
@@ -13,7 +13,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusTcpProtocal(byte slaveAddress, byte masterAddress, Endian endian) public ModbusTcpProtocol(byte slaveAddress, byte masterAddress, Endian endian)
: this(ConfigurationManager.AppSettings["IP"], slaveAddress, masterAddress, endian) : this(ConfigurationManager.AppSettings["IP"], slaveAddress, masterAddress, endian)
{ {
} }
@@ -25,10 +25,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusTcpProtocal(string ip, byte slaveAddress, byte masterAddress, Endian endian) public ModbusTcpProtocol(string ip, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusTcpProtocalLinker(ip); ProtocolLinker = new ModbusTcpProtocolLinker(ip);
} }
/// <summary> /// <summary>
@@ -39,10 +39,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
/// <param name="endian">端格式</param> /// <param name="endian">端格式</param>
public ModbusTcpProtocal(string ip, int port, byte slaveAddress, byte masterAddress, Endian endian) public ModbusTcpProtocol(string ip, int port, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusTcpProtocalLinker(ip, port); ProtocolLinker = new ModbusTcpProtocolLinker(ip, port);
} }
} }
} }

View File

@@ -5,13 +5,13 @@ namespace Modbus.Net.Modbus
/// <summary> /// <summary>
/// Modbus/Tcp协议连接器 /// Modbus/Tcp协议连接器
/// </summary> /// </summary>
public class ModbusTcpProtocalLinker : TcpProtocalLinker public class ModbusTcpProtocolLinker : TcpProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="ip">IP地址</param> /// <param name="ip">IP地址</param>
public ModbusTcpProtocalLinker(string ip) public ModbusTcpProtocolLinker(string ip)
: this(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502")) : this(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502"))
{ {
} }
@@ -21,9 +21,9 @@ namespace Modbus.Net.Modbus
/// </summary> /// </summary>
/// <param name="ip">IP地址</param> /// <param name="ip">IP地址</param>
/// <param name="port">端口</param> /// <param name="port">端口</param>
public ModbusTcpProtocalLinker(string ip, int port) : base(ip, port) public ModbusTcpProtocolLinker(string ip, int port) : base(ip, port)
{ {
((BaseConnector)BaseConnector).AddController(new FIFOController(500)); ((BaseConnector)BaseConnector).AddController(new FifoController(500));
} }
/// <summary> /// <summary>
@@ -33,14 +33,14 @@ namespace Modbus.Net.Modbus
/// <returns>数据是否正确</returns> /// <returns>数据是否正确</returns>
public override bool? CheckRight(byte[] content) public override bool? CheckRight(byte[] content)
{ {
//ProtocalLinker的CheckRight不会返回null //ProtocolLinker的CheckRight不会返回null
if (!base.CheckRight(content).Value) return false; if (!base.CheckRight(content).Value) return false;
//长度校验失败 //长度校验失败
if (content[5] != content.Length - 6) if (content[5] != content.Length - 6)
throw new ModbusProtocalErrorException(500); throw new ModbusProtocolErrorException(500);
//Modbus协议错误 //Modbus协议错误
if (content[7] > 127) if (content[7] > 127)
throw new ModbusProtocalErrorException(content[2] > 0 ? content[2] : content[8]); throw new ModbusProtocolErrorException(content[2] > 0 ? content[2] : content[8]);
return true; return true;
} }
} }

View File

@@ -145,18 +145,18 @@ namespace Modbus.Net.Modbus
case ModbusType.Rtu: case ModbusType.Rtu:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new ModbusRtuProtocal(SlaveAddress, MasterAddress, Endian) ? new ModbusRtuProtocol(SlaveAddress, MasterAddress, Endian)
: new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian); : new ModbusRtuProtocol(ConnectionString, SlaveAddress, MasterAddress, Endian);
break; break;
} }
//Tcp协议 //Tcp协议
case ModbusType.Tcp: case ModbusType.Tcp:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new ModbusTcpProtocal(SlaveAddress, MasterAddress, Endian) ? new ModbusTcpProtocol(SlaveAddress, MasterAddress, Endian)
: (ConnectionStringPort == null : (ConnectionStringPort == null
? new ModbusTcpProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian) ? new ModbusTcpProtocol(ConnectionString, SlaveAddress, MasterAddress, Endian)
: new ModbusTcpProtocal(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress, : new ModbusTcpProtocol(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress,
MasterAddress, Endian)); MasterAddress, Endian));
break; break;
} }
@@ -164,18 +164,18 @@ namespace Modbus.Net.Modbus
case ModbusType.Ascii: case ModbusType.Ascii:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new ModbusAsciiProtocal(SlaveAddress, MasterAddress, Endian) ? new ModbusAsciiProtocol(SlaveAddress, MasterAddress, Endian)
: new ModbusAsciiProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian); : new ModbusAsciiProtocol(ConnectionString, SlaveAddress, MasterAddress, Endian);
break; break;
} }
//Rtu协议 //Rtu协议
case ModbusType.RtuInTcp: case ModbusType.RtuInTcp:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new ModbusRtuInTcpProtocal(SlaveAddress, MasterAddress, Endian) ? new ModbusRtuInTcpProtocol(SlaveAddress, MasterAddress, Endian)
: (ConnectionStringPort == null : (ConnectionStringPort == null
? new ModbusRtuInTcpProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian) ? new ModbusRtuInTcpProtocol(ConnectionString, SlaveAddress, MasterAddress, Endian)
: new ModbusRtuInTcpProtocal(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress, : new ModbusRtuInTcpProtocol(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress,
MasterAddress, Endian)); MasterAddress, Endian));
break; break;
} }
@@ -183,10 +183,10 @@ namespace Modbus.Net.Modbus
case ModbusType.AsciiInTcp: case ModbusType.AsciiInTcp:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new ModbusAsciiInTcpProtocal(SlaveAddress, MasterAddress, Endian) ? new ModbusAsciiInTcpProtocol(SlaveAddress, MasterAddress, Endian)
: (ConnectionStringPort == null : (ConnectionStringPort == null
? new ModbusAsciiInTcpProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian) ? new ModbusAsciiInTcpProtocol(ConnectionString, SlaveAddress, MasterAddress, Endian)
: new ModbusAsciiInTcpProtocal(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress, : new ModbusAsciiInTcpProtocol(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress,
MasterAddress, Endian)); MasterAddress, Endian));
break; break;
} }
@@ -205,7 +205,7 @@ namespace Modbus.Net.Modbus
var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress); var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress);
var outputStruct = var outputStruct =
await Wrapper.SendReceiveAsync<GetSystemTimeModbusOutputStruct>( await Wrapper.SendReceiveAsync<GetSystemTimeModbusOutputStruct>(
Wrapper[typeof(GetSystemTimeModbusProtocal)], inputStruct); Wrapper[typeof(GetSystemTimeModbusProtocol)], inputStruct);
return outputStruct?.Time ?? DateTime.MinValue; return outputStruct?.Time ?? DateTime.MinValue;
} }
catch (Exception e) catch (Exception e)
@@ -227,7 +227,7 @@ namespace Modbus.Net.Modbus
var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime); var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime);
var outputStruct = var outputStruct =
await Wrapper.SendReceiveAsync<SetSystemTimeModbusOutputStruct>( await Wrapper.SendReceiveAsync<SetSystemTimeModbusOutputStruct>(
Wrapper[typeof(SetSystemTimeModbusProtocal)], inputStruct); Wrapper[typeof(SetSystemTimeModbusProtocol)], inputStruct);
return outputStruct?.WriteCount > 0; return outputStruct?.WriteCount > 0;
} }
catch (Exception e) catch (Exception e)
@@ -259,7 +259,7 @@ namespace Modbus.Net.Modbus
var inputStruct = new ReadDataModbusInputStruct(SlaveAddress, startAddress, var inputStruct = new ReadDataModbusInputStruct(SlaveAddress, startAddress,
(ushort) getByteCount, AddressTranslator); (ushort) getByteCount, AddressTranslator);
var outputStruct = await var outputStruct = await
Wrapper.SendReceiveAsync<ReadDataModbusOutputStruct>(Wrapper[typeof(ReadDataModbusProtocal)], Wrapper.SendReceiveAsync<ReadDataModbusOutputStruct>(Wrapper[typeof(ReadDataModbusProtocol)],
inputStruct); inputStruct);
return outputStruct?.DataValue; return outputStruct?.DataValue;
} }
@@ -283,7 +283,7 @@ namespace Modbus.Net.Modbus
var inputStruct = new WriteDataModbusInputStruct(SlaveAddress, startAddress, setContents, var inputStruct = new WriteDataModbusInputStruct(SlaveAddress, startAddress, setContents,
AddressTranslator, Endian); AddressTranslator, Endian);
var outputStruct = await var outputStruct = await
Wrapper.SendReceiveAsync<WriteDataModbusOutputStruct>(Wrapper[typeof(WriteDataModbusProtocal)], Wrapper.SendReceiveAsync<WriteDataModbusOutputStruct>(Wrapper[typeof(WriteDataModbusProtocol)],
inputStruct); inputStruct);
return outputStruct?.WriteCount == setContents.Length; return outputStruct?.WriteCount == setContents.Length;
} }
@@ -307,7 +307,7 @@ namespace Modbus.Net.Modbus
var inputStruct = new WriteSingleDataModbusInputStruct(SlaveAddress, startAddress, setContent, var inputStruct = new WriteSingleDataModbusInputStruct(SlaveAddress, startAddress, setContent,
(ModbusTranslatorBase)AddressTranslator, Endian); (ModbusTranslatorBase)AddressTranslator, Endian);
var outputStruct = await var outputStruct = await
Wrapper.SendReceiveAsync<WriteSingleDataModbusOutputStruct>(Wrapper[typeof(WriteSingleDataModbusProtocal)], Wrapper.SendReceiveAsync<WriteSingleDataModbusOutputStruct>(Wrapper[typeof(WriteSingleDataModbusProtocol)],
inputStruct); inputStruct);
return outputStruct?.WriteValue.ToString() == setContent.ToString(); return outputStruct?.WriteValue.ToString() == setContent.ToString();
} }

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.OPC
/// <summary> /// <summary>
/// Opc Da协议 /// Opc Da协议
/// </summary> /// </summary>
public class OpcDaProtocal : OpcProtocal public class OpcDaProtocol : OpcProtocol
{ {
private readonly string _host; private readonly string _host;
@@ -16,7 +16,7 @@ namespace Modbus.Net.OPC
/// </summary> /// </summary>
/// <param name="host">Opc DA服务地址</param> /// <param name="host">Opc DA服务地址</param>
/// <param name="isRegexOn">是否开启正则匹配</param> /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaProtocal(string host, bool isRegexOn) public OpcDaProtocol(string host, bool isRegexOn)
{ {
_host = host; _host = host;
_isRegexOn = isRegexOn; _isRegexOn = isRegexOn;
@@ -28,8 +28,8 @@ namespace Modbus.Net.OPC
/// <returns>是否连接成功</returns> /// <returns>是否连接成功</returns>
public override async Task<bool> ConnectAsync() public override async Task<bool> ConnectAsync()
{ {
ProtocalLinker = new OpcDaProtocalLinker(_host, _isRegexOn); ProtocolLinker = new OpcDaProtocolLinker(_host, _isRegexOn);
if (!await ProtocalLinker.ConnectAsync()) if (!await ProtocolLinker.ConnectAsync())
return false; return false;
return true; return true;
} }

View File

@@ -5,13 +5,13 @@ namespace Modbus.Net.OPC
/// <summary> /// <summary>
/// Opc Da协议连接器 /// Opc Da协议连接器
/// </summary> /// </summary>
public class OpcDaProtocalLinker : OpcProtocalLinker public class OpcDaProtocolLinker : OpcProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="isRegexOn">是否开启正则匹配</param> /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaProtocalLinker(bool isRegexOn) : this(ConfigurationManager.AppSettings["OpcDaHost"], isRegexOn) public OpcDaProtocolLinker(bool isRegexOn) : this(ConfigurationManager.AppSettings["OpcDaHost"], isRegexOn)
{ {
} }
@@ -20,7 +20,7 @@ namespace Modbus.Net.OPC
/// </summary> /// </summary>
/// <param name="host">Opc DA服务地址</param> /// <param name="host">Opc DA服务地址</param>
/// <param name="isRegexOn">是否开启正则匹配</param> /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaProtocalLinker(string host, bool isRegexOn) public OpcDaProtocolLinker(string host, bool isRegexOn)
{ {
BaseConnector = OpcDaConnector.Instance(host, isRegexOn); BaseConnector = OpcDaConnector.Instance(host, isRegexOn);
} }

View File

@@ -12,7 +12,7 @@
/// <param name="isRegexOn">是否开启正则匹配</param> /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcDaUtility(string connectionString, bool isRegexOn = false) : base(connectionString) public OpcDaUtility(string connectionString, bool isRegexOn = false) : base(connectionString)
{ {
Wrapper = new OpcDaProtocal(ConnectionString, isRegexOn); Wrapper = new OpcDaProtocol(ConnectionString, isRegexOn);
} }
} }
} }

View File

@@ -3,14 +3,14 @@
/// <summary> /// <summary>
/// Opc协议 /// Opc协议
/// </summary> /// </summary>
public abstract class OpcProtocal : BaseProtocal<OpcParamIn, OpcParamOut, ProtocalUnit<OpcParamIn, OpcParamOut>, public abstract class OpcProtocol : BaseProtocol<OpcParamIn, OpcParamOut, ProtocolUnit<OpcParamIn, OpcParamOut>,
PipeUnit<OpcParamIn, OpcParamOut, IProtocalLinker<OpcParamIn, OpcParamOut>, PipeUnit<OpcParamIn, OpcParamOut, IProtocolLinker<OpcParamIn, OpcParamOut>,
ProtocalUnit<OpcParamIn, OpcParamOut>>> ProtocolUnit<OpcParamIn, OpcParamOut>>>
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
protected OpcProtocal() : base(0, 0, Endian.BigEndianLsb) protected OpcProtocol() : base(0, 0, Endian.BigEndianLsb)
{ {
} }
} }
@@ -67,8 +67,8 @@
/// <summary> /// <summary>
/// 读数据协议 /// 读数据协议
/// </summary> /// </summary>
[SpecialProtocalUnit] [SpecialProtocolUnit]
public class ReadRequestOpcProtocal : ProtocalUnit<OpcParamIn, OpcParamOut> public class ReadRequestOpcProtocol : ProtocolUnit<OpcParamIn, OpcParamOut>
{ {
/// <summary> /// <summary>
/// 从对象的参数数组格式化 /// 从对象的参数数组格式化
@@ -159,8 +159,8 @@
/// <summary> /// <summary>
/// 写数据协议 /// 写数据协议
/// </summary> /// </summary>
[SpecialProtocalUnit] [SpecialProtocolUnit]
public class WriteRequestOpcProtocal : ProtocalUnit<OpcParamIn, OpcParamOut> public class WriteRequestOpcProtocol : ProtocolUnit<OpcParamIn, OpcParamOut>
{ {
/// <summary> /// <summary>
/// 从对象的参数数组格式化 /// 从对象的参数数组格式化

View File

@@ -6,7 +6,7 @@ namespace Modbus.Net.OPC
/// <summary> /// <summary>
/// Opc协议连接器 /// Opc协议连接器
/// </summary> /// </summary>
public abstract class OpcProtocalLinker : ProtocalLinker<OpcParamIn, OpcParamOut> public abstract class OpcProtocolLinker : ProtocolLinker<OpcParamIn, OpcParamOut>
{ {
/// <summary> /// <summary>
/// 发送并接收数据 /// 发送并接收数据

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.OPC
/// <summary> /// <summary>
/// Opc UA协议 /// Opc UA协议
/// </summary> /// </summary>
public class OpcUaProtocal : OpcProtocal public class OpcUaProtocol : OpcProtocol
{ {
private readonly string _host; private readonly string _host;
@@ -16,7 +16,7 @@ namespace Modbus.Net.OPC
/// </summary> /// </summary>
/// <param name="host">Opc UA服务地址</param> /// <param name="host">Opc UA服务地址</param>
/// <param name="isRegexOn">是否开启正则匹配</param> /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaProtocal(string host, bool isRegexOn) public OpcUaProtocol(string host, bool isRegexOn)
{ {
_host = host; _host = host;
_isRegexOn = isRegexOn; _isRegexOn = isRegexOn;
@@ -28,8 +28,8 @@ namespace Modbus.Net.OPC
/// <returns>是否连接成功</returns> /// <returns>是否连接成功</returns>
public override async Task<bool> ConnectAsync() public override async Task<bool> ConnectAsync()
{ {
ProtocalLinker = new OpcUaProtocalLinker(_host, _isRegexOn); ProtocolLinker = new OpcUaProtocolLinker(_host, _isRegexOn);
if (!await ProtocalLinker.ConnectAsync()) return false; if (!await ProtocolLinker.ConnectAsync()) return false;
return true; return true;
} }
} }

View File

@@ -5,13 +5,13 @@ namespace Modbus.Net.OPC
/// <summary> /// <summary>
/// Opc UA协议连接器 /// Opc UA协议连接器
/// </summary> /// </summary>
public class OpcUaProtocalLinker : OpcProtocalLinker public class OpcUaProtocolLinker : OpcProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="isRegexOn">是否开启正则匹配</param> /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaProtocalLinker(bool isRegexOn) : this(ConfigurationManager.AppSettings["OpcUaHost"], isRegexOn) public OpcUaProtocolLinker(bool isRegexOn) : this(ConfigurationManager.AppSettings["OpcUaHost"], isRegexOn)
{ {
} }
@@ -20,7 +20,7 @@ namespace Modbus.Net.OPC
/// </summary> /// </summary>
/// <param name="host">Opc UA服务地址</param> /// <param name="host">Opc UA服务地址</param>
/// <param name="isRegexOn">是否开启正则匹配</param> /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaProtocalLinker(string host, bool isRegexOn) public OpcUaProtocolLinker(string host, bool isRegexOn)
{ {
BaseConnector = OpcUaConnector.Instance(host, isRegexOn); BaseConnector = OpcUaConnector.Instance(host, isRegexOn);
} }

View File

@@ -12,7 +12,7 @@
/// <param name="isRegexOn">是否开启正则匹配</param> /// <param name="isRegexOn">是否开启正则匹配</param>
public OpcUaUtility(string connectionString, bool isRegexOn = false) : base(connectionString) public OpcUaUtility(string connectionString, bool isRegexOn = false) : base(connectionString)
{ {
Wrapper = new OpcUaProtocal(ConnectionString, isRegexOn); Wrapper = new OpcUaProtocol(ConnectionString, isRegexOn);
} }
} }
} }

View File

@@ -7,9 +7,9 @@ namespace Modbus.Net.OPC
/// <summary> /// <summary>
/// Opc通用Api入口 /// Opc通用Api入口
/// </summary> /// </summary>
public abstract class OpcUtility : BaseUtility<OpcParamIn, OpcParamOut, ProtocalUnit<OpcParamIn, OpcParamOut>, public abstract class OpcUtility : BaseUtility<OpcParamIn, OpcParamOut, ProtocolUnit<OpcParamIn, OpcParamOut>,
PipeUnit<OpcParamIn, OpcParamOut, IProtocalLinker<OpcParamIn, OpcParamOut>, PipeUnit<OpcParamIn, OpcParamOut, IProtocolLinker<OpcParamIn, OpcParamOut>,
ProtocalUnit<OpcParamIn, OpcParamOut>>> ProtocolUnit<OpcParamIn, OpcParamOut>>>
{ {
/// <summary> /// <summary>
/// 获取分隔符 /// 获取分隔符
@@ -60,7 +60,7 @@ namespace Modbus.Net.OPC
var readRequestOpcInputStruct = new ReadRequestOpcInputStruct(startAddress.Split('\r'), split); var readRequestOpcInputStruct = new ReadRequestOpcInputStruct(startAddress.Split('\r'), split);
var readRequestOpcOutputStruct = var readRequestOpcOutputStruct =
await await
Wrapper.SendReceiveAsync<ReadRequestOpcOutputStruct>(Wrapper[typeof(ReadRequestOpcProtocal)], Wrapper.SendReceiveAsync<ReadRequestOpcOutputStruct>(Wrapper[typeof(ReadRequestOpcProtocol)],
readRequestOpcInputStruct); readRequestOpcInputStruct);
return readRequestOpcOutputStruct?.GetValue; return readRequestOpcOutputStruct?.GetValue;
} }
@@ -86,7 +86,7 @@ namespace Modbus.Net.OPC
new WriteRequestOpcInputStruct(startAddress.Split('\r'), split, setContents[0]); new WriteRequestOpcInputStruct(startAddress.Split('\r'), split, setContents[0]);
var writeRequestOpcOutputStruct = var writeRequestOpcOutputStruct =
await await
Wrapper.SendReceiveAsync<WriteRequestOpcOutputStruct>(Wrapper[typeof(WriteRequestOpcProtocal)], Wrapper.SendReceiveAsync<WriteRequestOpcOutputStruct>(Wrapper[typeof(WriteRequestOpcProtocol)],
writeRequestOpcInputStruct); writeRequestOpcInputStruct);
return writeRequestOpcOutputStruct?.WriteResult == true; return writeRequestOpcOutputStruct?.WriteResult == true;
} }

View File

@@ -6,7 +6,7 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 西门子Ppi协议 /// 西门子Ppi协议
/// </summary> /// </summary>
public class SiemensPpiProtocal : SiemensProtocal public class SiemensPpiProtocol : SiemensProtocol
{ {
private readonly string _com; private readonly string _com;
@@ -15,7 +15,7 @@ namespace Modbus.Net.Siemens
/// </summary> /// </summary>
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
public SiemensPpiProtocal(byte slaveAddress, byte masterAddress) public SiemensPpiProtocol(byte slaveAddress, byte masterAddress)
: this(ConfigurationManager.AppSettings["COM"], slaveAddress, masterAddress) : this(ConfigurationManager.AppSettings["COM"], slaveAddress, masterAddress)
{ {
} }
@@ -26,7 +26,7 @@ namespace Modbus.Net.Siemens
/// <param name="com">串口地址</param> /// <param name="com">串口地址</param>
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
public SiemensPpiProtocal(string com, byte slaveAddress, byte masterAddress) public SiemensPpiProtocol(string com, byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress) : base(slaveAddress, masterAddress)
{ {
_com = com; _com = com;
@@ -49,7 +49,7 @@ namespace Modbus.Net.Siemens
/// <returns>从设备获取的字节流</returns> /// <returns>从设备获取的字节流</returns>
public override async Task<PipeUnit> SendReceiveAsync(params object[] content) public override async Task<PipeUnit> SendReceiveAsync(params object[] content)
{ {
if (ProtocalLinker == null || !ProtocalLinker.IsConnected) if (ProtocolLinker == null || !ProtocolLinker.IsConnected)
await ConnectAsync(); await ConnectAsync();
return await base.SendReceiveAsync(Endian, content); return await base.SendReceiveAsync(Endian, content);
} }
@@ -60,7 +60,7 @@ namespace Modbus.Net.Siemens
/// <param name="unit">协议核心</param> /// <param name="unit">协议核心</param>
/// <param name="content">协议的参数</param> /// <param name="content">协议的参数</param>
/// <returns>设备返回的信息</returns> /// <returns>设备返回的信息</returns>
private async Task<PipeUnit> ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content) private async Task<PipeUnit> ForceSendReceiveAsync(ProtocolUnit unit, IInputStruct content)
{ {
return await base.SendReceiveAsync(unit, content); return await base.SendReceiveAsync(unit, content);
} }
@@ -71,13 +71,13 @@ namespace Modbus.Net.Siemens
/// <returns>是否连接成功</returns> /// <returns>是否连接成功</returns>
public override async Task<bool> ConnectAsync() public override async Task<bool> ConnectAsync()
{ {
ProtocalLinker = new SiemensPpiProtocalLinker(_com, SlaveAddress); ProtocolLinker = new SiemensPpiProtocolLinker(_com, SlaveAddress);
var inputStruct = new ComCreateReferenceSiemensInputStruct(SlaveAddress, MasterAddress); var inputStruct = new ComCreateReferenceSiemensInputStruct(SlaveAddress, MasterAddress);
var outputStruct = var outputStruct =
(await (await (await (await
ForceSendReceiveAsync(this[typeof(ComCreateReferenceSiemensProtocal)], ForceSendReceiveAsync(this[typeof(ComCreateReferenceSiemensProtocol)],
inputStruct)). inputStruct)).
SendReceiveAsync(this[typeof(ComConfirmMessageSiemensProtocal)], answer => SendReceiveAsync(this[typeof(ComConfirmMessageSiemensProtocol)], answer =>
new ComConfirmMessageSiemensInputStruct(SlaveAddress, MasterAddress) new ComConfirmMessageSiemensInputStruct(SlaveAddress, MasterAddress)
)).Unwrap<ComConfirmMessageSiemensOutputStruct>(); )).Unwrap<ComConfirmMessageSiemensOutputStruct>();

View File

@@ -1,4 +1,5 @@
using System.IO.Ports; using System.Collections.Generic;
using System.IO.Ports;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -7,17 +8,17 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 西门子Ppi协议连接器 /// 西门子Ppi协议连接器
/// </summary> /// </summary>
public class SiemensPpiProtocalLinker : ComProtocalLinker public class SiemensPpiProtocolLinker : ComProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="com">串口地址</param> /// <param name="com">串口地址</param>
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
public SiemensPpiProtocalLinker(string com, int slaveAddress) public SiemensPpiProtocolLinker(string com, int slaveAddress)
: base(com, 9600, Parity.Even, StopBits.One, 8, slaveAddress) : base(com, 9600, Parity.Even, StopBits.One, 8, slaveAddress)
{ {
((BaseConnector)BaseConnector).AddController(new FIFOController(500)); ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<int>[] { new List<int> { 5 }, new List<int> { 6 }, new List<int> { 11, 12 } }, 500));
} }
/// <summary> /// <summary>
@@ -33,7 +34,7 @@ namespace Modbus.Net.Siemens
var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[4], content[5]); var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[4], content[5]);
var receiveBytes2 = var receiveBytes2 =
await SendReceiveWithoutExtAndDecAsync( await SendReceiveWithoutExtAndDecAsync(
new ComConfirmMessageSiemensProtocal().Format(inputStruct2)); new ComConfirmMessageSiemensProtocol().Format(inputStruct2));
} }
var receiveBytes = await SendReceiveWithoutExtAndDecAsync(extBytes); var receiveBytes = await SendReceiveWithoutExtAndDecAsync(extBytes);
if (content.Length > 6 && receiveBytes.Length == 1 && receiveBytes[0] == 0xe5) if (content.Length > 6 && receiveBytes.Length == 1 && receiveBytes[0] == 0xe5)
@@ -41,7 +42,7 @@ namespace Modbus.Net.Siemens
var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[4], content[5]); var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[4], content[5]);
var receiveBytes2 = var receiveBytes2 =
await SendReceiveWithoutExtAndDecAsync( await SendReceiveWithoutExtAndDecAsync(
new ComConfirmMessageSiemensProtocal().Format(inputStruct2)); new ComConfirmMessageSiemensProtocol().Format(inputStruct2));
return BytesDecact(receiveBytes2); return BytesDecact(receiveBytes2);
} }
return BytesDecact(receiveBytes); return BytesDecact(receiveBytes);
@@ -63,14 +64,14 @@ namespace Modbus.Net.Siemens
var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[1], content[2]); var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[1], content[2]);
ans = ans =
await SendReceiveWithoutExtAndDecAsync( await SendReceiveWithoutExtAndDecAsync(
new ComConfirmMessageSiemensProtocal().Format(inputStruct2)); new ComConfirmMessageSiemensProtocol().Format(inputStruct2));
} }
else else
{ {
var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[4], content[5]); var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[4], content[5]);
ans = ans =
await SendReceiveWithoutExtAndDecAsync( await SendReceiveWithoutExtAndDecAsync(
new ComConfirmMessageSiemensProtocal().Format(inputStruct2)); new ComConfirmMessageSiemensProtocol().Format(inputStruct2));
} }
} }
return ans; return ans;

View File

@@ -105,14 +105,14 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 西门子协议 /// 西门子协议
/// </summary> /// </summary>
public abstract class SiemensProtocal : BaseProtocal public abstract class SiemensProtocol : BaseProtocol
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="slaveAddress">从站号</param> /// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param> /// <param name="masterAddress">主站号</param>
protected SiemensProtocal(byte slaveAddress, byte masterAddress) protected SiemensProtocol(byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress, Endian.BigEndianLsb) : base(slaveAddress, masterAddress, Endian.BigEndianLsb)
{ {
} }
@@ -146,8 +146,8 @@ namespace Modbus.Net.Siemens
public byte ConfirmMessage { get; set; } public byte ConfirmMessage { get; set; }
} }
[SpecialProtocalUnit] [SpecialProtocolUnit]
internal class ComCreateReferenceSiemensProtocal : ProtocalUnit internal class ComCreateReferenceSiemensProtocol : ProtocolUnit
{ {
public override byte[] Format(IInputStruct message) public override byte[] Format(IInputStruct message)
{ {
@@ -201,8 +201,8 @@ namespace Modbus.Net.Siemens
public ushort TsapDst { get; } public ushort TsapDst { get; }
} }
[SpecialProtocalUnit] [SpecialProtocolUnit]
internal class CreateReferenceSiemensProtocal : ProtocalUnit internal class CreateReferenceSiemensProtocol : ProtocolUnit
{ {
public override byte[] Format(IInputStruct message) public override byte[] Format(IInputStruct message)
{ {
@@ -308,8 +308,8 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 串口消息确认协议 /// 串口消息确认协议
/// </summary> /// </summary>
[SpecialProtocalUnit] [SpecialProtocolUnit]
public class ComConfirmMessageSiemensProtocal : ProtocalUnit public class ComConfirmMessageSiemensProtocol : ProtocolUnit
{ {
/// <summary> /// <summary>
/// 格式化 /// 格式化
@@ -374,7 +374,7 @@ namespace Modbus.Net.Siemens
public ushort MaxPdu { get; } public ushort MaxPdu { get; }
} }
internal class EstablishAssociationSiemensProtocal : ProtocalUnit internal class EstablishAssociationSiemensProtocol : ProtocolUnit
{ {
public override byte[] Format(IInputStruct message) public override byte[] Format(IInputStruct message)
{ {
@@ -533,7 +533,7 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 读数据协议 /// 读数据协议
/// </summary> /// </summary>
public class ReadRequestSiemensProtocal : ProtocalUnit public class ReadRequestSiemensProtocol : ProtocolUnit
{ {
/// <summary> /// <summary>
/// 格式化 /// 格式化
@@ -688,7 +688,7 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 写数据协议 /// 写数据协议
/// </summary> /// </summary>
public class WriteRequestSiemensProtocal : ProtocalUnit public class WriteRequestSiemensProtocol : ProtocolUnit
{ {
/// <summary> /// <summary>
/// 格式化 /// 格式化
@@ -780,7 +780,7 @@ namespace Modbus.Net.Siemens
public TodClockStatus TodClockStatus { get; private set; } public TodClockStatus TodClockStatus { get; private set; }
} }
public class ReadTimeSiemensProtocal : ProtocalUnit public class ReadTimeSiemensProtocol : ProtocolUnit
{ {
public override byte[] Format(IInputStruct message) public override byte[] Format(IInputStruct message)
{ {
@@ -823,7 +823,7 @@ namespace Modbus.Net.Siemens
public byte ErrCod { get;private set; } public byte ErrCod { get;private set; }
} }
public class WriteTimeSiemensProtocal : ProtocalUnit public class WriteTimeSiemensProtocol : ProtocolUnit
{ {
public override byte[] Format(IInputStruct message) public override byte[] Format(IInputStruct message)
{ {
@@ -842,9 +842,9 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 西门子通讯报错信息 /// 西门子通讯报错信息
/// </summary> /// </summary>
public class SiemensProtocalErrorException : ProtocalErrorException public class SiemensProtocolErrorException : ProtocolErrorException
{ {
private static readonly Dictionary<int, string> ProtocalErrorDictionary = new Dictionary<int, string> private static readonly Dictionary<int, string> ProtocolErrorDictionary = new Dictionary<int, string>
{ {
{0x00, "No Error"}, {0x00, "No Error"},
{0x81, "Error in the application Id of the request"}, {0x81, "Error in the application Id of the request"},
@@ -860,7 +860,7 @@ namespace Modbus.Net.Siemens
{0xEF, "Layer 2 specific error"} {0xEF, "Layer 2 specific error"}
}; };
private static readonly Dictionary<int, string> ProtocalErrorDetailDictionary = new Dictionary<int, string> private static readonly Dictionary<int, string> ProtocolErrorDetailDictionary = new Dictionary<int, string>
{ {
{0x8304, "Resource not available,\r\n there are no more resources available for application associations to be established" }, {0x8304, "Resource not available,\r\n there are no more resources available for application associations to be established" },
{0x8104, "Context is not supported:\r\n -Error in PDU structure\r\n -Unknown service" }, {0x8104, "Context is not supported:\r\n -Error in PDU structure\r\n -Unknown service" },
@@ -873,12 +873,12 @@ namespace Modbus.Net.Siemens
/// </summary> /// </summary>
/// <param name="errCls">错误分类</param> /// <param name="errCls">错误分类</param>
/// <param name="errCod">错误码</param> /// <param name="errCod">错误码</param>
public SiemensProtocalErrorException(int errCls, int errCod) public SiemensProtocolErrorException(int errCls, int errCod)
: base((ProtocalErrorDictionary.ContainsKey(errCls) : base((ProtocolErrorDictionary.ContainsKey(errCls)
? ProtocalErrorDictionary[errCls] ? ProtocolErrorDictionary[errCls]
: "Unknown error") + " \r\n " + : "Unknown error") + " \r\n " +
(ProtocalErrorDetailDictionary.ContainsKey(errCls * 256 + errCod) (ProtocolErrorDetailDictionary.ContainsKey(errCls * 256 + errCod)
? ProtocalErrorDetailDictionary[errCls * 256 + errCod] ? ProtocolErrorDetailDictionary[errCls * 256 + errCod]
: "Unknown error detail")) : "Unknown error detail"))
{ {
ErrorClass = errCls; ErrorClass = errCls;

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 西门子Tcp协议扩展 /// 西门子Tcp协议扩展
/// </summary> /// </summary>
public class SiemensTcpProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend public class SiemensTcpProtocolLinkerBytesExtend : IProtocolLinkerBytesExtend
{ {
/// <summary> /// <summary>
/// 协议扩展,协议内容发送前调用 /// 协议扩展,协议内容发送前调用
@@ -35,7 +35,7 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 西门子Ppi协议扩展 /// 西门子Ppi协议扩展
/// </summary> /// </summary>
public class SiemensPpiProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend public class SiemensPpiProtocolLinkerBytesExtend : IProtocolLinkerBytesExtend
{ {
/// <summary> /// <summary>
/// 协议扩展,协议内容发送前调用 /// 协议扩展,协议内容发送前调用

View File

@@ -6,7 +6,7 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 西门子Tcp协议 /// 西门子Tcp协议
/// </summary> /// </summary>
public class SiemensTcpProtocal : SiemensProtocal public class SiemensTcpProtocol : SiemensProtocol
{ {
private readonly string _ip; private readonly string _ip;
private readonly ushort _maxCalled; private readonly ushort _maxCalled;
@@ -27,7 +27,7 @@ namespace Modbus.Net.Siemens
/// <param name="maxCalling"></param> /// <param name="maxCalling"></param>
/// <param name="maxCalled"></param> /// <param name="maxCalled"></param>
/// <param name="maxPdu"></param> /// <param name="maxPdu"></param>
public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, public SiemensTcpProtocol(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled,
ushort maxPdu) ushort maxPdu)
: this(tdpuSize, tsapSrc, tsapDst, maxCalling, maxCalled, maxPdu, ConfigurationManager.AppSettings["IP"]) : this(tdpuSize, tsapSrc, tsapDst, maxCalling, maxCalled, maxPdu, ConfigurationManager.AppSettings["IP"])
{ {
@@ -43,7 +43,7 @@ namespace Modbus.Net.Siemens
/// <param name="maxCalled"></param> /// <param name="maxCalled"></param>
/// <param name="maxPdu"></param> /// <param name="maxPdu"></param>
/// <param name="ip">IP地址</param> /// <param name="ip">IP地址</param>
public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, public SiemensTcpProtocol(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled,
ushort maxPdu, string ip) ushort maxPdu, string ip)
: this( : this(
tdpuSize, tsapSrc, tsapDst, maxCalling, maxCalled, maxPdu, ip, tdpuSize, tsapSrc, tsapDst, maxCalling, maxCalled, maxPdu, ip,
@@ -62,7 +62,7 @@ namespace Modbus.Net.Siemens
/// <param name="maxPdu"></param> /// <param name="maxPdu"></param>
/// <param name="ip">IP地址</param> /// <param name="ip">IP地址</param>
/// <param name="port">端口</param> /// <param name="port">端口</param>
public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, public SiemensTcpProtocol(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled,
ushort maxPdu, string ip, int port) : base(0, 0) ushort maxPdu, string ip, int port) : base(0, 0)
{ {
_taspSrc = tsapSrc; _taspSrc = tsapSrc;
@@ -93,7 +93,7 @@ namespace Modbus.Net.Siemens
/// <returns>返回的数据</returns> /// <returns>返回的数据</returns>
public override async Task<PipeUnit> SendReceiveAsync(params object[] content) public override async Task<PipeUnit> SendReceiveAsync(params object[] content)
{ {
if (ProtocalLinker == null || !ProtocalLinker.IsConnected) if (ProtocolLinker == null || !ProtocolLinker.IsConnected)
await ConnectAsync(); await ConnectAsync();
return await base.SendReceiveAsync(Endian, content); return await base.SendReceiveAsync(Endian, content);
} }
@@ -104,7 +104,7 @@ namespace Modbus.Net.Siemens
/// <param name="unit">协议的核心</param> /// <param name="unit">协议的核心</param>
/// <param name="content">协议的参数</param> /// <param name="content">协议的参数</param>
/// <returns>返回的数据</returns> /// <returns>返回的数据</returns>
public override PipeUnit SendReceive(ProtocalUnit unit, IInputStruct content) public override PipeUnit SendReceive(ProtocolUnit unit, IInputStruct content)
{ {
return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content)); return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content));
} }
@@ -115,9 +115,9 @@ namespace Modbus.Net.Siemens
/// <param name="unit">发送的数据</param> /// <param name="unit">发送的数据</param>
/// <param name="content">协议的参数</param> /// <param name="content">协议的参数</param>
/// <returns>返回的数据</returns> /// <returns>返回的数据</returns>
public override async Task<PipeUnit> SendReceiveAsync(ProtocalUnit unit, IInputStruct content) public override async Task<PipeUnit> SendReceiveAsync(ProtocolUnit unit, IInputStruct content)
{ {
if (ProtocalLinker != null && ProtocalLinker.IsConnected) return await base.SendReceiveAsync(unit, content); if (ProtocolLinker != null && ProtocolLinker.IsConnected) return await base.SendReceiveAsync(unit, content);
if (_connectTryCount > 10) return null; if (_connectTryCount > 10) return null;
return return
await await
@@ -131,7 +131,7 @@ namespace Modbus.Net.Siemens
/// <param name="unit">发送的数据</param> /// <param name="unit">发送的数据</param>
/// <param name="content">协议的参数</param> /// <param name="content">协议的参数</param>
/// <returns>返回的数据</returns> /// <returns>返回的数据</returns>
private async Task<PipeUnit> ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content) private async Task<PipeUnit> ForceSendReceiveAsync(ProtocolUnit unit, IInputStruct content)
{ {
return await base.SendReceiveAsync(unit, content); return await base.SendReceiveAsync(unit, content);
} }
@@ -143,15 +143,15 @@ namespace Modbus.Net.Siemens
public override async Task<bool> ConnectAsync() public override async Task<bool> ConnectAsync()
{ {
_connectTryCount++; _connectTryCount++;
ProtocalLinker = new SiemensTcpProtocalLinker(_ip, _port); ProtocolLinker = new SiemensTcpProtocolLinker(_ip, _port);
if (!await ProtocalLinker.ConnectAsync()) return false; if (!await ProtocolLinker.ConnectAsync()) return false;
_connectTryCount = 0; _connectTryCount = 0;
var inputStruct = new CreateReferenceSiemensInputStruct(_tdpuSize, _taspSrc, _tsapDst); var inputStruct = new CreateReferenceSiemensInputStruct(_tdpuSize, _taspSrc, _tsapDst);
var outputStruct = var outputStruct =
//先建立连接,然后建立设备的引用 //先建立连接,然后建立设备的引用
(await (await (await (await
ForceSendReceiveAsync(this[typeof(CreateReferenceSiemensProtocal)], inputStruct)).SendReceiveAsync( ForceSendReceiveAsync(this[typeof(CreateReferenceSiemensProtocol)], inputStruct)).SendReceiveAsync(
this[typeof(EstablishAssociationSiemensProtocal)], answer => this[typeof(EstablishAssociationSiemensProtocol)], answer =>
new EstablishAssociationSiemensInputStruct(0x0101, _maxCalling, new EstablishAssociationSiemensInputStruct(0x0101, _maxCalling,
_maxCalled, _maxCalled,
_maxPdu))).Unwrap<EstablishAssociationSiemensOutputStruct>(); _maxPdu))).Unwrap<EstablishAssociationSiemensOutputStruct>();

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Configuration; using System.Configuration;
namespace Modbus.Net.Siemens namespace Modbus.Net.Siemens
@@ -6,13 +7,13 @@ namespace Modbus.Net.Siemens
/// <summary> /// <summary>
/// 西门子Tcp协议连接器 /// 西门子Tcp协议连接器
/// </summary> /// </summary>
public class SiemensTcpProtocalLinker : TcpProtocalLinker public class SiemensTcpProtocolLinker : TcpProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="ip">IP地址</param> /// <param name="ip">IP地址</param>
public SiemensTcpProtocalLinker(string ip) public SiemensTcpProtocolLinker(string ip)
: this(ip, int.Parse(ConfigurationManager.AppSettings["SiemensPort"] ?? "102")) : this(ip, int.Parse(ConfigurationManager.AppSettings["SiemensPort"] ?? "102"))
{ {
} }
@@ -22,10 +23,10 @@ namespace Modbus.Net.Siemens
/// </summary> /// </summary>
/// <param name="ip">IP地址</param> /// <param name="ip">IP地址</param>
/// <param name="port">端口</param> /// <param name="port">端口</param>
public SiemensTcpProtocalLinker(string ip, int port) public SiemensTcpProtocolLinker(string ip, int port)
: base(ip, port) : base(ip, port)
{ {
((BaseConnector)BaseConnector).AddController(new FIFOController(500)); ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<int>[] { new List<int> { 11, 12 } }, 500));
} }
/// <summary> /// <summary>
@@ -48,10 +49,10 @@ namespace Modbus.Net.Siemens
case 0x02: case 0x02:
case 0x03: case 0x03:
if (content[17] == 0x00 && content[18] == 0x00) return true; if (content[17] == 0x00 && content[18] == 0x00) return true;
throw new SiemensProtocalErrorException(content[17], content[18]); throw new SiemensProtocolErrorException(content[17], content[18]);
case 0x07: case 0x07:
if (content[27] == 0x00 && content[28] == 0x00) return true; if (content[27] == 0x00 && content[28] == 0x00) return true;
throw new SiemensProtocalErrorException(content[27], content[28]); throw new SiemensProtocolErrorException(content[27], content[28]);
} }
return true; return true;
default: default:

View File

@@ -187,8 +187,8 @@ namespace Modbus.Net.Siemens
case SiemensType.Ppi: case SiemensType.Ppi:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new SiemensPpiProtocal(SlaveAddress, MasterAddress) ? new SiemensPpiProtocol(SlaveAddress, MasterAddress)
: new SiemensPpiProtocal(ConnectionString, SlaveAddress, MasterAddress); : new SiemensPpiProtocol(ConnectionString, SlaveAddress, MasterAddress);
break; break;
} }
//MPI //MPI
@@ -200,11 +200,11 @@ namespace Modbus.Net.Siemens
case SiemensType.Tcp: case SiemensType.Tcp:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu) ? new SiemensTcpProtocol(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu)
: (ConnectionStringPort == null : (ConnectionStringPort == null
? new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu, ? new SiemensTcpProtocol(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu,
ConnectionString) ConnectionString)
: new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu, : new SiemensTcpProtocol(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu,
ConnectionStringIp, ConnectionStringPort.Value)); ConnectionStringIp, ConnectionStringPort.Value));
break; break;
} }
@@ -236,7 +236,7 @@ namespace Modbus.Net.Siemens
var readRequestSiemensOutputStruct = var readRequestSiemensOutputStruct =
await await
Wrapper.SendReceiveAsync<ReadRequestSiemensOutputStruct>( Wrapper.SendReceiveAsync<ReadRequestSiemensOutputStruct>(
Wrapper[typeof(ReadRequestSiemensProtocal)], Wrapper[typeof(ReadRequestSiemensProtocol)],
readRequestSiemensInputStruct); readRequestSiemensInputStruct);
return readRequestSiemensOutputStruct?.GetValue; return readRequestSiemensOutputStruct?.GetValue;
} }
@@ -262,7 +262,7 @@ namespace Modbus.Net.Siemens
var writeRequestSiemensOutputStruct = var writeRequestSiemensOutputStruct =
await await
Wrapper.SendReceiveAsync<WriteRequestSiemensOutputStruct>( Wrapper.SendReceiveAsync<WriteRequestSiemensOutputStruct>(
Wrapper[typeof(WriteRequestSiemensProtocal)], Wrapper[typeof(WriteRequestSiemensProtocol)],
writeRequestSiemensInputStruct); writeRequestSiemensInputStruct);
return writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError; return writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError;
} }

View File

@@ -76,7 +76,7 @@ namespace Modbus.Net
//按从小到大的顺序对地址进行排序 //按从小到大的顺序对地址进行排序
var groupedAddresses = from address in addresses var groupedAddresses = from address in addresses
orderby orderby
AddressHelper.GetProtocalCoordinate(address.Address, address.SubAddress, AddressHelper.GetProtocolCoordinate(address.Address, address.SubAddress,
AddressTranslator.GetAreaByteLength(address.Area)) AddressTranslator.GetAreaByteLength(address.Area))
group address by address.Area group address by address.Area
into grouped into grouped
@@ -97,42 +97,42 @@ namespace Modbus.Net
var orderedAddresses = var orderedAddresses =
groupedAddress.OrderBy( groupedAddress.OrderBy(
address => address =>
AddressHelper.GetProtocalCoordinate(address.Address, address.SubAddress, AddressHelper.GetProtocolCoordinate(address.Address, address.SubAddress,
AddressTranslator.GetAreaByteLength(address.Area))); AddressTranslator.GetAreaByteLength(address.Area)));
foreach (var address in orderedAddresses) foreach (var address in orderedAddresses)
{ {
//第一次进入时直接压入地址 //第一次进入时直接压入地址
if (initNum < 0) if (initNum < 0)
{ {
initNum = AddressHelper.GetProtocalCoordinate(address.Address, address.SubAddress, initNum = AddressHelper.GetProtocolCoordinate(address.Address, address.SubAddress,
AddressTranslator.GetAreaByteLength(address.Area)); AddressTranslator.GetAreaByteLength(address.Area));
originalAddresses.Add(address); originalAddresses.Add(address);
} }
else else
{ {
//如果当前地址小于已经记录的地址域,表示这个地址的开始已经记录过了 //如果当前地址小于已经记录的地址域,表示这个地址的开始已经记录过了
if (AddressHelper.GetProtocalCoordinate(address.Address, address.SubAddress, if (AddressHelper.GetProtocolCoordinate(address.Address, address.SubAddress,
AddressTranslator.GetAreaByteLength(address.Area)) < AddressTranslator.GetAreaByteLength(address.Area)) <
AddressHelper.GetProtocalCoordinateNextPosition(preNum, AddressHelper.GetProtocolCoordinateNextPosition(preNum,
preType, preType,
AddressTranslator.GetAreaByteLength(address.Area))) AddressTranslator.GetAreaByteLength(address.Area)))
{ {
originalAddresses.Add(address); originalAddresses.Add(address);
//如果当前地址的末尾被记录,表示地址被记录的地址域覆盖,这个地址没有记录的必要 //如果当前地址的末尾被记录,表示地址被记录的地址域覆盖,这个地址没有记录的必要
if (AddressHelper.GetProtocalCoordinateNextPosition( if (AddressHelper.GetProtocolCoordinateNextPosition(
AddressHelper.GetProtocalCoordinate(address.Address, address.SubAddress, AddressHelper.GetProtocolCoordinate(address.Address, address.SubAddress,
AddressTranslator.GetAreaByteLength(address.Area)), AddressTranslator.GetAreaByteLength(address.Area)),
address.DataType, address.DataType,
AddressTranslator.GetAreaByteLength(address.Area)) <= AddressTranslator.GetAreaByteLength(address.Area)) <=
AddressHelper.GetProtocalCoordinateNextPosition(preNum, AddressHelper.GetProtocolCoordinateNextPosition(preNum,
preType, preType,
AddressTranslator.GetAreaByteLength(address.Area))) AddressTranslator.GetAreaByteLength(address.Area)))
continue; continue;
} }
//如果当前地址大于记录的地址域的开头,则表示地址已经不连续了 //如果当前地址大于记录的地址域的开头,则表示地址已经不连续了
else if (AddressHelper.GetProtocalCoordinate(address.Address, address.SubAddress, else if (AddressHelper.GetProtocolCoordinate(address.Address, address.SubAddress,
AddressTranslator.GetAreaByteLength(address.Area)) > AddressTranslator.GetAreaByteLength(address.Area)) >
AddressHelper.GetProtocalCoordinateNextPosition(preNum, AddressHelper.GetProtocolCoordinateNextPosition(preNum,
preType, preType,
AddressTranslator.GetAreaByteLength(address.Area))) AddressTranslator.GetAreaByteLength(address.Area)))
{ {
@@ -144,7 +144,7 @@ namespace Modbus.Net
GetCount = GetCount =
(int) (int)
Math.Ceiling( Math.Ceiling(
AddressHelper.MapProtocalGetCountToAbstractByteCount( AddressHelper.MapProtocolGetCountToAbstractByteCount(
preNum - (int) Math.Floor(initNum), preNum - (int) Math.Floor(initNum),
AddressTranslator.GetAreaByteLength(address.Area), AddressTranslator.GetAreaByteLength(address.Area),
BigEndianValueHelper.Instance.ByteLength[preType.FullName])), BigEndianValueHelper.Instance.ByteLength[preType.FullName])),
@@ -162,7 +162,7 @@ namespace Modbus.Net
} }
} }
//把当前地址变为上一个地址 //把当前地址变为上一个地址
preNum = AddressHelper.GetProtocalCoordinate(address.Address, address.SubAddress, preNum = AddressHelper.GetProtocolCoordinate(address.Address, address.SubAddress,
AddressTranslator.GetAreaByteLength(address.Area)); AddressTranslator.GetAreaByteLength(address.Area));
preType = address.DataType; preType = address.DataType;
} }
@@ -174,7 +174,7 @@ namespace Modbus.Net
GetCount = GetCount =
(int) (int)
Math.Ceiling( Math.Ceiling(
AddressHelper.MapProtocalGetCountToAbstractByteCount( AddressHelper.MapProtocolGetCountToAbstractByteCount(
preNum - (int) Math.Floor(initNum), AddressTranslator.GetAreaByteLength(area), preNum - (int) Math.Floor(initNum), AddressTranslator.GetAreaByteLength(area),
BigEndianValueHelper.Instance.ByteLength[preType.FullName])), BigEndianValueHelper.Instance.ByteLength[preType.FullName])),
DataType = typeof(byte), DataType = typeof(byte),
@@ -333,7 +333,7 @@ namespace Modbus.Net
EndUnit = continusAddress, EndUnit = continusAddress,
GapNumber = GapNumber =
(int) (int)
Math.Ceiling(AddressHelper.MapProtocalCoordinateToAbstractCoordinate( Math.Ceiling(AddressHelper.MapProtocolCoordinateToAbstractCoordinate(
continusAddress.Address, preCommunicationUnit.Address, continusAddress.Address, preCommunicationUnit.Address,
AddressTranslator.GetAreaByteLength(continusAddress.Area)) - AddressTranslator.GetAreaByteLength(continusAddress.Area)) -
preCommunicationUnit.GetCount * preCommunicationUnit.GetCount *

View File

@@ -14,7 +14,7 @@ namespace Modbus.Net
/// <param name="startAddress">起始地址</param> /// <param name="startAddress">起始地址</param>
/// <param name="byteLength">协议坐标单个地址的字节长度</param> /// <param name="byteLength">协议坐标单个地址的字节长度</param>
/// <returns></returns> /// <returns></returns>
public static double MapAbstractCoordinateToProtocalCoordinate(double abstractAddress, int startAddress, public static double MapAbstractCoordinateToProtocolCoordinate(double abstractAddress, int startAddress,
double byteLength) double byteLength)
{ {
return abstractAddress / byteLength + startAddress; return abstractAddress / byteLength + startAddress;
@@ -27,7 +27,7 @@ namespace Modbus.Net
/// <param name="startAddress">起始地址</param> /// <param name="startAddress">起始地址</param>
/// <param name="byteLength">协议坐标单个地址的字节长度</param> /// <param name="byteLength">协议坐标单个地址的字节长度</param>
/// <returns></returns> /// <returns></returns>
public static double MapProtocalCoordinateToAbstractCoordinate(double protocalAddress, int startAddress, public static double MapProtocolCoordinateToAbstractCoordinate(double protocalAddress, int startAddress,
double byteLength) double byteLength)
{ {
return (protocalAddress - startAddress) * byteLength; return (protocalAddress - startAddress) * byteLength;
@@ -40,7 +40,7 @@ namespace Modbus.Net
/// <param name="areaLength">协议坐标区域与字节之间的防缩倍数</param> /// <param name="areaLength">协议坐标区域与字节之间的防缩倍数</param>
/// <param name="byteLength">协议坐标单个地址的字节长度</param> /// <param name="byteLength">协议坐标单个地址的字节长度</param>
/// <returns></returns> /// <returns></returns>
public static double MapProtocalGetCountToAbstractByteCount(double protocalGetCount, double areaLength, public static double MapProtocolGetCountToAbstractByteCount(double protocalGetCount, double areaLength,
double byteLength) double byteLength)
{ {
return protocalGetCount * areaLength + byteLength; return protocalGetCount * areaLength + byteLength;
@@ -53,7 +53,7 @@ namespace Modbus.Net
/// <param name="subAddress">子地址</param> /// <param name="subAddress">子地址</param>
/// <param name="byteLength">协议坐标单个地址的字节长度</param> /// <param name="byteLength">协议坐标单个地址的字节长度</param>
/// <returns></returns> /// <returns></returns>
public static double GetProtocalCoordinate(int address, int subAddress, double byteLength) public static double GetProtocolCoordinate(int address, int subAddress, double byteLength)
{ {
return address + subAddress * (0.125 / byteLength); return address + subAddress * (0.125 / byteLength);
} }
@@ -76,7 +76,7 @@ namespace Modbus.Net
/// <param name="nextPositionBetweenType">间隔的数据类型</param> /// <param name="nextPositionBetweenType">间隔的数据类型</param>
/// <param name="byteLength">协议坐标单个地址的字节长度</param> /// <param name="byteLength">协议坐标单个地址的字节长度</param>
/// <returns></returns> /// <returns></returns>
public static double GetProtocalCoordinateNextPosition(double protocalAddress, Type nextPositionBetweenType, public static double GetProtocolCoordinateNextPosition(double protocalAddress, Type nextPositionBetweenType,
double byteLength) double byteLength)
{ {
return protocalAddress + return protocalAddress +

View File

@@ -104,71 +104,4 @@ namespace Modbus.Net
public EventWaitHandle ReceiveMutex { get; set; } public EventWaitHandle ReceiveMutex { get; set; }
} }
public class FIFOController : BaseController
{
private MessageWaitingDef _currentSendingPos;
public int AcquireTime { get; }
public FIFOController(int acquireTime)
{
AcquireTime = acquireTime;
}
protected override void SendingMessageControlInner()
{
try
{
while (!_taskCancel)
{
if (AcquireTime > 0)
{
Thread.Sleep(AcquireTime);
}
lock (WaitingMessages)
{
if (_currentSendingPos == null)
{
if (WaitingMessages.Count > 0)
{
_currentSendingPos = WaitingMessages.First();
}
}
if (_currentSendingPos != null)
{
_currentSendingPos.SendMutex.Set();
if (WaitingMessages.Count <= 1)
{
_currentSendingPos = null;
}
else
{
_currentSendingPos = WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1];
}
}
}
}
}
catch (ObjectDisposedException)
{
//ignore
}
catch(Exception e)
{
Log.Error(e, "Controller thorws exception");
}
}
protected override string GetKeyFromMessage(byte[] message)
{
return null;
}
protected override MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage)
{
return WaitingMessages.FirstOrDefault();
}
}
} }

View File

@@ -264,7 +264,7 @@ namespace Modbus.Net
foreach (var address in communicateAddress.OriginalAddresses) foreach (var address in communicateAddress.OriginalAddresses)
{ {
//字节坐标的位置 //字节坐标的位置
var localPos = AddressHelper.MapProtocalCoordinateToAbstractCoordinate(address.Address, var localPos = AddressHelper.MapProtocolCoordinateToAbstractCoordinate(address.Address,
communicateAddress.Address, communicateAddress.Address,
AddressTranslator.GetAreaByteLength(communicateAddress.Area)) + AddressTranslator.GetAreaByteLength(communicateAddress.Area)) +
address.SubAddress * 0.125; address.SubAddress * 0.125;
@@ -469,7 +469,7 @@ namespace Modbus.Net
{ {
//字节坐标地址 //字节坐标地址
var byteCount = var byteCount =
AddressHelper.MapProtocalGetCountToAbstractByteCount( AddressHelper.MapProtocolGetCountToAbstractByteCount(
addressUnit.Address - communicateAddress.Address + addressUnit.Address - communicateAddress.Address +
addressUnit.SubAddress * 0.125 / addressUnit.SubAddress * 0.125 /
AddressTranslator.GetAreaByteLength(communicateAddress.Area), AddressTranslator.GetAreaByteLength(communicateAddress.Area),

View File

@@ -9,12 +9,12 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 基本协议 /// 基本协议
/// </summary> /// </summary>
public abstract class BaseProtocal : BaseProtocal<byte[], byte[], ProtocalUnit, PipeUnit> public abstract class BaseProtocol : BaseProtocol<byte[], byte[], ProtocolUnit, PipeUnit>
{ {
/// <summary> /// <summary>
/// 构造器 /// 构造器
/// </summary> /// </summary>
protected BaseProtocal(byte slaveAddress, byte masterAddress, Endian endian) protected BaseProtocol(byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian) : base(slaveAddress, masterAddress, endian)
{ {
} }
@@ -30,7 +30,7 @@ namespace Modbus.Net
{ {
var pipeUnit = var pipeUnit =
new PipeUnit( new PipeUnit(
ProtocalLinker); ProtocolLinker);
return await pipeUnit.SendReceiveAsync(Endian, paramOut => content); return await pipeUnit.SendReceiveAsync(Endian, paramOut => content);
} }
return null; return null;
@@ -43,11 +43,11 @@ namespace Modbus.Net
/// <param name="content">输入信息的结构化描述</param> /// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
public override async Task<PipeUnit> public override async Task<PipeUnit>
SendReceiveAsync(ProtocalUnit unit, IInputStruct content) SendReceiveAsync(ProtocolUnit unit, IInputStruct content)
{ {
if (content != null) if (content != null)
{ {
var pipeUnit = new PipeUnit(ProtocalLinker); var pipeUnit = new PipeUnit(ProtocolLinker);
return await pipeUnit.SendReceiveAsync(unit, paramOut => content); return await pipeUnit.SendReceiveAsync(unit, paramOut => content);
} }
return null; return null;
@@ -57,19 +57,19 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 基本协议 /// 基本协议
/// </summary> /// </summary>
public abstract class BaseProtocal<TParamIn, TParamOut, TProtocalUnit, TPipeUnit> : public abstract class BaseProtocol<TParamIn, TParamOut, TProtocolUnit, TPipeUnit> :
IProtocal<TParamIn, TParamOut, TProtocalUnit, TPipeUnit> IProtocol<TParamIn, TParamOut, TProtocolUnit, TPipeUnit>
where TProtocalUnit : class, IProtocalFormatting<TParamIn, TParamOut> where TProtocolUnit : class, IProtocolFormatting<TParamIn, TParamOut>
where TParamOut : class where TParamOut : class
where TPipeUnit : PipeUnit<TParamIn, TParamOut, IProtocalLinker<TParamIn, TParamOut>, TProtocalUnit> where TPipeUnit : PipeUnit<TParamIn, TParamOut, IProtocolLinker<TParamIn, TParamOut>, TProtocolUnit>
{ {
/// <summary> /// <summary>
/// 构造器 /// 构造器
/// </summary> /// </summary>
protected BaseProtocal(byte slaveAddress, byte masterAddress, Endian endian) protected BaseProtocol(byte slaveAddress, byte masterAddress, Endian endian)
{ {
Endian = endian; Endian = endian;
Protocals = new Dictionary<string, TProtocalUnit>(); Protocols = new Dictionary<string, TProtocolUnit>();
SlaveAddress = slaveAddress; SlaveAddress = slaveAddress;
MasterAddress = masterAddress; MasterAddress = masterAddress;
} }
@@ -92,45 +92,45 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 协议集合 /// 协议集合
/// </summary> /// </summary>
protected Dictionary<string, TProtocalUnit> Protocals { get; } protected Dictionary<string, TProtocolUnit> Protocols { get; }
/// <summary> /// <summary>
/// 协议索引器,这是一个懒加载协议,当字典中不存在协议时自动加载协议,否则调用已经加载的协议 /// 协议索引器,这是一个懒加载协议,当字典中不存在协议时自动加载协议,否则调用已经加载的协议
/// </summary> /// </summary>
/// <param name="type">协议的类的GetType</param> /// <param name="type">协议的类的GetType</param>
/// <returns>协议的实例</returns> /// <returns>协议的实例</returns>
public TProtocalUnit this[Type type] public TProtocolUnit this[Type type]
{ {
get get
{ {
var protocalName = type.FullName; var protocalName = type.FullName;
TProtocalUnit protocalUnitReturn = null; TProtocolUnit protocalUnitReturn = null;
lock (Protocals) lock (Protocols)
{ {
if (Protocals.ContainsKey(protocalName)) if (Protocols.ContainsKey(protocalName))
{ {
protocalUnitReturn = Protocals[protocalName]; protocalUnitReturn = Protocols[protocalName];
} }
else else
{ {
//自动寻找存在的协议并将其加载 //自动寻找存在的协议并将其加载
var protocalUnit = var protocalUnit =
Activator.CreateInstance(type.GetTypeInfo().Assembly Activator.CreateInstance(type.GetTypeInfo().Assembly
.GetType(protocalName)) as TProtocalUnit; .GetType(protocalName)) as TProtocolUnit;
if (protocalUnit == null) if (protocalUnit == null)
throw new InvalidCastException($"No ProtocalUnit {nameof(TProtocalUnit)} implemented"); throw new InvalidCastException($"No ProtocolUnit {nameof(TProtocolUnit)} implemented");
protocalUnit.Endian = Endian; protocalUnit.Endian = Endian;
Register(protocalUnit); Register(protocalUnit);
} }
} }
return protocalUnitReturn ?? Protocals[protocalName]; return protocalUnitReturn ?? Protocols[protocalName];
} }
} }
/// <summary> /// <summary>
/// 协议的连接器 /// 协议的连接器
/// </summary> /// </summary>
public IProtocalLinker<TParamIn, TParamOut> ProtocalLinker { get; protected set; } public IProtocolLinker<TParamIn, TParamOut> ProtocolLinker { get; protected set; }
/// <summary> /// <summary>
/// 协议连接开始 /// 协议连接开始
@@ -144,8 +144,8 @@ namespace Modbus.Net
/// <returns></returns> /// <returns></returns>
public virtual bool Disconnect() public virtual bool Disconnect()
{ {
if (ProtocalLinker != null) if (ProtocolLinker != null)
return ProtocalLinker.Disconnect(); return ProtocolLinker.Disconnect();
return false; return false;
} }
@@ -156,7 +156,7 @@ namespace Modbus.Net
/// <param name="content">输入信息的结构化描述</param> /// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
public virtual TPipeUnit SendReceive( public virtual TPipeUnit SendReceive(
TProtocalUnit unit, IInputStruct content) TProtocolUnit unit, IInputStruct content)
{ {
return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content)); return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content));
} }
@@ -168,13 +168,13 @@ namespace Modbus.Net
/// <param name="content">输入信息的结构化描述</param> /// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
public virtual async Task<TPipeUnit> public virtual async Task<TPipeUnit>
SendReceiveAsync(TProtocalUnit unit, IInputStruct content) SendReceiveAsync(TProtocolUnit unit, IInputStruct content)
{ {
if (content != null) if (content != null)
{ {
var pipeUnit = var pipeUnit =
new PipeUnit<TParamIn, TParamOut, IProtocalLinker<TParamIn, TParamOut>, TProtocalUnit>( new PipeUnit<TParamIn, TParamOut, IProtocolLinker<TParamIn, TParamOut>, TProtocolUnit>(
ProtocalLinker); ProtocolLinker);
return await pipeUnit.SendReceiveAsync(unit, paramOut => content) as TPipeUnit; return await pipeUnit.SendReceiveAsync(unit, paramOut => content) as TPipeUnit;
} }
return null; return null;
@@ -207,7 +207,7 @@ namespace Modbus.Net
/// <param name="content">输入信息的结构化描述</param> /// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
/// <typeparam name="T">IOutputStruct的具体类型</typeparam> /// <typeparam name="T">IOutputStruct的具体类型</typeparam>
public virtual T SendReceive<T>(TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct public virtual T SendReceive<T>(TProtocolUnit unit, IInputStruct content) where T : class, IOutputStruct
{ {
return AsyncHelper.RunSync(() => SendReceiveAsync<T>(unit, content)); return AsyncHelper.RunSync(() => SendReceiveAsync<T>(unit, content));
} }
@@ -219,7 +219,7 @@ namespace Modbus.Net
/// <param name="content">输入信息的结构化描述</param> /// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
/// <typeparam name="T">IOutputStruct的具体类型</typeparam> /// <typeparam name="T">IOutputStruct的具体类型</typeparam>
public virtual async Task<T> SendReceiveAsync<T>(TProtocalUnit unit, IInputStruct content) public virtual async Task<T> SendReceiveAsync<T>(TProtocolUnit unit, IInputStruct content)
where T : class, IOutputStruct where T : class, IOutputStruct
{ {
return (await SendReceiveAsync(unit, content)).Unwrap<T>(); return (await SendReceiveAsync(unit, content)).Unwrap<T>();
@@ -228,11 +228,11 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 注册一个协议 /// 注册一个协议
/// </summary> /// </summary>
/// <param name="linkProtocal">需要注册的协议</param> /// <param name="linkProtocol">需要注册的协议</param>
protected void Register(TProtocalUnit linkProtocal) protected void Register(TProtocolUnit linkProtocol)
{ {
if (linkProtocal == null) return; if (linkProtocol == null) return;
Protocals.Add(linkProtocal.GetType().FullName, linkProtocal); Protocols.Add(linkProtocol.GetType().FullName, linkProtocol);
} }
} }
} }

View File

@@ -30,7 +30,7 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 基础Api入口 /// 基础Api入口
/// </summary> /// </summary>
public abstract class BaseUtility : BaseUtility<byte[], byte[], ProtocalUnit, PipeUnit> public abstract class BaseUtility : BaseUtility<byte[], byte[], ProtocolUnit, PipeUnit>
{ {
/// <summary> /// <summary>
/// 构造器 /// 构造器
@@ -43,14 +43,14 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 基础Api入口 /// 基础Api入口
/// </summary> /// </summary>
public abstract class BaseUtility<TParamIn, TParamOut, TProtocalUnit, TPipeUnit> : IUtilityProperty, IUtilityMethodData public abstract class BaseUtility<TParamIn, TParamOut, TProtocolUnit, TPipeUnit> : IUtilityProperty, IUtilityMethodData
where TProtocalUnit : class, IProtocalFormatting<TParamIn, TParamOut> where TParamOut : class where TProtocolUnit : class, IProtocolFormatting<TParamIn, TParamOut> where TParamOut : class
where TPipeUnit : PipeUnit<TParamIn, TParamOut, IProtocalLinker<TParamIn, TParamOut>, TProtocalUnit> where TPipeUnit : PipeUnit<TParamIn, TParamOut, IProtocolLinker<TParamIn, TParamOut>, TProtocolUnit>
{ {
/// <summary> /// <summary>
/// 协议收发主体 /// 协议收发主体
/// </summary> /// </summary>
protected IProtocal<TParamIn, TParamOut, TProtocalUnit, TPipeUnit> Wrapper; protected IProtocol<TParamIn, TParamOut, TProtocolUnit, TPipeUnit> Wrapper;
/// <summary> /// <summary>
/// 构造器 /// 构造器
@@ -237,13 +237,13 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 设备是否已经连接 /// 设备是否已经连接
/// </summary> /// </summary>
public bool IsConnected => Wrapper?.ProtocalLinker != null && Wrapper.ProtocalLinker.IsConnected; public bool IsConnected => Wrapper?.ProtocolLinker != null && Wrapper.ProtocolLinker.IsConnected;
/// <summary> /// <summary>
/// 标识设备的连接关键字 /// 标识设备的连接关键字
/// </summary> /// </summary>
public string ConnectionToken public string ConnectionToken
=> Wrapper?.ProtocalLinker == null ? ConnectionString : Wrapper.ProtocalLinker.ConnectionToken; => Wrapper?.ProtocolLinker == null ? ConnectionString : Wrapper.ProtocolLinker.ConnectionToken;
/// <summary> /// <summary>
/// 地址翻译器 /// 地址翻译器

View File

@@ -6,7 +6,7 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 串口连接对象 /// 串口连接对象
/// </summary> /// </summary>
public abstract class ComProtocalLinker : ProtocalLinker public abstract class ComProtocolLinker : ProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造器 /// 构造器
@@ -16,7 +16,7 @@ namespace Modbus.Net
/// <param name="stopBits">停止位</param> /// <param name="stopBits">停止位</param>
/// <param name="dataBits">数据位</param> /// <param name="dataBits">数据位</param>
/// <param name="slaveAddress">从站地址</param> /// <param name="slaveAddress">从站地址</param>
protected ComProtocalLinker(int baudRate, Parity parity, StopBits stopBits, int dataBits, int slaveAddress) protected ComProtocolLinker(int baudRate, Parity parity, StopBits stopBits, int dataBits, int slaveAddress)
: this(ConfigurationManager.AppSettings["COM"], baudRate, parity, stopBits, dataBits, slaveAddress) : this(ConfigurationManager.AppSettings["COM"], baudRate, parity, stopBits, dataBits, slaveAddress)
{ {
} }
@@ -30,7 +30,7 @@ namespace Modbus.Net
/// <param name="stopBits">停止位</param> /// <param name="stopBits">停止位</param>
/// <param name="dataBits">数据位</param> /// <param name="dataBits">数据位</param>
/// <param name="slaveAddress">从站地址</param> /// <param name="slaveAddress">从站地址</param>
protected ComProtocalLinker(string com, int baudRate, Parity parity, StopBits stopBits, int dataBits, protected ComProtocolLinker(string com, int baudRate, Parity parity, StopBits stopBits, int dataBits,
int slaveAddress) int slaveAddress)
: this( : this(
com, baudRate, parity, stopBits, dataBits, com, baudRate, parity, stopBits, dataBits,
@@ -48,7 +48,7 @@ namespace Modbus.Net
/// <param name="dataBits">数据位</param> /// <param name="dataBits">数据位</param>
/// <param name="connectionTimeout">超时时间</param> /// <param name="connectionTimeout">超时时间</param>
/// <param name="slaveAddress">从站地址</param> /// <param name="slaveAddress">从站地址</param>
protected ComProtocalLinker(string com, int baudRate, Parity parity, StopBits stopBits, int dataBits, protected ComProtocolLinker(string com, int baudRate, Parity parity, StopBits stopBits, int dataBits,
int connectionTimeout, int slaveAddress) int connectionTimeout, int slaveAddress)
{ {
BaseConnector = new ComConnector(com + ":" + slaveAddress, baudRate, parity, stopBits, dataBits, BaseConnector = new ComConnector(com + ":" + slaveAddress, baudRate, parity, stopBits, dataBits,

View File

@@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Serilog;
namespace Modbus.Net
{
public class FifoController : BaseController
{
private MessageWaitingDef _currentSendingPos;
public int AcquireTime { get; }
public FifoController(int acquireTime)
{
AcquireTime = acquireTime;
}
protected override void SendingMessageControlInner()
{
try
{
while (!_taskCancel)
{
if (AcquireTime > 0)
{
Thread.Sleep(AcquireTime);
}
lock (WaitingMessages)
{
if (_currentSendingPos == null)
{
if (WaitingMessages.Count > 0)
{
_currentSendingPos = WaitingMessages.First();
}
}
if (_currentSendingPos != null)
{
_currentSendingPos.SendMutex.Set();
if (WaitingMessages.Count <= 1)
{
_currentSendingPos = null;
}
else
{
_currentSendingPos = WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1];
}
}
}
}
}
catch (ObjectDisposedException)
{
//ignore
}
catch (Exception e)
{
Log.Error(e, "Controller throws exception");
}
}
protected override string GetKeyFromMessage(byte[] message)
{
return null;
}
protected override MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage)
{
return WaitingMessages.FirstOrDefault();
}
}
}

View File

@@ -8,23 +8,23 @@ namespace Modbus.Net
/// </summary> /// </summary>
/// <typeparam name="TParamIn">向Connector传入的类型</typeparam> /// <typeparam name="TParamIn">向Connector传入的类型</typeparam>
/// <typeparam name="TParamOut">从Connector返回的类型</typeparam> /// <typeparam name="TParamOut">从Connector返回的类型</typeparam>
/// <typeparam name="TProtocalUnit">协议单元的类型</typeparam> /// <typeparam name="TProtocolUnit">协议单元的类型</typeparam>
public interface IProtocal<TParamIn, TParamOut, TProtocalUnit, TPipeUnit> public interface IProtocol<TParamIn, TParamOut, TProtocolUnit, TPipeUnit>
where TProtocalUnit : class, IProtocalFormatting<TParamIn, TParamOut> where TProtocolUnit : class, IProtocolFormatting<TParamIn, TParamOut>
where TParamOut : class where TParamOut : class
where TPipeUnit : PipeUnit<TParamIn, TParamOut, IProtocalLinker<TParamIn, TParamOut>, TProtocalUnit> where TPipeUnit : PipeUnit<TParamIn, TParamOut, IProtocolLinker<TParamIn, TParamOut>, TProtocolUnit>
{ {
/// <summary> /// <summary>
/// 协议的连接器 /// 协议的连接器
/// </summary> /// </summary>
IProtocalLinker<TParamIn, TParamOut> ProtocalLinker { get; } IProtocolLinker<TParamIn, TParamOut> ProtocolLinker { get; }
/// <summary> /// <summary>
/// 协议索引器,这是一个懒加载协议,当字典中不存在协议时自动加载协议,否则调用已经加载的协议 /// 协议索引器,这是一个懒加载协议,当字典中不存在协议时自动加载协议,否则调用已经加载的协议
/// </summary> /// </summary>
/// <param name="type">协议的类的GetType</param> /// <param name="type">协议的类的GetType</param>
/// <returns>协议的实例</returns> /// <returns>协议的实例</returns>
TProtocalUnit this[Type type] { get; } TProtocolUnit this[Type type] { get; }
/// <summary> /// <summary>
/// 协议连接开始 /// 协议连接开始
@@ -58,7 +58,7 @@ namespace Modbus.Net
/// <param name="unit">协议的实例</param> /// <param name="unit">协议的实例</param>
/// <param name="content">输入信息的结构化描述</param> /// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
TPipeUnit SendReceive(TProtocalUnit unit, IInputStruct content); TPipeUnit SendReceive(TProtocolUnit unit, IInputStruct content);
/// <summary> /// <summary>
/// 发送协议,通过传入需要使用的协议内容和输入结构 /// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -66,7 +66,7 @@ namespace Modbus.Net
/// <param name="unit">协议的实例</param> /// <param name="unit">协议的实例</param>
/// <param name="content">输入信息的结构化描述</param> /// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
Task<TPipeUnit> SendReceiveAsync(TProtocalUnit unit, IInputStruct content); Task<TPipeUnit> SendReceiveAsync(TProtocolUnit unit, IInputStruct content);
/// <summary> /// <summary>
/// 发送协议,通过传入需要使用的协议内容和输入结构 /// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -76,7 +76,7 @@ namespace Modbus.Net
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
/// <typeparam name="T">IOutputStruct的具体类型</typeparam> /// <typeparam name="T">IOutputStruct的具体类型</typeparam>
T SendReceive<T>( T SendReceive<T>(
TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct; TProtocolUnit unit, IInputStruct content) where T : class, IOutputStruct;
/// <summary> /// <summary>
/// 发送协议,通过传入需要使用的协议内容和输入结构 /// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -86,6 +86,6 @@ namespace Modbus.Net
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
/// <typeparam name="T">IOutputStruct的具体类型</typeparam> /// <typeparam name="T">IOutputStruct的具体类型</typeparam>
Task<T> SendReceiveAsync<T>( Task<T> SendReceiveAsync<T>(
TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct; TProtocolUnit unit, IInputStruct content) where T : class, IOutputStruct;
} }
} }

View File

@@ -3,7 +3,7 @@
/// <summary> /// <summary>
/// 协议转换的接口 /// 协议转换的接口
/// </summary> /// </summary>
public interface IProtocalFormatting : IProtocalFormatting<byte[], byte[]> public interface IProtocolFormatting : IProtocolFormatting<byte[], byte[]>
{ {
} }
@@ -12,7 +12,7 @@
/// </summary> /// </summary>
/// <typeparam name="TParamIn">向Connector传入的数据类型</typeparam> /// <typeparam name="TParamIn">向Connector传入的数据类型</typeparam>
/// <typeparam name="TParamOut">从Connector返回的数据类型</typeparam> /// <typeparam name="TParamOut">从Connector返回的数据类型</typeparam>
public interface IProtocalFormatting<out TParamIn, in TParamOut> public interface IProtocolFormatting<out TParamIn, in TParamOut>
{ {
/// <summary> /// <summary>
/// 是否为小端格式 /// 是否为小端格式

View File

@@ -7,7 +7,7 @@ namespace Modbus.Net
/// </summary> /// </summary>
/// <typeparam name="TParamIn">向Connector传入的数据类型</typeparam> /// <typeparam name="TParamIn">向Connector传入的数据类型</typeparam>
/// <typeparam name="TParamOut">从Connector返回的数据类型</typeparam> /// <typeparam name="TParamOut">从Connector返回的数据类型</typeparam>
public interface IProtocalLinker<TParamIn, TParamOut> public interface IProtocolLinker<TParamIn, TParamOut>
{ {
/// <summary> /// <summary>
/// 通讯字符串 /// 通讯字符串

View File

@@ -3,14 +3,14 @@
/// <summary> /// <summary>
/// 协议字节伸缩 /// 协议字节伸缩
/// </summary> /// </summary>
public interface IProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend<byte[], byte[]> public interface IProtocolLinkerBytesExtend : IProtocolLinkerBytesExtend<byte[], byte[]>
{ {
} }
/// <summary> /// <summary>
/// 协议字节伸缩 /// 协议字节伸缩
/// </summary> /// </summary>
public interface IProtocalLinkerBytesExtend<TParamIn, TParamOut> public interface IProtocolLinkerBytesExtend<TParamIn, TParamOut>
{ {
/// <summary> /// <summary>
/// 协议扩展,协议内容发送前调用 /// 协议扩展,协议内容发送前调用

View File

@@ -0,0 +1,91 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Serilog;
namespace Modbus.Net
{
public class MatchController : BaseController
{
private MessageWaitingDef _currentSendingPos;
public int AcquireTime { get; }
protected ICollection<int>[] KeyMatches { get; }
public MatchController(ICollection<int>[] keyMatches, int acquireTime)
{
KeyMatches = keyMatches;
AcquireTime = acquireTime;
}
protected override void SendingMessageControlInner()
{
try
{
while (!_taskCancel)
{
if (AcquireTime > 0)
{
Thread.Sleep(AcquireTime);
}
lock (WaitingMessages)
{
if (_currentSendingPos == null)
{
if (WaitingMessages.Count > 0)
{
_currentSendingPos = WaitingMessages.First();
}
}
if (_currentSendingPos != null)
{
_currentSendingPos.SendMutex.Set();
if (WaitingMessages.Count <= 1)
{
_currentSendingPos = null;
}
else
{
_currentSendingPos = WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1];
}
}
}
}
}
catch (ObjectDisposedException)
{
//ignore
}
catch (Exception e)
{
Log.Error(e, "Controller throws exception");
}
}
protected override string GetKeyFromMessage(byte[] message)
{
string ans = "";
foreach (var matchPoses in KeyMatches)
{
int tmpCount = 0;
foreach (var matchPos in matchPoses)
{
tmpCount = tmpCount * 256 + message[matchPos];
}
ans += tmpCount + " ";
}
return ans;
}
protected override MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage)
{
var returnKey = GetKeyFromMessage(receiveMessage);
return WaitingMessages.FirstOrDefault(p=>p.Key == returnKey);
}
}
}

View File

@@ -8,13 +8,13 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 管道单元 /// 管道单元
/// </summary> /// </summary>
public class PipeUnit : PipeUnit<byte[], byte[], IProtocalLinker<byte[], byte[]>, ProtocalUnit> public class PipeUnit : PipeUnit<byte[], byte[], IProtocolLinker<byte[], byte[]>, ProtocolUnit>
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="protocalLinker">连接器</param> /// <param name="protocalLinker">连接器</param>
public PipeUnit(IProtocalLinker<byte[], byte[]> protocalLinker) : base(protocalLinker) public PipeUnit(IProtocolLinker<byte[], byte[]> protocalLinker) : base(protocalLinker)
{ {
} }
@@ -26,7 +26,7 @@ namespace Modbus.Net
/// <param name="protocalUnit">协议单元</param> /// <param name="protocalUnit">协议单元</param>
/// <param name="parameters">传递给输入结构的参数</param> /// <param name="parameters">传递给输入结构的参数</param>
/// <param name="success">上次的管道是否成功执行</param> /// <param name="success">上次的管道是否成功执行</param>
protected PipeUnit(IProtocalLinker<byte[], byte[]> protocalLinker, ProtocalUnit protocalUnit, byte[] parameters, protected PipeUnit(IProtocolLinker<byte[], byte[]> protocalLinker, ProtocolUnit protocalUnit, byte[] parameters,
bool success) : base(protocalLinker, protocalUnit, parameters, success) bool success) : base(protocalLinker, protocalUnit, parameters, success)
{ {
} }
@@ -42,12 +42,12 @@ namespace Modbus.Net
if (Success) if (Success)
{ {
var content = inputStructCreator.Invoke(ReturnParams); var content = inputStructCreator.Invoke(ReturnParams);
if (ProtocalLinker != null) if (ProtocolLinker != null)
return new PipeUnit(ProtocalLinker, null, return new PipeUnit(ProtocolLinker, null,
await ProtocalLinker.SendReceiveAsync(ProtocalUnit.TranslateContent(endian, content)), await ProtocolLinker.SendReceiveAsync(ProtocolUnit.TranslateContent(endian, content)),
true); true);
} }
return new PipeUnit(ProtocalLinker, null, ReturnParams, false); return new PipeUnit(ProtocolLinker, null, ReturnParams, false);
} }
/// <summary> /// <summary>
@@ -57,14 +57,14 @@ namespace Modbus.Net
/// <param name="inputStructCreator">构造输入结构的函数</param> /// <param name="inputStructCreator">构造输入结构的函数</param>
/// <returns>发送完成之后新的管道实例</returns> /// <returns>发送完成之后新的管道实例</returns>
public new async Task<PipeUnit> SendReceiveAsync( public new async Task<PipeUnit> SendReceiveAsync(
ProtocalUnit unit, ProtocolUnit unit,
Func<byte[], IInputStruct> inputStructCreator) Func<byte[], IInputStruct> inputStructCreator)
{ {
var receiveContent = await SendReceiveAsyncParamOut(unit, inputStructCreator); var receiveContent = await SendReceiveAsyncParamOut(unit, inputStructCreator);
if (receiveContent != null) if (receiveContent != null)
return new PipeUnit(ProtocalLinker, unit, return new PipeUnit(ProtocolLinker, unit,
receiveContent, true); receiveContent, true);
return new PipeUnit(ProtocalLinker, unit, ReturnParams, return new PipeUnit(ProtocolLinker, unit, ReturnParams,
false); false);
} }
@@ -83,18 +83,18 @@ namespace Modbus.Net
/// </summary> /// </summary>
/// <typeparam name="TParamIn">输入参数</typeparam> /// <typeparam name="TParamIn">输入参数</typeparam>
/// <typeparam name="TParamOut">输出参数</typeparam> /// <typeparam name="TParamOut">输出参数</typeparam>
/// <typeparam name="TProtocalLinker">连接器</typeparam> /// <typeparam name="TProtocolLinker">连接器</typeparam>
/// <typeparam name="TProtocalUnit">协议单元</typeparam> /// <typeparam name="TProtocolUnit">协议单元</typeparam>
public class PipeUnit<TParamIn, TParamOut, TProtocalLinker, TProtocalUnit> public class PipeUnit<TParamIn, TParamOut, TProtocolLinker, TProtocolUnit>
where TProtocalUnit : class, IProtocalFormatting<TParamIn, TParamOut> where TProtocolUnit : class, IProtocolFormatting<TParamIn, TParamOut>
where TProtocalLinker : class, IProtocalLinker<TParamIn, TParamOut> where TProtocolLinker : class, IProtocolLinker<TParamIn, TParamOut>
where TParamOut : class where TParamOut : class
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="protocalLinker">连接器</param> /// <param name="protocalLinker">连接器</param>
public PipeUnit(TProtocalLinker protocalLinker) : this(protocalLinker, null, null, true) public PipeUnit(TProtocolLinker protocalLinker) : this(protocalLinker, null, null, true)
{ {
} }
@@ -106,10 +106,10 @@ namespace Modbus.Net
/// <param name="protocalUnit">协议单元</param> /// <param name="protocalUnit">协议单元</param>
/// <param name="parameters">输入参数</param> /// <param name="parameters">输入参数</param>
/// <param name="success">上一次管道结果是否成功</param> /// <param name="success">上一次管道结果是否成功</param>
protected PipeUnit(TProtocalLinker protocalLinker, TProtocalUnit protocalUnit, TParamOut parameters, bool success) protected PipeUnit(TProtocolLinker protocalLinker, TProtocolUnit protocalUnit, TParamOut parameters, bool success)
{ {
ProtocalLinker = protocalLinker; ProtocolLinker = protocalLinker;
ProtocalUnit = protocalUnit; ProtocolUnit = protocalUnit;
ReturnParams = parameters; ReturnParams = parameters;
Success = success; Success = success;
} }
@@ -117,12 +117,12 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 协议连接器 /// 协议连接器
/// </summary> /// </summary>
protected TProtocalLinker ProtocalLinker { get; set; } protected TProtocolLinker ProtocolLinker { get; set; }
/// <summary> /// <summary>
/// 协议单元 /// 协议单元
/// </summary> /// </summary>
protected TProtocalUnit ProtocalUnit { get; set; } protected TProtocolUnit ProtocolUnit { get; set; }
/// <summary> /// <summary>
/// 输入结构传入的参数 /// 输入结构传入的参数
@@ -140,7 +140,7 @@ namespace Modbus.Net
/// <param name="unit">协议单元</param> /// <param name="unit">协议单元</param>
/// <param name="inputStructCreator">输入参数生成函数</param> /// <param name="inputStructCreator">输入参数生成函数</param>
/// <returns>输出参数</returns> /// <returns>输出参数</returns>
protected async Task<TParamOut> SendReceiveAsyncParamOut(TProtocalUnit unit, protected async Task<TParamOut> SendReceiveAsyncParamOut(TProtocolUnit unit,
Func<TParamOut, IInputStruct> inputStructCreator) Func<TParamOut, IInputStruct> inputStructCreator)
{ {
if (Success) if (Success)
@@ -151,10 +151,10 @@ namespace Modbus.Net
{ {
TParamOut receiveContent; TParamOut receiveContent;
//如果为特别处理协议的话,跳过协议扩展收缩 //如果为特别处理协议的话,跳过协议扩展收缩
if (unit.GetType().GetTypeInfo().GetCustomAttributes(typeof(SpecialProtocalUnitAttribute)).Any()) if (unit.GetType().GetTypeInfo().GetCustomAttributes(typeof(SpecialProtocolUnitAttribute)).Any())
receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent); receiveContent = await ProtocolLinker.SendReceiveWithoutExtAndDecAsync(formatContent);
else else
receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent); receiveContent = await ProtocolLinker.SendReceiveAsync(formatContent);
return receiveContent; return receiveContent;
} }
} }
@@ -167,15 +167,15 @@ namespace Modbus.Net
/// <param name="unit">协议单元</param> /// <param name="unit">协议单元</param>
/// <param name="inputStructCreator">输入参数生成函数</param> /// <param name="inputStructCreator">输入参数生成函数</param>
/// <returns>管道实体</returns> /// <returns>管道实体</returns>
public virtual async Task<PipeUnit<TParamIn, TParamOut, TProtocalLinker, TProtocalUnit>> SendReceiveAsync( public virtual async Task<PipeUnit<TParamIn, TParamOut, TProtocolLinker, TProtocolUnit>> SendReceiveAsync(
TProtocalUnit unit, TProtocolUnit unit,
Func<TParamOut, IInputStruct> inputStructCreator) Func<TParamOut, IInputStruct> inputStructCreator)
{ {
var receiveContent = await SendReceiveAsyncParamOut(unit, inputStructCreator); var receiveContent = await SendReceiveAsyncParamOut(unit, inputStructCreator);
if (receiveContent != null) if (receiveContent != null)
return new PipeUnit<TParamIn, TParamOut, TProtocalLinker, TProtocalUnit>(ProtocalLinker, unit, return new PipeUnit<TParamIn, TParamOut, TProtocolLinker, TProtocolUnit>(ProtocolLinker, unit,
receiveContent, true); receiveContent, true);
return new PipeUnit<TParamIn, TParamOut, TProtocalLinker, TProtocalUnit>(ProtocalLinker, unit, ReturnParams, return new PipeUnit<TParamIn, TParamOut, TProtocolLinker, TProtocolUnit>(ProtocolLinker, unit, ReturnParams,
false); false);
} }
@@ -187,7 +187,7 @@ namespace Modbus.Net
public T Unwrap<T>() where T : class, IOutputStruct public T Unwrap<T>() where T : class, IOutputStruct
{ {
var t = 0; var t = 0;
return ProtocalUnit.Unformat<T>(ReturnParams, ref t); return ProtocolUnit.Unformat<T>(ReturnParams, ref t);
} }
} }
} }

View File

@@ -7,7 +7,7 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 基本的协议连接器 /// 基本的协议连接器
/// </summary> /// </summary>
public abstract class ProtocalLinker : ProtocalLinker<byte[], byte[]> public abstract class ProtocolLinker : ProtocolLinker<byte[], byte[]>
{ {
/// <summary> /// <summary>
/// 发送并接收数据 /// 发送并接收数据
@@ -47,7 +47,7 @@ namespace Modbus.Net
var bytesExtend = var bytesExtend =
Activator.CreateInstance(GetType().GetTypeInfo().Assembly.GetType(GetType().FullName + "BytesExtend")) Activator.CreateInstance(GetType().GetTypeInfo().Assembly.GetType(GetType().FullName + "BytesExtend"))
as as
IProtocalLinkerBytesExtend; IProtocolLinkerBytesExtend;
return bytesExtend?.BytesExtend(content); return bytesExtend?.BytesExtend(content);
} }
@@ -62,7 +62,7 @@ namespace Modbus.Net
var bytesExtend = var bytesExtend =
Activator.CreateInstance(GetType().GetTypeInfo().Assembly.GetType(GetType().FullName + "BytesExtend")) Activator.CreateInstance(GetType().GetTypeInfo().Assembly.GetType(GetType().FullName + "BytesExtend"))
as as
IProtocalLinkerBytesExtend; IProtocolLinkerBytesExtend;
return bytesExtend?.BytesDecact(content); return bytesExtend?.BytesDecact(content);
} }
} }
@@ -70,7 +70,7 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 基本的协议连接器 /// 基本的协议连接器
/// </summary> /// </summary>
public abstract class ProtocalLinker<TParamIn, TParamOut> : IProtocalLinker<TParamIn, TParamOut> public abstract class ProtocolLinker<TParamIn, TParamOut> : IProtocolLinker<TParamIn, TParamOut>
where TParamOut : class where TParamOut : class
{ {
/// <summary> /// <summary>

View File

@@ -5,14 +5,14 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 协议单元 /// 协议单元
/// </summary> /// </summary>
public abstract class ProtocalUnit : ProtocalUnit<byte[], byte[]> public abstract class ProtocolUnit : ProtocolUnit<byte[], byte[]>
{ {
} }
/// <summary> /// <summary>
/// 协议单元 /// 协议单元
/// </summary> /// </summary>
public abstract class ProtocalUnit<TParamIn, TParamOut> : IProtocalFormatting<TParamIn, TParamOut> public abstract class ProtocolUnit<TParamIn, TParamOut> : IProtocolFormatting<TParamIn, TParamOut>
{ {
/// <summary> /// <summary>
/// 是否为小端格式 /// 是否为小端格式
@@ -72,7 +72,7 @@ namespace Modbus.Net
/// 特殊协议单元写入这个协议不会执行BytesExtend和BytesDecact /// 特殊协议单元写入这个协议不会执行BytesExtend和BytesDecact
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Class, Inherited = false)] [AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class SpecialProtocalUnitAttribute : Attribute public class SpecialProtocolUnitAttribute : Attribute
{ {
} }
@@ -93,13 +93,13 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 协议错误 /// 协议错误
/// </summary> /// </summary>
public class ProtocalErrorException : Exception public class ProtocolErrorException : Exception
{ {
/// <summary> /// <summary>
/// 构造函数 /// 构造函数
/// </summary> /// </summary>
/// <param name="message"></param> /// <param name="message"></param>
public ProtocalErrorException(string message) public ProtocolErrorException(string message)
: base(message) : base(message)
{ {
} }

View File

@@ -42,15 +42,15 @@ Modbus TCP connection and Siemens Ethenet Connection are supported at the same t
Connector implements the basic connecting methods, like Socket, Com and SignalR. Connector implements the basic connecting methods, like Socket, Com and SignalR.
### ProtocalLinker ### ProtocolLinker
ProtocalLinker implements the link, send, and send recevice actions. ProtocolLinker implements the link, send, and send recevice actions.
### ProtocalLinkerBytesExtend ### ProtocolLinkerBytesExtend
Some Protocal has the same head or tail in the same connection way, but different in different connection way, so bytes extend can extend sending message when they are sended in different type of connection. Some Protocol has the same head or tail in the same connection way, but different in different connection way, so bytes extend can extend sending message when they are sended in different type of connection.
### ProtocalUnit ### ProtocolUnit
Format and deformat the protocal message between the structual class and bytes array. Format and deformat the protocal message between the structual class and bytes array.
@@ -58,13 +58,13 @@ Format and deformat the protocal message between the structual class and bytes a
Help change the value between number and bytes, or number array to bytes array. Help change the value between number and bytes, or number array to bytes array.
### Protocal ### Protocol
Manage all protocals and implement a lazy loading method. Manage all protocals and implement a lazy loading method.
### Utility ### Utility
Manage several types of Protocal to a same calling interface. Manage several types of Protocol to a same calling interface.
### Machine ### Machine
@@ -385,7 +385,7 @@ task.InvokeTimerAll(new TaskItemGetData(returnValues =>
public async Task<bool> SetDatasAsync(string connectionToken, MachineSetDataType setDataType, Dictionary<string, double> values) public async Task<bool> SetDatasAsync(string connectionToken, MachineSetDataType setDataType, Dictionary<string, double> values)
``` ```
##<a name="implement"></a> Implementing Your Own Protocal ##<a name="implement"></a> Implementing Your Own Protocol
The main target of Modbus.Net is building a high extensable hardware communication protocal, so we allow everyone to extend the protocal. The main target of Modbus.Net is building a high extensable hardware communication protocal, so we allow everyone to extend the protocal.
To extend Modbus.Net, first of all ValueHelper.cs in Modbus.Net is a really powerful tool that you can use to modify values in byte array.There are two ValueHelpers: ValueHelper(Little Endian) and BigEndianValueHelper(Big Endian). Remember using the correct one. To extend Modbus.Net, first of all ValueHelper.cs in Modbus.Net is a really powerful tool that you can use to modify values in byte array.There are two ValueHelpers: ValueHelper(Little Endian) and BigEndianValueHelper(Big Endian). Remember using the correct one.
@@ -394,17 +394,17 @@ In this tutorial I will use Modbus.Net.Modbus to tell you how to implement your
You should follow the following steps to implement your own protocal. You should follow the following steps to implement your own protocal.
1.Implement Protocal. (ModbusProtocal.cs, ModbusTcpProtocal.cs) 1.Implement Protocol. (ModbusProtocol.cs, ModbusTcpProtocol.cs)
First: Extend BaseProtocal to ModbusProtocal. First: Extend BaseProtocol to ModbusProtocol.
```C# ```C#
public abstract class ModbusProtocal : BaseProtocal public abstract class ModbusProtocol : BaseProtocol
public class ModbusTcpProtocal : ModbusProtocal public class ModbusTcpProtocol : ModbusProtocol
``` ```
"abstract" keyword is optional because if user can use this protocal don't write abstract. "abstract" keyword is optional because if user can use this protocal don't write abstract.
Second: Extend ProtocalUnit, IInputStruct and IOutputStruct. Second: Extend ProtocolUnit, IInputStruct and IOutputStruct.
```C# ```C#
public class ReadDataModbusProtocal : ProtocalUnit public class ReadDataModbusProtocol : ProtocolUnit
{ {
public override byte[] Format(IInputStruct message) public override byte[] Format(IInputStruct message)
{ {
@@ -423,27 +423,27 @@ public class ReadDataModbusProtocal : ProtocalUnit
} }
} }
``` ```
There is another attribute called SpecialProtocalUnitAttribute. There is another attribute called SpecialProtocolUnitAttribute.
If you add SpecialProtocalUnitAttribute to ProtocalUnit, then the protocal will not run BytesExtend and BytesDecact. If you add SpecialProtocolUnitAttribute to ProtocolUnit, then the protocal will not run BytesExtend and BytesDecact.
```C# ```C#
[SpecialProtocalUnit] [SpecialProtocolUnit]
internal class CreateReferenceSiemensProtocal : ProtocalUnit internal class CreateReferenceSiemensProtocol : ProtocolUnit
{ {
... ...
} }
``` ```
2.Implement Protocal based ProtocalLinker. (ModbusTcpProtocalLinker) 2.Implement Protocol based ProtocolLinker. (ModbusTcpProtocolLinker)
ProtocalLinker connect the Protocal to the BaseConnector, so that byte array can be sended using some specific way like Ethenet. ProtocolLinker connect the Protocol to the BaseConnector, so that byte array can be sended using some specific way like Ethenet.
```C# ```C#
public class ModbusTcpProtocalLinker : TcpProtocalLinker public class ModbusTcpProtocolLinker : TcpProtocolLinker
{ {
public override bool CheckRight(byte[] content) public override bool CheckRight(byte[] content)
``` ```
CheckRight is the return check function, if you got the wrong bytes answer, you can return false or throw exceptions. CheckRight is the return check function, if you got the wrong bytes answer, you can return false or throw exceptions.
3.Implement Connector based ProtocalLinker and BaseConnector. (TcpProtocalLinker.cs, TcpConnector.cs) (Optional) 3.Implement Connector based ProtocolLinker and BaseConnector. (TcpProtocolLinker.cs, TcpConnector.cs) (Optional)
If you want to connect to hardware using another way, please implement your own ProtocalLinker and BaseConnector. And please remember that if you want to connector hardware using serial line, please don't use ComConnector in Modbus.Net and implement your own ComConnector. If you want to connect to hardware using another way, please implement your own ProtocolLinker and BaseConnector. And please remember that if you want to connector hardware using serial line, please don't use ComConnector in Modbus.Net and implement your own ComConnector.
You should implement all of these functions in BaseConnector. You should implement all of these functions in BaseConnector.
```C# ```C#
public abstract string ConnectionToken { get; } public abstract string ConnectionToken { get; }
@@ -457,11 +457,11 @@ public abstract byte[] SendMsg(byte[] message);
public abstract Task<byte[]> SendMsgAsync(byte[] message); public abstract Task<byte[]> SendMsgAsync(byte[] message);
``` ```
4.Implement ProtocalLinkerBytesExtend (ModbusProtocalLinkerBytesExtend.cs) 4.Implement ProtocolLinkerBytesExtend (ModbusProtocolLinkerBytesExtend.cs)
If you want to use extend bytes when you send your bytes array to the hardware, you can set ProtocalLinkerBytesExtend. If you want to use extend bytes when you send your bytes array to the hardware, you can set ProtocolLinkerBytesExtend.
The name of ProtocalLinkerBytesExtend is ProtocalLinker name + BytesExtend, like ModbusTcpProtocalLinkerBytesExtend. The name of ProtocolLinkerBytesExtend is ProtocolLinker name + BytesExtend, like ModbusTcpProtocolLinkerBytesExtend.
```C# ```C#
public class ModbusTcpProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend public class ModbusTcpProtocolLinkerBytesExtend : ProtocolLinkerBytesExtend
{ {
public override byte[] BytesExtend(byte[] content) public override byte[] BytesExtend(byte[] content)
{ {
@@ -482,7 +482,7 @@ public class ModbusTcpProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
} }
} }
``` ```
For example modbus tcp has a 6 bytes head: 4 bytes 0 and 2 bytes length. And when you get the bytes, please remove the head to fit the ModbusProtocal Unformat function. For example modbus tcp has a 6 bytes head: 4 bytes 0 and 2 bytes length. And when you get the bytes, please remove the head to fit the ModbusProtocol Unformat function.
5.Implement BaseUtility.cs (ModbusUtility.cs) 5.Implement BaseUtility.cs (ModbusUtility.cs)
Implement low level api for Modbus. Implement low level api for Modbus.
@@ -492,7 +492,7 @@ public override void SetConnectionType(int connectionType)
protected override async Task<byte[]> GetDatasAsync(byte slaveAddress, byte masterAddress, string startAddress, int getByteCount) protected override async Task<byte[]> GetDatasAsync(byte slaveAddress, byte masterAddress, string startAddress, int getByteCount)
public override async Task<bool> SetDatasAsync(byte slaveAddress, byte masterAddress, string startAddress, object[] setContents) public override async Task<bool> SetDatasAsync(byte slaveAddress, byte masterAddress, string startAddress, object[] setContents)
``` ```
And don't remember set default AddressTranslator, slaveAddress, masterAddress and Protocal. And don't remember set default AddressTranslator, slaveAddress, masterAddress and Protocol.
```C# ```C#
public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress) public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress)
{ {
@@ -544,13 +544,13 @@ public class AddressUnit
public int SubAddress { get; set; } = 0; public int SubAddress { get; set; } = 0;
} }
``` ```
First of all, there are two types of coordinates in Modbus.Net Address System - Protocal Coordinate and Abstract Coordinate. First of all, there are two types of coordinates in Modbus.Net Address System - Protocol Coordinate and Abstract Coordinate.
Here is an example of the differences between them: Here is an example of the differences between them:
In Register of Modbus, the minimum type is short, but Modbus.Net use type of byte to show the result. If you want to get value from 400003 in protocal coordinate, you actually get 5th and 6th byte value in abstract coordinate. In Register of Modbus, the minimum type is short, but Modbus.Net use type of byte to show the result. If you want to get value from 400003 in protocal coordinate, you actually get 5th and 6th byte value in abstract coordinate.
Version 1.0 and 1.1 used abstract coordinate so you need to convert the address. But fortunatly after 1.2, AddressUnit uses Protocal Coordinate so that you donnot need the convert the address descripted by modbus protocal itself, but this means if you want to get a bit or byte value in modbus, you need to use the subpos system. Version 1.0 and 1.1 used abstract coordinate so you need to convert the address. But fortunatly after 1.2, AddressUnit uses Protocol Coordinate so that you donnot need the convert the address descripted by modbus protocal itself, but this means if you want to get a bit or byte value in modbus, you need to use the subpos system.
For example if you want the get a value from the 6th byte in Hold Register. In traditional modbus you can only get 400003 of 2 bytes and get the 2nd byte from it. But in Modbus.Net there is an easy way to get it. For example if you want the get a value from the 6th byte in Hold Register. In traditional modbus you can only get 400003 of 2 bytes and get the 2nd byte from it. But in Modbus.Net there is an easy way to get it.
``` ```

View File

@@ -5,12 +5,12 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// Tcp连接对象 /// Tcp连接对象
/// </summary> /// </summary>
public abstract class TcpProtocalLinker : ProtocalLinker public abstract class TcpProtocolLinker : ProtocolLinker
{ {
/// <summary> /// <summary>
/// 构造器 /// 构造器
/// </summary> /// </summary>
protected TcpProtocalLinker(int port) protected TcpProtocolLinker(int port)
: this(ConfigurationManager.AppSettings["IP"], port) : this(ConfigurationManager.AppSettings["IP"], port)
{ {
} }
@@ -20,7 +20,7 @@ namespace Modbus.Net
/// </summary> /// </summary>
/// <param name="ip">Ip地址</param> /// <param name="ip">Ip地址</param>
/// <param name="port">端口</param> /// <param name="port">端口</param>
protected TcpProtocalLinker(string ip, int port) protected TcpProtocolLinker(string ip, int port)
: this(ip, port, int.Parse(ConfigurationManager.AppSettings["IPConnectionTimeout"] ?? "5000")) : this(ip, port, int.Parse(ConfigurationManager.AppSettings["IPConnectionTimeout"] ?? "5000"))
{ {
} }
@@ -31,7 +31,7 @@ namespace Modbus.Net
/// <param name="ip">Ip地址</param> /// <param name="ip">Ip地址</param>
/// <param name="port">端口</param> /// <param name="port">端口</param>
/// <param name="connectionTimeout">超时时间</param> /// <param name="connectionTimeout">超时时间</param>
protected TcpProtocalLinker(string ip, int port, int connectionTimeout) protected TcpProtocolLinker(string ip, int port, int connectionTimeout)
{ {
//初始化连接对象 //初始化连接对象
BaseConnector = new TcpConnector(ip, port, connectionTimeout); BaseConnector = new TcpConnector(ip, port, connectionTimeout);