APP下载

基于嵌入式系统的现代物流复检系统设计

2021-01-21王明绪徐颖若

电子设计工程 2021年1期
关键词:扫描器条码线程

王明绪,徐颖若,桂 博

(1.河南工业职业技术学院,河南 南阳 473000;2.郑州轻工业大学,河南 郑州 450000)

分拣系统在现代物流中至关重要[1],但是在物流实际运行过程中时常会出现分拣错误,导致运输成本增加等。嵌入式微处理器的发展为嵌入式操作系统的应用和发展提供了物质基础和动力之源。当前对物流分拣系统的研究主要停留在如何提高分拣系统的分拣速度和识别度,以及设备的精度和自动化程度上。对于如何减少分拣中出现错误的方面研究比较少,相关的研究主要是利用PLC技术对分拣系统进行改造。文中主要研究在现代物流复检系统中引入嵌入式技术[2-4]和终端节点移植实时操作系统RT-Thread[5-7],同时使用新型的Cortex-M7[8]处理器来提高分拣的准确度,使分拣系统高效精准运行。

1 物流复检系统简介

自动分拣系统[9-10]基本都分为输送装置、分类装置、分拣道口和控制装置这几个主要部分,其中分拣机和货物数据库是整个系统的核心。每套系统都有数个或者更多的下线口,这是整个分拣系统的末端,所以该研究开发的复检系统将终端节点安放于各个出线口处,各个终端节点通过CAN总线与主控节点通信,主控节点通过以太网访问远端数据库服务器,整个系统的架构如图1所示。

图1 复检系统总体结构

2 终端节点的设计

1)处理器的选择

终端节点所选取的嵌入式微处理器是由意法半导体公司推出的一款基于Cortex-M7的嵌入式ARM处理器,具有与内核紧耦合的嵌套向量控制器(NVIC),支持向量中断及中断嵌套,中断时自动保存和恢复处理器状态,可以动态调整优先级,特有末尾连锁和迟来的中断处理机制,极大地缩短了中断延迟。STM72F103RBT6属于意法半导体推出的STM72系列处理器中的F1系列,即增强型。系列嵌入式微处理器在保持低功耗、低压操作的基础上还拥有一流的外设及超高的性能,并且价格相对低廉,具有较高的性价比,利用简便易用的开发工具和简单的架构实现了高度集成。

2)激光条形码扫描的选择

条码扫描器被固定在输送装置上方,不会有太大震动,所以比较适合使用激光条码扫描器,使用5 V供电,条码扫描器可以以此为电源。终端节点选取的处理器有多个串口,可以很方便地与条码扫描器通信。这里选用了一款顶然A-2000A型激光条码阅读器。这款激光条码阅读器采用ROHM 650纳米可见激光二极管,颤镜式扫描模式,最小扫码精度为0.15 mm,在扫描精度为1.0 mm时的扫描景深为20~330 mm,扫描宽度为40~330 mm,误码率为九百万分之一。

3)最小系统

为了让终端节点使用的STM72F103RBT6能够正常工作,至少应具备供电电路、复位电路、时钟电路、电源滤波电路、JTAG程序调试下载电路以及启动模式选择电路。系统采用5 V供电,能够直接为条码扫描器供电,经过三端稳压芯片AMS1117稳压滤波之后,为系统提供3.3 V电源。使用了8 MHz的外部石英晶体振荡器[11],经过内部锁相环倍频后处理器提供72 MHz的时钟。系统使用低电平复位,具备程序下载和调试接口,设计的JTAG调试下载接口能够支持JTAG和SWD[12]两种模式。STM72F103RBT6在启动的时候会读取BOOT[1:0]引脚的状态来选择不同的启动模式,各种设置与启动模式如表1所示。通过设置BOOT硬件为0(低电平)或1(高电平),对应的启动模式的不同物流地址将会被映射到0地址,即启动存储区,以实现从不同的物理介质启动。在系统复位之后,在系统时钟的第4个上升沿,BOOT0和BOOT1引脚的状态将被锁存。用户可以根据需要,灵活地设置不同的启动模式。

表1 系统启动模式

4)条码扫描器通信接口

A-2000A型激光条码阅读器提供了PS2键盘接口、USB键盘接口和RS232串行接口这3种通信方式,目前使用较多的是USB接口,条码扫描器被枚举为HID键盘设备,相当于PC标准键盘。但是STM72F103RBT6内部不带有USB HOST或者USB OTG接口,无法直接使用USB通信接口,如确有需要,还需另外扩展,增加了设备的复杂度和研发成本。从实际出发,这里选择使用RS232接口。处理器的USART接口使用的是3.3 V的TTL电平,而条码扫描器使用的是标准的RS232,所以要利用MAX3232进行物理层电平的转换。JP2跳线是为了适应交叉或者直连的不同串口连接线。由于条码扫描器扩展了标准RS232接口,可以使用串口连接线供电,所以设置了JP3来为其提供所需的5 V电压,串行通信接口如图2所示。

