基于多线程消息框架的智能药房控制系统设计

2022-03-30 14:02吴文超王鹏飞陈一凡
计算机测量与控制 2022年2期
关键词:线程药房指令

吴文超,王鹏飞,陈一凡,王 瑞,叶 敏,瞿 宁

(上海无线电设备研究所,上海 200090)

0 引言

目前,信息技术在医疗卫生领域已经得到了较普遍的应用[1-3],各种规模的医院一般部署了HIS(医院信息系统),这使得医院中对各类信息的管理效率得到了大大的提高。发药环节是影响工作效率提高的一个瓶颈环节,多数医院目前还是使用手工方式进行发药操作,速度慢、工作强度大并且易产生错误[4-7]。具有高度自动化的智能药房系统[8-10]较好地弥补了这方面的不足, 它将处方发药操作由软件系统控制,由基于嵌入式平台的自动化机件系统完成操作, 速度快、准确率高并且容易维护。智能药房系统大大提高医疗机构的工作效率,是构建现代医疗机构的一个必然的发展方向[11-12]。

目前智能药房自动化设备形式主要有机械手式、存储药槽式、散装药品式、回转柜式等方式[13- 17],主要通过运动控制卡,PLC,CPLD,数控系统等传统控制方式[18-19],系统存在功能较为简单,拓展性不足、智能化程度不够的缺点。本文提出一种模块化多线程消息机制软件框架[20-21],基于Windows进行控制系统设计,以解决智能药房控制系统上诉不足。

1 智能药房系统组成

智能药房系统包含的主要硬件有机架机构,工控机,发药控制模块,一体式步进电机,可编程伺服电机,IO控制板及相应的传感器、执行器。智能药房系统由3大模块组成:发药模块、上药模块和左、右出药模块,通过工控机实现对药房各个模块的控制。系统硬件模块组成如图1所示。

图1 系统硬件模块组成

发药模块实现药品的发出功能,主要由发药电控模块,传输皮带和安全门电机构成,其中,发药电控模块通过CAN总线与工控机通信,接收工控机的指令实现发药动作,使得药品从药槽中滑出,并掉落在皮带上方,此时通过控制皮带运转将药品传输到出药模块。上药模块实现药品入库功能,主要由上药台、龙门和机械手组成,机械手整体位于龙门移动轴上,通过龙门X,Z轴的运动,带动机械手运动到指定的上药槽或储药槽。上药平台、龙门和机械手采用电机进行驱动,通过RS485总线与工控机实现通信。出药模块由左右两个提升机及传输皮带组成,将药品最后输送到指定的窗口,并提示用户取药。

2 控制系统软件设计

2.1 开发环境

智能药房控制系统采用Labview开发平台进行开发[21],其采用G编程语言结合图形化界面,提供丰富的对外通信接口和工具,能够一定程度降低系统的开发难度,大大加快软件系统的开发进展。

2.2 任务划分

智能药房控制系统主要有外部接口通信,上药功能,发药功能,出药功能,其中外部接口通信为背景后台运行,负责响应外部系统的任务指令。出于软件模块化以及开发调试简化的考虑,上药功能,发药功能,出药功能设计为独立并行运行模块,以保证在进行外部发药任务时,药房控制系统仍然有能力响应上药指令动作以及实现左右两个出药机构的同时运行,增加智能药房系统的运行效率。

2.3 模块及线程分配

根据智能药房的模块与功能组成,并考虑到各模块之间的并发和开发调试方面的独立性,软件采用模块化的设计方法,将智能药房控制系统分为TCP通信模块、药仓模块、左提篮机模块、右提篮机模块、上药综合模块、配置数据管理模块以及主程序。系统运行时各模块均嵌入到主程序模块,主程序模块不实现具体的功能,完成对各子模块的综合调度,各子模块均可独立运行和调试,单独实现各子模块特有的功能,软件开发时,可对各子模块进行同步开发,节约开发时间。

子模块和主模块均采用生产者-消费者模式多线程消息架构,各模块之间可实现灵活的功能调用,便于实现复杂的流程设计。

根据2.2节进行的任务划分,智能药房控制系统包含有TCP通信模块,上药模块,发药模块,左出药模块,右出药模块,主程序模块以及配置数据管理。

模块框架如图2所示,TCP通信模块接收药房数据管理系统(上位机)下发的指令后,将指令解析后传送到下位机主程序,主程序根据指令内容按照顺序进行进一步解析,将解析后的动作序发送到向上药模块、发药模块、左出药模块、右出药模块,进而通过相关机构进行药品的进出操作,在完成药品进出操作后,再向TCP通信模块发出调用指令,通过TCP通信模块向上位机回馈指令的执行情况。系统各模块均为独立运行的状态,上药、发药动作可同步进行动作。

图2 模块关系框架

2.3.1 TCP通信模块

