Python 实现Hart协议

  1. Hart协议介绍
    Hart协议多数使用在智能仪表上,如电磁流量计,液位计等智能仪表的电流输出端口4~20mA往往会支持Hart协议。Hart协议是在端口电流上添加叠加0.5mA的正弦调制波,以1200Hz代表逻辑‘1’,2200Hz代表逻辑‘0’,成功地把模拟信号和数字信号双向同时通讯,而不互相干扰。如下图:

    Hart协议的消息帧要求如下:

其中RES,是状态位,是从站向主站发送信息时才有的。
Hart协议的消息帧主要由以下几个字段来定义:
1.1. PREAMBLE,前导字节,一般是5个“FF”,也就是5个字节
1.2. DELIMITER,起始字节。起始字节来确定后续的ADDR字节是“短”结构还是“长”结构。起始字节主要有短结构的‘02’,长结构的‘82’(主站向从站发送命令)。以及短结构‘06’,长结构‘86’ (从站向主站发送消息)。短结构‘01’,长结构‘81’(突发模式)。
1.3. ADDR,地址字节。ADDR包含主机地址和从站地址。按上述所提,ADDR有两种结构,分别是短结构和长结构,不同的结构会导致ADDR字节数不同
1.3.1 短结构
短结构时,ADDR为1个字节(8位bit),8位bit含义如下:

主机地址:1表示是第一主机,0表示是第二主机(Hart手持式终端)
突发模式:突发模式是特例,结合上述DELIMITER字节,突发模式,0,1值将交替出现,也就是说,在该模式下,赋予2个主机的机会均等。此位为1 表示为“突发”模式。
SA: 字节后4位为从站地址,也就是说从站地址是0~15。只有16个从站。
1.3.2 长结构
长结构时,ADDR为5个字节,字节含义如下:

1.4. COM:命令字节,常用的命令有‘0’号命令,‘1’号命令,‘2’号命令等。具体参考Hart命令细节
1.5. BCNT:数据总长度。表示的是从BCNT后面一个字节开始(不包含BCNT自己)到CHK字节(不包含CHK字节)之间的字节数。由于规定数据字节(DATA)最多25个字节,因此BCNT最大27(响应码RES为2个字节),也就是0x18。
1.6. RES:响应码。响应码只有在从站回答时,从站才会发送响应码,以此来确定主站发送的命令是否正确执行,他将报告通讯中的错误、接收命令的状态(如:设备忙、无法识别命令等)和从机的操作状态。
如果我们在通讯过程中发现了错误,首字节的最高位(第7位)将置1,其余的7位将汇报出错误的细节,而第2个字节全为0。否则,当首字节的最高位为0时,表示通讯正常,其余的7位表示命令响应情况,第2个字节表示场设备状态的信息。
1.7. DATA:数据字节。数据字节可以为0,,也可以是从站提供的PV,SV等数据。
1.8. CHK:奇偶校验码。从起始字节开始到奇偶校验前一个字节的“异或”。

  1. PC端硬件要求
    Hart协议可以有两个主机(Master),首要主机是上位机,次要主机是可携带式的读数器。本文只使用上位机来进行Hart协议通讯,对硬件要求如下:
    2.1 Hart modem:使用的是MACTek公司的VIATOR,带有USB接口,直接连接到PC的USB。端口设置如下,波特率1200:

    2.2 智能仪表:采用的是KROHNE公司的OPTIFLEX2200 液位计,其点对点连接方式如下:

  2. Python实现Hart协议中的“命令0”和‘命令1’
    流程图如下:

  3. 举例说明命令0
    命令‘0’,主要是来询问仪表,仪表返回一些设备信息,如制造商信息,设备型号,设备ID等。只有通过命令0获得设备信息后,才能在命令1中使用长结构。由于命令0比较通用,可以来检查程序是否正常运行。
    在点对点模式下,在仪表上设置的Hart地址默认为"0",因此只要是仪表地址为’0’时,上位机发送命令’0’的消息帧均是:
    b’\xFF\xFF\xFF\xFF\xFF\x02\x80\x00\x00\x82’
    所以如果不打算使用command_0(DELMITEL,ADDR,CMD,BCNT)函数时,可以直接使用上述的消息帧来测试端口是否正确,具体程序如下:

