第4章:变量与数据库——SCADA系统的“血液”与“记忆”

各位同学,咱们今天聊点实在的。SCADA系统说白了,就是靠变量活着,靠数据库记着。你想想看,一个系统如果连数据都管不好,那还谈什么监控?

我刚开始接触SCADA那会儿,总觉得变量嘛,不就是个名字加个值?后来在项目里栽了跟头才明白——变量类型选不对,后面全是坑。今天我就把这块掰开了揉碎了讲给你听。

4.1 变量类型:I/O变量、内存变量、中间变量

SCADA里的变量,按我的理解,分三大类。咱们一个一个说。

4.1.1 I/O变量——系统的“眼睛”和“手”

I/O变量,全称是Input/Output变量。说白了,就是直接跟现场设备打交道的变量。

  • 输入变量:从PLC、RTU、传感器读进来的数据。比如温度、压力、流量、液位。
  • 输出变量:SCADA发出去控制现场设备的指令。比如开阀门、启泵、调频率。

我记得在某个水厂项目里,现场有个压力变送器,信号老是跳变。查了半天,发现是I/O变量配置时,滤波参数没设对。嗯,这里要注意——I/O变量的采集周期、滤波方式、死区设置,这些参数直接影响数据质量。

核心要点:I/O变量是SCADA与物理世界的桥梁。配置时一定要确认好数据类型(整型、浮点、布尔)、量程范围、工程单位。

4.1.2 内存变量——系统的“临时记事本”

内存变量,也叫内部变量。它不跟硬件绑定,纯粹在SCADA服务器内存里待着。

什么时候用?举个例子:你算一个平均值,需要把过去10个采样值存起来。这些中间计算结果,用内存变量最合适。

我个人的习惯是,把那些频繁读写、不需要长期保存的临时数据,都定义成内存变量。这样既快,又不占数据库空间。

小技巧:内存变量在系统重启后会丢失。如果你需要断电保持,记得用掉电保持型内存变量,或者干脆存到数据库里。

4.1.3 中间变量——系统的“逻辑中转站”

中间变量,其实可以看作是内存变量的一种特殊形式。它专门用在脚本逻辑里,做数据传递和状态判断。

比如你写一段脚本:如果A阀门开了,并且B泵在运行,那么C指示灯亮。这里的“A阀门状态”、“B泵状态”就是中间变量。

我曾经在一个化工项目里,脚本写得特别长,中间变量命名乱七八糟。后来维护的时候,自己都看不懂了。所以啊,中间变量的命名一定要规范,我建议用“前缀_功能_序号”的格式,比如“TMP_ALARM_01”。

变量类型 数据来源 存储位置 典型用途 断电后
I/O变量 现场设备 PLC/RTU 采集、控制 保留
内存变量 内部计算 SCADA内存 临时存储 丢失
中间变量 脚本逻辑 SCADA内存 逻辑中转 丢失

4.2 变量字典配置——SCADA的“户口本”

变量字典,就是所有变量的登记册。你每定义一个变量,都得在字典里登记清楚。

配置变量字典时,我建议你重点关注这几个字段:

  • 变量名:唯一标识,建议用英文+下划线,比如“TANK_LEVEL_01”
  • 数据类型:BOOL、INT、REAL、STRING,选错了会出大问题
  • 初始值:系统启动时的默认值
  • 量程上下限:用于报警和显示
  • 采集周期:多久读一次,单位毫秒
  • 归档属性:是否记录到历史数据库

避坑指南:我曾经在配置变量字典时,把两个变量的名字写成了大小写不同但拼写相同。结果系统把它们当成两个变量,数据全乱了。所以,变量名一定要区分大小写,并且做好命名规范。

下面是一个变量字典配置的示例:

变量名:PUMP_SPEED_01
数据类型:REAL
初始值:0.0
量程下限:0.0
量程上限:50.0
单位:Hz
采集周期:500
归档:是
报警:是(高限45.0,高高限48.0)

4.3 ODBC数据库连接——SCADA的“外挂大脑”

SCADA系统自己带的历史数据库,说实话,功能有限。真要搞数据分析、报表统计,还得靠专业的数据库,比如SQL Server、MySQL、Oracle。

ODBC(Open Database Connectivity)就是SCADA跟这些数据库对话的桥梁。

配置ODBC连接,我一般分三步走:

  1. 在Windows里建ODBC数据源:控制面板 → 管理工具 → ODBC数据源管理器
  2. 在SCADA里配置连接字符串:指定数据源名称、用户名、密码
  3. 测试连接:确保能正常读写

我记得有个项目,现场工程师怎么都连不上数据库。我远程一看,原来是ODBC驱动装的是32位,但SCADA是64位的。嗯,这种坑,你遇到了就知道有多烦。

个人经验:连接字符串里,我习惯加上“Trusted_Connection=no”,这样能明确指定用户名密码,避免权限问题。

一个典型的ODBC连接字符串长这样:

DSN=MySCADA_DB;UID=sa;PWD=123456;DATABASE=SCADA_History;

4.4 SQL脚本基础——让数据“活”起来

有了数据库,怎么用?靠SQL(Structured Query Language)。

你不需要成为SQL专家,但下面这几个命令,你必须会:

  • SELECT:查数据。比如“SELECT * FROM HistoryData WHERE TagName='TEMP_01'”
  • INSERT:写数据。比如“INSERT INTO AlarmLog VALUES ('2025-01-15', '高报警', 'TEMP_01')”
  • UPDATE:改数据。比如“UPDATE SetPoint SET Value=50.0 WHERE TagName='PUMP_SPEED'”
  • DELETE:删数据。这个慎用,我一般只用在清理过期数据时

我建议你在SCADA里写SQL脚本时,先用数据库管理工具(比如SQL Server Management Studio)测试一遍。确认没问题了,再贴到SCADA里。这样能避免很多低级错误。

重点提醒:SQL注入攻击在SCADA系统里也是存在的。千万别把用户输入直接拼接到SQL语句里。用参数化查询,安全第一。

下面是一个简单的SQL查询示例:

-- 查询最近1小时的所有报警记录
SELECT 
    TimeStamp,
    TagName,
    AlarmType,
    AlarmValue
FROM 
    AlarmHistory
WHERE 
    TimeStamp >= DATEADD(hour, -1, GETDATE())
ORDER BY 
    TimeStamp DESC;

知识体系总览

为了让你更直观地理解本章内容,我画了一张图。你看一眼,心里就有数了。

第4章:变量与数据库知识体系 SCADA数据管理 变量类型 I/O变量 内存变量 中间变量 变量字典配置 命名规范 数据类型 量程与归档 数据库 ODBC连接 SQL脚本 增删改查 核心逻辑:变量采集 → 字典管理 → 数据库存储 → SQL分析 数据流贯穿SCADA系统全生命周期 图:变量与数据库知识体系结构图

好了,这一章的内容就这些。变量和数据库是SCADA系统的根基,你把这章吃透了,后面学报警、趋势、报表就轻松多了。

记住我一句话:变量配不好,系统跑不了;数据库不会用,数据全白弄。


专注资料整理