2018-01-05 Update 2 Add Modbus RtuInUdp and AsciiInUdp

This commit is contained in:
parallelbgls
2018-01-05 12:44:33 +08:00
parent e8b8c3829e
commit 8593b9cc91
9 changed files with 260 additions and 13 deletions

View File

@@ -26,7 +26,7 @@ namespace Modbus.Net.Modbus
public ModbusAsciiInTcpProtocol(string ip, byte slaveAddress, byte masterAddress) public ModbusAsciiInTcpProtocol(string ip, byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress) : base(slaveAddress, masterAddress)
{ {
ProtocolLinker = new ModbusAsciiInTcpProtocolLinker(ip, slaveAddress); ProtocolLinker = new ModbusAsciiInTcpProtocolLinker(ip);
} }
/// <summary> /// <summary>
@@ -39,7 +39,7 @@ namespace Modbus.Net.Modbus
public ModbusAsciiInTcpProtocol(string ip, int port, byte slaveAddress, byte masterAddress) public ModbusAsciiInTcpProtocol(string ip, int port, byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress) : base(slaveAddress, masterAddress)
{ {
ProtocolLinker = new ModbusTcpProtocolLinker(ip, port); ProtocolLinker = new ModbusAsciiInTcpProtocolLinker(ip, port);
} }
} }
} }

View File

@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Modbus.Net.Modbus
{
public class ModbusAsciiInUdpProtocol : ModbusProtocol
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param>
public ModbusAsciiInUdpProtocol(byte slaveAddress, byte masterAddress)
: this(ConfigurationManager.AppSettings["IP"], slaveAddress, masterAddress)
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">ip地址</param>
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param>
public ModbusAsciiInUdpProtocol(string ip, byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress)
{
ProtocolLinker = new ModbusAsciiInUdpProtocolLinker(ip);
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">ip地址</param>
/// <param name="port">端口</param>
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param>
public ModbusAsciiInUdpProtocol(string ip, int port, byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress)
{
ProtocolLinker = new ModbusAsciiInUdpProtocolLinker(ip, port);
}
}
}

View File

@@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Modbus.Net.Modbus
{
public class ModbusAsciiInUdpProtocolLinker : UdpProtocolLinker
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">IP地址</param>
public ModbusAsciiInUdpProtocolLinker(string ip)
: base(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502"))
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">ip地址</param>
/// <param name="port">端口号</param>
public ModbusAsciiInUdpProtocolLinker(string ip, int port)
: base(ip, port)
{
((BaseConnector)BaseConnector).AddController(new FifoController(0));
}
/// <summary>
/// 校验返回数据是否正确
/// </summary>
/// <param name="content">返回的数据</param>
/// <returns>校验是否正确</returns>
public override bool? CheckRight(byte[] content)
{
//ProtocolLinker不会返回null
if (base.CheckRight(content) != true) return false;
//CRC校验失败
var contentString = Encoding.ASCII.GetString(content);
if (!Crc16.GetInstance().LrcEfficacy(contentString))
throw new ModbusProtocolErrorException(501);
//Modbus协议错误
if (byte.Parse(contentString.Substring(3, 2)) > 127)
throw new ModbusProtocolErrorException(byte.Parse(contentString.Substring(5, 2)));
return true;
}
}
}

View File

