刘俊宇,赵立宏
(南华大学 机械工程学院,湖南 衡阳 421001)
目前,卷烟厂所使用的卷烟机大多采用管道烟丝送料[1],卷烟机工作过程中,烟丝料全部由气力输送。当卷烟机以每分钟生产7 000 支或更高的生产速度工况下,送丝管内风速小于16 m/s,烟丝供应不足;而当管道内风速高于25 m/s 时又会造成烟丝质量下降[2]。依据卷烟厂生产经验,当烟丝速度控制在9-11 m/s 时,既能保证卷烟机中烟丝给入量充足、不影响正常生产,又能使管道内大部分烟丝处于悬浮状态,最大程度减小了燥碎,提高了卷烟质量。由于管道中烟丝速率较快,实现烟丝速度的实时监测需要处理大量数据,同时也对系统数据传输速率提出一定要求。因此该设计采用更大并行度的现场可编程逻辑门阵列(FPGA)作为控制核心,使用Modbus 协议为数据链路传递有效数据,使其高效快速的将烟丝测速仪处理完的数据传送到上位机和其它子模块。
Modbus 是1979 年由Modicon 公司发表的一种串行通信协议,由于其简单、开放的特点已成为工业通信领域的行业标准,在电子通信领域得到广泛的应用。Modbus 有RTU(Remote Terminal Unit)和ASCII 两种模式,都是以帧报文的形式传输数据。但在同等情况下,RTU 模式比ASCII 模式的数据密度更大,更适合多字节数据的传输。RTU 模式下,一帧报文包括:地址码、功能码、数据和校验码,见表1。由于每个数据都是16 进制,因此在理论上,每个Modbus 网络可以挂载255 个从机。不同的码有着不同功能,如功能码06 为预置单寄存器,功能码16为预置多寄存器等。功能不同数据长度和结构也有所不同,因此每帧报文发送完成后,间隔3.5 个字符时长,标志着一帧报文的结束[3]。
表1 Modbus 报文格式图Tab.1 Modbus message format diagram
本次实验采用Altera 公司的MAX 10 FPGA,该芯片在众多FPGA 中属于低成本的一款,性价比较高,内部嵌入丰富的存储资源和乘法器资源,加上FPGA 本身并行度较高,足够对高速运动的烟丝进行采样计算。并且该FPGA 内部集成度比较高,集成了锁相环(PLL)、RAM、PLD 逻辑等。特别是双数模转换(ADC)通道,能直接满足数据采集要求,减少了硬件设计要求,简化了设计流程,节约了时间成本。
数据采集传输硬件系统,由信号调理电路、FPGA、数模(DA)转换模块和显示模块组成。FPGA是整个电路的控制中心,负责连接控制各个硬件部分,并用算法实现对烟丝速度的求取。传感器电信号经信号调理电路处理后,由FPGA 集成的ADC 模块读取。数据传输硬件基于RS485 连接的通信链路,通过FPGA 分别将计算得到的烟丝速度和质量系数通过Modbus 协议传送到链路上的其它模块。如显示模块,实现数据传输到其它控制模块以及上位机的可视化。DA 模块除了将接收到的数据转换成模拟量外,还完成开关量的输入读取功能。根据开关量的通断,提供DA 模块是否正常运行的标志。数据采集传输系统的架构如图1 所示。
图1 数据采集传输系统硬件框图Fig.1 Hardware block diagram of data acquisition and transmission system
FPGA 遵从自上而下的设计原则,顶层模块只进行各个子模块的例化和连接[4]。为节省资源和提升系统整体速度,采取完成一个数据的计算则发送一个数据的方式。Modbus 通信模块连接如图2所示。
图2 Modbus 通信部分功能模块图Fig.2 Modbus communication function module diagram
该模块主要功能是根据项目要求控制发送和接收。控制部分由一个状态机组成,状态机控制FPGA 从内部数据寄存器内读取数据,把数据按格式转换成Modbus 协议所规定的报文形式,并存储到该模块的数据寄存器中。之后将报文发送到CRC 校验模块。验证正确后,给发送模块发送报文,并且根据发送、接收等模块返回的标志位进行状态判断,控制不同的状态转换,达到能够按要求控制485 总线上数据发送和接收的目的。
发送模块基于普通串口通信原理,将Modbus报文分成若干个字节,每次需要发送10 位数据,其中包括8 位有效数据、1 位起始位和1 位停止位[5]。主机上485 芯片DE 端电平上升沿,作为每个字符发送起始标志(DE 端电位由FPGA 控制),采用定时计数器,当数据发送到停止位正中时,计时器停止计时,并将该计时器停止标志位作为一个字节数据发送完成标志。一帧报文发送完成后,发送模块会产生一个标志位,并将该标志位传递给发送/接收控制模块。每帧报文起始位标志的实现采用定时器判断,保证每帧报文之间间隔不小于3.5 个字符时长。
接收模式中,485 芯片的DE 端必须拉低控制,为保证主机能够接收到各从机返回数据,除发送模式外,其它时间将DE 端拉低,等待接收数据。检测到串口有数据输入时,接收模块接收一个字节有效数据,并存入寄存器的高8 位,第二个字节存入寄存器的9-16 位,以此类推,直到一帧报文接收完毕。Modbus 每一帧报文都有固定的格式,如果格式位数与接收数据寄存器位数不匹配,或CRC 检验模块发现数据不正确,则接收数据失败,将丢弃该帧接收的报文。
Modbus 通信协议报文最后两个字符都由CRC校验码组成。CRC 校验步骤如下:
(1)定义一个16 位的CRC 寄存器,用于寄存CRC 校验码,初始值为0XFFFF[6]。
(2)将报文第一个字节的数值与CRC 寄存器中数据进行异或,并将结果替换原CRC 寄存器中数据。
(3)将CRC 寄存器中数据右移一位,高位补“0”,同时检测移出位,如果为“0”,则重复该步骤,如果移出位为“1”,将CRC 寄存器数据与0XA001异或并将结果保存至CRC 寄存器中。重复移动8次,便处理完一个字节数据。
(4)按顺序由高到低将报文中每一字节重复执行步骤(2)、(3),直到报文数据全都处理完毕,最终CRC 寄存器中的值即为CRC 校验码。
(1)提供4 路测速数据模拟量输出。其分别为烟丝速度、质量系数的电压和电流模拟量。电流型模拟量数据输出范围4-20 mA,电压型模拟量输出直流0-10 V。测速过程中需保证模拟量输出的连续性,且每两个数据间隔不超过40 ms/次。
(2)根据输入信号(读开关量)清零数据和保持数据。提供24 V DC 开关量测速装置的状态,指示模拟电压、电流输出是否正确。
(3)提供一个实时测速显示,至少达小数点后两位。测速数据要求每秒钟显示10 个数据以上。
该系统采用Mentor 公司的Modelsim 仿真软件与FPGA 内部的嵌入式逻辑分析仪(Signaltap)结合调试。由于烟丝速度值和质量系数的模拟电压、电流输出是连续的,因此FPGA 主机必须连续不断的向DA 模块发送更新的报文,并且每帧报文间隔小于40 ms。
在原有通信的前提下,调试的重点是提高数据更新速率。调试主要采用以下3 种方式:
(1)提高波特率。提高波特率则能加快数据传输速率。1 个字节数据需要传输10 位数据,当波特率为9 600 bps 情况下,传输时间为:10×1/9 600,约1 ms。发送一帧8 字节的报文所需要的时间大约8.3 ms,将波特率提高到38 400 bps 后,发送8 字节报文所需时间小于2.1 ms。当然,波特率并非越高越好,波特率越大传输数据准确性越难以保证,最终通过调试采用波特率为38 400 bps。
(2)合并报文发送。速度、质量系数总共4 路模拟量输出,一次写一个寄存器,需要发送4 帧报文,每帧报文8 字节,总共需要发送32 个字节。如果采用Modbus 功能码10,一次直接向DA 模块连续写入四个寄存器的值,仅需17 个字节,除去每帧报文之间的3.5 个字符的起始标志时间,合并发送报文时间可缩减一半。
(3)充分利用总线空闲。在保证模拟量连续发送情况下,可在向DA 模块发送报文后,总线空闲的时间内完成发送显示报文、读开关量输入等操作。可按要求在两帧写DA 模块内寄存器的报文之间,插入一帧送显示报文或者读取开关量输入。需要注意,在中间插入新的报文时要确保发送报文时间小于空闲时间,否则会影响模拟量输出的连续性。Modelsim 部分波形仿真图如图3 所示。
图3 Modelsim 仿真图Fig.3 Modelsim simulation diagram
由于管道中烟丝运动速率是无规律的,测试中采用FPGA 计数器产生一组有规律的模拟数据,将模拟数据写入FPGA 的数据寄存器中,观察仪器运行状况。通过485 转USB 模块,将485 总线上数据读入PC 端,将接收到数据与发送数据进行比对,通过比对发现总线上与发送数据完全一致。串口调试工具读取数据如图4 所示。
图4 串口调试模块读取数据图Fig.4 The serial debugging module read data graph
测试过程中发现,通过USB 将总线上数据读出并未出现异常,用示波器观察DA 模块输出模拟量数据也正常,但是现实模块显示数据有时出现异常。最终通过示波器观察485 总线上A、B 的波形发现,DA 模块和显示模块在接收到一帧Modbus 的报文后,返回一帧报文,DA 模块返回报文状态如图5 中“1”处所示。由于返回的一帧报文与发送报文在同一时刻占用485 总线,造成与显示模块通讯的偶然混乱,导致显示异常。而USB 模块挂载到485 总线上属于从机,只会接收主机发送的数据,没有检测到其它模块返回数据。
最终通过合理延时,在DA 输出合理空隙范围内,将DA 模块返回帧算入占用总线时长,错开返回帧与发送报文帧的时间,调整显示数据报文发送时间,拉低显示模块485 发送数据使能端,让显示模块仅处于接收状态等方式,解决了显示紊乱的问题。
图5 485 总线A、B 线波形图Fig.5 A and B line waveform of 485 bus
该设计基于MAX 10 FPGA,通过Modbus 协议搭载RS485 芯片,采用主从通信的方式,将烟丝测速仪中烟丝的数据转换成模拟量,同时在显示模块上显示数字量。最终测试得出模拟量每35 ms 更新一次,显示模块显示数据每秒钟更新10 次,能够准确读取提供的开关量,并做出相应处理。目前该烟丝测速仪的样机已经设计完成,在风力送丝机管道上,能够在误差允许范围内,测量出管道中高速运动的烟丝,并将各接口数据传递到相应的上位机控制系统中。