嵌入式Linux组态软件实时数据库的设计
据交换,需要编写特定的通用数据库接口(ODBC 接口)例程。Linux 提供了一组丰富的接口函数用来访问 MySQL 数据库。通过对通用数据库MySQL 的数据连接进行组态,实时数据库便可按照预 先指定的采样周期,对规定时间区段内的历史数据与MySQL 数据库建立数据连接。
3 实时数据库系统的实现
3.1 数据模型的分析与构建
传统数据模型包括三个部分:一组数据对象及其结构,一组数据操作,关于数据对象与 操作的完整性约束[6]。而对于工业生产中所产生的实时数据,还必须约束于严格的定时限制。
在应用于工业现场控制的组态软件中不仅包括实时产生的过程量数据,还存在着描述系 统运行状况的系统数据,在利用采集到的过程量数据的基础上,经处理后提取出的计算数据, 以及涉及控制测量组态或从工控软件输出到输出装置上的数据等。由此,可将实时数据模型 抽象为:模拟量,开关量,字符串量三种数据类型。
3.2 数据类型的实现
上述用于构建实时数据过程量的三类数据模型,对应于具体的实现分别可用:浮点型, 布尔型,字符数组来表示。实时数据可由结构类型实现,以其中的实时数据类型字段来区分 不同的过程量类型。实时数据结构类型的实现如下。
/*枚举类型标记实时数据过程量类型 */
typedef enum {
double_t = 1,
bool_t
} pv_type_set;
/* 联合类型实现实时数据过程量值 */
typedef union {
double dPV;
bool swhPV;
} pv_data_set;
/* 实时数据的数据类型 */
#define name_LEN 20
#define DESC_LEN 50
typedef STruct {
char nAME[NAME_LEN + 1];//数据点名称
pv_type_set type;//数据点类型
char desc[DESC_LEN + 1];//数据点描述信息
pv_data_set pv;//数据点过程量值
char domain[3];//数据点所在域号
char eu[DESC_LEN + 1];//数据点工程单位描述
double euLow;//数据点工程单位下限
double euHigh;//数据点工程单位上限
double pvRaw;//现场测量裸数据
bool IsRanCon;//是否进行量程变换
double pvRawLow;//裸数据量程下限
double pvRawHigh;//裸数据量程上限
bool static;//静态数据历史数据存储至文件系统
int storecyc;//备份周期
bool IsAlarm;//是否报警
int AlarmPriority;//报警优先级
… …
} tag_node;
3.3 实时数据在数据库中的组织形式及相关数据结构
为了充分地利用 Linux 平台对实时多任务操作的支持,实时数据库的数据采集与处理等任务应以多进程的形式并发执行。而Linux 操作系统IPC 机制中的共享内存技术可以根据需 要离散地分配内存空间,从而可将所有数据点的共享内存地址构成索引并建表。在实际应用 中,经常会将若干在生产工艺上有关联的数据点划分为一个数据域,所以地址索引表为两级 结构:第一级为域表,其中的数据项存储特定数据域的地址;第二级为数据点表,数据项存 储某一数据域中的每个数据点的内存地址。域表与数据点表中存储的数据点所在的域号字段 与数据点号字段组合构成数据点ID。包括所有实时数据点的地址索引由一张域表与多张数 据点表构成。根据存储域表结构的内存地址,便可访问所有数据点的共享内存地址。下面给 出域表与数据点表用到的数据结构。
/* 描述域表数据项的数据结构 */
typedef struct {
char domIndex[3];//域号
tbTag_item *tbTag_ptr;//该域的数据点表地址
} tbDom_item;
/*描述数据点表数据项的数据结构*/
typedef struct {
char tagIndex[3];//数据点号
tag_node *tag_ptr;//指向数据点的指针
int shmid;//存储该数据点的共享内存标号
char name[NAME_LEN + 1];//数据点名称
} tbTag_item;
域表与数据点表的数据项内容与关系结构示意见图 3。
3.4 一组访问实时数据库的通用编程接口
作为投入现场运行的监控组态软件的核心部件,实时数据库需要为现场操作人员提供类 似传统数据库管理系统的实时数据查询与更新等功能。另外出于设备无关性的考虑,也需要 为监控组态软件的其他应用程序提供一组用来直接访问实时数据库的接口函数。这样,对于 其他工控设备与实时数据库进行数据交换的需求,只要利用这样一组接口函数开发不同的驱 动程序便可得到满足,从而增强了实时数据库系统的通用性与开放性。下面列出了一些较为 常用的数据访问接口函数。
int CreatTag();//创建数据点
char *GetNameByID(char *tagID);//通过数据点ID 取得数据点名
char *GetIDByName(char *tagName);//通过数据点名得到数据点ID
pv_type_set GetPVType(char *tagName);//通过数据点名得到数据点过程量值类型
int GetPVByName(char *tagName, pv_data_set *pv);//根据数据点名获取数据点过程量值
数据库 设计 实时 软件 Linux 组态 嵌入式 相关文章:
- 基于虚拟仪器的特性测试参数数据库的设计(06-24)
- 嵌入式数据库在Java中的应用(03-03)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- 嵌入式移动数据库系统中的数据查询(02-21)
- Linux EXT3下删除MySQL数据库的数据恢复(05-26)
- 嵌入式移动数据库与Agent技术(03-01)