#前导符总是‘ff’,并且是5个连续的‘ff‘
PREAMBLE='ff'
#定界符,短字定届符为02(主站发给从站),06(从站发给主站),01(突发报文)。长字定届符分别是82,86,81
DELMITEL='02'
#Address 可以是长字符。但命令0 可以使用短字符.由于从站地址为0是,address=‘80’,从站地址是15时,address=‘8F’
ADDR='80'
#命令0,命令1较为常用
CMD='00'
#定义BCNT下一字节到Check字节之间的字节数量,最多27个?
BCNT='00'
# Hart modern在PC上的端口COM
serialPort='COM22'
#波特率必须是1200
baudRate=1200
ser=serial.Serial(serialPort,baudRate,stopbits=serial.STOPBITS_ONE,parity=serial.PARITY_ODD,timeout=0.5)
#Send_Data_0=command_0(DELMITEL,ADDR,CMD,BCNT)
#command0 总是等于b'\xFF\xFF\xFF\xFF\xFF\x02\x80\x00\x00\x82'
Send_Data_0=b'\xFF\xFF\xFF\xFF\xFF\x02\x80\x00\x00\x82'
ser.write(Send_Data_0)
time.sleep(0.5)
n=ser.inWaiting()
if n:# read_data 类型是bytes,但read_data[0]的类型是intread_data=ser.read(n)#(b'\x00\xff\xff\xff\xff\xff\x06\x80\x00\x13\x00T\xfeE\xd7\x05\x06\x01\x01\x08\x00\x02\x0f\xcd\x05\x04\x00}\x00:')#会有点乱码,原因未知。但当把读出来的数据进行list后,和上面的显示不一样print("reading data from OPTIFLEX is %s"%read_data)read_data_str=[]for i in read_data:#hex(i) 把 整型 i转换成16进制字符,是字符型。read_data_str.append(hex(i))#read_data_str=['0x0', '0xff', '0xff', '0xff', '0xff', '0xff', '0x6', '0x80', '0x0', '0x13', '0x0', '0x54', '0xfe', '0x45', '0xd7', '0x5', '0x6', '0x1', '0x1', '0x8', '0x0', '0x2', '0xf', '0xcd', '0x5', '0x4', '0x0', '0x7d', '0x0', '0x1a']print('reading data for Command_0 is %s'%read_data_str)
ser.close()

以上就是很简单的命令0 实现程序,通过命令0,上位机得到一系列的十六位进制的字符串,需要根据Hart协议的命令’0’解释,对获得的字符串进行脱壳解释,以此来得到设备信息,并记录设备信息,为命令1的实现做准备。
命令1的实现就需要根据实际命令0得到的设备信息进行设置,目的是读取仪表的PV值(Hart协议总共四个变量,PV,SV,TV,4V)在此就不打算展开,有需要的同学可以和我站内联系。

