ST怎么写常量定义:CONST Pi : REAL := 3.14159; END_CONST

发布于 2026-03-15 09:00:01 · 浏览 3 次 · 评论 0 条

在结构化文本(Structured Text,ST)编程中,常量定义是构建可靠、可维护自动化程序的基础环节。它让关键数值、物理常量、设备参数等以明确名称出现,避免“魔法数字”(如直接写 3.14159273.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 不是一行随意输入的代码,而是由严格语法结构组成的声明单元。逐部分解析如下:

  1. CONST
    这是ST语言的关键字,表示“常量声明区”的开始。它必须独占一行或作为声明块的首标识符,且必须大写(IEC 61131-3规定关键字区分大小写,constConst 均为非法)。

  2. Pi
    这是用户自定义的常量标识符(名称)。命名需遵守以下规则:

    • 仅含英文字母(a–z, A–Z)、数字(0–9)和下划线 _
    • 必须以字母或下划线开头1PiPi!Pi Value 均非法);
    • 区分大小写(PIpiPi 是三个不同标识符);
    • 不得与ST保留字(如 IFWHILEREALCONST)重名。
  3. :
    英文半角冒号,是类型声明的引导符号,不可省略,也不可用中文冒号 替代。

  4. 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字符)
  5. :=
    初始化赋值操作符,由英文半角冒号 : 和等号 = 组成,中间无空格。它是ST中唯一合法的常量赋值符号(= 单独使用是逻辑相等判断,= 不能用于赋值)。

  6. 3.14159
    字面量(literal),即具体的数值。对 REAL 类型,小数点必须存在(3INT3.0 才是 REAL)。若写 3.14159265358979323846 超出 REAL 精度,系统会自动截断或四舍五入为最接近的可表示值。

  7. ;
    语句结束符,英文半角分号,不可省略。缺少分号将导致编译报错,且错误提示往往指向下一行,易造成误判。

  8. END_CONST
    常量声明区结束关键字,必须与 CONST 配对,且必须大写、独占一行或紧跟在最后一项常量后。它标志着常量定义块的终结,之后才能进入变量声明(VAR)、程序体(BEGINEND)等区域。


二、完整常量声明块的标准格式(含多常量示例)

单个常量极少独立存在。实际工程中,常量按功能归类集中声明。以下为合规、清晰、可直接粘贴使用的模板:

CONST
    Pi              : REAL  := 3.14159;
    Gravitation     : REAL  := 9.80665;   // 标准重力加速度,单位 m/s²
    MaxSpeed        : INT   := 1500;      // 电机最大转速,单位 rpm
    SensorTimeout   : TIME  := T#500ms;   // 传感器超时时间
    DefaultMode     : BOOL  := TRUE;
END_CONST

关键格式要点:

  • CONSTEND_CONST 必须成对出现,且各自独占一行;
  • 每个常量占一行,格式统一为 名称 : 类型 := 值;
  • 名称、冒号、类型、赋值符、值之间允许空格(增强可读性),但不可换行(如 Pi : 换行再写 REAL := 3.14159; 是非法的);
  • 注释用双斜杠 // 引导,从 // 开始至行末均被忽略,不影响语法;
  • TIME 类型需用时间字面量(如 T#2sT#100msT#1h30m),不可直接写 100

三、常量 vs 变量:为什么不能用 VAR 替代 CONST?

初学者常混淆 CONSTVAR,甚至试图写 VAR Pi : REAL := 3.14159;。这是根本性错误,原因在于二者语义与运行时行为截然不同:

特性 CONST 常量 VAR 变量
内存分配 编译时确定,不占用RAM;值固化在代码段 运行时分配RAM空间,有实际地址
可修改性 绝对不可修改;任何赋值操作(如 Pi := 3.14;)编译报错 运行中可反复读写(Speed := Speed + 1;
作用域 仅限于声明所在POU(程序组织单元)内 可设为 VAR_GLOBALVAR_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 改为 60HzVoltagePerHz 自动更新,无需人工计算修改。

4. 用 STRING 常量统一版本与作者信息

CONST
    SW_Version  : STRING[16] := 'V2.3.1';
    Author      : STRING[32] := 'Automation Team';
    BuildDate   : STRING[10] := '2024-06-15';
END_CONST

可在HMI或诊断日志中直接调用,便于追溯。


六、编译与调试验证步骤

写出常量定义后,必须通过以下动作闭环验证:

  1. 保存文件:确保当前ST源文件已保存(快捷键 Ctrl + S)。
  2. 编译整个项目:点击 BuildRebuild All(非仅编译当前POU),触发全局语法检查。
  3. 查看编译日志
    • 若显示 0 error(s), 0 warning(s),说明语法完全合规;
    • 若报错,精读第一行错误信息(如 Error 471: Expected ';'),定位到对应行号修正;
    • 警告(Warning)如 Warning 227: Constant not used 表示该常量在程序中从未被引用,可安全删除以精简代码。
  4. 在线监控(可选):下载程序至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可执行、可验证、可传承的工程事实。写好常量,就是为整个控制逻辑铺设平整的地基——后续所有变量运算、逻辑判断、故障诊断,都将稳固立于其上。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文