如图3所示,TCP通信模块包含界面事件线程、TCP通信线程、指令执行线程3个线程。其中界面事件线程用于调试使用,通过界面事件触发执行特定的指令发送。界面事件线程用于调试,发出TCP发送指令的指令以及向外部系统发送TCP指令;TCP接收与解析线程用于接收TCP指令,并将TCP指令解析成对应的系统指令,通过队列消息传送到指令执行线程,最后指令执行线程执行指令将指令通过队列消息发送到主程序。

图3 TCP通信模块设计

2.3.2 主程序模块

如图4所示,主程序模块包含界面事件线程、指令执行线程以及后台监控线程3个线程。其中界面事件线程用于调试使用,用于进行上药、发药、出药、盘点等指令的手动调试以及作为控制系统其它模块的启动接口,便于实现多模块的联合调试。指令执行线程执行对应的程序指令,将相应的模块指令通过队列消息下发到各个模块,模块指令的内容从文件读取,需要执行的指令来自主程序调试界面或者TCP通信模块的消息。后台监控线程执行外部门开传感器监控,模块报警监控,并执行监控到异常后的相应动作功能。

图4 主控模块设计

2.3.3 上药、发药、左右出药模块

模块软件架构与前文所诉主控模块、TCP通信模块相同,上药模块、发药模块、左出药模块、右出药模块均包含界面事件线程,指令执行线程以及后台监控线程3个线程。其中界面事件线程用于调试使用,用于进行上药、发药、出药、盘点、单步动作等指令的手动调试。指令执行线程执行对应的程序指令,将相应的动作指令进行进一步解析为硬件控制命令序列,控制电机、继电器等电控单元。模块指令的内容从配置文件读取,需要执行的指令来自主程序消息或者下位机人机交互界面。后台监控线程执行外检测传感器,电机控制器监控,并将监控到的状态显示到界面上。

2.3.4 配置数据管理模块

配置数据管理模块包含界面事件线程,指令执行线程两个线程。其中界面事件线程用于调试使用,用于文件读取或写入时的手动调试。指令执行线程执行对应的程序指令,从磁盘读或者写相应的配置文件,并将结果显示到界面上,需要执行的指令来自主程序消息或者配置数据管理界面。配置数据管理相关的文件主要有程序运行的配置文件以及生成的日志文件两大类。

2.4 上位机接口协议设计

上位机接口属于通信协议,通常采用的通信指令采用XML进行表达[16],协议具有较强的可读性和拓展性,可以实现基本类型和自定义类型及其类型数组的表征,并且自带语义及结构,解析相对简单。

以药仓发药指令为例,其指令设计如表1所示。

表1 指令设计说明(机械手上药)

指令示例如下:

机械手ID

3 控制系统软件实现

控制系统按照模块设计开发,运行过程中各模块通过消息机制进行通信,并根据消息内容执行响应的指令。消息传递的过程如图5所示。首先TCP通信线程后台接收上位机TCP信息,解析指令后,发送消息到TCP执行指令线程,TCP执行指令线程收到消息后,关联主程序指令,发送消息到主程序动作调度线程,主程序动作调度线程接收到消息后,进一步解析为相应的子模块动作线程指令,并通过消息发送到子模块消息队列,由子模块执行相应的动作序列。

图5 消息传递过程

3.1 TCP通信模块

模块运行过程如图6所示。TCP通信线程过程为:线程创建后,完成通信连接建立,初始化相关的状态变量。其后线程切换到监控TCP端口,当接收到TCP信息后,对指令进行解析,并根据指令内容向执行指令线程发送消息,通知执行指令线程执行具体的动作;当接收到停止指令时,将进行结束线程的动作,并向执行指令线程发送结束指令,最终结束整个系统。

图6 TCP通信线程和TCP指令执行线程工作流程

为了尽可能实现功能上的解耦,并没有直接通过TCP通信线程向主程序线程发送消息,而是通过TCP指令执行线程进行发送,主要目的将TCP消息接收和向主程序发送任务消息的动作解耦,便于通过界面事件(第三方)向指令执行线程发送消息,达到执行相应主程序指令的目的。同时,确保了TCP通信线线程和指令执行线程代码结构的简单,便于维护和拓展新功能。

TCP通信模块的主要功能包括将接收到的通信数据显示在界面上以及手动将特定的指令向外发送。单步执行界面为执行通信协议所定义的指令,即在上位机未参与的情况下,实现向外发布协议中相应的指令,主要为了实现模块的独立调试。调试步骤类似于日志功能,用于记录调试过程中产生的所有步骤的信息,用于对动作流程以及时序进行分析和优化,以及排查有可能出现的异常。

3.2 主程序模块

主程序模块包括界面线程、主程序动作调度线程和后台监控共3个线程,其中主程序动作调度线程的运行过程如图7所示。

图7 TCP指令执行线程和主程序调度线程工作流程

