第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连接,我一般分三步走:
- 在Windows里建ODBC数据源:控制面板 → 管理工具 → ODBC数据源管理器
- 在SCADA里配置连接字符串:指定数据源名称、用户名、密码
- 测试连接:确保能正常读写
我记得有个项目,现场工程师怎么都连不上数据库。我远程一看,原来是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;
知识体系总览
为了让你更直观地理解本章内容,我画了一张图。你看一眼,心里就有数了。
好了,这一章的内容就这些。变量和数据库是SCADA系统的根基,你把这章吃透了,后面学报警、趋势、报表就轻松多了。
记住我一句话:变量配不好,系统跑不了;数据库不会用,数据全白弄。