用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

基于RTLinux的实时控制系统

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:23:41
for Linux-2.2.18。数据库的客户端程序包为MYSQL-3.23.49RPM。控制程序包括实时控制程序和非实时程序两部分。

3 系统设计的关键问题

现场单元中与实现控制部分和非实时控制部分程序相对应的文件为gatectl_module.c和gatectl_app.c。二者由gcc编译后生成目标文件gatectl_module.o和gatectl_app.o。前者为内核模块,嵌入到RTLinux核中,用于实时采集和实时控制输出,运行于内核态。后者为Linux应用环境,运行于用户空间,完成数据的预处理、访问数据库和人机接口等工作。

3.1 内核模块

内核模块程序按多线程模式编写,RTLinux提供了与多线程编程相应的API函数。

RTLinux2.2内核中,完成实时任务的模块主要包括以下两个功能函数:

Int init_module();

Void cleanup_module()。

前者在模块第一次装入核中时被调用,完成实时任务的参数(优先级别、中断周期等)的设置,进行任务的启动和终止等操作。后者在模块卸载时被调用,一般在调试或系统退出时使用。模块中可启动多个任务,本系统在实时部分只设计一个实时任务即Task1。
javascript:window.open(this.src);" style="cursor:pointer;"/>
    启动实时任务前必须进行初始化。init_module()中的初始化工作包括以下三部分:

·为保证内核态的实时进程与用户空间的非实时进程间交换信息。须创建3个RTL-FIFO,具体为:rtf1用于实时进程与非实时进程间的数据交换,数据包括采集到的模拟量和数字量;rtf3用于非实时进程向实时进程传递控制命令字,以启动和终止实时任务;rtf2用于保存经ttf3传递的实时任务的控制命令字。创建工作由RTLinux提供的API函数rtf_create(n,buf)来完成。

·创建实时任务Task1对应的线程,并设定其调度优先级,由API函数pthread_create来完成。

·当非实时进程通过rtf3进行控制命令传递时,实时进程应及时响应。因此必须在实时程序中建立跟踪rtf3变化的子程序,调用rtf_create_handler(3,&data_handler)来完成此功能。

内核态的主体程序有两种实现方式:中断处理和周期实时线程方式。本系统采用周期性实时线,即周期性地执行数据采集、输出控制结果以及与处于用户空间中的非实时进程交换数据。具体过程见图4。

在编写实时程序时,应特别注意的是:实时任务运行在内核水平,是为了提供对计算机硬件的直接访问能力,为避免不确定的延迟,RTLinux给代码和数据分配固定的内存空间。实时任务不能使用Linux的系统调用及Linux中的程序与数据结构,否则难以保证数据的一致性。此外应控制实时程序的执行时间,编写程序时应注意包含与API函数对应的头文件。

内核程序中与RT-FIFO相关的函数有:

rtf_create():创建RT-FIFO。

rtf_get():从RT-FIFO读数据。

rtf_put():向RT-FIFO写数据。

rtf_create_handler():建立响应RT-FIFO变化的子程序。

内核程序中与实时任务线程相关的函数有:

pthread_create():创建实时任务对应的线程。

pthread_wait_np():将当前线程挂起,直至下一个周期线程。

pthread_makeperiodic_np():设置线程的属性并启动线程。

pthread_suspend_np():将本线程无限期挂起,即终止任务。

在调试阶段,需要将有bug的模块卸载。该项工作由cleanup_module()来完成。在卸载模块时将rtf1、rf2和rtf3撤销,并撤销实时任务Task1。

3.2 应用程序

Linux下应用程序gatect1_app工作流程见图4,其程序用Linux下的C语言开发。集中监控站和维护站的程序在Windows下用Visual C++开发。其中有几点要说明:

·RT-FIFO被Linux视为字符设备,因此可以通过调用open("/dev/rtf1",O_RDONLY)来获得rtf1的指针,rtf2的rtf3类似。获得指针后通过read和write函数实现对RT_FIFO的读写操作。

·程序中调用select函数检查RT_FIFO是否忙,以避免读RT_FIFO时出现阻塞现象。

·LCD显示模块MGLS-240128内置智能控制器,只需将待显示的数据送控制器的显示缓冲区就能实现显示功能,数据显示不会占用系统过多的时间。
javascript:window.open(this.src);" style="cursor:pointer;"/>
    ·系统数据传输和维护通过网络数据库来实现。数据库采用客户端/服务器模块,将LCU、集中维护站设置为客户端,将集中监控站设置为服务器。本系统采用基于TCP/IP协议的MYSQL数据库为实现数据管理。MYSQL是一个多用户、多线程的SQL数据库服务器,由客户端/服务器结构来实现。它由一个服务器守护程序mysqld和不同的客户程序及库组成,使用TCP/IP把多个客户(LCU等)连接到一个服务器(集中监控站)上。在运行前应将主机名、IP地址等设备就绪,在LCU的应用程序gatectl_app中应包含MYSQL.h头文件,其中有MYSQL的API函数的具体实现。在用户空间,C语言程序通过这些API函数访问远程的数据库服务器。

·数据的预处理:为防止被干扰的数据上传到服务器,应用程序对数据进行滤波,再对数据进行分类。经过预处理后的数据才可以送数据缓冲区,通过API函数向数据库服务器上传。

4 应用效果

目前该系统正在试验室运行。从连续运转的情况看,控制实时性和可靠性均达到了设计要求,网络和数据库均运行正常,可见本设计思路是可行的。下一步将设放到工业现场进一步验证。RTLinux实现实时控制功能并与Linux有机结合,这一设计思路既满足了实时控制系统对响应的快速性、时间的精确性和控制的可预测性的要求,又充分发挥了Linux对网络和数据库的支持功能。将RTLinux引入控制领域,拓宽了Linux的应用范围,必须加速工业控制的信息化。



上一页  [1] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:7,359.37500 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号