基于EtherCAT和多线程的压装系统优化
2021-06-03丁国清
陈 锐,丁国清
(上海交通大学电子信息与电气工程学院,上海 200240)
0 引言
在压装过程中,压装系统需要监控压装过程中的压力与位移数据,并基于压力-位移曲线判断压装质量[1]。随着压头数量的增加和压装精度的提高,压装系统对数据传输和程序执行的效率提出了更高的要求。基于现场总线技术的传统压装系统[2],已经满足不了多压头联动加工的需要。而工业以太网具有工程实践的基础和互联网的快速、低成本、动态拓扑管理等优点,被认为是未来可以代替现场总线技术的最佳候选技术[3]。
另外,压装系统大都工作在工控机(IPC)或嵌入式设备上。随着主频的提高,单核CPU的能耗和发热急剧增加,依靠提升主频来提高CPU性能的模式达到了瓶颈[4-5]。因此,多核CPU在工业控制领域得到了越来越多的应用[6],而传统的压装系统需要针对多核CPU进行优化,以更好发挥硬件的性能。
因此,结合EtherCAT技术,将压装系统的通讯周期从1 ms降至250 μs,并将时间基准偏差控制在1 μs以下;针对多核CPU进行多线程优化后,在实现实时采集、显示和控制的同时,提高了数据传输的稳定性,均衡了系统负载。
1 系统结构
1.1 EtherCAT主站
主站平台为运行在标准PC上的Ubuntu12.04虚拟机,内核版本为3.14.79。为了提高系统的实时性,还安装了RT-PREEMPT实时补丁[7]。主站通过Beckhoff提供的开源软件IGH EtherCAT Master for Linux实现,配置时,使用高分辨率定时器和通用网卡。安装时,在etc/sysconfig/ethercat文件中配置网卡地址和类型,启动,若显示Starting EtherCAT master 1.5.2 done,则说明主站已配置成功,可以通过IGH提供的命令行工具查看主站和从站状态信息。
1.2 EtherCAT从站
EtherCAT从站采用的是XMC4800开发板和MADHT1505BA1伺服电机,采用的连接方式为线型拓扑[8],采用了Distributed Clock(DC)同步方式。整个网络拓扑结构如图1所示,通过IGH提供的命令行工具,可以看到以XMC4800的时钟作为基准,伺服驱动器的时间基准偏差为640 ns。
1.3 EtherCAT通信原理
EtherCAT协议基于普通以太网协议,帧类型为0x88A4。其数据帧结构如图2所示,其数据区包含多个子报文,对应某个从站的逻辑映像区,一次传输最多可以实现1 486 Byte数据的交换。
系统共有2个从站,传输的数据帧总长度为60 Byte。数据传输时,从站根据子报文头读取对应的数据,并将新的数据写入对应的位置,因此,数据帧在每个从站停留时间很短。整个传输过程继承了以太网全双工传输的模式,数据帧沿网线循环一圈后回到主站,完成数据的交互。
2 压装系统分析
伺服压装共有5个阶段,分别为快进、探测、压装、保压和回退阶段,阶段的切换按照压力值和位移判断[9]。因此,整个压装系统按照功能,可以分为以下任务:交互界面、数据传输、数据处理和控制、数据存储和查找、其他通信功能等。
在常见的工业PC/嵌入式软件中,为了防止程序卡死导致没有响应的问题,常常会编写看门狗程序,在程序长时间没有响应时,重启程序。
2.1 并行性分析
2.1.1 人机交互界面
显示线程(主线程)因为要负责显示和交互功能,一般刷新间隔在几十ms。除了界面刷新具有周期性外,和用户动作相关的事件,如点击按钮等,都是随机发生,而且对响应的实时性要求相对不高。其他一些定时操作,也可以放在此线程中。
2.1.2 数据传输
数据传输是压装系统最核心的功能之一,它具有确定的周期,特别是高频传输时,对传输的稳定性要求很高。为了保证该任务得到优先执行,一般设置该任务优先级为高优先级。
2.1.3 数据处理
数据处理在数据传输结束后才能进行,所以在执行逻辑上存在串行关系。对于实时控制,需要在下一次传输开始前,完成数据的处理和控制指令的生成。
对于简单的控制情形,可以将数据通讯、数据处理和控制放在同一线程中。如果控制较复杂,建议分配单独线程,并通过信号量和共享内存与数据传输线程通讯,保证数据得到及时处理、结果能够及时发送。
2.1.4 看门狗
看门狗常常通过周期计数实现,也属于周期任务。但由于在某一时限内执行喂狗操作即可,所以周期要求不严格,且与其他线程无关,可以根据实际情况设定时限,所以可以根据主线程的定时器信号进行喂狗。
2.1.5 查看和存储
查看和存储常作为界面按钮的响应函数。查看操作只有在用户点击查看按钮时,才会运行,所以存在随机性,时间间隔较长。而存储功能只有当传输过程结束并且用户选择存储时,才会运行,将缓冲区的数据存放进数据库中。所以这两个功能对实时性要求也不高,与其他功能的关联较少。
2.1.6 总结
基于以上分析,压装系统可以采取多线程并行的方式。交互界面在初始化后,根据刷新周期,从共享内存1内读取数据并刷新曲线;若有交互事件发生,则执行对应的查看、存储操作;在每个周期,数据传输线程首先接收数据并发送共享内存2内的数据,将接收数据写入共享内存1,并通知数据处理线程处理;数据处理完成后,数据处理线程将处理结果写入共享内存2。而看门狗与其他功能无关,定时喂狗即可,定时功能可放在主线程中,以观察主线程是否运行正常。待传输结束后,再进行数据的存储。基本的执行逻辑如图3所示。
2.2 多线程实现
多线程采用Qt推荐的movetothread()方法,将EtherCAT通信和控制、数据库、界面显示、看门狗等功能放在不同的线程中。
2.2.1 显示线程
显示线程作为系统的主线程,包含了界面的设计和刷新、主要对象的建立和初始化以及线程的分配、槽函数的连接等。曲线的绘制和刷新采用qcustomplot库实现,这是一个轻量的第三方绘图库,只需要将头文件放置在工程文件中即可调用。
2.2.2 EtherCAT通讯与控制线程
EtherCAT通讯与控制线程使用了IGH提供的应用程序接口文件ecrt.h和静态库ethercat.lib[10],因为该线程对实时性要求较高,为保证其得到优先执行,实验中将其优先级设置为-19。
EtherCAT通讯的工作流程如图4所示。
过程数据主要包括XMC4800开发板的ADC采样数据和MADHT1505BA1的控制和反馈信息,索引配置如图5所示。
2.2.3 数据库
数据库采用的是Qt自带的SQLite数据库。SQLite是轻型的数据库,它占用资源非常少,一般1 MB内存就已足够,在嵌入式中应用广泛。使用时,数据库与程序连接,采用API接口即可访问,这种方式减小了延迟时间,使开发更加简单。
2.2.4 线程间通讯
线程间通讯主要是通过槽函数、信号量以及共享内存实现。
2.2.4.1 信号与槽函数
槽机制是Qt的特色,可以将某个信号与某个对象的函数相关联,当信号发出者与信号接收者属于不同的线程时,即可实现不同线程间的通讯。实验时使用的槽连接如图6所示。
2.2.4.2 共享内存
共享内存是指多个进程可以共同访问的同一块内存区域,是最快的可用IPC(inter-process communication)方式。在EtherCAT通讯线程中,通过SharedMemory类创建共享内存对象,设置共享内存区的键值,然后通过内存复制写入数据。
当EtherCAT传输线程释放共享内存后,其他线程可以根据设置的键值找到该共享内存,建立连接并读取其中的数据。为避免多个线程同时访问,在建立连接后需要加锁,操作完成后再解锁。
3 实验及结果分析
实验基于一主两从的EtherCAT线性拓扑结构,整个系统如图7所示。
主站:Ubuntu 12.04(kernel 3.14.79)+RT-PREEMPT+IGH EtherCAT Master+Qt应用程序。
从站:XMC4800模块+Panasonic 伺服驱动器MADHT1505BA1。
其他:电机,RJ45网线。
3.1 多线程运行情况
Qt程序可以通过调用QThread类的currentThreadId()方法,显示当前线程的线程号。实验中的各线程对应的线程号如表1所示。
表1 压装系统主要线程及其线程号
从表1可以看出,压装系统的主要功能都由不同的线程执行,说明程序优化后实现了多线程并行的目标。
3.2 界面显示
设置显示界面的刷新频率为10 Hz,为保证信号显示正常,使用信号发生器产生偏置电压为1 V,幅值为0.5 V,频率为0.1 Hz的正弦信号,显示界面的曲线如图8所示。
从图8可以看出,信号与正弦信号吻合。由于噪声干扰较大,结果的最大值取峰值最大值的均值,约为1 600,结果的最小值取谷值最大值的均值,约为850,周期大约为100次显示的时间。因为XMC4800的ADC采样的输入范围为0~3.3 V,采样位数为12位,对应十进制为0~4 095,所以采样精度为8 mV,其中最高点理论采样值为1 551,最低点理论采样值为930,如果不考虑干扰等外界因素,实际结果与理论吻合。因为界面以10 Hz频率刷新,100次显示刷新对应时间为10 s,则与信号频率0.1 Hz吻合,说明实验实现了通过EtherCAT采集和传输数据。
3.3 通信时间测试
运行主程序,在Shell内通过命令行工具查看EtherCAT主站运行情况,双核系统下的运行结果如图9所示。
从图9可以看出,系统在双核平台运行时,EtherCAT主站激活后运行在Operation状态,使用的网卡地址为08:00:27:8D:6D:77,连接的从站有2个,参考时钟为Slave0,即XMC4800的时钟。主站发包数为4 000个/s,收包数为3 999,丢包数为1,丢包率为0.025%,传输速率为417.3 Kbyte/s,说明EtherCAT传输方式是可靠的。
EtherCAT基于通用的以太网卡,所以通过检测网口的收发包数量,即可了解数据传输的情况。运行主站程序,实现数据收发后,在Windows系统中,使用Wireshark网络抓包软件进行测试和统计,每100 ms的收发包数量如图10、图11、表2所示。因为EtherCAT采用全双工通信方式,如果按250 μs的周期通信,则100 ms的理论收发包数为800个。
表2 每100 ms发包数统计表
从图10、图11和表2可以看出,虽然平均收发包数都为理论值800,但是单核系统传输存在较大波动,发包幅度在675~926之间,方差较大。而双核系统的传输更加稳定,发包数在773~812之间,3 min(1 800个)数据的方差仅为9.515,因此基于双核的压装系统在数据传输的稳定性方面要优于单核系统。
3.4 界面刷新间隔测试
在人机交互线程中,调用Linux系统的gettimeofday()函数,可以得到每次界面刷新的时间。每次刷新时,计算与上次刷新的时间差,就可以得到界面刷新的时间间隔。实验统计了连续的125次间隔,结果如表3所示。
表3 界面刷新间隔统计表
从表3可以发现,交互界面进程在单核系统下,刷新周期波动较大,但总体上和多核情况差距不大。综合图10、图11和表2、表3,说明了对于高频的数据传输,即IO密集型任务,多核有较大的优势。而对于低频周期任务,如界面刷新、看门狗等,两者相差不大。所以,对于多总线、高精度的工业控制系统,多核平台是可行的、较优的选择。
3.5 CPU运行状态
Linux系统提供了许多查看系统状态的指令,如top、vmstat指令等。实验中为了观察每个核心的使用率,使用了mpstst工具,统计了程序运行1 min的CPU情况,计算了CPU的平均占用率和空闲时间占比,结果如表4所示。
表4 CPU 1 min运行情况 %
从表4可以发现,采用双核CPU后,单个核心的用户平均占用率从25.94%降至12.01%和14.22%,平均降低了49.5%,基本上实现了2个核心的均匀分配。而对于系统占用率,则从47.83%分别降至26.73%和31.97%,平均降低了38.6%,单个核心的平均占用率平均降低了40%。
4 结束语
本文对基于EtherCAT通信和多线程的压装系统进行了研究,着重介绍了EtherCAT通信的使用和压装系统功能的多线程分配,给出了具体的软件设计方案。实验验证了该系统能够实现数据的实时传输和较好的稳定性,为EtherCAT协议和多线程技术在工业自动化中的应用提供了设计参考,具有一定的实用价值。