3. 实时数据库与变量组态

SCADA上位机的实时数据库是整套监控系统的“数据心脏”。它并不直接与现场设备对话,而是通过通信驱动把PLC、仪表、变频器等设备中的原始数据采集上来,再以“变量”为最小单位组织、存储和发布。组态工程师在画面上看到的每一个温度、压力、流量、开关状态,背后都对应实时数据库中的一个变量。理解变量类型、地址映射、采集周期和工程单位换算这四件事,是让画面“活起来”的前提。

变量类型决定数据如何被解释

实时数据库中的变量按用途和数据类型划分。按用途,常见的有I/O变量(与设备地址绑定,负责采集和下发)、内存变量(内部计算、中间结果、画面切换标志)、系统变量(时间、报警计数、通信状态)和计算变量(由表达式或脚本生成)。按数据类型,最常用的是布尔量(BOOL,如启停、故障)、整型(INT/DINT,如计数器、档位)、浮点型(REAL,如温度、压力、流量)和字符串(STRING,如批次号、设备名称)。

类型选错会带来隐蔽的问题。例如把一个16位整型寄存器直接当浮点读,数值会完全失真;把浮点变量用于开关判断,可能因精度误差导致条件永远不成立。工程上一般遵循:现场是开关量就用BOOL,是计数值或状态码就用INT,是模拟量测量值就用REAL,只有确实需要文本信息时才用STRING。对于模拟量,还要明确它是“原始码值”还是“已换算工程量”,这直接决定后续是否需要标定换算。

地址映射:把变量钉在设备的真实位置上

地址映射是变量与设备寄存器之间的“门牌号”对应关系。以常见的Modbus TCP为例,PLC中一个保持寄存器地址为40001,对应协议内部偏移0,数据类型为16位无符号整数。若现场温度变送器把0~100℃线性映射到0~10000的码值,那么上位机变量“Tank1_Temp”的地址就应写成类似 40001(或驱动要求的 4x:0),类型为INT,再通过工程量换算得到真实温度。

地址映射要特别注意三点:一是地址基准,不同驱动对40001的偏移定义不同,有的从0开始,有的从1开始,配错会整体错位;二是字节序,32位浮点跨两个寄存器时存在ABCD、CDAB、BADC、DCBA等排列,字节序不对会读出天文数字;三是寄存器连续性,批量读取连续地址能显著提升通信效率,因此组态时应有意识地把相关变量安排在相邻地址。下面这张图展示了一个典型的变量从现场寄存器到画面显示的完整映射与换算链路。

变量从现场寄存器到画面显示的映射与换算链路 现场设备 温度变送器 量程 0~100 ℃ 输出 0~10000 码值 PLC 保持寄存器 地址 40001 类型 UINT16 当前码值 6250 实时数据库变量 Tank1_Temp 类型 REAL 采集周期 500 ms 画面显示 62.5 单位 ℃ 工程量换算(线性标定) 实际值 = (码值 − 码值下限) × (量程上限 − 量程下限) ÷ (码值上限 − 码值下限) + 量程下限 = (6250 − 0) × (100 − 0) ÷ (10000 − 0) + 0 = 62.5 ℃ 采集周期与数据刷新 t=0 t=500ms t=1000ms t=1500ms t=2000ms 周期越短响应越快,但通信负载越高;模拟量常用 500 ms~2 s,开关量常用 100~500 ms

数据采集周期:速度与负载的平衡

采集周期指上位机驱动向设备发起一次读取的时间间隔。周期越短,画面响应越及时,但通信负载、CPU占用和设备压力也越大。工程上通常按信号的重要性和变化速度分级设置:急停、联锁、关键开关量用100~200 ms;一般开关状态和报警用500 ms;温度、液位等变化缓慢的模拟量用1~2 s;电量累计、日统计量可用5~10 s甚至更长。

采集周期不是越短越好。若一条Modbus链路上挂了20台设备,每台读50个寄存器,周期设为100 ms,则每秒需完成约1万次寄存器读取,串行链路往往无法承受,会出现超时、丢包和通信质量下降。合理的做法是分组轮询:把关键变量放在快组,普通变量放在慢组,并利用驱动的“变化上报”或“死区”功能,只在数值变化超过阈值时才更新数据库,从而在响应速度和负载之间取得平衡。

工程单位换算:让码值变成可读的物理量

现场仪表输出的通常是原始码值,例如4~20 mA对应0~10000码值,或0~27648对应0~100%的标准化值。上位机必须通过线性标定把它换算成工程量。通用公式为:

实际值 = (码值 − 码值下限) × (量程上限 − 量程下限) ÷ (码值上限 − 码值下限) + 量程下限

以温度变送器为例,量程0~100℃,码值0~10000,当前码值6250,则实际值 = (6250 − 0) × (100 − 0) ÷ (10000 − 0) + 0 = 62.5℃。若仪表存在零点迁移,例如量程为−20~80℃,则量程下限为−20,公式同样适用。对于4~20 mA信号,若驱动直接读电流值,也可用两点法标定:4 mA对应量程下限,20 mA对应量程上限。

换算时还要注意单位统一。压力可能同时出现kPa、MPa、bar,流量可能同时出现m³/h、L/min,组态时应统一到画面和报表使用的单位,并在变量注释中写明原始单位和换算系数。对于非线性信号(如热电阻、热电偶),不能简单线性换算,应使用驱动内置的线性化表或在上位机中查表换算。

建议在变量命名中体现单位和类型,例如 Tank1_Temp_C、Pump1_Run_BOOL、Line1_Flow_m3h,这样在画面绑定、报警配置和脚本引用时不易混淆。

一个可执行的组态检查清单

完成变量组态后,建议按以下清单逐项核对,避免上线后才发现问题:

检查项检查内容常见错误
变量类型BOOL/INT/REAL/STRING是否与设备数据一致浮点当整型读,数值失真
地址映射寄存器地址、偏移基准、字节序是否正确40001偏移从0还是从1开始
采集周期关键量快、普通量慢,是否分组轮询全部设100 ms导致通信超时
单位换算量程上下限、码值上下限、单位是否统一忘记零点迁移,负量程算错
读写权限只读变量是否禁止写入,写变量是否有确认误写寄存器导致设备动作
报警限值报警值是否按工程量设置,死区是否合理用码值设报警,阈值完全错误

把这六项检查落实到位,实时数据库就能稳定、准确地为画面、报警、趋势和报表提供数据。变量组态看似基础,但它决定了整个SCADA系统的数据质量,后续所有高级功能都建立在这一层之上。