图2 串行通信接口

5)CAN接口

STM72F103RBT6[13]内部带有CAN接口控制器,它支持CAN协议2.0A和2.0B,最高波特率可以达到1 Mbit/s。整个CAN接口的设计如图3所示,一片MCP2551实现了CAN接口的物理层,完成CAN控制器输入输出与CAN总线电平的转换。R9为120 Ω的CAN接口终端电阻,是为了实现CAN总线的阻抗匹配。MCP2551是一个可容错的CAN协议控制器和物理总线的接口器件,为CAN协议控制器提供差分收发能力,符合ISO-11898标准。它的输出可以取得最小为45 Ω的负载,在标称终端电阻为120 Ω时最多允许接入112个节点。MCP2551[14]支持高速、斜率控制和待机3种操作模式,可以通过Rs硬件进行配置,这里选择将Rs引脚通过电阻接地而使用斜率控制模式。斜率控制模式可以通过对CANL和CANH的下降上升时间加以限制来进一步减少电磁干扰。经过反复试验,在10K斜率控制电阻的作用下,CAN接口的性能完全能够达到该研究中试验的要求。

图3 整个CAN接口的设计

3 RT-Thread在STM72F103RBT6上的移植

RT-Thread的系统源代码结果,采用模块化组织方式。include目录中包含RT-Thread使用的头文件;src目录中的文件为实时内核源代码,包括调度器、内存管理、对象管理器、进程间通信等内核组件;components目录为系统外围组件,libcpu目录里面是针对不用CPU的芯片支持包,主要的移植工作都在这里。

在系统进入临界区时,需要关闭中断,以防止线程调度或者中断到来的打断,以实现互斥访问。相对应的,在系统离开临界区时,就需要打开中断。在中断关闭前需要保存当前PRIMASK寄存器的状态,并在打开中断时恢复PRIMASK寄存器的状态。正常模式下进行线程切换时,会触发一个pendSV异常。异常发生时,Cortex-M7 会自动把 R0~R3,R12、LR、PC.PSR压入当前线程堆栈,然后再执行pendSV的异常处理程序。在系统正常运行时处在Thread模式,使用的是PSP,而进入异常后处在Handler模式,使用的是MSP。操作系统的移植一直是嵌入式系统开发的难点和重点,需要大量的工作来完成。

4 CAN接口程序设计

为了使CAN模块能够正常工作,还要对其编程控制其完成指定的任务。通过对其一系列的寄存器的操作来完成CAN的控制。在硬件复位以后,CAN控制器进入休眠模式以节省电能。为了正常使用CAN,就需要对其进行初始化,对CAN的初始化需要在初始化模式中进行。在初始化函数中,主要完成对时间特性寄存器和控制寄存器的设置,包括CAN的工作模式、相关中断、波特率等设置。此外还有CAN过滤器相关寄存器的设置,将过滤器设置在屏蔽位工作模式。在完成初始化后,复位CAN->MCR的INRQ位,在CAN与总线取得同步后,进入正常模式。正常模式中就可以完成报文的正常收发。

5 系统应用程序的设计

在完成RT-Thread到STM72F103RBT6目标平台的移植之后,接下来就是开发系统应用程序来实现功能。第一步就是完成相关硬件或者外设的初始化,包括CAN接口的初始化,LED的初始化,串口的初始化等。初始化工作完成之后,接下来就是应用线程的开发。采用多线程技术可以以较小的系统开销,降低应用程序开发的复杂度,提高系统的可靠性。RT-Thread以线程为最小的调度单位,采用基于优先级的全抢占式调度算法。针对本应用,创建了CAN线程、Barcode线程、Daemon线程以及Deal线程这4个主要线程,并通过线程间同步和通信进行相互的协调。主要线程间的交互图如图4所示。

图4 线程交互图

