第四节:数据类型与变量——工控编程的“砖瓦”

各位工程师朋友,咱们今天聊聊数据类型和变量。这玩意儿听起来基础,但说实话,我见过太多项目出问题,根源就在这上面栽了跟头。你想想看,盖房子地基没打好,后面装修再漂亮也白搭。工控编程也是这个理。

一、基本数据类型:工控世界的“原子”

基本数据类型,说白了就是PLC能直接认识的最基础的数据格式。我习惯把它们分成几类来记:

1. BOOL(布尔型)

这是最小的数据单位,就两个值:TRUE或FALSE。在梯形图里,它对应一个触点或线圈的状态。

实际应用:电机启停、阀门开关、报警信号……几乎所有数字量信号都用BOOL表示。

我的经验:BOOL变量命名时,我习惯加前缀“b_”,比如b_MotorRun、b_AlarmHigh。这样一眼就能看出是布尔量,排查问题快很多。

2. INT(整型)

16位有符号整数,范围-32768到32767。计数器、定时器预设值、模拟量转换后的原始值,经常用INT。

我曾经踩过的坑:有一次做温度采集,模拟量模块输出0-27648对应0-100度。我直接用INT变量存,结果温度超过100度时,数值溢出变成了负数,加热器还在拼命加热……后来我改成REAL类型,再也没出过这问题。

3. REAL(浮点型)

32位浮点数,能表示小数。PID运算、流量累计、压力换算,这些带小数的计算,必须用REAL。

嗯,这里要注意:REAL的精度有限,做高精度累加时,误差会慢慢累积。我一般每1000次累加做一次清零或补偿。

4. TIME(时间型)

PLC里专门存时间间隔的数据类型。格式通常是T#1h30m20s500ms这种。

我个人习惯用TIME做超时判断,比如“如果泵启动后5秒内压力没上来,就报警”。比用INT自己算秒数方便多了。

数据类型 位数 范围 典型用途
BOOL 1位 TRUE/FALSE 开关量、状态位
INT 16位 -32768 ~ 32767 计数器、模拟量原始值
REAL 32位 ±1.18e-38 ~ ±3.4e38 PID、浮点运算
TIME 32位 0 ~ 24天20小时 定时、超时判断

二、用户自定义类型:把“砖瓦”砌成“预制板”

光有基本类型不够用。比如一个电机,有启停命令、运行状态、电流值、温度值……每次都要声明4个变量,太麻烦。这时候就该自定义类型上场了。

1. STRUCT(结构体)

把多个不同类型的数据打包成一个整体。我定义一个电机结构体:

TYPE MotorType :
STRUCT
    b_StartCmd : BOOL;      // 启动命令
    b_RunStatus : BOOL;     // 运行状态
    r_Current : REAL;       // 电流值
    r_Temperature : REAL;   // 温度值
    t_OverloadTimer : TIME; // 过载计时
END_STRUCT
END_TYPE

声明变量时直接写:Motor1 : MotorType; 然后通过 Motor1.b_StartCmd 访问。是不是清爽多了?

我建议:把项目中所有设备都定义成结构体。这样程序结构清晰,后期维护时,改一个结构体定义,所有实例自动更新。

2. ENUM(枚举)

枚举就是给一组整数起个名字。比如设备状态:

TYPE DeviceState :
(
    IDLE := 0,      // 空闲
    RUNNING := 1,   // 运行中
    FAULT := 2,     // 故障
    MAINTENANCE := 3 // 维护中
);
END_TYPE

用枚举代替魔法数字,代码可读性直接拉满。你想想看,看到 IF state = 2 THENIF state = FAULT THEN,哪个更直观?

三、变量作用域与生命周期:你的变量“活”多久?

这个问题,我刚开始做项目时也迷糊过。变量到底在哪儿能用?能活多久?

1. 作用域:变量能“看”到多远

  • 局部变量:只在当前POU(程序组织单元)里有效。比如FB(功能块)内部的变量,外面看不见。好处是封装性好,不会互相干扰。
  • 全局变量:整个项目都能访问。我一般只放系统级的参数,比如“急停状态”、“系统模式”。

我曾经犯过的错:在一个大项目里,全局变量用了上百个。结果调试时,一个地方改了值,另一个地方莫名其妙受影响。查了两天才找到原因。从那以后,我定了个规矩:能用局部变量,绝不用全局的。

2. 生命周期:变量什么时候“生”,什么时候“死”

  • 全局变量:PLC上电就存在,断电才消失。适合存需要保持的数据,比如累计产量。
  • 局部变量:每次调用POU时创建,调用结束就销毁。适合做临时计算。
  • 保持型变量(RETAIN):断电后数据不丢失。我用来存配方参数、设备校准值。

核心原则:变量的“寿命”越长,越要小心管理。全局变量就像公共厕所,谁都能进,但卫生状况堪忧。局部变量像自家卫生间,干净但只有自己能用。

四、知识体系总览

下面这张图,是我自己总结的数据类型与变量知识框架。你看一眼,心里就有谱了:

数据类型与变量知识体系 基本数据类型 用户自定义类型 变量作用域与生命周期 BOOL INT REAL TIME STRUCT(结构体) ENUM(枚举) 局部变量 全局变量 保持型变量(RETAIN) 实际应用示例 • BOOL:电机启停、阀门开关、报警信号 • INT:计数器值、模拟量原始值(0-27648) • REAL:PID输出、温度/压力换算值 • STRUCT:将电机、泵、阀等设备打包成一个整体 • ENUM:设备状态(空闲/运行/故障/维护) 核心原则:变量寿命越长,管理越要小心

这张图把今天讲的内容串起来了。你保存下来,写程序时对照着看,思路会清晰很多。

最后说一句:数据类型和变量,是工控编程的“砖瓦”。砖瓦选对了、放对了地方,房子才能盖得稳。别嫌基础,我见过太多高级工程师,最后栽在变量类型不匹配、作用域混乱这些“小问题”上。


公众号:蓝海资料掘金营,微信deep3321