APP下载

基于QT平台的雷达伺服调试系统

2021-06-16翔,刘

舰船电子对抗 2021年2期
关键词:伺服系统串口元件

宣 翔,刘 悦

(1.中国电子科技集团公司第三十八研究所,安徽 合肥 230088;2.长鑫存储技术有限公司,安徽 合肥 230601)

0 引 言

随着现代雷达指标的不断提升,雷达伺服系统朝着高精度、高响应方向不断发展,伺服系统性能的提升不仅对伺服系统配套的电气元件性能提出更高的要求,也对系统调试发起了更大的挑战。传统的雷达伺服调试由于缺乏人机交互界面,调试过程中更多依赖于工程人员的项目经验和对电气元件的理解从而给出输出变量,且被控元件相应的反馈信号只能依赖于工程人员通过控制软件中的数据记录分析以及通过示波器在通信端点完成曲线记录。

基于传统雷达伺服调试过程中操作复杂、变量给定模糊不清且状态反馈显示困难等状况,本文设计开发的一种针对雷达伺服调试的系统,通过控制器局域网络(CAN)总线、串口通信等多种方式与外部元件进行信息交互,绘制实时动态曲线图记录电机转速、电流等状态信息,且在测试过程中实时编辑控制指令并发送。

1 伺服调试系统界面结构

用户界面是否美观以及易操作是衡量一个UI界面友好与否的重要标准,用户界面部分作为本系统重要的组成部分,布局和设计均基于以上两点完成。

QT平台作为当今界面设计时常用的软件平台,其采用的C++编程语言作为内核语言,设计人员在编程时可以实时进行效果仿真和调试。同时,该平台包含多种实用的外部库,设计人员通过库的调用即可实现与计算机和驱动之间的互连,并实现向程序添加图片、多媒体等功能,操作简单。本系统基于QT平台在界面开发时的以上优势,采用该平台完成用户界面的设计。本系统界面设计结构主要包括如图 1所示的部分,主页面下包括测试模式和实验模式2种模式,测试模式主要包括用于显示数字信号输入输出状态的点灯模块,曲线绘制模块主要显示如电流、电压、速度等实时连续变化的变量用以记录,而串口、CAN通信模块则用于与外部元件实时通信,获取对方状态并下达相应指令。实验模式下参数调整模块用于改变用户的自定义参数,并通过指令下达模块下达相应的指令。

2 界面显示设计

2.1 信号与槽机制

信号与槽机制作为QT平台的核心机制,它的本质是一种用于对象之间通信的机制,当对象改变其状态时,信号就由该对象发射出去,槽用于接收信号,并在收到信号后立即执行相应的成员函数,信号与槽取代了函数指针,使得通信程序的编写变得更加简洁明了。其中,信号与槽之间的关系可以描述为:多个信号可以连接到1个槽,1个信号可以连接到多个槽,图2展示了信号与槽之间的关系。

图2 信号与槽关系模型

QT中标准的信号与槽格式为:

connect(Object1,Signal1,Object2,Slot1);

2.2 点灯模块

本文设计了点灯模块用于直观地显示如速度到达等数字变量,如条件满足,则显示为绿色,如条件不满足显示为红色,或其他的一些警告性情况,呈红黄色交替显示。

QT平台常采用QpushButton类按钮用于变量状态显示,QpushButton本身为矩形,本文需要将其变为圆形且显示为特定的图片,这里采用改变样式表的方法,将需要显示的图片样式添加到Button的样式表中,并采用setStyleSheet函数进行设定,例如setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/green.ico);}”);即将Button设置为绿色圆形按钮图片。为实现数字变量改变时按钮显示状态随之改变的功能,本文采用了changeButtonico()函数,代码如下:

void Button::changeButtonico()

{

if(speedIsOK)

ui->button_speed->setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/green.ico);}”);

else

ui->button_speed->setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/red.ico);}”);

