Merge branch 'master' of https://github.com/parallelbgls/Modbus.Net.git
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
namespace Modbus.Net.Modbus
|
||||
{
|
||||
/// <summary>
|
||||
/// 南大奥拓NA200H专用AddressFormater
|
||||
/// </summary>
|
||||
public class AddressFormaterNA200H : AddressFormater
|
||||
{
|
||||
public override string FormatAddress(string area, int address)
|
||||
@@ -13,6 +16,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Modbus标准AddressFormater
|
||||
/// </summary>
|
||||
public class AddressFormaterModbus : AddressFormater
|
||||
{
|
||||
public override string FormatAddress(string area, int address)
|
||||
|
||||
@@ -4,12 +4,21 @@ using System.Linq;
|
||||
namespace Modbus.Net.Modbus
|
||||
{
|
||||
/// <summary>
|
||||
/// NA200H数据单元翻译器
|
||||
/// 南大奥拓NA200H数据单元翻译器
|
||||
/// </summary>
|
||||
public class AddressTranslatorNA200H : AddressTranslator
|
||||
{
|
||||
/// <summary>
|
||||
/// 读功能码
|
||||
/// </summary>
|
||||
protected Dictionary<string, AreaOutputDef> ReadFunctionCodeDictionary;
|
||||
/// <summary>
|
||||
/// 功能码翻译至标准Modbus地址位置
|
||||
/// </summary>
|
||||
protected Dictionary<string, int> TransDictionary;
|
||||
/// <summary>
|
||||
/// 写功能码
|
||||
/// </summary>
|
||||
protected Dictionary<string, AreaOutputDef> WriteFunctionCodeDictionary;
|
||||
|
||||
public AddressTranslatorNA200H()
|
||||
@@ -188,7 +197,13 @@ namespace Modbus.Net.Modbus
|
||||
/// </summary>
|
||||
public class AddressTranslatorModbus : AddressTranslator
|
||||
{
|
||||
/// <summary>
|
||||
/// 读功能码
|
||||
/// </summary>
|
||||
protected Dictionary<string, AreaOutputDef> ReadFunctionCodeDictionary;
|
||||
/// <summary>
|
||||
/// 写功能码
|
||||
/// </summary>
|
||||
protected Dictionary<string, AreaOutputDef> WriteFunctionCodeDictionary;
|
||||
|
||||
public AddressTranslatorModbus()
|
||||
|
||||
@@ -2,18 +2,18 @@
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>Modbus.Net.Modbus</id>
|
||||
<version>1.2.1</version>
|
||||
<version>1.2.2</version>
|
||||
<title>Modbus.Net.Modbus</title>
|
||||
<authors>Chris L.(Luo Sheng)</authors>
|
||||
<owners>Hangzhou Delian Information and Science Technology Co.,Ltd.</owners>
|
||||
<owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners>
|
||||
<licenseUrl>https://github.com/parallelbgls/Modbus.Net/blob/master/LICENSE.md</licenseUrl>
|
||||
<projectUrl>https://github.com/parallelbgls/Modbus.Net/tree/master/Modbus.Net/Modbus.Net.Modbus</projectUrl>
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<description>Modbus.Net Modbus Implementation</description>
|
||||
<copyright>Copyright 2015 Hangzhou Delian Science and Technology Co.,Ltd.</copyright>
|
||||
<copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright>
|
||||
<tags>hardware communicate protocal modbus Delian</tags>
|
||||
<dependencies>
|
||||
<dependency id="Modbus.Net" version="1.2.1" />
|
||||
<dependency id="Modbus.Net" version="1.2.2" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
namespace Modbus.Net.Modbus
|
||||
{
|
||||
/// <summary>
|
||||
/// Modbus/Rtu协议
|
||||
/// Modbus/Ascii码协议
|
||||
/// </summary>
|
||||
public class ModbusAsciiProtocal : ModbusProtocal
|
||||
{
|
||||
|
||||
@@ -3,6 +3,9 @@ using System.Text;
|
||||
|
||||
namespace Modbus.Net.Modbus
|
||||
{
|
||||
/// <summary>
|
||||
/// Modbus/Ascii码协议连接器
|
||||
/// </summary>
|
||||
public class ModbusAsciiProtocalLinker : ComProtocalLinker
|
||||
{
|
||||
public ModbusAsciiProtocalLinker(string com) : base(com, 9600, Parity.None, StopBits.One, 8)
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
namespace Modbus.Net.Modbus
|
||||
{
|
||||
/// <summary>
|
||||
/// Modbus设备
|
||||
/// </summary>
|
||||
public class ModbusMachine : BaseMachine
|
||||
{
|
||||
public ModbusMachine(ModbusType connectionType, string connectionString,
|
||||
|
||||
@@ -4,6 +4,9 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Modbus.Net.Modbus
|
||||
{
|
||||
/// <summary>
|
||||
/// 变量功能码
|
||||
/// </summary>
|
||||
internal enum ModbusProtocalVariableFunctionCode : byte
|
||||
{
|
||||
ReadVariable = 20,
|
||||
@@ -39,6 +42,9 @@ namespace Modbus.Net.Modbus
|
||||
WriteMultiRegister = 16
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Modbus协议
|
||||
/// </summary>
|
||||
public abstract class ModbusProtocal : BaseProtocal
|
||||
{
|
||||
protected ModbusProtocal(byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress)
|
||||
@@ -58,7 +64,7 @@ namespace Modbus.Net.Modbus
|
||||
|
||||
#region 读PLC数据
|
||||
|
||||
public class ReadDataModbusInputStruct : InputStruct
|
||||
public class ReadDataModbusInputStruct : IInputStruct
|
||||
{
|
||||
public ReadDataModbusInputStruct(byte slaveAddress, string startAddress, ushort getCount,
|
||||
AddressTranslator addressTranslator)
|
||||
@@ -79,7 +85,7 @@ namespace Modbus.Net.Modbus
|
||||
public ushort GetCount { get; }
|
||||
}
|
||||
|
||||
public class ReadDataModbusOutputStruct : OutputStruct
|
||||
public class ReadDataModbusOutputStruct : IOutputStruct
|
||||
{
|
||||
public ReadDataModbusOutputStruct(byte slaveAddress, byte functionCode,
|
||||
int dataCount, byte[] dataValue)
|
||||
@@ -101,14 +107,14 @@ namespace Modbus.Net.Modbus
|
||||
|
||||
public class ReadDataModbusProtocal : ProtocalUnit
|
||||
{
|
||||
public override byte[] Format(InputStruct message)
|
||||
public override byte[] Format(IInputStruct message)
|
||||
{
|
||||
var r_message = (ReadDataModbusInputStruct) message;
|
||||
return Format(r_message.SlaveAddress, r_message.FunctionCode,
|
||||
r_message.StartAddress, r_message.GetCount);
|
||||
}
|
||||
|
||||
public override OutputStruct Unformat(byte[] messageBytes, ref int pos)
|
||||
public override IOutputStruct Unformat(byte[] messageBytes, ref int pos)
|
||||
{
|
||||
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
@@ -130,7 +136,7 @@ namespace Modbus.Net.Modbus
|
||||
|
||||
#region 写PLC数据
|
||||
|
||||
public class WriteDataModbusInputStruct : InputStruct
|
||||
public class WriteDataModbusInputStruct : IInputStruct
|
||||
{
|
||||
public WriteDataModbusInputStruct(byte slaveAddress, string startAddress, object[] writeValue,
|
||||
AddressTranslator addressTranslator)
|
||||
@@ -159,7 +165,7 @@ namespace Modbus.Net.Modbus
|
||||
public byte[] WriteValue { get; }
|
||||
}
|
||||
|
||||
public class WriteDataModbusOutputStruct : OutputStruct
|
||||
public class WriteDataModbusOutputStruct : IOutputStruct
|
||||
{
|
||||
public WriteDataModbusOutputStruct(byte slaveAddress, byte functionCode,
|
||||
ushort startAddress, ushort writeCount)
|
||||
@@ -184,7 +190,7 @@ namespace Modbus.Net.Modbus
|
||||
/// </summary>
|
||||
public class WriteDataModbusProtocal : ProtocalUnit
|
||||
{
|
||||
public override byte[] Format(InputStruct message)
|
||||
public override byte[] Format(IInputStruct message)
|
||||
{
|
||||
var r_message = (WriteDataModbusInputStruct) message;
|
||||
var functionCode = r_message.FunctionCode;
|
||||
@@ -201,7 +207,7 @@ namespace Modbus.Net.Modbus
|
||||
return formattingBytes;
|
||||
}
|
||||
|
||||
public override OutputStruct Unformat(byte[] messageBytes, ref int flag)
|
||||
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
|
||||
{
|
||||
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
@@ -216,7 +222,7 @@ namespace Modbus.Net.Modbus
|
||||
|
||||
#region 读PLC时间
|
||||
|
||||
public class GetSystemTimeModbusInputStruct : InputStruct
|
||||
public class GetSystemTimeModbusInputStruct : IInputStruct
|
||||
{
|
||||
public GetSystemTimeModbusInputStruct(byte slaveAddress)
|
||||
{
|
||||
@@ -235,7 +241,7 @@ namespace Modbus.Net.Modbus
|
||||
public ushort GetCount { get; }
|
||||
}
|
||||
|
||||
public class GetSystemTimeModbusOutputStruct : OutputStruct
|
||||
public class GetSystemTimeModbusOutputStruct : IOutputStruct
|
||||
{
|
||||
public GetSystemTimeModbusOutputStruct(byte slaveAddress, byte functionCode,
|
||||
byte writeByteCount, ushort year, byte day, byte month, ushort hour, byte second, byte minute,
|
||||
@@ -261,14 +267,14 @@ namespace Modbus.Net.Modbus
|
||||
/// </summary>
|
||||
public class GetSystemTimeModbusProtocal : ProtocalUnit
|
||||
{
|
||||
public override byte[] Format(InputStruct message)
|
||||
public override byte[] Format(IInputStruct message)
|
||||
{
|
||||
var r_message = (GetSystemTimeModbusInputStruct) message;
|
||||
return Format(r_message.SlaveAddress, r_message.FunctionCode,
|
||||
r_message.StartAddress, r_message.GetCount);
|
||||
}
|
||||
|
||||
public override OutputStruct Unformat(byte[] messageBytes, ref int flag)
|
||||
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
|
||||
{
|
||||
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
@@ -289,7 +295,7 @@ namespace Modbus.Net.Modbus
|
||||
|
||||
#region 写PLC时间
|
||||
|
||||
public class SetSystemTimeModbusInputStruct : InputStruct
|
||||
public class SetSystemTimeModbusInputStruct : IInputStruct
|
||||
{
|
||||
public SetSystemTimeModbusInputStruct(byte slaveAddress, DateTime time)
|
||||
{
|
||||
@@ -332,7 +338,7 @@ namespace Modbus.Net.Modbus
|
||||
public ushort Millisecond { get; }
|
||||
}
|
||||
|
||||
public class SetSystemTimeModbusOutputStruct : OutputStruct
|
||||
public class SetSystemTimeModbusOutputStruct : IOutputStruct
|
||||
{
|
||||
public SetSystemTimeModbusOutputStruct(byte slaveAddress, byte functionCode,
|
||||
ushort startAddress, ushort writeCount)
|
||||
@@ -357,7 +363,7 @@ namespace Modbus.Net.Modbus
|
||||
/// </summary>
|
||||
public class SetSystemTimeModbusProtocal : ProtocalUnit
|
||||
{
|
||||
public override byte[] Format(InputStruct message)
|
||||
public override byte[] Format(IInputStruct message)
|
||||
{
|
||||
var r_message = (SetSystemTimeModbusInputStruct) message;
|
||||
return Format(r_message.SlaveAddress, r_message.FunctionCode,
|
||||
@@ -366,7 +372,7 @@ namespace Modbus.Net.Modbus
|
||||
r_message.Month, r_message.Hour, r_message.Second, r_message.Minute, r_message.Millisecond);
|
||||
}
|
||||
|
||||
public override OutputStruct Unformat(byte[] messageBytes, ref int flag)
|
||||
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
|
||||
{
|
||||
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
|
||||
@@ -8,9 +8,9 @@ namespace Modbus.Net.Modbus
|
||||
/// <summary>
|
||||
/// Tcp协议字节伸缩
|
||||
/// </summary>
|
||||
public class ModbusTcpProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
|
||||
public class ModbusTcpProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend
|
||||
{
|
||||
public override byte[] BytesExtend(byte[] content)
|
||||
public byte[] BytesExtend(byte[] content)
|
||||
{
|
||||
//Modbus/Tcp协议扩张,前面加6个字节,前面4个为0,后面两个为协议整体内容的长度
|
||||
var newFormat = new byte[6 + content.Length];
|
||||
@@ -22,7 +22,7 @@ namespace Modbus.Net.Modbus
|
||||
return newFormat;
|
||||
}
|
||||
|
||||
public override byte[] BytesDecact(byte[] content)
|
||||
public byte[] BytesDecact(byte[] content)
|
||||
{
|
||||
//Modbus/Tcp协议收缩,抛弃前面6个字节的内容
|
||||
var newContent = new byte[content.Length - 6];
|
||||
@@ -31,9 +31,9 @@ namespace Modbus.Net.Modbus
|
||||
}
|
||||
}
|
||||
|
||||
public class ModbusRtuProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
|
||||
public class ModbusRtuProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend
|
||||
{
|
||||
public override byte[] BytesExtend(byte[] content)
|
||||
public byte[] BytesExtend(byte[] content)
|
||||
{
|
||||
var crc = new byte[2];
|
||||
//Modbus/Rtu协议扩张,增加CRC校验
|
||||
@@ -44,7 +44,7 @@ namespace Modbus.Net.Modbus
|
||||
return newFormat;
|
||||
}
|
||||
|
||||
public override byte[] BytesDecact(byte[] content)
|
||||
public byte[] BytesDecact(byte[] content)
|
||||
{
|
||||
//Modbus/Rtu协议收缩,抛弃后面2个字节的内容
|
||||
var newContent = new byte[content.Length - 2];
|
||||
@@ -53,10 +53,11 @@ namespace Modbus.Net.Modbus
|
||||
}
|
||||
}
|
||||
|
||||
public class ModbusAsciiProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
|
||||
public class ModbusAsciiProtocalLinkerBytesExtend : IProtocalLinkerBytesExtend
|
||||
{
|
||||
public override byte[] BytesExtend(byte[] content)
|
||||
public byte[] BytesExtend(byte[] content)
|
||||
{
|
||||
//Modbus/Ascii协议扩张,前面增加:,后面增加LRC校验和尾字符
|
||||
var newContent = new List<byte>();
|
||||
newContent.AddRange(Encoding.ASCII.GetBytes(":"));
|
||||
foreach (var number in content)
|
||||
@@ -69,8 +70,9 @@ namespace Modbus.Net.Modbus
|
||||
return newContent.ToArray();
|
||||
}
|
||||
|
||||
public override byte[] BytesDecact(byte[] content)
|
||||
public byte[] BytesDecact(byte[] content)
|
||||
{
|
||||
//Modbus/Ascii协议收缩,抛弃头尾。
|
||||
var newContent = new List<byte>();
|
||||
var ans = Encoding.ASCII.GetString(content);
|
||||
var index = ans.IndexOf(Environment.NewLine);
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
namespace Modbus.Net.Modbus
|
||||
{
|
||||
/// <summary>
|
||||
/// Modbus/Rtu协议连接器
|
||||
/// </summary>
|
||||
public class ModbusRtuProtocalLinker : ComProtocalLinker
|
||||
{
|
||||
public ModbusRtuProtocalLinker(string com) : base(com, 9600, Parity.None, StopBits.One, 8)
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
namespace Modbus.Net.Modbus
|
||||
{
|
||||
/// <summary>
|
||||
/// Modbus/Tcp协议连接器
|
||||
/// </summary>
|
||||
public class ModbusTcpProtocalLinker : TcpProtocalLinker
|
||||
{
|
||||
public ModbusTcpProtocalLinker(string ip) : base(ip, int.Parse(ConfigurationManager.ModbusPort))
|
||||
|
||||
@@ -23,8 +23,14 @@ namespace Modbus.Net.Modbus
|
||||
Ascii = 2
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Modbus基础Api入口
|
||||
/// </summary>
|
||||
public class ModbusUtility : BaseUtility
|
||||
{
|
||||
/// <summary>
|
||||
/// Modbus协议类型
|
||||
/// </summary>
|
||||
private ModbusType _modbusType;
|
||||
|
||||
public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress)
|
||||
@@ -81,6 +87,7 @@ namespace Modbus.Net.Modbus
|
||||
_modbusType = value;
|
||||
switch (_modbusType)
|
||||
{
|
||||
//Rtu协议
|
||||
case ModbusType.Rtu:
|
||||
{
|
||||
Wrapper = ConnectionString == null
|
||||
@@ -88,6 +95,7 @@ namespace Modbus.Net.Modbus
|
||||
: new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress);
|
||||
break;
|
||||
}
|
||||
//Tcp协议
|
||||
case ModbusType.Tcp:
|
||||
{
|
||||
Wrapper = ConnectionString == null
|
||||
@@ -98,6 +106,7 @@ namespace Modbus.Net.Modbus
|
||||
MasterAddress));
|
||||
break;
|
||||
}
|
||||
//Ascii协议
|
||||
case ModbusType.Ascii:
|
||||
{
|
||||
Wrapper = ConnectionString == null
|
||||
@@ -114,6 +123,12 @@ namespace Modbus.Net.Modbus
|
||||
ModbusType = (ModbusType) connectionType;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 读数据
|
||||
/// </summary>
|
||||
/// <param name="startAddress">起始地址</param>
|
||||
/// <param name="getByteCount">获取字节个数</param>
|
||||
/// <returns>获取的结果</returns>
|
||||
public override async Task<byte[]> GetDatasAsync(string startAddress, int getByteCount)
|
||||
{
|
||||
try
|
||||
@@ -131,6 +146,12 @@ namespace Modbus.Net.Modbus
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 写数据
|
||||
/// </summary>
|
||||
/// <param name="startAddress">起始地址</param>
|
||||
/// <param name="setContents">需要设置的数据</param>
|
||||
/// <returns>设置是否成功</returns>
|
||||
public override async Task<bool> SetDatasAsync(string startAddress, object[] setContents)
|
||||
{
|
||||
try
|
||||
@@ -149,6 +170,10 @@ namespace Modbus.Net.Modbus
|
||||
}
|
||||
|
||||
/*
|
||||
/// <summary>
|
||||
/// 读时间
|
||||
/// </summary>
|
||||
/// <returns>设备的时间</returns>
|
||||
public override DateTime GetTime()
|
||||
{
|
||||
try
|
||||
@@ -165,6 +190,11 @@ namespace Modbus.Net.Modbus
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 写时间
|
||||
/// </summary>
|
||||
/// <param name="setTime">需要写入的时间</param>
|
||||
/// <returns>写入是否成功</returns>
|
||||
public override bool SetTime(DateTime setTime)
|
||||
{
|
||||
try
|
||||
|
||||
@@ -8,9 +8,9 @@ using System.Runtime.InteropServices;
|
||||
[assembly: AssemblyTitle("Modbus.Net.Modbus")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyCompany("杭州德联物联网科技有限公司")]
|
||||
[assembly: AssemblyProduct("Modbus.Net.Modbus")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2016")]
|
||||
[assembly: AssemblyCopyright("Copyright © Chris L. 2017 HangZhou Delian IoT Science Technology Co.,Ltd.")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
|
||||
// 方法是按如下所示使用“*”: :
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.2.0")]
|
||||
[assembly: AssemblyFileVersion("1.2.0")]
|
||||
[assembly: AssemblyVersion("1.2.2")]
|
||||
[assembly: AssemblyFileVersion("1.2.2")]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Modbus.Net
|
||||
Modbus.Net.Modbus
|
||||
===================
|
||||
[](https://www.nuget.org/packages/Modbus.Net.Modbus/)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user