2018-01-05 Update 2 Add Modbus RtuInUdp and AsciiInUdp
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
47
Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocol.cs
Normal file
47
Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocol.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
47
Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocol.cs
Normal file
47
Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocol.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
51
Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs
Normal file
51
Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
README.md
14
README.md
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user