using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//***************HART协议说明***********************************////
//HART命令查询帧格式:0xFF+0xFF+定界符+地址+数据字节数+数据+校验和
//1、前导符:2-20字节,用于与接收器之间的同步
//首次开始通信或数据帧重发时,使用20字节前导码,前导码都是0xFF。
//2、定界符:1字节,短帧:01,02,06对应成组、主从、从主三种模式,长帧时将短帧最高位置1即可
//3、长帧和短帧区别在于地址的字节数不同,短帧地址为1字节,用于初始化时命令0查询设备标志、ID等信息
//长帧地址:5字节(40位),建立在设备唯一标识符的基础上
//唯一标识符分为三个部分:
//第一字节最高位,1表示基本主设备,0表示副主设备
//第一字节第六位(次高位),1表示处于成组模式,0表示没有成组模式
//长地址的其它部分是设备的唯一标识符,共38位,均为0表示广播地址
//二.二短帧地址:1字节
//最高位1表示主设备,0表示副主设备
//第6位1表示处于成组模式,0表示没有处于成组模式
//第4、5位必须置0
//最低四位表示巡检地址,对应设备巡检地址0-15
//4、命令字节:1字节,表明该帧所封装的HART命令,命令字节值在从设备响应中原值返回
//5、字节奇数:1字节,表明此字节与最后帧校验字节之间的数据字节个数,用于识别帧的结束,范围0-27
//6、数据域:由整数字节的用户数据组成,长度为0-25字节
//在主-从帧中,数据域存放用户对设备的请求数据
//在从-主帧中,数据用于存放设备对用户的响应数据
//7、校验字节:1字节,对不包括前导符和该字节的帧中所有字节进行水平校验(异或)的结果
//垂直校验时通信过程中硬件自动对每个字节所有位进行奇偶校验后产生的结果
//水平校验时所有字节依次按位进行异或运算后的结果
//8、响应码:只在从帧中出现
//响应码第一字节指明通信状态,第二字节表示现场设备工作状态
//该帧数据只有在响应码第一字节最高位为0时有效,1表示通信错误
namespace Hart
{
public partial class from1 : Form
{
//HART对应串口初始化
Private SerialPort serial_hart = new SerialPort();
Private void portInit()
{
serial_hart.PortName = hart[0]["port"].ToString();
serial_hart.BaudRate = Convert.ToInt32(hart[0]["baudrate"]);
serial_hart.ReceivedBytesThreshold = 1;
serial_hart.Parity = Parity.Odd;
try
{
serial_hart.Open();
int n = serial_hart.BytesToRead; //串口缓存区待读取数据个数
byte[] buffirstclear = new byte[n];
serial_hart.Read(buffirstclear, 0, n);//将串口缓存区之前的数据清理掉,防止过量非预期数据进入解析环节
buffirstclear = new byte[1]; //释放变量空间
}
catch (Exception ex)
{
if (ex.ToString() != ex1)
{
ex1 = ex.ToString();
MessageBox.Show(ex.Message);
}
}
}
#region 设备信息
private int manufacID = 18; //制造商ID
private int devType = 8; //制造商设备类型
private int sfVersion = 1; //软件版本号
private int hwVersion = 0; //硬件版本号
private int[] devID = new int[3]; //设备ID
private int cmdVersion = 5; //通用命令文档版本号
private int devIDResult = 0; //设备ID计算结果
#endregion
#region 主变量(PV)
private int PVUnitCd = 0; //主变量代码
private float PVValue = 0; //主变量
private float PVCurrent = 0; //主变量电流
private float PVPercentRange = 0; //主变量量程百分比
private int PVSensNum = 0; //主变量传感器编号
private int PVSensUnitCd = 0; //传感器极限、最小精度单位代码