为实现警告性情况按钮状态呈红黄交替显示,速度到达模块报警,本文采用了QTimer类timeout函数,通过信号与槽机制将QTimer计时器与用于图片交替显示的icoChange()函数相连,实现代码如下:

connect(m_timer,SIGNAL(timeout()),this,SLOT(icoChange());

m_timer=new QTimer(this);m_timer->start(10);

在icoChange()函数中,采用了int m_count变量:

m_count+=1;

if(m_count%2)

ui->button_speed->setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/red.ico);}”);

else

ui->button_speed->setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/yellow.ico);}”);

if(m_count==100)

m_count=0;

通过整型变量随时间计数器自加,并向2取余,实现交替改变,当m_count到达既定数值时需要置位0,函数循环调用,从而实现状态的循环显示。

2.3 双缓冲机制

QT中采用QPainter类绘制图形,当控件重绘频繁时,例如实时采集到变量数值变化并绘制成曲线图时,由于屏幕高频率刷新,从而引起屏幕闪烁,重回频率越高,闪烁越明显[1]。双缓冲机制的原理是绘制控件时,首先将要绘制的内容绘制在1个图片中,再将图片一次性绘制到控件上,通过这种方式,可以使图片的擦写过程在幕后进行,避免闪烁的效果,原理如图3所示。本文数据采集后绘制的曲线图使得屏幕刷新频率较高,因此需要采用双缓冲机制绘制图形。

图3 双缓冲机制原理图

代码的实现主要通过refreshPixmap()函数,首先将当前的pix图像赋值给一个临时的tmpPix图像,然后采用QPainter类将采集到的图像信息以及固有的一些属性如坐标轴、刻度等在该临时图像上进行绘制,随后通过drawPixmap()函数将临时图像绘制到painter上,再通过事件event调用painter,从而实现了实时绘制曲线图,擦写过程均在幕后完成。

void Curve::refreshPixmap()

{

QPainter painter(this);

tmpPix=pix;

QPainter pp(&tmpPix);

QPen pen;

QColor color(Qt::white);

pen.setColor(color)

pen.setWidth(2);

pp.setPen(pen);

pp.senRenderHint(QPainter::Antialiasing,true);

int pointx=45,pointy=620;//确认坐标轴起点

int width=930-pointx,height=580;

pp.drawRect(5,5,950-10,650-10);

pp.drawLine(pointx,pointy,width+pointx,pointy);

pp.drawLine(pointx,pointy-height,pointx,pointy);

QPen penDegree;

painter.drawPixmap(900,700,tmpPix);

}

2.4 工具栏设计

伺服调试过程中通常需要实时记录实验数据,如曲线图、仪表值等等,为满足调试过程的需求,本系统添加了工具栏,列出了如文件保存、图片打印、文本打印以及放大、旋转等常用工具,如图4所示。

图4 工具栏界面图

例如图像打印只需要调用QPrinter以及QPrintDialog 2个类即可调用打印机及其属性,并将图像打印到文件中。

3 通信接口的实现

3.1 串口调试模块

串口通信的概念是按位发送和接收字节,其重要参数分为:波特率、数据位、奇偶校验位、停止位。串口调试模块需要利用到计算机串口驱动,通过设置串口参数实现与外部端口的通信。QT平台提供了第三方串口库,只需要在QTpro添加QT +=serialport代码即可在相应的子程序引用库,使得代码编写过程更为便捷[2]。在程序中实现自动寻找可用的端口号用到以下代码:

foreach(const QSerial PortInfo::availablePorts())

{

QSerialPort serial;

serial.setPort(info);

if(serial.open(QIODevice::ReadWrite))

{

ui->portNameBox->addItem(serial.PortName());

serial.close();

}

}

UI界面设计中,调用QpushButton以及QTextEdit类,可以绘制文本输入和接收框以及相应的按钮。按钮是否可用通过setEnabel(bool)函数进行设置,例如发送数据按钮与其他设置参数按钮不能同时操作,因此应设置相应的逻辑关系,按钮通过addItem()函数即可增加选项用于选择,完成后的串口界面如图5所示。

