陈 浩,吴裕斌,吴 鑫,曹丹华
(华中科技大学光学与电子信息学院,湖北武汉 430074)
在现代自动化生产过程中,工业视觉检测系统被广泛应用于成品检验、质量控制等领域[1]。典型的视觉检测系统主要由智能相机、控制终端、光源3部分组成[2-3],控制终端作为系统的重要组成单元,具有以下2个特点:作为系统的控制核心与众多设备进行高频度的数据交互;功能需求可能会动态变化。这就要求控制终端软件应具备低耦合、易扩展、强实时的特性[4],常规模块化的软件设计思路无法满足上述要求。
本文介绍了一种面向工业视觉检测系统的控制终端软件设计方案,该方案以改进MVC模式为核心,按照软件功能逻辑划分层次,并引入抽象数据接口类和中间件技术用于降低软件内部耦合,提高扩展能力。针对实时性,实现了一种基于优先级调度策略的线程池,并在抑制超时方面与传统线程池进行了比较。
工业视觉检测系统控制终端软件运行的硬件平台是Cortex-A8内核的AM3358型微处理器,主频为1 GHz,内存为512 M字节,液晶屏分辨率为1 024 ×768,通过以太网与CAN总线分别与智能相机和光源控制器连接。操作系统选用嵌入式Linux,内核版本为3.12,UI界面开发采用Qt5框架。相比于基于x86平台的大型控制终端设备,嵌入式平台方案具有高性能、低功耗、易部署的优点。
控制终端软件设计以传统MVC模式[5]架构为基础,采用分层模型思想以及中间件技术对传统MVC模式进行改进,整体框架分为视图层、控制器层、逻辑处理层、数据对象层和数据访问层,通过抽象数据接口类和中间件进行数据交互,整体软件框架如图1所示。
图1 工业视觉检测系统控制终端软件整体框架
视图层负责控制终端软件功能模块UI界面的绘制,可以根据实际需求采用不同方式进行开发,在Qt框架下,通常采用拖拽控件的方式设计界面。
控制器层作为视图层和逻辑控制层之间信息交互的桥梁,一方面接收视图层传入的交互数据并将其序列化为二进制字节流,完成后传递给逻辑控制层。另一方面将逻辑控制层返回的数据分发给视图层用于显示。
逻辑控制层负责具体业务逻辑的处理,如接收检测图像任务、发送配置文件任务、监控系统运行状态任务等。为提高控制终端响应的实时性,逻辑控制层采用多线程和线程池方案处理不同任务。
数据对象层负责不同类型协议帧的构造与解析。控制终端与其他设备之间需要通过特定类型的数据进行信息交换,一般把这些特定类型的数据称之为协议帧,其按不同的功能可以分为请求帧、应答帧、控制帧等。为实现数据和逻辑的分离,与协议帧有关的操作都经由数据对象层处理。
数据访问层负责协议帧的发送与接收,针对不同的总线格式,通过预设代码屏蔽差异,对外提供统一的数据传输接口,减小与数据对象层之间的数据耦合。
为进一步降低控制终端软件的耦合性,提高扩展能力,层与层之间仅通过抽象数据接口类(以下简称接口类)进行数据交互,最大程度地降低了层与层之间的耦合性。接口类对外提供统一调用的方法,功能核心是能够表示不同类型、不同长度的数据,在C++语言中通过虚函数与类模板来实现。接口类的核心变量与方法如图2所示。接口类采用类模板的形式进行定义,在实例化时根据不同的T参数可以表示任意类型数据,同时定义map类型的变量用于存储具体数据,并将读写数据的方法定义为虚函数,在默认函数无法满足需求的情况下可以通过重载扩充功能。
层与层之间可以通过接口类简化调用关系,但在软件运行过程中,视图层、控制器层、逻辑处理层业务代码可能会处于不同的线程当中,为实现安全的跨线程消息传递,控制终端软件将层与层之间的信息交互请求当做独立事件,通过Qt5中的事件循环机制和信号槽机制建立事件分发中间件,专职于跨线程的消息传递。
图2 抽象数据接口类核心变量与方法UML图
控制终端启动后,会自动与智能相机建立网络连接,并等待用户指令。当用户通过视图层界面触发某项功能后,视图层首先判断功能类型,然后构造抽象数据接口类,最后通过事件分发中间件传递给控制器层。控制器层收到接口类后进行序列化操作,然后通过中间件分发给逻辑控制层进行业务逻辑处理,进而完成与智能相机的交互任务。
当控制终端收到智能相机发送的协议帧后,首先通过数据访问层和数据对象层进行解析,然后交由逻辑控制层进行业务处理,最后通过控制器层和中间件将数据分发给视图层,进而反馈给用户。整个处理流程时序如图3所示。
图3 控制终端软件处理流程
控制终端软件中的逻辑控制层采用线程池技术处理外部设备的交互请求。目前对线程池的研究主要集中在如何提高性能的层面上,但对于实时控制系统而言,保证在规定时间内完成对设备交互请求的响应才是控制终端软件线程池设计的关键。
根据交互请求的紧急程度创建不同优先级的线程是提高控制终端软件响应实时性的有效方案,但由于交互请求发生的时刻不统一,静态设置线程优先级的方案无法满足实际应用场景,需要通过某种策略动态确定线程的优先级。
支持向量回归机(support vector regression,SVR)具备容易实现、学习速度快的优点,广泛应用于各类数据的估计和拟合[6]。利用SVR能够对线程处理交互请求所用时间进行估计,为动态确定线程优先级提供数据支持,避免请求超时现象的发生。
半同步/半异步(half-sync/half-async)型线程池(简称为HSHA线程池)是一种典型的线程池方案,具有简单易实现的优点[7]。基于优先级调度策略的线程池(简称为SVR线程池)以HSHA线程池为原型,添加了请求事件监测模块,整体架构如图4所示,由同步层和异步层2部分组成。其中同步层包括监听接口模块,异步层包括请求列表模块、请求缓冲区模块和线程队列模块。当有交互请求输入时,监听接口模块被激活,将请求的标识、发出时间、门限时间等信息添加入请求列表模块中,然后线程池根据SVR算法进行完成时间估计,进而确定线程优先级,完成后将交互请求时间存入缓冲区,并分配线程进行逻辑处理。
图4 基于优先级调度策略的线程池整体架构
对于某个固定交互请求,需要在一定时间范围内得到应答,一般称这段时间为门限时间。令Tm为交互请求的门限时间,Tw为交互请求的延迟时间,Tr为交互请求的实际完成时间,To为请求的紧急程度,则它们之间的关系如下:
To=Tm-Tw-Tr
(1)
由于门限时间Tm是固定的,请求延迟时间Tw在正常环境下可以认为是相同的。从式(1)可以看出,交互请求的实际完成时间Tr直接影响紧急程度To,To越小说明交互请求越紧急,若To为负数则说明交互请求将超时完成,利用SVR对Tr进行估计可以确定To。根据上述分析,To可以反映出交互请求的优先级别,To越小说明交互请求的优先级越高,将优先获得线程池处理。
根据式(1)中的参数,基于优先级调度策略线程池架构中的请求列表需要记录交互请求的类型编号、延迟时间、门限时间和完成时间,这些参数为动态计算交互请求的优先级提供了参数依据。
SVR算法的本质是求解二次规划问题,求解过程复杂,不适合嵌入式系统。基于最小二乘原理的SVR算法采用解线性方程组来替代解二次规划问题,降低了运算难度,在保证学习精度的情况下降低了对处理器资源的消耗,适用于嵌入式系统。
为完成控制终端软件对交互请求实际完成时间 的估计,需要确定最小二乘SVR算法的输入样本。根据线程池的特点,Tr与线程池运行线程的总数量M、请求对应线程执行完毕的平均响应时间Ta、请求对应线程运行前的平均等待时间Tw、线程池当前线程处于阻塞态的总次数N以及总时间Tb等因素有关,前3个参数用于估测新线程的运行时间,最后2个参数用于估测新线程的阻塞时间。据此可以确定最小二乘SVR算法的输入向量xi和预测输出量yi,如表1所示。
表1 最小二乘SVR算法的输入向量与预测输出量
控制终端软件每处理完一次交互请求都会产生新的样本,为避免样本数膨胀引起估算量增加,规定估算样本的数量为n,每产生一个新的样本,就把最旧的样本丢弃。
控制终端实际用于缺陷钮扣的识别与分拣,实验系统如图5所示,控制终端通过以太网与3台智能相机相连,通过CAN总线与光源控制器、上料机、皮带机等外部设备相连。智能相机通过机器视觉方法对钮扣样本进行检测,并将样本图像与检测结果以协议帧的形式发送给控制终端,控制终端解析后将图像与结果显示在液晶屏上,实际界面效果如图6所示。
图5 缺陷钮扣自动分选系统拓扑结构
图6 控制终端软件实际界面效果
耦合性是影响软件可扩展能力的关键因素之一,可以通过类间耦合CBO值、类的响应RFC值、消息传递耦合MPC值等度量指标对软件架构的耦合性进行定量分析[8],测试方法如下:
采用改进MVC模式对控制终端软件的核心模块进行设计,计算出所有有效类的耦合性度量指标,并与传统MVC模式进行比较。根据文献[8]推荐的典型值,统计CBO≤5的类个数、RFC≤100的类个数、MPC≤100的类个数,计算出各自占类总数的比例,高占比说明软件模块代码之间耦合性低,整体扩展性较好,测试结果如表2所示。
表2 控制终端软件代码耦合性测试结果
从表2可以看出,在基于改进MVC模式设计的控制终端软件核心代码中,满足低耦合特性的类所占比例均高于传统MVC模式,软件耦合性更低,类模块划分合理,具有良好的可扩展性。
工业视觉检测系统中的3台智能相机会根据实际检测情况向控制终端发送图像帧,图像长宽均为128个像素,格式为RGB888。为测定控制终端的响应情况,调节3台相机使其分别以1、5、10、15帧/s的速度发送图像帧,测定控制终端实际显示图像的帧率,测试结果如表3所示。
表3 丢帧率测试结果
通过表3可以分析出,当3台智能相机同时以1、5、10、15 帧/s的速度发送图像帧时,控制终端实际显示图像的丢帧率均在1%以下,界面流畅,满足实际应用需求。
请求超时发生率受线程池调度策略的影响,是衡量控制终端软件实时性的重要指标。为评估控制终端软件对外部设备交互请求的响应能力,本文分别实现了基于SVR线程池架构和普通HSHA线程池架构的多线程管理模块,并调节3台智能相机使其分别以7、10、15 帧/s的速度各自发出1 000个图像帧传输请求。根据发送帧率计算,3台相机图像帧传输请求对应的门限时间Tm分别为142.86、100.00、66.67 ms。任意一台相机发出图像帧后开启独立计时,控制终端软件完成图像帧处理后发出应答信号,相机收到应答信号后停止计时,计时值即为控制终端软件对图像帧传输请求的实际响应时间Tr。如果Tr大于Tm,则记录一次超时,通过测定超时次数以及超时发生率进而对线程池性能做出评价。
根据线程池设计原理,请求超时发生率受线程池线程数量的影响,可以通过试探法确定最佳数量。具体做法如下:设定控制终端软件线程池中线程数量分别为1、2、4、8、16,SVR估算样本数量固定为30,核函数采用径向基函数。在控制终端收到3 000个图像帧传输请求的条件下,SVR和HAHS线程池的请求超时发生率结果如表4所示。
表4 不同线程池下图像帧传输请求超时发生率
从表4可以看出:
(1)当线程池线程数量过少时,SVR线程池和HAHS线程池的请求超时发生率都比较高,这是由于过少的线程数量导致请求队列堆积,控制终端无法及时响应图像帧传输请求。又因为SVR线程池需要通过计算确定线程优先级,耗费了更多的时间,所以在线程池线程数量最低时,SVR线程池的请求超时发生率高于HAHS线程池。
(2)当线程池线程数量过多时,虽然图像帧传输请求得到了控制终端软件的及时响应,但过多的线程增加了切换的时间开销,系统性能降低,SVR线程池的请求超时发生率有所上升。
[7] 张海瑞,彭旭锋,梁庭,等.LC谐振传感器的信号检测系统研究[J].传感技术学报,2015(4):503-509.
[8] XIONG J,LI Y,HONG Y,et al.Wireless LTCC-based capacitive pressure sensor for harsh environment[J].Sensors & Actuators A Physical,2013,197(8):30-37.
[9] 邱关源.电路[M].北京:高等教育出版社,1999:252-256.
[10] 康昊,秦丽,谭秋林,等.无线无源压力传感器前端特征参数提取方法研究[J].传感器与微系统,2013,32(10):13-15.
[11] 张林,陈大钦.模拟电子技术基础[M].北京:高等教育出版社,2014.
[12] Texas instrument.LMX2571 Data sheet[R/OL].http://www.ti.com.cn/cn/lit/ds/symlink/lmx2571.pdf.2015.
[13] Analog Devices Inc.AD9858 Data sheet[R/OL].http://www.analog.com/media/en/technical-documentation/data-sheets/AD9858.pdf.2003.
[14] Analog Devices Inc.ADL5511 Data Sheet[R/OL].http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5511.pdf.2011.
[15] Analog Devices Inc.AD8009 Data sheet[R/OL].http://www.analog.com/media/cn/technical-documentation/data-sheets/AD8009_cn.pdf.2000.
[16] Analog Devices Inc.AD7667 Data sheet[R/OL].http://www.analog.com/media/en/technical-documentation/data-sheets/AD7667.pdf.2013.
[17] 张海瑞,梁庭,洪应平,等.无线无源压力读取系统中线性扫频源的设计[J].仪表技术与传感器,2015(9):23-27.