Python实现Hart协议相关推荐

  1. 通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!

    摘要:在当今信息化时代,大多数企业都需要网络支撑企业的ICT运行,提升企业运行效率,针对企业网络中的网元设备(包括交换机,路由器,防火墙等),很多企业希望根据自身的业务特点定制网络管理,比如可以实现网 ...

  2. 从入门到入土:基于Python采用TCP协议实现通信功能的程序

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  3. python 下载文件-Python实现HTTP协议下的文件下载方法总结

    本文介绍了几种常用的python下载文件的方法,具体使用到了htttplib2,urllib等包,希望对大家有帮忙. 1.简单文件下载 使用htttplib2,具体代码如下: h = httplib2 ...

  4. python应用系列教程——python使用smtp协议发送邮件:html文本邮件、图片邮件、文件附件邮件

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用smtp协议发送电子邮件.包含发送html文本邮件.包含图片附件的邮件,包含其他文件附件的邮件.可设置邮件的收发人,主题,内容 ...

  5. Python通过MQTT协议上传物联网数据给ThingsBoard

    第一步: 用租户账号登录,配置ThingsBoard 设备,使用MQTT协议 第二步: 参考这篇文章,使用MQTT客户端 发消息给ThingsBoard 主要是一个username的参数 第三步: 使 ...

  6. python通过onvif协议搜索局域网所有摄像头ip,并获取摄像头rtsp,mac地址等相关服务

    这里用到camera_discovery模块 pip install camera_discovery from camera_discovery import CameraDiscovery cam ...

  7. HART协议数据格式避坑(C语言压缩字符串Packed-ASCII和ASCII转换)

    HART协议数据格式避坑(C语言压缩字符串Packed-ASCII和ASCII转换) 首先HART数据格式如下: 重点就是浮点数和字符串类型 Latin-1就不说了 基本用不到 浮点数 浮点数里面 如 ...

  8. HART协议通用结构体及地址、常量的定义

    HART协议通用结构体及地址.常量的定义 在HART模块中,通常是通过UART发送一个字节,且需要11位二进制数据,第一位起始位,第二到九位共八位是要发送的数据,第十位是校验位<奇校验>, ...

  9. 【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程

    [嵌入式硬件芯片开发笔记]HART协议调制解调芯片AD5700配置流程 XTAL_EN接地,CLK_CFG的两个引脚由同一个GPIO控制 初始时HART_CLK_CFG输出低电平 由RTS引脚控制调制 ...

  10. 用Python实现ModbusTcp协议

    用Python实现ModbusTcp协议 去年2021年写了两篇用Python实现Modbus-RTU串行通信协议的文章,今年有个项目用现场上位计算机通过ModbusTcp网关来读写现场的Modbus ...

最新文章

  1. IDEA中PlantUML的使用
  2. Keras 构建DNN 对用户名检测判断是否为非法用户名(从数据预处理到模型在线预测)
  3. Silverlight学习笔记(3):Silverlight的界面布局
  4. 电脑显示连接了网络但是不能上网_为什么电脑插上网线显示已连接却上不了网...
  5. 魔鬼作坊第一部实践----第九课
  6. java类的聚合 组合定义_Java里组合和聚合的概念及其实现
  7. DataTable,List和Json的转换
  8. LoadRunner的Apache的监控
  9. 合成孔径雷达算法与实现_典型线面目标合成孔径雷达参数化成像
  10. 计算机ppt试题训练,教案计算机试题.ppt
  11. linux下载文件命令
  12. win10任务栏不合并图标如何设置
  13. 数字经济的网络黑手,中科信安:勒索软件攻击比去年同期增加7倍
  14. 安信可A9G二次开发的准备工作
  15. Introduction to OOC Programming Language
  16. 移动应用/APP的测试流程及方法
  17. STM32笔记-FM收音机
  18. 兼容IE9的文件上传
  19. 黑龙江大米:正宗东北大米,源于黑土地
  20. Linux-SO_REUSEPORT特性

热门文章

  1. 计算机病毒是计算机软件出现的故障,计算机病毒引发故障有哪些
  2. 安平仓管王 5000xp v2.9 免费下载
  3. 做游戏开发,选择Unity还是Unreal?
  4. [ CSOL ] - zihao + 自适应 + 文字滚动 + 媒体查询 + fullpage + 手风琴 + 延时动画
  5. 加班熬夜一个月,终于把所有Python库整理齐了,祝你早日学成
  6. Windows 7下的虚拟光驱
  7. 基于Linux下的英英词典
  8. Xshell6、Xftp6【官方免费版】下载
  9. PGP加密软件介绍、下载地址(官方发行最新版)及安装教程
  10. 软件工程实践: 敏捷开发流程图(scrum)