using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HslCommunication.ModBus
{
///
/// Modbus-Ascii通讯协议的类库,基于rtu类库完善过来
///
///
/// 本客户端支持的标准的modbus-tcp协议,内置的消息号会进行自增,地址格式采用富文本表示形式
///
/// 地址共可以携带3个信息,最完整的表示方式"s=2;x=3;100",对应的modbus报文是 02 03 00 64 00 01 的前四个字节,站号,功能码,起始地址,下面举例
///
/// -
/// 读取线圈
/// ReadCoil("100")表示读取线圈100的值,ReadCoil("s=2;100")表示读取站号为2,线圈地址为100的值
///
/// -
/// 读取离散输入
/// ReadDiscrete("100")表示读取离散输入100的值,ReadDiscrete("s=2;100")表示读取站号为2,离散地址为100的值
///
/// -
/// 读取寄存器
/// ReadInt16("100")表示读取寄存器100的值,ReadInt16("s=2;100")表示读取站号为2,寄存器100的值
///
/// -
/// 读取输入寄存器
/// ReadInt16("x=4;100")表示读取输入寄存器100的值,ReadInt16("s=2;x=4;100")表示读取站号为2,输入寄存器100的值
///
///
/// 对于写入来说也是一致的
///
/// -
/// 写入线圈
/// WriteCoil("100",true)表示读取线圈100的值,WriteCoil("s=2;100",true)表示读取站号为2,线圈地址为100的值
///
/// -
/// 写入寄存器
/// Write("100",(short)123)表示写寄存器100的值123,Write("s=2;100",(short)123)表示写入站号为2,寄存器100的值123
///
///
///
///
///
/// 基本的用法请参照下面的代码示例,初始化部分的代码省略
///
/// 复杂的读取数据的代码示例如下:
///
/// 写入数据的代码如下:
///
///
public class ModbusAscii : ModbusRtu
{
#region Constructor
///
/// 实例化一个Modbus-ascii协议的客户端对象
///
public ModbusAscii( )
{
}
///
/// 指定服务器地址,端口号,客户端自己的站号来初始化
///
/// 站号
public ModbusAscii( byte station = 0x01 ) : base( station )
{
}
#endregion
#region Modbus Rtu Override
///
/// 检查当前的Modbus-Ascii响应是否是正确的
///
/// 发送的数据信息
/// 带是否成功的结果数据
protected override OperateResult CheckModbusTcpResponse( byte[] send )
{
// 转ascii
byte[] modbus_ascii = ModbusInfo.TransRtuToAsciiPackCommand( send );
// 核心交互
OperateResult result = ReadBase( modbus_ascii );
if (!result.IsSuccess) return result;
// 还原modbus报文
OperateResult modbus_core = ModbusInfo.TransAsciiPackCommandToRtu( result.Content );
if (!modbus_core.IsSuccess) return modbus_core;
// 发生了错误
if ((send[1] + 0x80) == modbus_core.Content[1]) return new OperateResult( modbus_core.Content[2], ModbusInfo.GetDescriptionByErrorCode( modbus_core.Content[2] ) );
// 成功的消息
return OperateResult.CreateSuccessResult( modbus_core.Content );
}
#endregion
#region Object Override
///
/// 返回表示当前对象的字符串
///
/// 字符串信息
public override string ToString( )
{
return $"ModbusAscii[{PortName}:{BaudRate}]";
}
#endregion
}
}