论文部分内容阅读
摘要:基于多线程和模块化的设计思想,以abview为开发平台,实现了人机交互式控制系统软件的设计开发。本方案的设计难点是基于Labview开发平台的人机交互式控制软件的架构设计以及高实时性和可靠性的多线程协同工作模式的实现。本方案具有人机交互界面友好、开发周期短、稳定可靠、控制准确度高等特点,极大地提高了控制系统的开发效率和自动化程度。
关键词:多线程;人机交互式控制;Labview;
中图分类号:A06-029文献标识码:A文章编号:1674-3520(2014)-06-00259-021、前言
人机交互式控制模式是指操作人员通过终端设备输入信息和操作命令,系统接到后立即处理,并通过终端设备显示处理结果,操作人员根据处理结果进一步输入信息和操作命令。系统与操作人员以人机对话的方式一问一答,直至最终获得理想的结果,这种方式与传统的非交互式处理相比,具有灵活、直观、便于控制的优点,在工业控制领域越来越广泛地采用。
而传统的基于Keil平台状态机的开发模式和基于Vxworks平台多任务的开发模式都不能很好地满足人交互式控制系统软件的开发要求。Labview是一种基于图形化数据流的编程语言,为人机交互式控制软件的设计开发提供了崭新的平台。它使用图形语言(如各种图标、图形符号、连线等)以框图的形式编写程序,在提供强大功能的同时保证了系统的灵活性。
2、软件结构设计
2.1Labview多线程运行机制介绍
Labview的运行机制是一种协作式的多线程并行运行机制,当同等优先级线程被执行时,时间片循环排序为每个线程分配了同等的处理器时间。在一个线程用完了可用的时间片,操作系统自动地停止处理该线程,开始执行队列中下一个线程。这种混合了抢占式和时间片轮转式的任务排序能够保证多任务的并行实时处理。
基于Labview多线程并行执行,分割时间片占用CPU资源的运行机制,根据软件需求,将该软件分为主程序MAIN.VI和它所调用的各子程序组成。主程序采用面向数据流的结构化设计思路,分为若干个线程并行执行,每个线程由一个while循环构成。不同线程的优先级不同,通过在循环空闲时段调用“等待到下一个整数倍毫秒”函数和队列的使用来调节CPU资源占有线程时间和数据的读写速度,从而达到不同优先级线程并行执行的效果。
2.2线程间通讯方式
其他线程之间的数据交互通过队列、局部变量及VI服务器引用进行。通过局部变量进行数据交互多用于数据更新频率低,数据结构简单的控件的值属性改变,主要包括CAN总线初始化标志位、流程参数(标量)等;为了避免内存的消耗和数据竞争,保证数据不丢失,指令响应的及时准确,采用队列来进行不同线程之间的数据传递;而人机交互界面上控件的动画实时显示则采用VI服务器引用来与运动控制子VI进行信息交互。
3、CAN协议层的实现
CAN总线协议层基于已在各型号中广泛使用的双通道切换通信原理,基于Labview语言,总线接收采用查询方式实现,开启独立2个线程,由当前工作通道来决定哪个线程处于工作状态,而备用通道工作线程处于空闲状态。当数据接收高峰时段,相邻两次接收时间间隔小于1ms,当数据接收空闲时段,相邻两次查询延时设置为10ms,让出CPU资源,保证了其他线程执行的实时性。
CAN总线发送采用FIFO队列模式,当不同的线程在相临时间间隔内均需发送数据时,仅需将所要发送的数据放入发送队列。而在数据发送线程中,以查询方式读取队列缓冲区内的数据,当发送函数返回值为1时,代表本次发送成功,此时才从队列中取出下一个待发送数据;若发送失败,则通过备用通道向总线各节点发送切换帧,告之各节点切换CAN工作通道,并将未发送成功数据重新发送。当总线切换3次均为发送成功,则在人机交互界面弹出报警对话框,告之操作者总线通讯失败。
如应用局部变量实现线程间数据交互,如果查询速度大于局部变量的速度,则会多次重复读取同一数据;如果查询速度小于局部变量的改变速度,则会导致数据遗漏。
4、过程控制的实现
控制功能的实现是本设计的重点和难点。怎样实现控制流程执行时在各个状态中灵活切换并能及时有效响应“停止”按键,不出现死循环或响应不及时现象?通过大量实验,最终确定使用“生产者——消费者”+“状态机”的设计模式来实现人机指令触发响应和控制状态的灵活切换。
4.1生产者——消费者设计
“生产者——消费者”设计模式是事件处理器和队列消息处理器相结合构成的复合设计模式。生产者是指令的提供方,产生指令,并将指令放入队列,由事件结构+while循环组成;消费者是指令的消费方,依次从队列中取出指令,由while循环+条件结构处理。生产者和消费者之间存在一个指令缓冲区,通过队列来实现。例如当“推进”指令按下,“推进”指令入队列,在消费者循环中指令出队列并执行相应流程,当推进过程中“停止”按下,则清空队列,并执行“停止”入队列最前端,这样在消费者循环中就能及时切换并执行停止流程。
具体程序结构框图如图1所示。
5.1状态机设计
在消费者循环中,采用“状态机”的设计模式来实现某个事件中各个状态的切换,主要采用“while循环+条件分支”结构,并利用移位寄存器来传递状态。在程序执行完任一状态时,对状态变量赋值并存储于移位寄存器中,实现将下一个状态传递到下一次循环判断中。下一次执行while循环进行状态判断时,通过条件结构对移位寄存器中存储的状态进行判断,来执行相应的状态。这样,就实现了动态实时地改变程序执行顺序,以适应多种控制情况的目的。具体结构图如图2所示。
当控制过程复杂时,在消费者循环中需要运行多层状态机,即每一个状态中又包含若干个子状态。这样,在程序实现时就需要调用多层条件结构,每一层条件结构都需要有对应的移位寄存器用来判断本次循环条件执行的分支。如图3所示。这样,就造成了程序层次过多,可读性维护性差的弊端。因此,我们可分析将每一层状态机都封装为一个函数功能模块,而此VI的输入输出参数设为本次执行的状态和下一次要执行的状态。
以对中控制为例,对中的控制过程复杂,存在多个控制状态,状态切换图如图4所示。如对中控制过程分为“左右粗对中”、“上下粗对中”、“左右平行”、“左右对中”、“上下平行”、“上下对中”6个顺序执行阶段,每个控制阶段中多次对油缸进行控制,油缸有上下左右四个运动方向。油缸控制存在11种状态切换,所以将油缸控制编写为controlMotor.vi模块,此VI的输入输出参数为本次油缸执行状态、和下次油缸执行状态。每次调用controlMotor.vi时只执行一种状态,通过外层循环的移位寄存器改变状态值来实现状态切换,这样简化了程序结构,也避免了与主VI无法实时进行数据交互的问题。程序框图如图5所示。
10、仿真及桌面联调
各项控制功能调试:水平装填车电控系统在实际大型试验应用中,能够正确执行自动对中、抓弹、放弹、装填、退弹等控制功能,能够实时响应停止操作,并能够正确恢复继续执行,各故障状态能够及时准确报警。
CAN总线通信功能及性能:总线上各节点给控制单元发送数据,当总线负载率为100%时,CAN数据接收线程仍能够正常接收数据,未出现丢数现象;水平装填车电控系统信息传输的正确性、协调性,即水平装填车电控系统内部各设备间软件接口正确,所有指令、数据收发正确。在运行期间CPU为43%内存使用为256M,远远低于系统总内存。在执行控制流程或用户对人机交互界面进行操作时,数据处理能够正常收发,未出现丢数死机等异常现象。
11、程序设计时应注意的问题
11.1多线程的同步执行
多线程的同步执行,应合理分配CPU资源,优先级高的线程。如总线数据接收线程,应避免使用延时函数,以保证数据接收的及时性。总线数据存储线程应根据数据接收的最小周期来设定循环的周期,做到不占用过多的CPU资源,保证其他线程的执行,又不会出现数据存储遗漏。
11.2内存泄漏的避免
程序中打开了某些资源(文件、引用等),在程序退出之前,不论是否有异常出现,都一定要把资源关闭。若打开的资源不关闭,则一直驻留在内存中。但程序关闭后再无法访问这些资源,这就造成了内存泄漏。不论在过程中是否有错,打开的文件都应当在程序结束前被关闭。
11.3状态机的使用
状态机的应用重点是移位寄存器的灵活使用,移位寄存器会动态地将状态变量存在一个内置的缓冲区中,不能通过局部变量或全局变量在其他线程中赋值来更改状态执行步骤。
11.4文件存储过大问题
用TDMS文件将总线数据存储在硬盘中,存储数据线程的执行周期如果过小,会造成存储数据文件过大,存储数据索引文件过大的问题,会大大影响硬盘存储数据效率。所以,存储数据线程的周期要根据数据产生周期而定,当数据以1帧/ms的速率进行入队列操作时,数据存储的周期要大于等于1s。
12结束语
本文的创新点在于多线程协同工作的设计思想,以及处理人机交互式控制的编程框架。以Labview2011为集成开发环境,以水平装填车控制系统软件为例,对多功能控制系统进行了设计。实验表明,各功能模块运行良好,对外界触发响应及时,线程间数据交互准确无误。程序中使用动态设计,程序方便修改,具有较大的灵活性。很好地保证了系统的可视化操作和应用实施的通用性。
参考文献:
[1]Labview宝典/陈树学,刘萱编著.—北京:电子工业出版社,2011.3
[2]我和Labview:一个NI工程师的十年编程经验/阮奇桢编著.—北京:北京航空航天大学出版社,2009.9
关键词:多线程;人机交互式控制;Labview;
中图分类号:A06-029文献标识码:A文章编号:1674-3520(2014)-06-00259-021、前言
人机交互式控制模式是指操作人员通过终端设备输入信息和操作命令,系统接到后立即处理,并通过终端设备显示处理结果,操作人员根据处理结果进一步输入信息和操作命令。系统与操作人员以人机对话的方式一问一答,直至最终获得理想的结果,这种方式与传统的非交互式处理相比,具有灵活、直观、便于控制的优点,在工业控制领域越来越广泛地采用。
而传统的基于Keil平台状态机的开发模式和基于Vxworks平台多任务的开发模式都不能很好地满足人交互式控制系统软件的开发要求。Labview是一种基于图形化数据流的编程语言,为人机交互式控制软件的设计开发提供了崭新的平台。它使用图形语言(如各种图标、图形符号、连线等)以框图的形式编写程序,在提供强大功能的同时保证了系统的灵活性。
2、软件结构设计
2.1Labview多线程运行机制介绍
Labview的运行机制是一种协作式的多线程并行运行机制,当同等优先级线程被执行时,时间片循环排序为每个线程分配了同等的处理器时间。在一个线程用完了可用的时间片,操作系统自动地停止处理该线程,开始执行队列中下一个线程。这种混合了抢占式和时间片轮转式的任务排序能够保证多任务的并行实时处理。
基于Labview多线程并行执行,分割时间片占用CPU资源的运行机制,根据软件需求,将该软件分为主程序MAIN.VI和它所调用的各子程序组成。主程序采用面向数据流的结构化设计思路,分为若干个线程并行执行,每个线程由一个while循环构成。不同线程的优先级不同,通过在循环空闲时段调用“等待到下一个整数倍毫秒”函数和队列的使用来调节CPU资源占有线程时间和数据的读写速度,从而达到不同优先级线程并行执行的效果。
2.2线程间通讯方式
其他线程之间的数据交互通过队列、局部变量及VI服务器引用进行。通过局部变量进行数据交互多用于数据更新频率低,数据结构简单的控件的值属性改变,主要包括CAN总线初始化标志位、流程参数(标量)等;为了避免内存的消耗和数据竞争,保证数据不丢失,指令响应的及时准确,采用队列来进行不同线程之间的数据传递;而人机交互界面上控件的动画实时显示则采用VI服务器引用来与运动控制子VI进行信息交互。
3、CAN协议层的实现
CAN总线协议层基于已在各型号中广泛使用的双通道切换通信原理,基于Labview语言,总线接收采用查询方式实现,开启独立2个线程,由当前工作通道来决定哪个线程处于工作状态,而备用通道工作线程处于空闲状态。当数据接收高峰时段,相邻两次接收时间间隔小于1ms,当数据接收空闲时段,相邻两次查询延时设置为10ms,让出CPU资源,保证了其他线程执行的实时性。
CAN总线发送采用FIFO队列模式,当不同的线程在相临时间间隔内均需发送数据时,仅需将所要发送的数据放入发送队列。而在数据发送线程中,以查询方式读取队列缓冲区内的数据,当发送函数返回值为1时,代表本次发送成功,此时才从队列中取出下一个待发送数据;若发送失败,则通过备用通道向总线各节点发送切换帧,告之各节点切换CAN工作通道,并将未发送成功数据重新发送。当总线切换3次均为发送成功,则在人机交互界面弹出报警对话框,告之操作者总线通讯失败。
如应用局部变量实现线程间数据交互,如果查询速度大于局部变量的速度,则会多次重复读取同一数据;如果查询速度小于局部变量的改变速度,则会导致数据遗漏。
4、过程控制的实现
控制功能的实现是本设计的重点和难点。怎样实现控制流程执行时在各个状态中灵活切换并能及时有效响应“停止”按键,不出现死循环或响应不及时现象?通过大量实验,最终确定使用“生产者——消费者”+“状态机”的设计模式来实现人机指令触发响应和控制状态的灵活切换。
4.1生产者——消费者设计
“生产者——消费者”设计模式是事件处理器和队列消息处理器相结合构成的复合设计模式。生产者是指令的提供方,产生指令,并将指令放入队列,由事件结构+while循环组成;消费者是指令的消费方,依次从队列中取出指令,由while循环+条件结构处理。生产者和消费者之间存在一个指令缓冲区,通过队列来实现。例如当“推进”指令按下,“推进”指令入队列,在消费者循环中指令出队列并执行相应流程,当推进过程中“停止”按下,则清空队列,并执行“停止”入队列最前端,这样在消费者循环中就能及时切换并执行停止流程。
具体程序结构框图如图1所示。
5.1状态机设计
在消费者循环中,采用“状态机”的设计模式来实现某个事件中各个状态的切换,主要采用“while循环+条件分支”结构,并利用移位寄存器来传递状态。在程序执行完任一状态时,对状态变量赋值并存储于移位寄存器中,实现将下一个状态传递到下一次循环判断中。下一次执行while循环进行状态判断时,通过条件结构对移位寄存器中存储的状态进行判断,来执行相应的状态。这样,就实现了动态实时地改变程序执行顺序,以适应多种控制情况的目的。具体结构图如图2所示。
当控制过程复杂时,在消费者循环中需要运行多层状态机,即每一个状态中又包含若干个子状态。这样,在程序实现时就需要调用多层条件结构,每一层条件结构都需要有对应的移位寄存器用来判断本次循环条件执行的分支。如图3所示。这样,就造成了程序层次过多,可读性维护性差的弊端。因此,我们可分析将每一层状态机都封装为一个函数功能模块,而此VI的输入输出参数设为本次执行的状态和下一次要执行的状态。
以对中控制为例,对中的控制过程复杂,存在多个控制状态,状态切换图如图4所示。如对中控制过程分为“左右粗对中”、“上下粗对中”、“左右平行”、“左右对中”、“上下平行”、“上下对中”6个顺序执行阶段,每个控制阶段中多次对油缸进行控制,油缸有上下左右四个运动方向。油缸控制存在11种状态切换,所以将油缸控制编写为controlMotor.vi模块,此VI的输入输出参数为本次油缸执行状态、和下次油缸执行状态。每次调用controlMotor.vi时只执行一种状态,通过外层循环的移位寄存器改变状态值来实现状态切换,这样简化了程序结构,也避免了与主VI无法实时进行数据交互的问题。程序框图如图5所示。
10、仿真及桌面联调
各项控制功能调试:水平装填车电控系统在实际大型试验应用中,能够正确执行自动对中、抓弹、放弹、装填、退弹等控制功能,能够实时响应停止操作,并能够正确恢复继续执行,各故障状态能够及时准确报警。
CAN总线通信功能及性能:总线上各节点给控制单元发送数据,当总线负载率为100%时,CAN数据接收线程仍能够正常接收数据,未出现丢数现象;水平装填车电控系统信息传输的正确性、协调性,即水平装填车电控系统内部各设备间软件接口正确,所有指令、数据收发正确。在运行期间CPU为43%内存使用为256M,远远低于系统总内存。在执行控制流程或用户对人机交互界面进行操作时,数据处理能够正常收发,未出现丢数死机等异常现象。
11、程序设计时应注意的问题
11.1多线程的同步执行
多线程的同步执行,应合理分配CPU资源,优先级高的线程。如总线数据接收线程,应避免使用延时函数,以保证数据接收的及时性。总线数据存储线程应根据数据接收的最小周期来设定循环的周期,做到不占用过多的CPU资源,保证其他线程的执行,又不会出现数据存储遗漏。
11.2内存泄漏的避免
程序中打开了某些资源(文件、引用等),在程序退出之前,不论是否有异常出现,都一定要把资源关闭。若打开的资源不关闭,则一直驻留在内存中。但程序关闭后再无法访问这些资源,这就造成了内存泄漏。不论在过程中是否有错,打开的文件都应当在程序结束前被关闭。
11.3状态机的使用
状态机的应用重点是移位寄存器的灵活使用,移位寄存器会动态地将状态变量存在一个内置的缓冲区中,不能通过局部变量或全局变量在其他线程中赋值来更改状态执行步骤。
11.4文件存储过大问题
用TDMS文件将总线数据存储在硬盘中,存储数据线程的执行周期如果过小,会造成存储数据文件过大,存储数据索引文件过大的问题,会大大影响硬盘存储数据效率。所以,存储数据线程的周期要根据数据产生周期而定,当数据以1帧/ms的速率进行入队列操作时,数据存储的周期要大于等于1s。
12结束语
本文的创新点在于多线程协同工作的设计思想,以及处理人机交互式控制的编程框架。以Labview2011为集成开发环境,以水平装填车控制系统软件为例,对多功能控制系统进行了设计。实验表明,各功能模块运行良好,对外界触发响应及时,线程间数据交互准确无误。程序中使用动态设计,程序方便修改,具有较大的灵活性。很好地保证了系统的可视化操作和应用实施的通用性。
参考文献:
[1]Labview宝典/陈树学,刘萱编著.—北京:电子工业出版社,2011.3
[2]我和Labview:一个NI工程师的十年编程经验/阮奇桢编著.—北京:北京航空航天大学出版社,2009.9