首先,主程序初始化,启动所有子模块线程,并初始化相关的程序内部变量,启动完成后,主程序动作调度线程监控消息队列中是否接收外部消息。当接收到外部消息后,若非停止消息并且消息相关的子模块处于就绪状态,则向子模块发送动作执行消息,并重新监控是否收到外部消息;若为停止消息,则向子模块发送停止消息,并停止本模块;若相关的子模块处于非就绪状态,主程序动作调度线程将进行等待,直到子模块就绪,再向子模块发送动作执行消息。

主程序的主要功能有:弹出子模块,方便进行子模块的调试工作,直接通过界面对智能药房功能动作进行调试,而不依赖于上位机系统,提高调试效率。

3.3 上药、出药、发药模块

上药、出药、发药模块为智能药房控制系统的底层模块,实现对系统硬件进行直接操作,完成相应的动作功能。执行过程如图8所示。软件启动时,子模块动作线程启动,并进行初始化,随即监控相关的消息队列,当收到消息后,子模块执行相应动作,执行完成后,从消息队列按顺序拉取下一条指令,直到全部指令执行结束。当子模块接收到停止消息时,将直接退出线程,并关闭子模块。

各模块实现均按照相同的框架完成,上药模块、出药模块、发药模块界面设计如图8所示。

图8 主程序调度线程和子模块执行线程工作流程

上药模块由上药平台、龙门以及机械手组成,实现对模块相关的电机控制、传感器数据采集。主要功能有电机调试、传感器调试、标定功能调试、单步调试等。调试时以界面事件为载体,向子模块动作线程(上药龙门机械手执行线程)发送消息,实现对每一个步骤的调试过程。

出药模块包括左提篮机和右提篮机,由于左右出药模块同步出药的需求,将该功能分为左提篮机和右提篮机两个模块。出药模块仅由电机组成,主要功能为电机调试。调试时以界面事件为载体,向子模块动作线程(例如右提篮机动作执行线程)发送消息,实现对电机相关功能的调试过程。

发药模块主要实现药仓的参数设置与保存,硬件相关动作(复位、发药、老练等)的调试。

3.4 配置数据管理模块

软件设计上为了隔离开发和调试的过程,将智能药房位置相关、动作相关、软件设定相关的参数均做成了可配置的形式,配置数据管理模块对程序所有的配置数据进行了汇总,并予以显示。

4 实验结果与分析

智能药房控制系统基于消息对子模块系统进行控制,消息内容通过参数配置调试界面输出,可详细的显示智能药房控制系统的运行状态,例如实际运行步骤顺序和耗时等相关信息。调试过程可根据相关信息,分析故障原因,并优化智能药房控制参数,提高系统效能。

为验证智能药房控制系统实际效能,对智能药房控制系统做了单药单发药实验,多药单发药实验和上药实验,测试结果如表2~4所示。智能药房发药综合时间与药品发药频次和药品位置有关。本文描述的智能药房具体情况如下:1)包含3个模块化的药仓,每个药仓有16层,每层包含13~15个药槽编号;2)上药模块包含2条上药轨道和2个缓存轨道,可一次性完成8盒药品的上药动作;3)包含6个出药口。实际控制发药时,根据被发药品的位置,会自动选择药品的出药位置,以减少发药时间。

对于单个药单进行发药,发药实验取最高层药槽、最底层药槽、最左药仓、最右药仓、单盒、多盒、单药单、多药单等情况进行测试,发药时间介于4.5~11.6 s之间,单种药品数量越多,发药位置越高,发药位置距离药篮越远,发药时间越长。单个药单的平均发药时间为8 s左右。

对于多个药单进行发药,由于发药时左右出药口出药过程是并行的,平均单个药单的发药时间为7 s左右。

上药耗时和药品目标槽位与上药模块的距离相关,距离越近,上药时间越短,单次上药平均时间为7.6 s,即0.95 s/盒。

表2 单药单发药过程测试结果

表3 多药单发药过程测试结果

表4 上药过程测试结果

5 结束语

本文介绍了智能药房控制系统的软件设计和实现,提出了一种基于消息的模块化、多线程控制软件设计架构,在自动化设备控制系统开发有较好的可复用性。

根据本智能药房在医院的使用情况来看,智能药房控制系统的模块性强,安装维护简单,运行稳定可靠,对医院药房工作人员的工作效率提升明显,具有较大的应用前景。

猜你喜欢
线程药房指令
5G终端模拟系统随机接入过程的设计与实现
实时操作系统RT⁃Thread启动流程剖析
面向自动化药房的搬运机器人设计
皮肤科药房开展药学服务效果观察
实时操作系统mbedOS 互斥量调度机制剖析
一样,不一样
《单一形状固定循环指令G90车外圆仿真》教案设计
医院药房会计核算工作中存在的问题及其建议探讨
新机研制中总装装配指令策划研究
药房里的照相馆