写在前面
通信协议是做上位机开发经常会听到的一个词。无论是单片机开发常用的串口通信协议,还是上位机开发常用TCP/IP通信协议,以及网络通信常用的Http协议,可以这么说,通信协议无处不在。公众号:【dotNet工控上位机:thinger_swj】
对于通信协议,官方性解释是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。通俗地说,为了保证机器与机器之间能够正常对话,两者之间需要共同使用同一种语言,这种语言就是通信协议,就和中国人之间沟通使用普通话、本地人之间沟通使用方言、不同国家的人之间沟通使用英语是一个道理。
1 通信协议剖析
本文主要针对的硬件是国内仪表市场占有率比较高的一个品牌——厦门宇电AI系列仪表。厦门宇电自动化科技有限公司专门为AI 系列显示控制仪表开发了一个通讯协议——AIBUS,这个AIBUS会有一系列的协议说明,对上位机开发人员来说,这就是一个自定义协议。
如果要和一个自定义协议的仪表进行通信,我们需要从以下几个环节着手去做:通信协议剖析、硬件配置及环境搭建、根据协议编写通信库、编写测试软件进行测试。
这里首先找到了该仪表的通信协议说明书,一般仪表或者PLC的通信协议可以通过供应商提供或者官网下载,宇电仪表通信协议下载链接:
http://www.yudian.com/Download/11904/List.html
在协议说明书中,找到通信的核心报文部分:
AI 仪表采用 16 进制数据格式来表示各种指令代码及数据。AI 仪表软件通讯指令经过优化设计,标准的通讯指令只有两条,一条为读指令,一条为写指令,两条指令使得上位机软件编写容易,但能 100%完整地对仪表进行操作;标准读和写指令分别如下:
读: 地址代号+52H(82)+要读的参数代号+00+00+校验码
写: 地址代号+43H(67)+要写的参数代号+写入低字节+写入高字节+校验码
地址代号:为了在一个通讯接口上连接多台 AI 仪表,需要给每台 AI 仪表编一个互不相同的通讯地址,有效的地址为 0-80(部分型号为 0-100),所以一条通讯线路上最多可连接 81 台 AI 仪表,仪表的通讯地址由参数 Addr 决定。仪表内部采用两个重复的 128-208(16 进制为 80H-D0H)之间数值来表示地址代号,由于大于 128的数较少用到(如 ASC 方式的协议通常只用 0-127 之间的数),因此可降低因数据与地址重复造成冲突的可能性。
参数代号:AI 仪表通讯协议规定,地址代号为两个相同的字节,数值为(仪表地址+80H)。 例如:仪表参数 Addr=10(16 进制数为0AH,0A+80H=8AH),则该地址代号: 8AH 8AH 参数代号:仪表的参数用1个8位二进制数(一个字节,写为 16 进制数)的参数代号来表示,它在指令中表示要读/写的参数名。
校验码:校验码采用 16 位求和校验方式,其中读指令的校验码计算方法为:
要读参数的代号×256+82+ADDR
写指令的校验码计算方法为:
要写的参数代号×256+67+要写的参数值+ADDR
公式中 ADDR为仪表地址参数值,范围是 0~80(注意不要加上 80H)。校验码为以上公式做二进制16位整数加法后得到的余数,余数为2 个字节,其低字节在前,高字节在后。要写的参数值用16位二进 制整数表示。
返回数据:无论是读还是写,仪表都返回以下 10 个字节数据:
测量值 PV+给定值 SV+输出值MV及报警状态+所读/写参数值+校验码
其中 PV、SV 及所读参数值均各占 2 个字节,代表一个 16 位二进制有符号补码整数,低位字节在前,高位字节在后,整数无法表示小数点,要求用户在上位机处理;MV 占一个字节,按 8 位有符号二进制数格式,数值范围-110~+110,状态位占一个字节,校验码占 2个字节,共 10个字节。
通过以上说明,可以发现AIBUS这个通信协议相对来说还是比较简单的,我们只需要按照规定,将组织好的报文发送给控制器,即可获取到测量值、给定值、输出值、报警状态及参数值。
2 硬件环境搭建
将整个环境搭建起来,需要涉及以下硬件:
- Pt100铂热电阻
· 宇电温控表
· RS485转USB
· 工控机电脑
· 根据宇电温控表的接线图,整体硬件接线如下图所示:
注意:接线完成后,需要按照宇电温控表说明书,对宇电仪表进行相关的设置,包含通信参数设置、从站地址、输入类型等。
3 通信库开发
通信库开发是本文的核心内容,这里需要有一定的C#编程基础,同时对通信协议有一定的认识和了解。
- 初始化通讯:初始化通信主要是进行串口连接及断开连接方法的编写:
· 为了方便进行报文的组织,编写了一个报文拼接类ByteArray:
- 校验:AIBUS协议中的校验采用校验和的方式:
读指令的校验码计算方法为:要读参数的代号×256+82+ADDR
写指令的校验码计算方法为:要写的参数代号×256+67+要写的参数值+ADDR
· 读取参数:AIBUS读取参数报文格式如下:
· 写入参数:AIBUS写入参数报文格式如下:
4 通信软件开发
完成通信库开发后,再写通信软件就非常简单了,直接通过创建通信对象,调用相关的方法即可获取到相应的数据。
5、写在最后
本文主要针对C#与厦门宇电温控表之间的自定义协议通信做了较为详细的描述,相信对于很多电气工程师,尤其是以西门子PLC为主的电气工程师来说,会有很大帮助。近几年随着人工智能、物联网的流程,工控行业发生了很大的变化,每一位电气工程师都应该及时作出调整,至少学习一门高级编程语言,未雨绸缪,以更好的姿态来应对即将到来的智能制造2025。