@@ -5,6 +5,22 @@ using System.Text;
namespace Modbus.Net.Modbus namespace Modbus.Net.Modbus
{ {
/// <summary>
/// Udp字节伸缩
/// </summary>
public class ModbusRtuInUdpProtocolLinkerBytesExtend : ModbusRtuProtocolLinkerBytesExtend
{
}
/// <summary>
/// Udp字节伸缩
/// </summary>
public class ModbusAsciiInUdpProtocolLinkerBytesExtend : ModbusAsciiProtocolLinkerBytesExtend
{
}
/// <summary> /// <summary>
/// Udp字节伸缩 /// Udp字节伸缩
/// </summary> /// </summary>

View File

@@ -27,7 +27,7 @@ namespace Modbus.Net.Modbus
public ModbusRtuInTcpProtocol(string ip, byte slaveAddress, byte masterAddress) public ModbusRtuInTcpProtocol(string ip, byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress) : base(slaveAddress, masterAddress)
{ {
ProtocolLinker = new ModbusTcpProtocolLinker(ip); ProtocolLinker = new ModbusRtuInTcpProtocolLinker(ip);
} }
/// <summary> /// <summary>

View File

@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Modbus.Net.Modbus
{
public class ModbusRtuInUdpProtocol : ModbusProtocol
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param>
public ModbusRtuInUdpProtocol(byte slaveAddress, byte masterAddress)
: this(ConfigurationManager.AppSettings["IP"], slaveAddress, masterAddress)
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">ip地址</param>
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param>
public ModbusRtuInUdpProtocol(string ip, byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress)
{
ProtocolLinker = new ModbusRtuInUdpProtocolLinker(ip);
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">ip地址</param>
/// <param name="port">端口号</param>
/// <param name="slaveAddress">从站号</param>
/// <param name="masterAddress">主站号</param>
public ModbusRtuInUdpProtocol(string ip, int port, byte slaveAddress, byte masterAddress)
: base(slaveAddress, masterAddress)
{
ProtocolLinker = new ModbusRtuInUdpProtocolLinker(ip, port);
}
}
}

View File

@@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Modbus.Net.Modbus
{
public class ModbusRtuInUdpProtocolLinker : UdpProtocolLinker
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">IP地址</param>
public ModbusRtuInUdpProtocolLinker(string ip)
: base(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502"))
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ip">IP地址</param>
/// <param name="port">端口号</param>
public ModbusRtuInUdpProtocolLinker(string ip, int port)
: base(ip, port)
{
((BaseConnector)BaseConnector).AddController(new FifoController(0));
}
/// <summary>
/// 校验返回数据
/// </summary>
/// <param name="content">设备返回的数据</param>
/// <returns>数据是否正确</returns>
public override bool? CheckRight(byte[] content)
{
//ProtocolLinker的CheckRight不会返回null
if (base.CheckRight(content) != true) return false;
//CRC校验失败
if (!Crc16.GetInstance().CrcEfficacy(content))
throw new ModbusProtocolErrorException(501);
//Modbus协议错误
if (content[1] > 127)
throw new ModbusProtocolErrorException(content[2]);
return true;
}
}
}
}

View File

@@ -33,10 +33,21 @@ namespace Modbus.Net.Modbus
/// Ascii连接Tcp透传 /// Ascii连接Tcp透传
/// </summary> /// </summary>
AsciiInTcp = 4, AsciiInTcp = 4,
/// <summary> /// <summary>
/// Udp连接 /// Udp连接
/// </summary> /// </summary>
Udp = 5 Udp = 5,
/// <summary>
/// Rtu连接Udp透传
/// </summary>
RtuInUdp = 6,
/// <summary>
/// Ascii连接Udp透传
/// </summary>
AsciiInUdp = 7
} }
/// <summary> /// <summary>
@@ -175,7 +186,7 @@ namespace Modbus.Net.Modbus
: new ModbusAsciiProtocol(ConnectionString, SlaveAddress, MasterAddress); : new ModbusAsciiProtocol(ConnectionString, SlaveAddress, MasterAddress);
break; break;
} }
//Rtu协议 //Rtu协议Tcp透传
case ModbusType.RtuInTcp: case ModbusType.RtuInTcp:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
@@ -186,7 +197,7 @@ namespace Modbus.Net.Modbus
MasterAddress)); MasterAddress));
break; break;
} }
//Ascii协议 //Ascii协议Tcp透传
case ModbusType.AsciiInTcp: case ModbusType.AsciiInTcp:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
@@ -197,7 +208,7 @@ namespace Modbus.Net.Modbus
MasterAddress)); MasterAddress));
break; break;
} }
//Udp协议 //Tcp协议Udp透传
case ModbusType.Udp: case ModbusType.Udp:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
@@ -208,6 +219,28 @@ namespace Modbus.Net.Modbus
MasterAddress)); MasterAddress));
break; break;
} }
//Rtu协议Udp透传
case ModbusType.RtuInUdp:
{
Wrapper = ConnectionString == null
? new ModbusRtuInUdpProtocol(SlaveAddress, MasterAddress)
: (ConnectionStringPort == null
? new ModbusRtuInUdpProtocol(ConnectionString, SlaveAddress, MasterAddress)
: new ModbusRtuInUdpProtocol(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress,
MasterAddress));
break;
}
//Rtu协议Udp透传
case ModbusType.AsciiInUdp:
{
Wrapper = ConnectionString == null
? new ModbusAsciiInUdpProtocol(SlaveAddress, MasterAddress)
: (ConnectionStringPort == null
? new ModbusAsciiInUdpProtocol(ConnectionString, SlaveAddress, MasterAddress)
: new ModbusAsciiInUdpProtocol(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress,
MasterAddress));
break;
}
} }
} }
} }

View File

@@ -109,10 +109,9 @@ RoadMap
* New UdpConnector (Complete) * New UdpConnector (Complete)
### Version 1.4.2 ### Version 1.4.2
* Serial Port Connection with Multiple Master Station (In Road) * PPI Remake (Coding)
* PPI Remake (In Road) * Modbus Udp (Coding)
* Siemens MPI Support (In Road) * Full Async/Sync SerialPort and Ethenet Communication (Coding)
* Siemens MultiStation PPI Support (In Road)
### Version 1.4.3 ### Version 1.4.3
* Machine and Utility Builder (In Road) * Machine and Utility Builder (In Road)
@@ -121,10 +120,13 @@ RoadMap
* Unite TransServer.Net into Modbus.Net (In Road) * Unite TransServer.Net into Modbus.Net (In Road)
* Passive Connector and Controller (In Road) * Passive Connector and Controller (In Road)
* Interfaces Architecture (In Road) * Interfaces Architecture (In Road)
* Dependency Injection (In Road)
* ValueHelper remake to interface, users can add their own value translate function (In Road) * ValueHelper remake to interface, users can add their own value translate function (In Road)
* New Zoom (In Road) * New Zoom (In Road)
* New TaskManager (In Road) * New TaskManager (In Road)
* Mutiple Address fields in Machine (In Road)
* Serial Port Connection with Multiple Master Station (In Road)
* Siemens MPI Support (In Road)
* Siemens MultiStation PPI Support (In Road)
### Version 1.6.X ### Version 1.6.X
* English comment (In Road) * English comment (In Road)
@@ -134,4 +136,4 @@ RoadMap
* Rename to Transport.Net (In Road) * Rename to Transport.Net (In Road)
* Puzzle Builder (In Road) * Puzzle Builder (In Road)
* Protocol Builer (In Road) * Protocol Builer (In Road)
* Dependency Injection (In Road)