在结构化文本(Structured Text,ST)编程中,常量定义是构建可靠、可维护自动化程序的基础环节。它让关键数值、物理常量、设备参数等以明确名称出现,避免“魔法数字”(如直接写 3.14159 或 273.15)散落在代码各处,从而大幅提升程序的可读性、一致性和后期修改效率。本文聚焦一个具体而高频的操作:如何在符合IEC 61131-3标准的PLC开发环境中(如Codesys、TIA Portal、Unity Pro、KW Studio等),正确书写常量定义语句 CONST Pi : REAL := 3.14159; END_CONST,并延伸讲解其语法本质、常见错误、工程实践技巧及与变量定义的本质区别。
一、语句拆解:每个字符都承担明确语义
CONST Pi : REAL := 3.14159; END_CONST 不是一行随意输入的代码,而是由严格语法结构组成的声明单元。逐部分解析如下:
-
CONST
这是ST语言的关键字,表示“常量声明区”的开始。它必须独占一行或作为声明块的首标识符,且必须大写(IEC 61131-3规定关键字区分大小写,const或Const均为非法)。 -
Pi
这是用户自定义的常量标识符(名称)。命名需遵守以下规则:- 仅含英文字母(a–z, A–Z)、数字(0–9)和下划线
_; - 必须以字母或下划线开头(
1Pi、Pi!、Pi Value均非法); - 区分大小写(
PI、pi、Pi是三个不同标识符); - 不得与ST保留字(如
IF、WHILE、REAL、CONST)重名。
- 仅含英文字母(a–z, A–Z)、数字(0–9)和下划线
-
:
英文半角冒号,是类型声明的引导符号,不可省略,也不可用中文冒号:替代。 -
REAL
数据类型关键字,表示该常量为IEEE 754单精度浮点数(32位),取值范围约 ±1.18×10⁻³⁸ 到 ±3.4×10³⁸,精度约6–7位有效数字。其他常用类型包括:INT(16位有符号整数,−32768 至 32767)DINT(32位有符号整数,−2147483648 至 2147483647)LREAL(64位双精度浮点数,精度更高)BOOL(布尔型,TRUE/FALSE)STRING[32](定长字符串,最多32字符)
-
:=
初始化赋值操作符,由英文半角冒号:和等号=组成,中间无空格。它是ST中唯一合法的常量赋值符号(=单独使用是逻辑相等判断,=不能用于赋值)。 -
3.14159
字面量(literal),即具体的数值。对REAL类型,小数点必须存在(3是INT,3.0才是REAL)。若写3.14159265358979323846超出REAL精度,系统会自动截断或四舍五入为最接近的可表示值。 -
;
语句结束符,英文半角分号,不可省略。缺少分号将导致编译报错,且错误提示往往指向下一行,易造成误判。 -
END_CONST
常量声明区结束关键字,必须与CONST配对,且必须大写、独占一行或紧跟在最后一项常量后。它标志着常量定义块的终结,之后才能进入变量声明(VAR)、程序体(BEGIN…END)等区域。
二、完整常量声明块的标准格式(含多常量示例)
单个常量极少独立存在。实际工程中,常量按功能归类集中声明。以下为合规、清晰、可直接粘贴使用的模板:
CONST
Pi : REAL := 3.14159;
Gravitation : REAL := 9.80665; // 标准重力加速度,单位 m/s²
MaxSpeed : INT := 1500; // 电机最大转速,单位 rpm
SensorTimeout : TIME := T#500ms; // 传感器超时时间
DefaultMode : BOOL := TRUE;
END_CONST
关键格式要点:
CONST与END_CONST必须成对出现,且各自独占一行;- 每个常量占一行,格式统一为
名称 : 类型 := 值;; - 名称、冒号、类型、赋值符、值之间允许空格(增强可读性),但不可换行(如
Pi :换行再写REAL := 3.14159;是非法的); - 注释用双斜杠
//引导,从//开始至行末均被忽略,不影响语法; TIME类型需用时间字面量(如T#2s、T#100ms、T#1h30m),不可直接写100。
三、常量 vs 变量:为什么不能用 VAR 替代 CONST?
初学者常混淆 CONST 与 VAR,甚至试图写 VAR Pi : REAL := 3.14159;。这是根本性错误,原因在于二者语义与运行时行为截然不同:
| 特性 | CONST 常量 |
VAR 变量 |
|---|---|---|
| 内存分配 | 编译时确定,不占用RAM;值固化在代码段 | 运行时分配RAM空间,有实际地址 |
| 可修改性 | 绝对不可修改;任何赋值操作(如 Pi := 3.14;)编译报错 |
运行中可反复读写(Speed := Speed + 1;) |
| 作用域 | 仅限于声明所在POU(程序组织单元)内 | 可设为 VAR_GLOBAL 或 VAR_EXTERNAL 跨POU访问 |
| 初始化 | 必须初始化(:= 不可省略) |
初始化可选(未初始化则取默认值,如 REAL 默认为 0.0) |
| 用途 | 物理常量、配置阈值、枚举码、固定系数 | 实时数据、中间计算结果、状态标志 |
因此,Pi 必须用 CONST —— 它不是随时间变化的量,而是数学定义的不变量。若误用 VAR,不仅浪费内存,更埋下被意外修改的风险(如某处逻辑错误执行 Pi := 0;),导致所有依赖圆周率的计算全面失准。
四、高频错误与修正对照表
下表列出实践中90%以上的编译失败案例,每项均给出错误代码、错误原因及正确写法:
| 错误代码 | 错误原因 | 正确写法 |
|---|---|---|
CONST pi : real = 3.14159; END_CONST |
关键字大小写错误(pi, real, =) |
CONST Pi : REAL := 3.14159; END_CONST |
CONST Pi:REAL:=3.14159 END_CONST |
缺少分号 ; |
CONST Pi : REAL := 3.14159; END_CONST |
CONST Pi : REAL := 3,14159; END_CONST |
小数点用中文逗号 ,(全角) |
CONST Pi : REAL := 3.14159; END_CONST |
CONST Pi : REAL := "3.14159"; END_CONST |
对数值字面量加引号(引号仅用于 STRING 类型) |
CONST Pi : REAL := 3.14159; END_CONST |
CONST Pi : REAL; END_CONST |
CONST 必须初始化,:= 和值不可省略 |
CONST Pi : REAL := 3.14159; END_CONST |
CONST Pi : REAL := 3.14159; Const E : REAL := 2.718; END_CONST |
多个 CONST 关键字非法;应合并到一个块中 |
CONST Pi : REAL := 3.14159; E : REAL := 2.718; END_CONST |
CONST Pi : REAL := 3.14159; VAR Temp : REAL; END_VAR |
CONST 块未结束就插入 VAR;必须先 END_CONST,再写 VAR |
CONST Pi : REAL := 3.14159; END_CONST<br>VAR Temp : REAL; END_VAR |
五、进阶技巧:提升工程鲁棒性
1. 使用 LREAL 提升精度(适用于高精度计算)
当涉及长距离定位、精密温控或科学计算时,REAL 的6位精度可能不足。改用 LREAL(双精度):
CONST
Pi_Large : LREAL := 3.14159265358979323846;
PlanckConst : LREAL := 6.62607015e-34; // 普朗克常数,单位 J·s
END_CONST
2. 定义常量数组(批量同类型值)
例如电机多档转速预设:
CONST
MotorSpeeds : ARRAY[0..3] OF INT := [1000, 1200, 1400, 1500];
END_CONST
访问方式:MotorSpeeds[2] 返回 1400。
3. 基于常量派生新常量(增强可维护性)
避免重复硬编码,用已有常量组合新常量:
CONST
BaseFreq : REAL := 50.0; // 基准频率 Hz
MaxVoltage : REAL := 400.0; // 最高电压 V
VoltagePerHz: REAL := MaxVoltage / BaseFreq; // 8.0 V/Hz
END_CONST
若日后 BaseFreq 改为 60Hz,VoltagePerHz 自动更新,无需人工计算修改。
4. 用 STRING 常量统一版本与作者信息
CONST
SW_Version : STRING[16] := 'V2.3.1';
Author : STRING[32] := 'Automation Team';
BuildDate : STRING[10] := '2024-06-15';
END_CONST
可在HMI或诊断日志中直接调用,便于追溯。
六、编译与调试验证步骤
写出常量定义后,必须通过以下动作闭环验证:
- 保存文件:确保当前ST源文件已保存(快捷键
Ctrl + S)。 - 编译整个项目:点击
Build→Rebuild All(非仅编译当前POU),触发全局语法检查。 - 查看编译日志:
- 若显示
0 error(s), 0 warning(s),说明语法完全合规; - 若报错,精读第一行错误信息(如
Error 471: Expected ';'),定位到对应行号修正; - 警告(Warning)如
Warning 227: Constant not used表示该常量在程序中从未被引用,可安全删除以精简代码。
- 若显示
- 在线监控(可选):下载程序至PLC后,在线查看常量是否出现在变量监视表中(通常标记为
Const或带锁图标),确认其值恒定不变。
七、与其他IEC 61131-3语言的对比(为何ST最适配常量)
| 语言 | 常量支持情况 | 说明 |
|---|---|---|
| ST(结构化文本) | ✅ 原生支持 CONST 块,语法简洁、直观、工业界事实标准 |
推荐首选 |
| LD(梯形图) | ❌ 无显式常量声明机制 | 所有数值需硬编码在触点/线圈参数中,无法复用 |
| FBD(功能块图) | ⚠️ 部分平台支持“常量功能块”(如 REAL_CONSTANT),但需拖拽连线,不如ST声明紧凑 |
适合简单场景,复杂项目维护困难 |
| IL(指令表) | ⚠️ 可通过 LD 加载字面量,但无命名常量概念 |
已基本淘汰,不推荐新项目使用 |
| SFC(顺序功能图) | ❌ 仅描述流程,不处理数据定义 | 常量需在关联的ST或FBD中定义 |
因此,只要项目采用ST作为主编程语言,CONST 就是定义常量的唯一标准、高效、可移植方案。
八、典型应用场景清单(直接套用)
以下为电气自动化中高频使用的常量定义实例,可复制修改后立即投入工程:
// --- 设备物理参数 ---
CONST
GearRatio : REAL := 12.5; // 减速机传动比
EncoderPPR : INT := 1000; // 编码器线数(Pulses Per Revolution)
MotorPoles : INT := 4; // 电机极对数
END_CONST
// --- 控制算法参数 ---
CONST
PID_Kp : REAL := 2.5; // 比例增益
PID_Ki : REAL := 0.8; // 积分时间常数(单位 s)
PID_Kd : REAL := 0.1; // 微分时间常数(单位 s)
SampleTime : TIME := T#10ms; // PID采样周期
END_CONST
// --- 安全与报警阈值 ---
CONST
OverTempAlarm : REAL := 85.0; // 温度报警上限(℃)
UnderVoltLock : REAL := 350.0; // 欠压闭锁阈值(V)
MaxFaultCount : INT := 3; // 允许连续故障次数
END_CONST
// --- 通信与协议 ---
CONST
ModbusSlaveID : INT := 1; // Modbus从站地址
BaudRate : INT := 115200; // 串口波特率
TimeoutMS : TIME := T#200ms; // 通信超时
END_CONST
每组常量按功能隔离,注释直指用途,后续修改只需调整数值,无需搜索全部代码。
九、最佳实践总结( checklist )
- 命名即文档:用
MaxConveyorSpeed代替Speed1,用EmergencyStopDelay代替Delay3; - 单位显式标注:在注释中写明单位(如
// ℃,// rpm,// ms),杜绝歧义; - 避免跨POU常量:如需全局共享,创建专用
GVL_Constants全局变量列表(GVL),在其中用VAR_GLOBAL CONSTANT声明; - 定期清理:每轮版本迭代后,运行“未使用变量/常量”扫描工具,删除冗余项;
- 版本控制:将常量定义文件纳入Git/SVN,每次修改提交清晰日志(如
chore(const): update Pi to 3.14159265 for precision)。
十、结语:常量是程序的基石,而非装饰
CONST Pi : REAL := 3.14159; END_CONST 这11个单词、2个符号、1个数值,构成的不仅是语法正确的代码行,更是自动化系统确定性的第一道防线。它把抽象的数学真理,转化为PLC可执行、可验证、可传承的工程事实。写好常量,就是为整个控制逻辑铺设平整的地基——后续所有变量运算、逻辑判断、故障诊断,都将稳固立于其上。

暂无评论,快来抢沙发吧!