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

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.Modbus
/// <summary>
/// Modbus/Ascii码协议
/// </summary>
public class ModbusAsciiInTcpProtocal : ModbusProtocal
public class ModbusAsciiInTcpProtocol : ModbusProtocol
{
/// <summary>
/// 构造函数
@@ -13,7 +13,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
}
@@ -25,10 +25,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
ProtocalLinker = new ModbusAsciiInTcpProtocalLinker(ip, slaveAddress);
ProtocolLinker = new ModbusAsciiInTcpProtocolLinker(ip, slaveAddress);
}
/// <summary>
@@ -39,10 +39,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
ProtocalLinker = new ModbusTcpProtocalLinker(ip, port);
ProtocolLinker = new ModbusTcpProtocolLinker(ip, port);
}
}
}

View File

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

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.Modbus
/// <summary>
/// Modbus/Ascii码协议
/// </summary>
public class ModbusAsciiProtocal : ModbusProtocal
public class ModbusAsciiProtocol : ModbusProtocol
{
/// <summary>
/// 构造函数
@@ -13,7 +13,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
}
@@ -25,10 +25,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
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;
namespace Modbus.Net.Modbus
@@ -6,17 +7,17 @@ namespace Modbus.Net.Modbus
/// <summary>
/// Modbus/Ascii码协议连接器
/// </summary>
public class ModbusAsciiProtocalLinker : ComProtocalLinker
public class ModbusAsciiProtocolLinker : ComProtocolLinker
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="com">串口地址</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)
{
((BaseConnector)BaseConnector).AddController(new FIFOController(500));
((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<int>[] { new List<int> { 0, 1 }}, 500));
}
/// <summary>
@@ -26,15 +27,15 @@ namespace Modbus.Net.Modbus
/// <returns>校验是否正确</returns>
public override bool? CheckRight(byte[] content)
{
//ProtocalLinker不会返回null
//ProtocolLinker不会返回null
if (!base.CheckRight(content).Value) return false;
//CRC校验失败
var contentString = Encoding.ASCII.GetString(content);
if (!Crc16.GetInstance().LrcEfficacy(contentString))
throw new ModbusProtocalErrorException(501);
throw new ModbusProtocolErrorException(501);
//Modbus协议错误
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;
}
}

View File

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

View File

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

View File

@@ -6,7 +6,7 @@ namespace Modbus.Net.Modbus
/// <summary>
/// Modbus/Rtu协议tcp透传
/// </summary>
public class ModbusRtuInTcpProtocal : ModbusProtocal
public class ModbusRtuInTcpProtocol : ModbusProtocol
{
/// <summary>
/// 构造函数
@@ -14,7 +14,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
}
@@ -26,10 +26,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
ProtocalLinker = new ModbusTcpProtocalLinker(ip);
ProtocolLinker = new ModbusTcpProtocolLinker(ip);
}
/// <summary>
@@ -39,10 +39,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
ProtocalLinker = new ModbusRtuInTcpProtocalLinker(ip, port);
ProtocolLinker = new ModbusRtuInTcpProtocolLinker(ip, port);
}
}
}

View File

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

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.Modbus
/// <summary>
/// Modbus/Rtu协议
/// </summary>
public class ModbusRtuProtocal : ModbusProtocal
public class ModbusRtuProtocol : ModbusProtocol
{
/// <summary>
/// 构造函数
@@ -13,7 +13,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
}
@@ -25,10 +25,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
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
{
/// <summary>
/// Modbus/Rtu协议连接器
/// </summary>
public class ModbusRtuProtocalLinker : ComProtocalLinker
public class ModbusRtuProtocolLinker : ComProtocolLinker
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="com">串口地址</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)
{
((BaseConnector)BaseConnector).AddController(new FIFOController(500));
((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<int>[]{new List<int>{0}}, 500));
}
/// <summary>
@@ -25,14 +26,14 @@ namespace Modbus.Net.Modbus
/// <returns>数据是否正确</returns>
public override bool? CheckRight(byte[] content)
{
//ProtocalLinker的CheckRight不会返回null
//ProtocolLinker的CheckRight不会返回null
if (!base.CheckRight(content).Value) return false;
//CRC校验失败
if (!Crc16.GetInstance().CrcEfficacy(content))
throw new ModbusProtocalErrorException(501);
throw new ModbusProtocolErrorException(501);
//Modbus协议错误
if (content[1] > 127)
throw new ModbusProtocalErrorException(content[2]);
throw new ModbusProtocolErrorException(content[2]);
return true;
}
}

