恒达娱乐 > SEO技术 > 强实时测控系统的软件设计技术

强实时测控系统的软件设计技术

admin SEO技术 2020年04月08日

  工业控制和SCADA的发展对测控及仿真软件的实时性提出了更高的要求,软件的实时性已作为评估测控、仿真系统性能优劣的一项重要考核指标。实现软件的实时性当然离不开高速I/O传输及高速数据采集的支持,许多公司现已成功研制出具有高可靠性和稳定性的高速数据采集板卡,板卡的研制仅仅为高速数据采集提供了很好的硬件平台,还需要应用微机接口技术、软件工程技术、总线技术使其发挥应有的作用。本文主要从A/D触发时钟和触发模式等硬件配置的软件设置方法,数据传输方式和端口I/O操作方法的选择,以及多线程应用技术等方面,探讨有关如何进行程序设计来提高软件实时性的技巧及关键技术。

  高效率、高可靠性、高频率、高准确度的定时器脉冲触发源是实现稳定可靠高速数据采集的重要前提。在高速采集板卡上一般设计有两块Intel8254定时芯片,且相互桥联,即第一块Intel8254的时钟输入脚接入高精度、高频率的石英振荡器,其输出作为第二块Intel8254时钟的输入,第二块Intel8254的输出才是触发A/D的真正脉冲源。在程序设计时尤其要注意二者的协联及相互间的匹配关系,这种设计的定时器1和2的计数值CT1和CT2必须满足如下关系式: CT1×CT2=时钟基频/系统的采样频率,同时CT2最好是CT1的整数倍。通过Matlab with Simulink平台的仿真结果以及实践证明:比较可靠的方法是将CT1强行设置为2k或4k,再利用上式关系计算出CT2。同时两时钟的工作方式最好设置成方式2。

  A/D触发模式将直接影响A/D采样速率和孔径时间,A/D触发的模式一般有三种:软件触发、定时器同步触发以及外部触发。一般而言,软件触发一般适合采样速度较慢且现场信号变化比较缓慢的场合;外部触发适合于多路信号需要同步采样的场合,其采样速率由外部触发信号的频率而定;定时器同步触发一般适合采样速率较快的场合。在编写底层驱动程序时,要根据外部信号的特征和控制系统实时性的要求选取合适的A/D触发模式。

  数据的传输方式也同样影响A/D的采样速率和孔径时间,数据的传输方式一般有软件查询(软件控制)、中断传输、DMA方式以及FIFO方式等四种方式,以常见的A/D转换基频10M为例,上述4种方式的数据传输速率分别为10-20kS/s、10-30kS/s、恒达登录200kS/s、330kS/s。通过比较可知,需高速数据采集的场合应选取FIFO数据传输方式为宜。

  在对高速数据采集板卡的端口进行I/O操作时,针对ISA和PCI总线设备,应特别注意有所区别:

  一个ISA设备驱动程序的资源是固定不变的,而一个PCI设备驱动程序的资源是操作系统自动分配的,需通过设备ID号和厂商ID号获得设备的物理位置、总线号、器件号和功能号,并利用它们寻址PCI配置空间,才能从配置空间获得中断号、端口地址等硬件资源。

  ISA设备与PCI设备驱动程序对中断处理不同:一个ISA设备驱动程序的中断模式可以是LevelSensitive,也可以是Latched,而且中断向量是否与其它设备共享无关紧要。但一个PCI设备驱动程序的中断模式必须是LevelSensitive,而且中断向量必须是共享的。

  通过Matlab with Simulink平台的仿真结果来看:在高速数据采集过程中,为了缩短A/D的孔径时间,提高A/D的转换效率,应尽量减少对其端口I/O操作的次数。最好的解决办法是将A/D整个过程分解为:包括时钟基频、采样频率、扫描通道、通道增益等参数设置等在内的A/D初始化过程;A/D标志位判别及数据采集过程;数据转移及处理过程等,并将这三个过程采用Visual C++将其编译成DLL(动态链接库),然后在应用程序中调用,比在Visual C++中直接采用_inp()、_outp()等编成的子函数要更省时。编写DLL时,若在VC++环境中嵌入汇编语言,效果更佳。但要记住:编译后的DLL在Win9X(包括WinME)系统中必须存放在System子目录下,而在Win2k或XP系统中必须存放在System32子目录下。

  一个复杂的测控、仿真软件,往往要求数据采集、图形界面生成、控制算法实现、远程通信、数据管理等过程并行完成,而Windows又并非是一个实时性很强的操作系统,但其多线程能力为实现这种并行处理能力提供了很好的解决方案。

  线程数量不宜过多,否则线程间的频繁切换反而会影响程序的执行效率,从而导致软件实时性的下降,在高速数据采集过程中,采用2~3线程足以满足软件的实时性要求。如设定A/D初始化线程、数据采集线程、数据传输与处理线程等。

  因为同一时间有多个线程在执行,公共数据区段内的变量、数据或参数可能会被其它的线程在线修改,必须合理控制并发线程。在测控程序设计中,较好的办法是通过Semaphore(信号量)对象来控制线程间的同步,同时在所有并发线程中,设置数据采集线程具有最高优先级。

  不同的外部设备,如PCI总线、ISA总线、串行设备,其I/O操作的速度不同,因此必须合理协调不同I/O设备间的I/O操作。

  一般而言,一个调入内存并准备执行的程序称为一个进程,每个进程拥有一个局部虚拟地址空间和一个控制点,每个进程可创建多个并发线程,并由一个主线程开始,所有线程共享该进程里的地址空间、数据和系统资源。Win32、WinNT是一种抢先式多线程调度方式,可以保证优先级高的线程首先获得CPU运行时间。在高速数据采集系统中,可为每个线程设定一个优先级,操作系统根据线程的优先级让CPU抢先执行当前最适当的线程。在实现安全有效的多线程机制的软件时,恒达注册登录除了要合理设置线程优先级外,还要合理控制并发线程,否则不仅会造成线程死锁,还会导致系统崩溃,最易导致线程死锁的因素是多线程中公共数据的访问过程。为了避免此现象发生,可通过线程之间的同步来实现对公共数据块进行保护。

  各个线程可以访问进程中的公共变量,需要注意的问题是如何防止两个或两个以上的线程同时访问同一个数据,以免破坏数据的完整性。在高速数据采集过程中,应避免数据采集线程往FIFO缓冲区写数据的同时,数据转移线程来访问FIFO缓存。

  Visual C++中使用同步类来解决操作系统的并行性引起的数据不安全问题。MFC支持的七个多线程的同步类可以分成两大类:同步对象(CsyncObject、Csemaphore、Cmutex、CcriticalSection和Cevent)和同步访问对象(CmultiLock和CsingleLock)。临界区(Critical section)是保证在某一个时间只有一个线程可以访问数据的方法。使用它的过程中,需要给各个线程提供一个共享的临界区对象,无论哪个线程占有临界区对象,都可以访问受到保护的数据,此时其它线程需要等待,直到该线程释放临界区对象为止。临界区被释放后,另外的线程可以强占这个临界区,以便访问共享的数据。临界区对应着一个CriticalSection对象,当线程需要访问保护数据时,调用临界区对象的Lock()成员函数;当对保护数据的操作完成之后,调用临界区对象的Unlock()成员函数释放对临界区对象的拥有权,以使另一个线程可以夺取临界区对象并访问受保护的数据。信号量(Semaphore)和互斥(Mutexe)的用法很相似,不同的是,它可以同一时刻允许多个线程访问同一个资源,这正是高速数据采集所需的对并发线程控制的方法。创建一个信号量需要用Csemaphore类声明一个对象,一旦创建了一个信号量对象,就可以用它来对资源访问。可以先创建一个CsingleLock或CmltiLock对象,然后用该对象的Lock()函数减少这个信号量的计数值,Unlock()反之。

  在多线程程序运行过程中,必须要有一个主线程。其实,线程有用户界面线程和工作线程(又称为后台线程)之分。前者通常用来处理用户的输入并响应各种事件和消息,应用程序的主执行线程CWinAPP对象就是一个用户界面线程,当应用程序启动时,它自动创建和启动。同样,它的终止也意味着该程序的结束,进程终止。工作线程用来执行程序的后台处理任务,在高速数据采集过程中,A/D初始化线程、数据采集线程、数据转移与处理线程就是后台线程,和用户界面线程的区别是,它不用从CwinThread类派生来创建。一个进程中的所有线程共享它们父进程的变量,但同时每个线程可以拥有自己的变量。

  在本设计中,将控制策略管理线程作为主线程,其属性设置成CWinAPP,数据采集线程在所有并发线程中具有最高的优先级,数据采集线程不间断地将采集的数据存放到公共的FIFO数据缓冲区,以便数据处理线程调用,控制策略管理线程具有最高优先级的主线程,可以随时唤醒或挂起后台线程。同时,所有后台线程只能有数据采集线程唤醒,控制策略管理线程则无权干涉,程序通过CEvent对象来沟通各线程间发生的事件,通过获得Csemaphore的使用权来存取公共数据FIFO缓冲区的数据。

  影响测控及仿真软件实时性既有硬件的因素,也有软件的因素,二者相互依存,相互制约。一个良好的软件设计不仅可以提高硬件的性能,还可弥补其性能设计上的不足。软件设计时,要考虑其综合因素,如A/D触发方式、数据转换方式的选择、多线程的应用及其相互间的协同工作关系,大容量数据存储与高速数据存取间矛盾、高速数据采集与高速数据存取间的矛盾等等。■

  1. 吴重光等,系统仿线. 施阳、严卫生等,MATLAB及动态仿真工具SIMULINK,清华大学出版社 2001.6

标签: 软件设计技术