基于Modbus协议的智能压力传感器研发
1 引言
20世纪90年代以来,在传感技术基础上结合微处理器技术发展起来的智能能传感技术成为国际上研究的热点。传感器领域的智能化得到了快速发展,出现了不同种类的智能化传感器产品。但是,单一智能化传感器并不能充分发挥智能化的优点,只有将其与计算机联网才能真正将智能化传感器的特点全面发挥出来。本文根据 rs-485总线以差分平衡方式传输信号,具有抗干扰性好、传输距离远等特点,通过一对双绞线作为传输介质将现场设备与上位机连起来,使系统结构大为简化,同时这也大大降低了系统安装、调试以及维护的成本。通过目前国际上普遍采用的modbus通信协议进行编写,方便操作人员的阅读及使用。
2 modbus rtu通信协议
modbus协议是莫迪康公司1978年发明用于电子控制器进行控制和通信的协议。
modbus协议已经被接受转化成为中国国家标准gb/t 19582-2008 《基于modbus协议的工业自动化网络规范》。
modbus协议采用主从(master-slave)技术,是一种问答方式的通信协议。modbus通讯协议有两种传送方式:rtu方式和ascii方式,相对于ascii方式,rtu模式表达相同的信息需要较少的位数,且在相同通讯速率下具有更大的数据流量。因此本文采用的是modbus rtu模式[2]。
使用rtu模式时,消息发送至少要以3.5个字符时间的停顿间隔开始(如表1中的t1-t2-t3-t4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0-9,a-f。功能码是每帧通讯信息的第二个字节,根据modbus协议规定 ,不同功能码对应数域格式不尽相同,常用的功能码有 1、2、3、4、5、6、15 和 16 , 分别表示读线圈、读输入状态、读保持寄存器、读输入寄存器、写单个线圈、写单个输入状态、写多个线圈, 写多个保持寄存器。本文根据需要主要是用的3、6、16功能码。网络设备不断侦测网络总线,当第一个域(地址域)接收到,每个设备都进行解码以判断是否发给自己。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。
整个消息帧必须作为一连续的流传输。如果在帧完成之前有超过3.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前一消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的crc 域的值不可能是正确的[3]。一典型的rtu模式的消息结构如表1所示。
3 系统硬件设计
智能传感器(intelligent sensor)是具有信息检测与处理功能的传感器。智能传感器带有微处理机,具有采集、处理、交换信息的能力,是传感器集成化与微处理机相结合的产物。本设计中智能压力传感器的组成如图1所示。
图1 基于c8051f350的智能压力传感器的方框图
整个系统按照各部分功能可分为电源模块、温度采集模块、模拟信号调理模块、数据通信模块等部分。本设计使用c8051f350作为数据采集后的微处理器,c8051f350内部有一个全差分24位sigma-delta模/数转换器(adc),该adc具有在片校准功能。两个独立的抽取滤波器可被编程到1khz的采样率[5]。可以使用内部的2.5v电压基准,也可以用差分外部基准进行比率测量,其中在本设计中使用的是内部电压基准。adc0中包含一个可编程增益放大器,有8种增益设置,最大增益可达128倍,增益调节范围完全符合设计要求。
设计采用陶瓷材料经特殊工艺精制而成的干式陶瓷压阻压力传感器cps181,陶瓷是一种公认的高弹性、抗腐蚀、抗磨损、抗冲击和振动的材料。陶瓷的热稳定特性及它的厚膜电阻可以使它的工作温度范围高达-40~135℃,而且具有测量的高精度、高稳定性。电气绝缘程度>2kv,输出信号强,长期稳定性好[4]。设计使用ds18b20测量工作环境温度。ds18b20具有以下特性:
(1) 独特的单线接口,只需一个接口引脚即可通信;
(2) 不需要外部元件;
(3) 可用数据线供电;
(4) 不需要备份电源等。
测量得到的温度信号经过单线接口送入ds18b20或从ds18b20送出,因此从c8051f350到ds18b20仅需连接一条线。设计的通信通过rs485完成。因为rs-485的数据最高传输速率为10mbps;rs-485接口是采用平衡驱动器和差分接收器的组合,抗共模能力强,即抗噪声干扰性好[6];rs-485接口的最大传输距离可达3000米;支持众多常见的操作系统,易于实现不同网络之间的通信。
4 系统软件设计
4.1下位机通信程序的创新性设计
系统的下位机程序主要是运用了大家熟悉的c语言进行编程,程序采用了模块化思想,结构清晰易读。主要包括系统初始化、更新传感器温度值、更新传感器供电电压值、更新传感器零漂值、更新传感器压力值、由modbus协议对上位机发来的报文进行解释形成任务标志、执行modbus协议的相应功能代码任务、向上位机发送应答报文、故障诊断、电源管理等模块。
设计的创新点:自定义了一个寄存器数组,数组里包括地址、量程、增益、波特率、零漂、版本号、温度、供电电压、故障信息、压力值等,并对他们进行了编号。寄存器分配一览表如表2所示。
(1)每一寄存器由两个字节构成,高字节在前,低字节在后,高字节存放数值的高位,低字节存放数值的低位。例如:量程代码存放于编号为01h的寄存器中,所占的两个字节规定如下(其中xx为以16进制形式存放的量程代码):
寄存器编号 字节 高半字节 低半字节
01h 高字节 0 0
低字节 x x
定义:传感器地址、量程、增益、波特率分别占用一个寄存器(即两个字节),它们的寄存器号分别为00h、01h、02h、03h,在modbus协议功能码03中,起始地址高位、低位可以分别对应传感器地址、量程、增益、波特率的高位、低位。
(2) 在具体编写程序时,把寄存器数组的所有只写属性放入flash
然后初始化读出。上位机发信息,下位机解释相应命令,读出或写入相应数据。在编写执行03、06、16任务模块时我们把要读取的寄存器数组的起始下标和要读取的数据个数分别根据modbus功能码中的起始地址高、低位和寄存器数高、低位设定成一个变量,这样简化了程序,可读性强。
(3)modbus协议规定,当设备使用rtu模式通信时,整个报文帧必须以连续的字符流发送。报文帧由时长至少为3.5个字符时间的空闲间隔区分。如果两个字符之间的空闲间隔大于1.5个字符时间,则报文帧被认为不完整应该被接收节点丢弃。而在实际通信过程中由于每帧消息不定长,所以程序中最主要的问题是如何找到modbus消息帧的开始和结束时间点,并且要满足两个字符之间的空闲间隔和两个报文帧之间的空闲间隔。程序的解决方法:接收采用中断方式并采用了可重复触发的可编程单稳方式进行处理,在利用modbus协议通信时保证了实时性接收。
(4)对于报文发错问题(即不符合要发送的报文),已用crc校验程序对其处理。对于发送不符合要求的传感器地址、功能代码、数据、从机设备故障、从机设备忙碌、超时等问题,通过发送不正常响应信息来进行处理。而且上位机也编写了相应的程序代码。
(5) 对于零漂、温漂的补偿以及线性化的问题,通过软件进行补偿处理的。实验证明,系统精度可以控制在千分之五之内。
4.2上位机通信程序的编写
图2 modbus串口协议通信界面
上位机串口通信是采用 visual basic语言编写,visual basic提供了面向对象的可视化编程工具。开发人员只需按设计要求在屏幕上“画”出所需的用户界面来,并设置这些对象的属性,不必为用户界面设计而编写大量的程序代码[7]。相对于传统编程语言,visual basic最突出的特点是事件驱动编程机制。每个事件都能驱动一段程序的运行。程序员只需编写响应用户动作的代码,各个动作之间不一定有联系,这样的程序一般较短,且易于编写和维护。在visual basic中为了完成串行通信,使用了mscomm控件,它可实现对串口的数据发送和接收。为了实现自动发送功能,还用到了timer控件。这两个控件在程序运行时都是不可见的[8][9],在设计时把它们放在窗体的右上角即可。图3为modbus串口协议通信界面。此串口通信主要完成的功能:
(1)搜索传感器配置信息:当用户在用此传感器时,可能不清楚挂接传感器地址位置以及串口所使用的波特率,为此编写了相应的程序方便用户查询。
(2)读传感器配置信息,包括地址、量程、增益、波特率、程序代码、修正系数、功能代码等。此部分根据modbus功能码03编写,严格按照rtu帧格式编写。
(3)写传感器配置信息。用户可以根据自己的要求,更改地址、量程、增益、波特率、程序代码、修正系数、功能代码等。此部分是根据根据modbus功能码06或16编写。
(4) 采集传感器工作状态。包括传感器压力、供电电压、环境温度、零漂、故障信息等。
modbus串口协议通信界面如图2所示。
部分程序如下:
private sub timer1_timer()
if star_find = true then `如果有启动搜索命令标志
area_num = area_num + 1
mscomm1.outbuffercount = 0
if area_num >= 248 then `如果现波特率下超出下位机地址范围,则地址清零,重新换波特率搜索
area_num = 0
timer1.enabled = false
ll= msgbox("该波特率下无法搜索到下位机地址,请改变波特率!", vbok, "提示")
end if
call start_find `开端口,将搜索命令发给下位机,并确定mscomm1.rthreshold属性
end if
if star_read = true then `如果有启动读命令标志
call start_read `开端口,将读命令发给下位机,并确定mscomm1.rthreshold属性
end if
if star_write = true then `如果有启动写命令标志
call start_write
`开端口,将配置信息强置给下位机,并确定mscomm1.sthreshold属性
end if
if star_acq = true then `如果有启动采集命令标志
if acq_end = true then `如果有结束采集命令标志
timer1.enabled = false `关闭时钟
acq_end = false `清除结束采集命令标志
end if
call start_read `开端口,将读命令发给下位机,并确定mscomm1.rthreshold属性
end if
end sub
4.3 编程时应注意以下几个问题
(1) 下位机从应答到发送数据并返回回应消息有一定的时间间隔,程序已根据不同波特率对其进行设定。保证对下位机的信息正确读取。
(2) 在搜索传感器配置信息时,若搜索不到,要有提示通信出错信息,不能无限时间搜索。
(3) 每一次的传输是0-255之间的数据,必须把inputmode属性设置为1(默认为0),表示以二进制格式取回数据。否则当设置为0时,超过128的部分会被当成双字节文字处理,结果出现错误。
5 结束语
利用上述的软硬件设计方法,通过 vb6.0的mscomm控件可以做到基于modbus通信协议的上位机与下位机的相互通信。该方法编程简单、实用,运行稳定可靠,操作简便易行,通用性强,同时降低了开发成本,很好的满足了工业现场的要求。
文章版权归西部工控xbgk所有,未经许可不得转载。