图5 串口调试模块界面图

3.2 CAN通信模块设计

CAN通信模块是基于CAN总线协议设计的,CAN总线的概念是控制器局域网,其特点主要包括节点不分主从,通过报文ID进行过滤,速度较快且具备错误检测功能。

CAN通信模块通过QLineEidt类进行设计,由于该类采用的数据是QString类型,而QString类型数据为了清晰展示,通常采用空格符对数据进行分割,从而增加了数据的长度。本文为避免数据传输过程冗长,采用了将QString类转换为char型数据进行传输,从而减少串口传输的数据量。

通过分析雷达伺服调试过程中可能要采集的数据以及需要下达的指令数据,系统需要的有效数据可能多达10个字节,包括电流、速度、电压数值等等。因此,数据包结构设计如表1所示。

表1 数据包结构表

为保证数据完整性,CAN通信模块通常采用一种算法对原始数据计算出1个校验值,并将校验值一同发出,接收方用相同的方法计算出校验值进行数据校验,本文采用了目前行业内比较常用的CRC循环校验法,该方法具有侦错能力强、系统消耗小等优点,适用于本系统,主要实现代码如下:

void CAN_com::CRC_check()

{

if (enable==1)

{

for(int i=0;i

{

crc=data[i]^crc;

for(int j=0;j<7;j++)

{

tmp1=crc &&0X 0001;

if (tmp1=0X0001)

crc=crc》1^0XA001;

else

crc=crc》1;

}

}

}

}

3.3 参数调整和指令下达模块

参数调整和指令下达模块即变量输入输出模块,根据雷达伺服系统常用的参数,参数调整和指令下达模块通常包括速度设定,电流门限、电压门限、使能、比例、积分、微分(PID)参数调整等。本系统通过在界面上提供输入框改变变量值,并通过串口或CAN通信方式送达可编程逻辑控制器(PLC)或其他被控元件,实现参数变更和指令下达的功能[3]。

4 应用实例

在某项目中,采用本系统进行雷达伺服系统调试,通过串口通信建立雷达伺服系统和本软件调试系统的连接,计算机端采用USB转串口模块,PLC通过IO量与多种被控元件如接近开关、水平传感器等建立连接,通过CAN总线建立与伺服电机的连接从而接收伺服电机各项反馈量并向其下达控制指令,各被控元件及伺服电机结合传动结构件集成为雷达伺服系统,系统组成图如图6所示。

图6 系统组成图

系统上电后,打开串口界面,搜索串口端口号,建立串口连接。通过数据采集,接收到伺服电机电压为380 V,通过加载使能,给定相应速度,收集并绘制伺服系统某关节部分位置曲线,曲线显示其完成循环往复运动,与实际运动状态拟合。同时,调试系统采集到各被控元件的状态信息,并通过伺服调试系统界面的各点灯模块加以显示。经分析,本系统实时采集了被控元件的状态信息,并绘制了相应变量的状态曲线,通过参数调整和指令下达模块可以实时改变输出变量的状态从而实现控制被控元件的功能。系统简单明了,操作简易,适合伺服调试人员现场调试。系统调试界面如图7所示。

图7 雷达伺服调试系统界面

通过实际应用可以发现,本系统信息显示和人工操作完全可以满足雷达伺服系统调试的需要。

5 结束语

本文通过QT平台设计了一款用于雷达伺服系统调试的系统,该系统包含了伺服系统常用的参数设定、通信方式和状态显示,极大简化了伺服调试人员调试过程。此外,该系统性能稳定且价格低廉,具有一定的发展前景。

猜你喜欢

伺服系统串口元件
浅谈支撑轴力伺服系统在深基坑中的应用
MCS—51单片机中的多串口通讯技术的应用
如何读懂色环电阻
非线性元件的处理
全国计算机等级考试机房准备工作探讨
微机串口的测试诊断
上海风云“东邪”谁属
Protel 99se网络表装载中纠错探索
基于VC串口通信的实现