用户线程一般在application.c文件中实现,通过rt_thread_startup函数向内核注册线程,在系统初始化的时候,最终会调用rt_application_init函数来初始化各个线程所使用的资源,完成最终的注册工作。针对实际需求,设计CAN线程、deal线程、Daemon线程和Barcode这4个主要线程。其中Daemon线程作为系统的守护进程,监控系统的运行状态,完成与其他线程的交互,控制系统的工作流程。当Daemon线程接收到USART中断发送到邮箱中的邮件,就会向Barcode线程发送一个邮件,通知其进行一次USART接口的条码数据接收。Barcode线程在完成一次条码数据接收后,会根据是否接收到了特定的字符来判断是不是接收到了一个完整的条码,如果接受到了一个完整的条码,就会向邮箱中发送邮件,通知CAN线程来向主控节点发送条码数据。当Barcode线程判断并没有接收到一条完整的条码,就会将每次接收到的部分条码数据放入条码缓冲区,直到接收到一条完整的条码。在Barcode线程完成一条条码的部分接受工作或者发生错误时,就会主动放弃CPU的占有,调度到Daemon线程。CAN线程的工作就是在接收到Barcode线程发送到邮箱里的邮件时,通过CAN接口向主控节点发送一条完整的条码,当成功发送完一条条码,就会进入休眠状态,进而调度到守护线程。另外在发生错误时,也会放弃系统资源,Daemon线程就会得到调度。在系统接收到CAN发送过来的固定长度的报文,就会发送邮件通知守护线程,守护线程会解析从主控节点通过CAN发送过来的命令。守护线程在解析完命令后,会发送邮件通知Deal线程完成相应的动作,譬如控制下线口伸缩皮带机的工作。

6 主控节点的设计

1)主控节点CAN接口设计

主控节点使用的嵌入式微处理器S3C6410本身并不带CAN总线接口,必须利用其他通信接口外扩CAN总线接口。该研究中采用的是MCP2510加MCP2551的设计方案,两种芯片出自一家公司,具有较好的兼容性。MCP2510内部带有2个29字节的接收屏蔽寄存器和6个29字节接收滤波寄存器,可以用来滤除掉不需要的报文,进而最大程度减少微处理器的开销。MPC2510使用的是8 MHz的外部石英晶体振荡器,利用电阻的阻抗特性在上电时完成复位。MPC2510实现了CAN协议中的数据链路层,是一个CAN协议控制器,它的工作是将待发送数据封装成帧,而这些帧不符合CAN总线的电气特性,为了把这些帧变成CAN总线上的数据流,还需要利用一片物流层的芯片进行电气特性转换,这里采用的是与MCP2510搭配的MCP2551。MCP2551完全满足ISO-11898协议标准的物理层需求,能够支持1 Mb/s的通信速率。并且还带有斜率控制功能,以减少电磁干扰。它还带有多种保护措施并且其电气特征最大可以支持112个节点。MCP2551使用了压摆率控制模式,以减小电磁干扰。

2)主控节点人机接口程序设计

在Fedora9中,使用配置好的集成开发工具Qt Creator进行主控节点应用程序的开发。使用Qt Creator中所见即所得的UI开发工具设计的图像界面,如图5所示。界面显示通过CAN收到的相应下线通道的货物条码和通道,在查询数据库后,将查询到的货物目的地、运输车辆的号牌显示出来。如果发生错误,会弹出QMassageBox警告。

图5 物流复检系统UI界面

创建好UI界面之后,Qt Creator会为其生成一个界面类MainWindow。在私有数据部分添加Socket CAN所用到的数据,建立各个通道存放条码数据的缓冲区。此外,为MainWindow创建按键和Socket CAN接收所用到的私有插槽。在MainWindow的构造函数中完成数据和图形界面的初始化,并完成SocketCAN接收数据的准备工作。整个应用程序的工作流程,如图6所示。应用程序开始工作后,会对用到的软硬件资源进行初始化,完成图形界面的初始化、私有数据的初始化、SocketCAN通信的准备工作还有数据的连接等。在初始化完成之后,应用程序会进入信号-插槽循环,根据系统发送的不同信号完成不同的工作。但收到SocketCAN信号,就会处理从can0接收到的条码数据,查询数据库并返回结果。如果是触摸屏输入信号,例如复位通道1,软件就会清空通道1的条码缓冲,重新开始一次分拨任务。如果接收到的是退出信号,应用就会退出执行,释放使用到的软硬件资源。在系统正常工作时,复检应用程序需要开机后自动开始执行,并且QT应用程序的执行需要脚本来建立一系列的环境变量。

图6 主控节点应用程序流程图

7 结论

在目前的技术条件下,并不能保证分拣机构精准高效地运行,时常会发生分拣错误,给物流及其相关领域带来了巨大的损失。现代社会越来越不能容忍物流分拣中的这种错误,因此在该研究中设计了一种基于嵌入式系统[15-16]的物流复检系统,详细阐述了物流复检系统各个环节硬件平台的设计和软件系统的开发。研究表明,该系统能够提高物流分拣的准确度。

猜你喜欢

扫描器条码线程
热线互动
基于C#线程实验探究
浅析影响商品条码质量的主要因素
日杂商品条码质量现状研究
基于国产化环境的线程池模型研究与实现
浅谈linux多线程协作
基于固定条码与电子标签比对设备的设计
SICK TIM351迷你型激光扫描器
戒指扫描器
利用彩色扫描器对有色污布测色及对洗净性进行评价