using HslCommunication.Core.Address;
using HslCommunication.ModBus;
using HslCommunication.Serial;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
namespace HslCommunication.Instrument.Temperature
{
///
/// 阿尔泰科技发展有限公司的DAM3601温度采集模块,基于ModbusRtu开发完成。
///
///
/// 该温度采集模块是基于modbus-rtu,但不是标准的modbus协议,存在一些小误差,需要重写实现,并且提供了基础的数据转换
///
public class DAM3601 : ModBus.ModbusRtu
{
#region Constructor
///
/// 实例化一个默认的对象
///
public DAM3601( ) : base( )
{
SleepTime = 200;
}
///
/// 使用站号实例化默认的对象
///
/// 站号信息
public DAM3601( byte station ) : base( station )
{
SleepTime = 200;
}
#endregion
#region Public Method
///
/// 读取所有的温度数据,并转化成相关的信息
///
/// 结果数据对象
public OperateResult ReadAllTemperature( )
{
string address = "x=4;1";
if (AddressStartWithZero) address = "x=4;0";
OperateResult read = ReadInt16( address, 128 );
if (!read.IsSuccess) return OperateResult.CreateFailedResult( read );
return OperateResult.CreateSuccessResult( read.Content.Select( m => TransformValue( m ) ).ToArray( ) );
}
///
/// 数据转换方法,将读取的值,
///
/// 读取的值
/// 转换后的值
private float TransformValue(short value )
{
if ((value & 0x800) > 0)
{
return (((value & 0xFFF) ^ 0xFFF) + 1) * (-0.0625f);
}
else
{
return (value & 0x7FF) * 0.0625f;
}
}
#endregion
#region Override
///
/// 从Modbus服务器批量读取寄存器的信息,需要指定起始地址,读取长度
///
/// 起始地址,格式为"1234",或者是带功能码格式x=3;1234
/// 读取的数量
/// 带有成功标志的字节信息
///
/// 此处演示批量读取的示例
///
///
public override OperateResult Read( string address, ushort length )
{
OperateResult analysis = ModbusInfo.AnalysisAddress( address, AddressStartWithZero, ModbusInfo.ReadRegister );
if (!analysis.IsSuccess) return OperateResult.CreateFailedResult( analysis );
return ReadModBusBase( analysis.Content, length );
}
#endregion
#region Object Override
///
/// 返回表示当前对象的字符串
///
/// 字符串
public override string ToString( )
{
return $"DAM3601[{PortName}:{BaudRate}]";
}
#endregion
}
}