View File

@@ -5,7 +5,7 @@ namespace Modbus.Net.Modbus
/// <summary>
/// Modbus/Tcp协议
/// </summary>
public class ModbusTcpProtocal : ModbusProtocal
public class ModbusTcpProtocol : ModbusProtocol
{
/// <summary>
/// 构造函数
@@ -13,7 +13,7 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
}
@@ -25,10 +25,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
ProtocalLinker = new ModbusTcpProtocalLinker(ip);
ProtocolLinker = new ModbusTcpProtocolLinker(ip);
}
/// <summary>
@@ -39,10 +39,10 @@ namespace Modbus.Net.Modbus
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</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)
{
ProtocalLinker = new ModbusTcpProtocalLinker(ip, port);
ProtocolLinker = new ModbusTcpProtocolLinker(ip, port);
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -12,7 +12,7 @@
/// <param name="isRegexOn">是否开启正则匹配</param>
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>
/// Opc协议
/// </summary>
public abstract class OpcProtocal : BaseProtocal<OpcParamIn, OpcParamOut, ProtocalUnit<OpcParamIn, OpcParamOut>,
PipeUnit<OpcParamIn, OpcParamOut, IProtocalLinker<OpcParamIn, OpcParamOut>,
ProtocalUnit<OpcParamIn, OpcParamOut>>>
public abstract class OpcProtocol : BaseProtocol<OpcParamIn, OpcParamOut, ProtocolUnit<OpcParamIn, OpcParamOut>,
PipeUnit<OpcParamIn, OpcParamOut, IProtocolLinker<OpcParamIn, OpcParamOut>,
ProtocolUnit<OpcParamIn, OpcParamOut>>>
{
/// <summary>
/// 构造函数
/// </summary>
protected OpcProtocal() : base(0, 0, Endian.BigEndianLsb)
protected OpcProtocol() : base(0, 0, Endian.BigEndianLsb)
{
}
}
@@ -67,8 +67,8 @@
/// <summary>
/// 读数据协议
/// </summary>
[SpecialProtocalUnit]
public class ReadRequestOpcProtocal : ProtocalUnit<OpcParamIn, OpcParamOut>
[SpecialProtocolUnit]
public class ReadRequestOpcProtocol : ProtocolUnit<OpcParamIn, OpcParamOut>
{
/// <summary>
/// 从对象的参数数组格式化
@@ -159,8 +159,8 @@
/// <summary>
/// 写数据协议
/// </summary>
[SpecialProtocalUnit]
public class WriteRequestOpcProtocal : ProtocalUnit<OpcParamIn, OpcParamOut>
[SpecialProtocolUnit]
public class WriteRequestOpcProtocol : ProtocolUnit<OpcParamIn, OpcParamOut>
{
/// <summary>
/// 从对象的参数数组格式化

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,7 +6,7 @@ namespace Modbus.Net.Siemens
/// <summary>
/// 西门子Ppi协议
/// </summary>
public class SiemensPpiProtocal : SiemensProtocal
public class SiemensPpiProtocol : SiemensProtocol
{
private readonly string _com;
@@ -15,7 +15,7 @@ namespace Modbus.Net.Siemens
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param>
public SiemensPpiProtocal(byte slaveAddress, byte masterAddress)
public SiemensPpiProtocol(byte slaveAddress, byte masterAddress)
: this(ConfigurationManager.AppSettings["COM"], slaveAddress, masterAddress)
{
}
@@ -26,7 +26,7 @@ namespace Modbus.Net.Siemens
/// <param name="com">串口地址</param>
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param>
public SiemensPpiProtocal(string com, byte slaveAddress, byte masterAddress)
public SiemensPpiProtocol(string com, byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress)
{
_com = com;
@@ -49,7 +49,7 @@ namespace Modbus.Net.Siemens
/// <returns>从设备获取的字节流</returns>
public override async Task<PipeUnit> SendReceiveAsync(params object[] content)
{
if (ProtocalLinker == null || !ProtocalLinker.IsConnected)
if (ProtocolLinker == null || !ProtocolLinker.IsConnected)
await ConnectAsync();
return await base.SendReceiveAsync(Endian, content);
}
@@ -60,7 +60,7 @@ namespace Modbus.Net.Siemens
/// <param name="unit">协议核心</param>
/// <param name="content">协议的参数</param>
/// <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);
}
@@ -71,13 +71,13 @@ namespace Modbus.Net.Siemens
/// <returns>是否连接成功</returns>
public override async Task<bool> ConnectAsync()
{
ProtocalLinker = new SiemensPpiProtocalLinker(_com, SlaveAddress);
ProtocolLinker = new SiemensPpiProtocolLinker(_com, SlaveAddress);
var inputStruct = new ComCreateReferenceSiemensInputStruct(SlaveAddress, MasterAddress);
var outputStruct =
(await (await
ForceSendReceiveAsync(this[typeof(ComCreateReferenceSiemensProtocal)],
ForceSendReceiveAsync(this[typeof(ComCreateReferenceSiemensProtocol)],
inputStruct)).
SendReceiveAsync(this[typeof(ComConfirmMessageSiemensProtocal)], answer =>
SendReceiveAsync(this[typeof(ComConfirmMessageSiemensProtocol)], answer =>
new ComConfirmMessageSiemensInputStruct(SlaveAddress, MasterAddress)
)).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.Tasks;
@@ -7,17 +8,17 @@ namespace Modbus.Net.Siemens
/// <summary>
/// 西门子Ppi协议连接器
/// </summary>
public class SiemensPpiProtocalLinker : ComProtocalLinker
public class SiemensPpiProtocolLinker : ComProtocolLinker
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="com">串口地址</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)
{
((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>
@@ -33,7 +34,7 @@ namespace Modbus.Net.Siemens
var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[4], content[5]);
var receiveBytes2 =
await SendReceiveWithoutExtAndDecAsync(
new ComConfirmMessageSiemensProtocal().Format(inputStruct2));
new ComConfirmMessageSiemensProtocol().Format(inputStruct2));
}
var receiveBytes = await SendReceiveWithoutExtAndDecAsync(extBytes);
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 receiveBytes2 =
await SendReceiveWithoutExtAndDecAsync(
new ComConfirmMessageSiemensProtocal().Format(inputStruct2));
new ComConfirmMessageSiemensProtocol().Format(inputStruct2));
return BytesDecact(receiveBytes2);
}
return BytesDecact(receiveBytes);
@@ -63,14 +64,14 @@ namespace Modbus.Net.Siemens
var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[1], content[2]);
ans =
await SendReceiveWithoutExtAndDecAsync(
new ComConfirmMessageSiemensProtocal().Format(inputStruct2));
new ComConfirmMessageSiemensProtocol().Format(inputStruct2));
}
else
{
var inputStruct2 = new ComConfirmMessageSiemensInputStruct(content[4], content[5]);
ans =
await SendReceiveWithoutExtAndDecAsync(
new ComConfirmMessageSiemensProtocal().Format(inputStruct2));
new ComConfirmMessageSiemensProtocol().Format(inputStruct2));
}
}
return ans;

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Configuration;
namespace Modbus.Net.Siemens
@@ -6,13 +7,13 @@ namespace Modbus.Net.Siemens
/// <summary>
/// 西门子Tcp协议连接器
/// </summary>
public class SiemensTcpProtocalLinker : TcpProtocalLinker
public class SiemensTcpProtocolLinker : TcpProtocolLinker
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">IP地址</param>
public SiemensTcpProtocalLinker(string ip)
public SiemensTcpProtocolLinker(string ip)
: this(ip, int.Parse(ConfigurationManager.AppSettings["SiemensPort"] ?? "102"))
{
}
@@ -22,10 +23,10 @@ namespace Modbus.Net.Siemens
/// </summary>
/// <param name="ip">IP地址</param>
/// <param name="port">端口</param>
public SiemensTcpProtocalLinker(string ip, int port)
public SiemensTcpProtocolLinker(string ip, int 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>
@@ -48,10 +49,10 @@ namespace Modbus.Net.Siemens
case 0x02:
case 0x03:
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:
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;
default:

View File

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

View File

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

View File

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

View File

@@ -104,71 +104,4 @@ namespace Modbus.Net
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)
{
//字节坐标的位置
var localPos = AddressHelper.MapProtocalCoordinateToAbstractCoordinate(address.Address,
var localPos = AddressHelper.MapProtocolCoordinateToAbstractCoordinate(address.Address,
communicateAddress.Address,
AddressTranslator.GetAreaByteLength(communicateAddress.Area)) +
address.SubAddress * 0.125;
@@ -469,7 +469,7 @@ namespace Modbus.Net
{
//字节坐标地址
var byteCount =
AddressHelper.MapProtocalGetCountToAbstractByteCount(
AddressHelper.MapProtocolGetCountToAbstractByteCount(
addressUnit.Address - communicateAddress.Address +
addressUnit.SubAddress * 0.125 /
AddressTranslator.GetAreaByteLength(communicateAddress.Area),

View File

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

View File

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

View File

@@ -6,7 +6,7 @@ namespace Modbus.Net
/// <summary>
/// 串口连接对象
/// </summary>
public abstract class ComProtocalLinker : ProtocalLinker
public abstract class ComProtocolLinker : ProtocolLinker
{
/// <summary>
/// 构造器
@@ -16,7 +16,7 @@ namespace Modbus.Net
/// <param name="stopBits">停止位</param>
/// <param name="dataBits">数据位</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)
{
}
@@ -30,7 +30,7 @@ namespace Modbus.Net
/// <param name="stopBits">停止位</param>
/// <param name="dataBits">数据位</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)
: this(
com, baudRate, parity, stopBits, dataBits,
@@ -48,7 +48,7 @@ namespace Modbus.Net
/// <param name="dataBits">数据位</param>
/// <param name="connectionTimeout">超时时间</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)
{
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>
/// <typeparam name="TParamIn">向Connector传入的类型</typeparam>
/// <typeparam name="TParamOut">从Connector返回的类型</typeparam>
/// <typeparam name="TProtocalUnit">协议单元的类型</typeparam>
public interface IProtocal<TParamIn, TParamOut, TProtocalUnit, TPipeUnit>
where TProtocalUnit : class, IProtocalFormatting<TParamIn, TParamOut>
/// <typeparam name="TProtocolUnit">协议单元的类型</typeparam>
public interface IProtocol<TParamIn, TParamOut, TProtocolUnit, TPipeUnit>
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>
IProtocalLinker<TParamIn, TParamOut> ProtocalLinker { get; }
IProtocolLinker<TParamIn, TParamOut> ProtocolLinker { get; }
/// <summary>
/// 协议索引器,这是一个懒加载协议,当字典中不存在协议时自动加载协议,否则调用已经加载的协议
/// </summary>
/// <param name="type">协议的类的GetType</param>
/// <returns>协议的实例</returns>
TProtocalUnit this[Type type] { get; }
TProtocolUnit this[Type type] { get; }
/// <summary>
/// 协议连接开始
@@ -58,7 +58,7 @@ namespace Modbus.Net
/// <param name="unit">协议的实例</param>
/// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns>
TPipeUnit SendReceive(TProtocalUnit unit, IInputStruct content);
TPipeUnit SendReceive(TProtocolUnit unit, IInputStruct content);
/// <summary>
/// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -66,7 +66,7 @@ namespace Modbus.Net
/// <param name="unit">协议的实例</param>
/// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns>
Task<TPipeUnit> SendReceiveAsync(TProtocalUnit unit, IInputStruct content);
Task<TPipeUnit> SendReceiveAsync(TProtocolUnit unit, IInputStruct content);
/// <summary>
/// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -76,7 +76,7 @@ namespace Modbus.Net
/// <returns>输出信息的结构化描述</returns>
/// <typeparam name="T">IOutputStruct的具体类型</typeparam>
T SendReceive<T>(
TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct;
TProtocolUnit unit, IInputStruct content) where T : class, IOutputStruct;
/// <summary>
/// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -86,6 +86,6 @@ namespace Modbus.Net
/// <returns>输出信息的结构化描述</returns>
/// <typeparam name="T">IOutputStruct的具体类型</typeparam>
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>
public interface IProtocalFormatting : IProtocalFormatting<byte[], byte[]>
public interface IProtocolFormatting : IProtocolFormatting<byte[], byte[]>
{
}
@@ -12,7 +12,7 @@
/// </summary>
/// <typeparam name="TParamIn">向Connector传入的数据类型</typeparam>
/// <typeparam name="TParamOut">从Connector返回的数据类型</typeparam>
public interface IProtocalFormatting<out TParamIn, in TParamOut>
public interface IProtocolFormatting<out TParamIn, in TParamOut>
{
/// <summary>
/// 是否为小端格式

View File

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

View File

@@ -3,14 +3,14 @@
/// <summary>
/// 协议字节伸缩
/// </summary>
public interface IProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend<byte[], byte[]>
public interface IProtocolLinkerBytesExtend : IProtocolLinkerBytesExtend<byte[], byte[]>
{
}
/// <summary>
/// 协议字节伸缩
/// </summary>
public interface IProtocalLinkerBytesExtend<TParamIn, TParamOut>
public interface IProtocolLinkerBytesExtend<TParamIn, TParamOut>
{
/// <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>
public class PipeUnit : PipeUnit<byte[], byte[], IProtocalLinker<byte[], byte[]>, ProtocalUnit>
public class PipeUnit : PipeUnit<byte[], byte[], IProtocolLinker<byte[], byte[]>, ProtocolUnit>
{
/// <summary>
/// 构造函数
/// </summary>
/// <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="parameters">传递给输入结构的参数</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)
{
}
@@ -42,12 +42,12 @@ namespace Modbus.Net
if (Success)
{
var content = inputStructCreator.Invoke(ReturnParams);
if (ProtocalLinker != null)
return new PipeUnit(ProtocalLinker, null,
await ProtocalLinker.SendReceiveAsync(ProtocalUnit.TranslateContent(endian, content)),
if (ProtocolLinker != null)
return new PipeUnit(ProtocolLinker, null,
await ProtocolLinker.SendReceiveAsync(ProtocolUnit.TranslateContent(endian, content)),
true);
}
return new PipeUnit(ProtocalLinker, null, ReturnParams, false);
return new PipeUnit(ProtocolLinker, null, ReturnParams, false);
}
/// <summary>
@@ -57,14 +57,14 @@ namespace Modbus.Net
/// <param name="inputStructCreator">构造输入结构的函数</param>
/// <returns>发送完成之后新的管道实例</returns>
public new async Task<PipeUnit> SendReceiveAsync(
ProtocalUnit unit,
ProtocolUnit unit,
Func<byte[], IInputStruct> inputStructCreator)
{
var receiveContent = await SendReceiveAsyncParamOut(unit, inputStructCreator);
if (receiveContent != null)
return new PipeUnit(ProtocalLinker, unit,
return new PipeUnit(ProtocolLinker, unit,
receiveContent, true);
return new PipeUnit(ProtocalLinker, unit, ReturnParams,
return new PipeUnit(ProtocolLinker, unit, ReturnParams,
false);
}
@@ -83,18 +83,18 @@ namespace Modbus.Net
/// </summary>
/// <typeparam name="TParamIn">输入参数</typeparam>
/// <typeparam name="TParamOut">输出参数</typeparam>
/// <typeparam name="TProtocalLinker">连接器</typeparam>
/// <typeparam name="TProtocalUnit">协议单元</typeparam>
public class PipeUnit<TParamIn, TParamOut, TProtocalLinker, TProtocalUnit>
where TProtocalUnit : class, IProtocalFormatting<TParamIn, TParamOut>
where TProtocalLinker : class, IProtocalLinker<TParamIn, TParamOut>
/// <typeparam name="TProtocolLinker">连接器</typeparam>
/// <typeparam name="TProtocolUnit">协议单元</typeparam>
public class PipeUnit<TParamIn, TParamOut, TProtocolLinker, TProtocolUnit>
where TProtocolUnit : class, IProtocolFormatting<TParamIn, TParamOut>
where TProtocolLinker : class, IProtocolLinker<TParamIn, TParamOut>
where TParamOut : class
{
/// <summary>
/// 构造函数
/// </summary>
/// <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="parameters">输入参数</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;
ProtocalUnit = protocalUnit;
ProtocolLinker = protocalLinker;
ProtocolUnit = protocalUnit;
ReturnParams = parameters;
Success = success;
}
@@ -117,12 +117,12 @@ namespace Modbus.Net
/// <summary>
/// 协议连接器
/// </summary>
protected TProtocalLinker ProtocalLinker { get; set; }
protected TProtocolLinker ProtocolLinker { get; set; }
/// <summary>
/// 协议单元
/// </summary>
protected TProtocalUnit ProtocalUnit { get; set; }
protected TProtocolUnit ProtocolUnit { get; set; }
/// <summary>
/// 输入结构传入的参数
@@ -140,7 +140,7 @@ namespace Modbus.Net
/// <param name="unit">协议单元</param>
/// <param name="inputStructCreator">输入参数生成函数</param>
/// <returns>输出参数</returns>
protected async Task<TParamOut> SendReceiveAsyncParamOut(TProtocalUnit unit,
protected async Task<TParamOut> SendReceiveAsyncParamOut(TProtocolUnit unit,
Func<TParamOut, IInputStruct> inputStructCreator)
{
if (Success)
@@ -151,10 +151,10 @@ namespace Modbus.Net
{
TParamOut receiveContent;
//如果为特别处理协议的话,跳过协议扩展收缩
if (unit.GetType().GetTypeInfo().GetCustomAttributes(typeof(SpecialProtocalUnitAttribute)).Any())
receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent);
if (unit.GetType().GetTypeInfo().GetCustomAttributes(typeof(SpecialProtocolUnitAttribute)).Any())
receiveContent = await ProtocolLinker.SendReceiveWithoutExtAndDecAsync(formatContent);
else
receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent);
receiveContent = await ProtocolLinker.SendReceiveAsync(formatContent);
return receiveContent;
}
}
@@ -167,15 +167,15 @@ namespace Modbus.Net
/// <param name="unit">协议单元</param>
/// <param name="inputStructCreator">输入参数生成函数</param>
/// <returns>管道实体</returns>
public virtual async Task<PipeUnit<TParamIn, TParamOut, TProtocalLinker, TProtocalUnit>> SendReceiveAsync(
TProtocalUnit unit,
public virtual async Task<PipeUnit<TParamIn, TParamOut, TProtocolLinker, TProtocolUnit>> SendReceiveAsync(
TProtocolUnit unit,
Func<TParamOut, IInputStruct> inputStructCreator)
{
var receiveContent = await SendReceiveAsyncParamOut(unit, inputStructCreator);
if (receiveContent != null)
return new PipeUnit<TParamIn, TParamOut, TProtocalLinker, TProtocalUnit>(ProtocalLinker, unit,
return new PipeUnit<TParamIn, TParamOut, TProtocolLinker, TProtocolUnit>(ProtocolLinker, unit,
receiveContent, true);
return new PipeUnit<TParamIn, TParamOut, TProtocalLinker, TProtocalUnit>(ProtocalLinker, unit, ReturnParams,
return new PipeUnit<TParamIn, TParamOut, TProtocolLinker, TProtocolUnit>(ProtocolLinker, unit, ReturnParams,
false);
}
@@ -187,7 +187,7 @@ namespace Modbus.Net
public T Unwrap<T>() where T : class, IOutputStruct
{
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>
public abstract class ProtocalLinker : ProtocalLinker<byte[], byte[]>
public abstract class ProtocolLinker : ProtocolLinker<byte[], byte[]>
{
/// <summary>
/// 发送并接收数据
@@ -47,7 +47,7 @@ namespace Modbus.Net
var bytesExtend =
Activator.CreateInstance(GetType().GetTypeInfo().Assembly.GetType(GetType().FullName + "BytesExtend"))
as
IProtocalLinkerBytesExtend;
IProtocolLinkerBytesExtend;
return bytesExtend?.BytesExtend(content);
}
@@ -62,7 +62,7 @@ namespace Modbus.Net
var bytesExtend =
Activator.CreateInstance(GetType().GetTypeInfo().Assembly.GetType(GetType().FullName + "BytesExtend"))
as
IProtocalLinkerBytesExtend;
IProtocolLinkerBytesExtend;
return bytesExtend?.BytesDecact(content);
}
}
@@ -70,7 +70,7 @@ namespace Modbus.Net
/// <summary>
/// 基本的协议连接器
/// </summary>
public abstract class ProtocalLinker<TParamIn, TParamOut> : IProtocalLinker<TParamIn, TParamOut>
public abstract class ProtocolLinker<TParamIn, TParamOut> : IProtocolLinker<TParamIn, TParamOut>
where TParamOut : class
{
/// <summary>

View File

@@ -5,14 +5,14 @@ namespace Modbus.Net
/// <summary>
/// 协议单元
/// </summary>
public abstract class ProtocalUnit : ProtocalUnit<byte[], byte[]>
public abstract class ProtocolUnit : ProtocolUnit<byte[], byte[]>
{
}
/// <summary>
/// 协议单元
/// </summary>
public abstract class ProtocalUnit<TParamIn, TParamOut> : IProtocalFormatting<TParamIn, TParamOut>
public abstract class ProtocolUnit<TParamIn, TParamOut> : IProtocolFormatting<TParamIn, TParamOut>
{
/// <summary>
/// 是否为小端格式
@@ -72,7 +72,7 @@ namespace Modbus.Net
/// 特殊协议单元写入这个协议不会执行BytesExtend和BytesDecact
/// </summary>
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class SpecialProtocalUnitAttribute : Attribute
public class SpecialProtocolUnitAttribute : Attribute
{
}
@@ -93,13 +93,13 @@ namespace Modbus.Net
/// <summary>
/// 协议错误
/// </summary>
public class ProtocalErrorException : Exception
public class ProtocolErrorException : Exception
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="message"></param>
public ProtocalErrorException(string message)
public ProtocolErrorException(string 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.
### 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.
@@ -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.
### Protocal
### Protocol
Manage all protocals and implement a lazy loading method.
### Utility
Manage several types of Protocal to a same calling interface.
Manage several types of Protocol to a same calling interface.
### Machine
@@ -385,7 +385,7 @@ task.InvokeTimerAll(new TaskItemGetData(returnValues =>
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.
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.
1.Implement Protocal. (ModbusProtocal.cs, ModbusTcpProtocal.cs)
First: Extend BaseProtocal to ModbusProtocal.
1.Implement Protocol. (ModbusProtocol.cs, ModbusTcpProtocol.cs)
First: Extend BaseProtocol to ModbusProtocol.
```C#
public abstract class ModbusProtocal : BaseProtocal
public class ModbusTcpProtocal : ModbusProtocal
public abstract class ModbusProtocol : BaseProtocol
public class ModbusTcpProtocol : ModbusProtocol
```
"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#
public class ReadDataModbusProtocal : ProtocalUnit
public class ReadDataModbusProtocol : ProtocolUnit
{
public override byte[] Format(IInputStruct message)
{
@@ -423,27 +423,27 @@ public class ReadDataModbusProtocal : ProtocalUnit
}
}
```
There is another attribute called SpecialProtocalUnitAttribute.
If you add SpecialProtocalUnitAttribute to ProtocalUnit, then the protocal will not run BytesExtend and BytesDecact.
There is another attribute called SpecialProtocolUnitAttribute.
If you add SpecialProtocolUnitAttribute to ProtocolUnit, then the protocal will not run BytesExtend and BytesDecact.
```C#
[SpecialProtocalUnit]
internal class CreateReferenceSiemensProtocal : ProtocalUnit
[SpecialProtocolUnit]
internal class CreateReferenceSiemensProtocol : ProtocolUnit
{
...
}
```
2.Implement Protocal based ProtocalLinker. (ModbusTcpProtocalLinker)
ProtocalLinker connect the Protocal to the BaseConnector, so that byte array can be sended using some specific way like Ethenet.
2.Implement Protocol based ProtocolLinker. (ModbusTcpProtocolLinker)
ProtocolLinker connect the Protocol to the BaseConnector, so that byte array can be sended using some specific way like Ethenet.
```C#
public class ModbusTcpProtocalLinker : TcpProtocalLinker
public class ModbusTcpProtocolLinker : TcpProtocolLinker
{
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.
3.Implement Connector based ProtocalLinker and BaseConnector. (TcpProtocalLinker.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.
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 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.
```C#
public abstract string ConnectionToken { get; }
@@ -457,11 +457,11 @@ public abstract byte[] SendMsg(byte[] message);
public abstract Task<byte[]> SendMsgAsync(byte[] message);
```
4.Implement ProtocalLinkerBytesExtend (ModbusProtocalLinkerBytesExtend.cs)
If you want to use extend bytes when you send your bytes array to the hardware, you can set ProtocalLinkerBytesExtend.
The name of ProtocalLinkerBytesExtend is ProtocalLinker name + BytesExtend, like ModbusTcpProtocalLinkerBytesExtend.
4.Implement ProtocolLinkerBytesExtend (ModbusProtocolLinkerBytesExtend.cs)
If you want to use extend bytes when you send your bytes array to the hardware, you can set ProtocolLinkerBytesExtend.
The name of ProtocolLinkerBytesExtend is ProtocolLinker name + BytesExtend, like ModbusTcpProtocolLinkerBytesExtend.
```C#
public class ModbusTcpProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
public class ModbusTcpProtocolLinkerBytesExtend : ProtocolLinkerBytesExtend
{
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)
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)
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#
public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress)
{
@@ -544,13 +544,13 @@ public class AddressUnit
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:
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.
```

View File

@@ -5,12 +5,12 @@ namespace Modbus.Net
/// <summary>
/// Tcp连接对象
/// </summary>
public abstract class TcpProtocalLinker : ProtocalLinker
public abstract class TcpProtocolLinker : ProtocolLinker
{
/// <summary>
/// 构造器
/// </summary>
protected TcpProtocalLinker(int port)
protected TcpProtocolLinker(int port)
: this(ConfigurationManager.AppSettings["IP"], port)
{
}
@@ -20,7 +20,7 @@ namespace Modbus.Net
/// </summary>
/// <param name="ip">Ip地址</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"))
{
}
@@ -31,7 +31,7 @@ namespace Modbus.Net
/// <param name="ip">Ip地址</param>
/// <param name="port">端口</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);