2017-05-17 Update 3 Implement log system and add comments

This commit is contained in:
parallelbgls
2017-05-17 18:01:30 +08:00
parent 3c6f18dc69
commit ba56c5be1b
34 changed files with 987 additions and 82 deletions

View File

@@ -9,7 +9,14 @@ namespace Modbus.Net.Modbus
/// </summary>
internal enum ModbusProtocalVariableFunctionCode : byte
{
/// <summary>
/// 读变量
/// </summary>
ReadVariable = 20,
/// <summary>
/// 写变量
/// </summary>
WriteVariable = 21
}
@@ -18,7 +25,14 @@ namespace Modbus.Net.Modbus
/// </summary>
public enum ModbusProtocalTimeFunctionCode : byte
{
/// <summary>
/// 读时间
/// </summary>
GetSystemTime = 3,
/// <summary>
/// 写时间
/// </summary>
SetSystemTime = 16
}
@@ -27,9 +41,24 @@ namespace Modbus.Net.Modbus
/// </summary>
public enum ModbusProtocalReadDataFunctionCode : byte
{
/// <summary>
/// 读线圈
/// </summary>
ReadCoilStatus = 1,
/// <summary>
/// 读输入线圈
/// </summary>
ReadInputStatus = 2,
/// <summary>
/// 读保持寄存器
/// </summary>
ReadHoldRegister = 3,
/// <summary>
/// 读输入寄存器
/// </summary>
ReadInputRegister = 4
}
@@ -38,7 +67,24 @@ namespace Modbus.Net.Modbus
/// </summary>
internal enum ModbusProtocalWriteDataFunctionCode : byte
{
/// <summary>
/// 写单个线圈
/// </summary>
WriteSingleCoil = 5,
/// <summary>
/// 写单个寄存器
/// </summary>
WriteSingleRegister = 6,
/// <summary>
/// 写多个线圈
/// </summary>
WriteMultiCoil = 15,
/// <summary>
/// 写多个寄存器
/// </summary>
WriteMultiRegister = 16
}
@@ -47,16 +93,30 @@ namespace Modbus.Net.Modbus
/// </summary>
public abstract class ModbusProtocal : BaseProtocal
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站地址</param>
/// <param name="masterAddress">主站地址</param>
/// <param name="endian">端格式</param>
protected ModbusProtocal(byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress, endian)
{
}
/// <summary>
/// 连接
/// </summary>
/// <returns>是否连接成功</returns>
public override bool Connect()
{
return ProtocalLinker.Connect();
}
/// <summary>
/// 连接
/// </summary>
/// <returns>是否连接成功</returns>
public override async Task<bool> ConnectAsync()
{
return await ProtocalLinker.ConnectAsync();
@@ -65,8 +125,18 @@ namespace Modbus.Net.Modbus
#region PLC数据
/// <summary>
/// 读数据输入
/// </summary>
public class ReadDataModbusInputStruct : IInputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站地址</param>
/// <param name="startAddress">开始地址</param>
/// <param name="getCount">读取个数</param>
/// <param name="addressTranslator">地址翻译器</param>
public ReadDataModbusInputStruct(byte slaveAddress, string startAddress, ushort getCount,
AddressTranslator addressTranslator)
{
@@ -78,17 +148,39 @@ namespace Modbus.Net.Modbus
(ushort) Math.Ceiling(getCount / addressTranslator.GetAreaByteLength(translateAddress.AreaString));
}
/// <summary>
/// 从站地址
/// </summary>
public byte SlaveAddress { get; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; }
/// <summary>
/// 开始地址
/// </summary>
public ushort StartAddress { get; }
/// <summary>
/// 获取个数
/// </summary>
public ushort GetCount { get; }
}
/// <summary>
/// 读数据输出
/// </summary>
public class ReadDataModbusOutputStruct : IOutputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="functionCode">功能码</param>
/// <param name="dataCount">数据个数</param>
/// <param name="dataValue">读取的数据值</param>
public ReadDataModbusOutputStruct(byte slaveAddress, byte functionCode,
int dataCount, byte[] dataValue)
{
@@ -98,17 +190,37 @@ namespace Modbus.Net.Modbus
DataValue = dataValue.Clone() as byte[];
}
/// <summary>
/// 从站号
/// </summary>
public byte SlaveAddress { get; private set; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; private set; }
/// <summary>
/// 数据个数
/// </summary>
public int DataCount { get; private set; }
/// <summary>
/// 数据值
/// </summary>
public byte[] DataValue { get; private set; }
}
/// <summary>
/// 读数据协议
/// </summary>
public class ReadDataModbusProtocal : ProtocalUnit
{
/// <summary>
/// 格式化
/// </summary>
/// <param name="message">读取参数</param>
/// <returns>读取数据的协议核心</returns>
public override byte[] Format(IInputStruct message)
{
var r_message = (ReadDataModbusInputStruct) message;
@@ -116,6 +228,12 @@ namespace Modbus.Net.Modbus
r_message.StartAddress, r_message.GetCount);
}
/// <summary>
/// 反格式化
/// </summary>
/// <param name="messageBytes">设备返回的信息</param>
/// <param name="pos">当前反格式化的位置</param>
/// <returns>反格式化的信息</returns>
public override IOutputStruct Unformat(byte[] messageBytes, ref int pos)
{
var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref pos);
@@ -131,8 +249,19 @@ namespace Modbus.Net.Modbus
#region PLC数据
/// <summary>
/// 写数据输入
/// </summary>
public class WriteDataModbusInputStruct : IInputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="startAddress">开始地址</param>
/// <param name="writeValue">写入的数据</param>
/// <param name="addressTranslator">地址翻译器</param>
/// <param name="endian">端格式</param>
public WriteDataModbusInputStruct(byte slaveAddress, string startAddress, object[] writeValue,
AddressTranslator addressTranslator, Endian endian)
{
@@ -147,21 +276,49 @@ namespace Modbus.Net.Modbus
WriteValue = writeByteValue;
}
/// <summary>
/// 从站号
/// </summary>
public byte SlaveAddress { get; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; }
/// <summary>
/// 开始地址
/// </summary>
public ushort StartAddress { get; }
/// <summary>
/// 写入个数
/// </summary>
public ushort WriteCount { get; }
/// <summary>
/// 写入字节个数
/// </summary>
public byte WriteByteCount { get; }
/// <summary>
/// 写入的数据
/// </summary>
public byte[] WriteValue { get; }
}
/// <summary>
/// 写数据输出
/// </summary>
public class WriteDataModbusOutputStruct : IOutputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="functionCode">功能码</param>
/// <param name="startAddress">开始地址</param>
/// <param name="writeCount">写入个数</param>
public WriteDataModbusOutputStruct(byte slaveAddress, byte functionCode,
ushort startAddress, ushort writeCount)
{
@@ -171,20 +328,37 @@ namespace Modbus.Net.Modbus
WriteCount = writeCount;
}
/// <summary>
/// 从站号
/// </summary>
public byte SlaveAddress { get; private set; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; private set; }
/// <summary>
/// 开始地址
/// </summary>
public ushort StartAddress { get; private set; }
/// <summary>
/// 写入个数
/// </summary>
public ushort WriteCount { get; private set; }
}
/// <summary>
/// 写多个寄存器状态
/// 写多个寄存器协议
/// </summary>
public class WriteDataModbusProtocal : ProtocalUnit
{
/// <summary>
/// 格式化
/// </summary>
/// <param name="message">写寄存器参数</param>
/// <returns>写寄存器协议核心</returns>
public override byte[] Format(IInputStruct message)
{
var r_message = (WriteDataModbusInputStruct) message;
@@ -194,6 +368,12 @@ namespace Modbus.Net.Modbus
return formattingBytes;
}
/// <summary>
/// 反格式化
/// </summary>
/// <param name="messageBytes">设备返回的信息</param>
/// <param name="flag">当前反格式化的位置</param>
/// <returns>反格式化的信息</returns>
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
{
var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
@@ -209,8 +389,15 @@ namespace Modbus.Net.Modbus
#region PLC时间
/// <summary>
/// 读时间输入
/// </summary>
public class GetSystemTimeModbusInputStruct : IInputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
public GetSystemTimeModbusInputStruct(byte slaveAddress)
{
SlaveAddress = slaveAddress;
@@ -219,17 +406,45 @@ namespace Modbus.Net.Modbus
GetCount = 5;
}
/// <summary>
/// 从站号
/// </summary>
public byte SlaveAddress { get; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; }
/// <summary>
/// 开始地址
/// </summary>
public ushort StartAddress { get; }
/// <summary>
/// 获取个数
/// </summary>
public ushort GetCount { get; }
}
/// <summary>
/// 读时间输出
/// </summary>
public class GetSystemTimeModbusOutputStruct : IOutputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="functionCode">功能码</param>
/// <param name="writeByteCount">写入个数</param>
/// <param name="year">年</param>
/// <param name="day">日</param>
/// <param name="month">月</param>
/// <param name="hour">时</param>
/// <param name="second">秒</param>
/// <param name="minute">分</param>
/// <param name="millisecond">毫秒</param>
public GetSystemTimeModbusOutputStruct(byte slaveAddress, byte functionCode,
byte writeByteCount, ushort year, byte day, byte month, ushort hour, byte second, byte minute,
ushort millisecond)
@@ -240,20 +455,37 @@ namespace Modbus.Net.Modbus
Time = new DateTime(year, month, day, hour, minute, second, millisecond);
}
/// <summary>
/// 从站号
/// </summary>
public byte SlaveAddress { get; private set; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; private set; }
/// <summary>
/// 写入个数
/// </summary>
public byte WriteByteCount { get; private set; }
/// <summary>
/// 时间
/// </summary>
public DateTime Time { get; private set; }
}
/// <summary>
/// 读系统时间
/// 读系统时间协议
/// </summary>
public class GetSystemTimeModbusProtocal : ProtocalUnit
{
/// <summary>
/// 格式化
/// </summary>
/// <param name="message">写系统时间参数</param>
/// <returns>写系统时间的核心</returns>
public override byte[] Format(IInputStruct message)
{
var r_message = (GetSystemTimeModbusInputStruct) message;
@@ -261,6 +493,12 @@ namespace Modbus.Net.Modbus
r_message.StartAddress, r_message.GetCount);
}
/// <summary>
/// 反格式化
/// </summary>
/// <param name="messageBytes">获取的信息</param>
/// <param name="flag">当前反格式化的位置</param>
/// <returns>反格式化的信息</returns>
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
{
var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
@@ -282,8 +520,16 @@ namespace Modbus.Net.Modbus
#region PLC时间
/// <summary>
/// 写时间输入
/// </summary>
public class SetSystemTimeModbusInputStruct : IInputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="time">时间</param>
public SetSystemTimeModbusInputStruct(byte slaveAddress, DateTime time)
{
SlaveAddress = slaveAddress;
@@ -300,33 +546,79 @@ namespace Modbus.Net.Modbus
Millisecond = (ushort) time.Millisecond;
}
/// <summary>
/// 从站号
/// </summary>
public byte SlaveAddress { get; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; }
/// <summary>
/// 开始地址
/// </summary>
public ushort StartAddress { get; }
/// <summary>
/// 写入个数
/// </summary>
public ushort WriteCount { get; }
/// <summary>
/// 写入字节个数
/// </summary>
public byte WriteByteCount { get; }
/// <summary>
/// 年
/// </summary>
public ushort Year { get; }
/// <summary>
/// 日
/// </summary>
public byte Day { get; }
/// <summary>
/// 月
/// </summary>
public byte Month { get; }
/// <summary>
/// 时
/// </summary>
public ushort Hour { get; }
/// <summary>
/// 秒
/// </summary>
public byte Second { get; }
/// <summary>
/// 分
/// </summary>
public byte Minute { get; }
/// <summary>
/// 毫秒
/// </summary>
public ushort Millisecond { get; }
}
/// <summary>
/// 写时间输出
/// </summary>
public class SetSystemTimeModbusOutputStruct : IOutputStruct
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slaveAddress">从站号</param>
/// <param name="functionCode">功能码</param>
/// <param name="startAddress">开始地址</param>
/// <param name="writeCount">写入个数</param>
public SetSystemTimeModbusOutputStruct(byte slaveAddress, byte functionCode,
ushort startAddress, ushort writeCount)
{
@@ -336,20 +628,37 @@ namespace Modbus.Net.Modbus
WriteCount = writeCount;
}
/// <summary>
/// 从站号
/// </summary>
public byte SlaveAddress { get; private set; }
/// <summary>
/// 功能码
/// </summary>
public byte FunctionCode { get; private set; }
/// <summary>
/// 开始地址
/// </summary>
public ushort StartAddress { get; private set; }
/// <summary>
/// 写入个数
/// </summary>
public ushort WriteCount { get; private set; }
}
/// <summary>
/// 写系统时间
/// 写系统时间协议
/// </summary>
public class SetSystemTimeModbusProtocal : ProtocalUnit
{
/// <summary>
/// 格式化
/// </summary>
/// <param name="message">写系统时间的参数</param>
/// <returns>写系统时间的核心</returns>
public override byte[] Format(IInputStruct message)
{
var r_message = (SetSystemTimeModbusInputStruct) message;
@@ -359,6 +668,12 @@ namespace Modbus.Net.Modbus
r_message.Month, r_message.Hour, r_message.Second, r_message.Minute, r_message.Millisecond);
}
/// <summary>
/// 反格式化
/// </summary>
/// <param name="messageBytes">获取的信息</param>
/// <param name="flag">当前反格式化的位置</param>
/// <returns>反格式化的信息</returns>
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
{
var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
@@ -388,12 +703,19 @@ namespace Modbus.Net.Modbus
{501, "RTU_ILLEGAL_CRC"}
};
/// <summary>
/// Modbus错误
/// </summary>
/// <param name="messageNumber">Modbus错误号</param>
public ModbusProtocalErrorException(int messageNumber)
: base(ProtocalErrorDictionary[messageNumber])
{
ErrorMessageNumber = messageNumber;
}
/// <summary>
/// Modbus错误号
/// </summary>
public int ErrorMessageNumber { get; private set; }
}
}