HART协议通用命令用法实例(C#).docx

上传人:scccc 文档编号:14400980 上传时间:2022-02-05 格式:DOCX 页数:26 大小:39.12KB
返回 下载 相关 举报
HART协议通用命令用法实例(C#).docx_第1页
第1页 / 共26页
HART协议通用命令用法实例(C#).docx_第2页
第2页 / 共26页
HART协议通用命令用法实例(C#).docx_第3页
第3页 / 共26页
HART协议通用命令用法实例(C#).docx_第4页
第4页 / 共26页
HART协议通用命令用法实例(C#).docx_第5页
第5页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《HART协议通用命令用法实例(C#).docx》由会员分享,可在线阅读,更多相关《HART协议通用命令用法实例(C#).docx(26页珍藏版)》请在三一文库上搜索。

1、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+t界符+地址璘据字节数+数据+校验和/1、前导符:2-20字节,用于与接收器之间的同步首次开始通信或数据帧重发时,使用20字节前导码,前导码都是0xFF。2、定界符:

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最低四位表示巡检地址,对应

3、设备巡检地址0-154、命令字节:1字节,表明该帧所封装的HART命令,命令字节值在从设备响应中原值返回5、字节奇数:1字节,表明此字节与最后帧校验字节之间的数据字节个数,用于识别帧的 结束,范围0-276、数据域:由整数字节的用户数据组成,长度为 0-25字节/在主-从帧中,数据域存放用户对设备的请求数据/在从-主帧中,数据用于存放设备对用户的响应数据7、校验字节:1字节,对不包括前导符和该字节的帧中所有字节进行水平校验(异或)的 结果/垂直校验时通信过程中硬件自动对每个字节所有位进行奇偶校验后产生的结果/水平校验时所有字节依次按位进行异或运算后的结果8、响应码:只在从帧中出现/响应码第一字

4、节指明通信状态,第二字节表示现场设备工作状态/该帧数据只有在响应码第一字节最高位为0时有效,1表示通信错误 namespace Hart public partial class from1 : Form/HART对应串口初始化Private SerialPort serial_hart = new SerialPort ();Private void portInit() serial_hart.PortName = hart0 port .ToString();serial_hart.BaudRate =Convert .ToInt32(hart0baudrate);serial_hart

5、.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.ToS

6、tring() != ex1) ex1 = ex.ToString();MessageBoxShow(ex.Message);#region设备信息private int manufacID = 18;/ 制造商 IDprivate int devType = 8;/ 制造商设备类型private int sfVersion = 1;/ 软件版本号private int hwVersion = 0;/ 硬件版本号private int devID = new int3;/ 设备 IDprivate int cmdVersion = 5;/通用命令文档版本号private int devIDRe

7、sult = 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; /传感器极限、最小精度单位代码 private float PVUpSensLmt = 0

8、; / 传感器上限private float PVLowSensLmt = 0; / 传感器下限private float PVMiniSpan = 0;/ 主变量最小精度private int PVAlarmSelCd = 0; /主变量报警选择代码private int PVTransFuncCd = 0; /主变量传递功能代码private int PVRangeUnitCd = 0; /主变量上下量程单位代码private float PVUpRangeValue = 0; / 主变量上限值private float PVLowRangValue = 0;/ 主变量下限值private

9、 float PVDampValue = 0;/ 主变量阻尼值,单位秒private int WriteProtectCd = 251; 写保护代码private int PLDCd = 18;/ 商标发行商代码,18-ABB 公司#endregion#region第二第四变量private int SecVUnitCd = 0; / 第二变量代码private float SecVValue = 0; / 第二变量值private int ThirdVUnitCd = 0; / 第三变量代码private float ThirdVValue = 0; / 第三变量值private int F

10、orthVUnitCd = 0; / 第四变量代码private float ForthVValue = 0; / 第四变量值#endregion#region标签、描述符、日期(日月年)private string hartTag = ;/ 标签private string hartDspt = ;/ 描述private string hartDate =; 日期#endregion#region通用命令帧头private byte口 cmdHead = new byte14; 帧头包含导引符、定界符、地址private int cmdHeadInitFlag = 0; / 帧头初始化标志#

11、endregion#region常量表、动态变量表public DataTable hartConstant = new DataTable();public DataTable hartDynamic = new DataTable();#endregionprivate int IDHartConstant = 0;/ 常量表 IDprivate int IDHartDynamic = 0;/ 动态变量表 IDprivate string errorstr = ;/ 错误信息字符串private string hartMsg = ;/读设备消息返回结果public string HartP

12、araShow = new string6;private int FinalAssembleNum = 0;/ 最终装配号private int hartGetCmdOk = new int9;/9个通用查询命令,查询成功后对应单元#region常量表初始化private void HartConstantInit() hartConstant.Columns.Add(ID, typeof(int);hartConstant.Columns.Add(Time, typeof(string);hartConstant.Columns.Add(制造商 ID, typeof(int);hartCo

13、nstant.Columns.Add(制造商设备类型”, typeof(int);hartConstant.Columns.Add(通用命令文档版本号”, typeof(int);hartConstant.Columns.Add(设备软件版本号 ”, typeof(int);hartConstant.Columns.Add( 设备硬件版本号 ”, typeof(int);hartConstant.Columns.Add( 设备 ID 号 ”,typeof(int);hartConstant.Columns.Add( 设备消息 ”, typeof(string);hartConstant.Col

14、umns.Add( 标签 Tag,typeof(string);hartConstant.Columns.Add( 描述符 ”, typeof(string);hartConstant.Columns.Add( 日期”,typeof(string);hartConstant.Columns.Add( 传感器序列号 ”, typeof(int);hartConstant.Columns.Add( 传感器上下限单位代码 ”, typeof(int);hartConstant.Columns.Add( 传感器上限 ”, typeof(float);hartConstant.Columns.Add(

15、传感器下限 ”, typeof(float);hartConstant.Columns.Add(” 主变量最小精度 ”, typeof(float);hartConstant.Columns.Add(报警选择代码 ”, typeof(int);hartConstant.Columns.Add( 传递功能代码 ”, typeof(int);hartConstant.Columns.Add(” 上下量程值代码 ”, typeof(int);hartConstant.Columns.Add(” 主变量上限值 ”, typeof(float);hartConstant.Columns.Add(” 主变

16、量下限值 ”, typeof(float);hartConstant.Columns.Add(” 主变量阻尼值 ”, typeof(float);hartConstant.Columns.Add(” 写保护代码 ”, typeof(int);hartConstant.Columns.Add( 最终装配号 ”, typeof(int);#endregion#region动态变量表初始化private void HartDynamicInit() hartDynamic.Columns.Add(”ID”, typeof(int);hartDynamic.Columns.Add(”Time”,typ

17、eof(string);hartDynamic.Columns.Add( 设备 ID 号”, typeof(int);hartDynamic.Columns.Add(” 主变量单位代码 ”, typeof(int);hartDynamic.Columns.Add(” 主变量值 ”,typeof(float);hartDynamic.Columns.Add(” 主变量电流 ”, typeof(float);hartDynamic.Columns.Add(” 主变量量程百分比 ”, typeof(float);hartDynamic.Columns.Add( 第二变量单位代码 ”, typeof(

18、int);hartDynamic.Columns.Add( 第二变量值 ”, typeof(int);hartDynamic.Columns.Add( 第三变量单位代码 ”, typeof(int);hartDynamic.Columns.Add( 第三变量值 ”, typeof(int);hartDynamic.Columns.Add( 第四变量单位代码 ”, typeof(int);hartDynamic.Columns.Add( 第四变量值 ”, typeof(int);#endregion#region发送命令0 (读标识码)查询请求private void hartSendCmd0(

19、)发送命令 0 (读标识码)查询请求if (hartopenflag = 1) byte口 cmd = new byte13;for (int i = 0; i 8; i+) cmdi = 0xff;/第一次通信前导符为20个0xFFcmd8 = 0x02;短帧,主从模式cmd9 = 0x80;/ 主设备cmd10 = 0x00;/ 命令 0cmd11 = 0x00; / 数据长度 0cmd12 = Convert.ToByte( cmd8 A cmd9 A cmd10 A cmd11);/ 水平serial_hart.Write(cmd, 0, 13); #endregion#region发

20、送无请求数据的长帧通用方法private void hartLongFrameCmdsend(byte cmdn) 发送无请求数据的长帧通用方byte口 cmd = new byte17;if (cmdHeadInitFlag = 1)/获取到设备信息后for (int i = 0; i 14; i+) cmdi = cmdHeadi; / 帧头赋值cmd14 = 1;/ 命令 1cmd15 = cmdn; /无请求数据cmd16 = cmd8;for (int i = 9; i 24) buf = new byten;serial_hart.Read(buf, 0, n);for (int

21、i = 0; i 9; i+) if (bufi = 0x06) & (bufi + 1 = 0x80) & (bufi + 2 = 0x0) & (bufi + 3 = 12)begin = i;if (bufi + 4 = 0) & (bufi + 5 = 0) manufacID = bufi + 7;devType = bufi + 8;cmdVersion = bufi + 10;sfVersion = bufi + 12;hwVersion = bufi + 13;devID0 = bufi + 15;devID1 = bufi + 16;devID2 = bufi + 17;de

22、vIDResult = devID1 * 256 + devID2;hartGetCmdOk0 = 1;/返回值接收成功标志置1cmdHeadInit();/初始化命令帧头 else errorstr =数据长度有误!;pictureBox_Normal.Image = Properties.Resources.异常;label_Right.Text =异常;label_Hint.Text = Hart 通用命令 0 + errorstr;hartSendCmd0(); /未能获取到设备信息则重新发送请 求 #endregion #region数据解析查找帧头相关变量private int h

23、eadbegin = 0;/ 分界符位置private int headFindFlag = 0;/ 找到分解符标志#endregion#region判断返回值是否正确,并找到帧头(分界符位置)判断帧头(定界符)位置private void findFrameHead(byte口 bufl, byte cmdn,byte datanum) for (int i = 0; i 10; i+)if (buf1i = 0x86) & (buf1i + 1 = cmdHead9) &(buf1i + 2 = cmdHead10) & (buf1i + 3 = cmdHead11) &(buf1i +

24、4 = cmdHead12) & (buf1i + 5 = cmdHead13) &(buf1i + 6 = cmdn) & (buf1i + 7 = datanum) if (buf1i + 8 = 0) & (buf1i + 9 = 0)headbegin = i;headFindFlag = 1;if (buf1i + 8 = 0) & (buf1i + 9 = 5)errorstr =命令+ cmdn.ToString() + 返回结果异常,字节数不 对! !;pictureBox_Normal.Image = Properties.Resources.异常;label_Right.T

25、ext =异常;label_Hint.Text = errorstr;#endregion#region查询命令通用帧头设置private void cmdHeadInit()初始化命令帧头,只有在获取到设备信息后才会有此标志为1for (int i = 0; i 8; i+)cmdHeadi = 0xff;cmdHead8 = 0x82;cmdHead9 = Convert.ToByte( manufacID);cmdHead9 |=0x80;cmdHead10 = Convert.ToByte(devType);for (int i = 0; i 18) buf = new byten;s

26、erial_hart.Read(buf, 0, n);findFrameHead(buf, cmdn, datanum);if (headFindFlag = 1) PVUnitCd = bufheadbegin + 10;PVValue = BitConverter.ToSingle(buf, headbegin + 11);hartGetCmdOk1 = 1;headFindFlag = 0;headbegin = 0; else hartSendCmd1();#endregion#region命令2返回值解析(主变量电流值和百分比)/命令2返回值解析/ 预期返回值为:FF FF FF F

27、F FF FF FF FF 86 #add1 #add2 #add3 #add4 #add5 0x020x1800 00#0.#3#4.#7/*8个前导符 */ 定界符 *5字节地址*/命令/数据长度状态/主变量电流/主变量量程百分比 private void hartGetCmd2() int n = serial_hart.BytesToRead;byte口 buf;byte cmdn = 2;byte datanum = 8;if (n 18) buf = new byten; serial_hart.Read(buf, 0, n); findFrameHead(buf, cmdn, d

28、atanum); if (headFindFlag = 1) PVCurrent = BitConverter.ToSingle(buf, headbegin + 10); PVPercentRange = BitConverter.ToSingle(buf, headbegin + 14); hartGetCmdOk2 = 1;headFindFlag = 0; headbegin = 0; else hartSendCmd2();#endregion#region命令3返回值解析(主变量电流和动态变量)/命令3返回值解析/ 预期返回值为:FF FF FF FF FF FF FF FF 86

29、 #add1 #add2 #add3 #add4 #add5 0x03 0x1800 00#0.#3#4/*8个前导符 */定界符 *5字节地址*命令/数据长度状态/主变量电流主变量单位代码/ #5.#8#9#10.#13#14#15#18#19#20.#23/主变量值*第二变量代码*第二变量值*第三变量代码*第三变量值*第四变量代码*第四变量值private void hartGetCmd3() int n = serial_hart.BytesToRead;byte buf;byte cmdn = 3;byte datanum = 24;if (n 34 ) buf = new byten

30、;serial_hart.Read(buf, 0, n);findFrameHead(buf, cmdn, datanum);if (headFindFlag = 1) PVCurrent = BitConverter.ToSingle(buf, headbegin + 10);PVUnitCd = bufheadbegin + 14;PVValue = BitConverter.ToSingle(buf, headbegin + 15);SecVUnitCd = bufheadbegin + 19;SecVValue = BitConverter.ToSingle(buf, headbegi

31、n + 20);ThirdVUnitCd = bufheadbegin + 24;ThirdVValue = BitConverter.ToSingle(buf, headbegin + 25);ForthVUnitCd = bufheadbegin + 29;ForthVValue = BitConverter.ToSingle(buf, headbegin + 30);hartGetCmdOk3 = 1;headFindFlag = 0;headbegin = 0; elsehartSendCmd3();#endregion#region命令12返回值解析(设备消息)/该命令用于读取设备消

32、息/ 预期返回值为:FF FF FF FF FF FF FF FF 86 #add1 #add2 #add3 #add4 #add50x0C 0x1800 00#0.#23/*8个前导符*/ 定界符/*5 字节地址*命令数据长度状态设备消息(ASCIIprivate void hartGetCmd12() int n = serial_hart.BytesToRead;byte buf;byte cmdn = 12;byte datanum ;if (n 18) buf = new byten;serial_hart.Read(buf, 0, n);datanum = Convert.ToBy

33、te(n-18); /是24还是实际字符串长度不确定 findFrameHead(buf, cmdn, datanum);if (headFindFlag = 1)StringBuilder strb = new StringBuilder();for (int i = 0; i 31)buf = new byten;serial_hart.Read(buf, 0, n);findFrameHead(buf, cmdn, datanum);if (headFindFlag = 1)StringBuilder strb = new StringBuilder();for (int i = 0;

34、i 6; i+) strb.Append(char)bufheadbegin + 10 + i); hartTag = strb.ToString(); strb.Clear();for (int i = 6; i 26) buf = new byten;serial_hart.Read(buf, 0, n);findFrameHead(buf, cmdn, datanum);if (headFindFlag = 1)PVSensNum = (bufheadbegin + 10 16) & 0xff0000 + (bufheadbegin+ 11 8) & 0xff00 + bufheadbe

35、gin + 12;PVSensUnitCd = bufheadbegin + 13;PVUpSensLmt = BitConverter.ToSingle(buf, headbegin + 14);PVLowSensLmt = BitConverter.ToSingle(buf, headbegin + 18);PVMiniSpan = BitConverter.ToSingle(buf, headbegin + 22);hartGetCmdOk6 = 1;headFindFlag = 0;headbegin = 0; else hartSendCmd14();#endregion#region命令15返回值解析(主变

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1