3. iQ-F编程基础与标签化设计

三菱iQ-F系列(FX5U/FX5UC)在编程方式上与传统FX系列最大的区别之一,就是全面支持IEC 61131-3风格的标签化编程。过去我们习惯用X0、Y0、M100、D200这类软元件直接编程,程序可读性差、复用困难;而标签化设计允许我们给每个信号起一个有业务含义的名字,例如Start_PB、Motor_Run、Conveyor_Speed_SP,让程序从"地址堆砌"变成"语义表达"。本节围绕三种编程语言的特点、标签的定义与分类,以及如何用标签完成一个电机启停程序展开。

一、ST、LD、FBD三种语言的特点与适用场景

GX Works3支持多种编程语言,本节重点掌握三种:梯形图(LD)、结构化文本(ST)和功能块图(FBD)。它们不是互相替代的关系,而是各有擅长的表达领域。

梯形图(LD)是最贴近继电器逻辑的语言,以触点、线圈、功能指令块构成。它的优势在于"看得见电流通路":串联是"与"、并联是"或"、常闭触点是取反,非常适合表达联锁、启保停、互锁、急停链这类开关量逻辑。对于现场电工和维护人员,梯形图的可读性最高,排查故障时能顺着能流方向逐点测量。缺点是处理复杂数学运算、循环、数组和字符串时非常笨拙。

结构化文本(ST)是类Pascal的高级语言,支持IF…THEN…ELSIF…ELSE、CASE、FOR、WHILE等结构,以及丰富的运算符和函数。它适合表达:多条件判断、配方计算、数据换算(如模拟量标定)、状态机、循环处理。ST代码紧凑,一段十几行的ST可能等价于几十个梯形图网络。缺点是对纯开关量逻辑不如梯形图直观,且需要一定的编程基础。

功能块图(FBD)以方块和连线表达数据流,输入在左、输出在右,块与块之间用信号线连接。它特别适合表达信号处理链,例如"模拟量输入→滤波→标定→限幅→输出"这样的连续处理过程,也适合调用标准功能块(如PID、定时器、计数器)。FBD的视觉逻辑是"数据从哪来、经过什么处理、到哪去",与梯形图的"能流"逻辑不同。

选择语言的实用原则:开关量联锁与启保停优先用LD;数学运算、状态机、批量数据处理优先用ST;信号处理链和功能块调用优先用FBD。同一个项目中三种语言可以混用,在GX Works3中不同POU(程序组织单元)可各自选择语言。

二、全局标签与局部标签

标签按作用范围分为全局标签和局部标签,这是结构化编程的基础。

全局标签(Global Label)在整个项目中可见,任何POU都能引用。它通常对应实际的物理I/O、HMI交互点、跨程序共享的中间变量。定义时需要指定:标签名、数据类型、软元件分配(如X0、Y0、D100)或直接使用标签软元件。例如:

标签名              数据类型    软元件      说明
Start_PB           BOOL        X0          启动按钮(常开)
Stop_PB            BOOL        X1          停止按钮(常闭)
Motor_Run          BOOL        Y0          电机运行输出
Motor_Speed_SP     INT         D100        速度设定值
Motor_Speed_PV     INT         D200        速度反馈值

局部标签(Local Label)只在定义它的POU内部有效,外部程序无法访问。它用于存放该程序段内部的临时变量、中间计算结果、循环计数器等。局部标签不分配实际软元件(或分配在局部标签区),因此不会与其他程序产生地址冲突,也不会污染全局命名空间。这是模块化设计的关键:每个功能块内部自洽,只通过输入/输出参数与外界交互。

两者的关系可以这样理解:全局标签是"公共接口",局部标签是"内部实现"。一个好的结构化程序,应该让每个POU尽量只依赖自己的局部标签和少量明确的全局接口,而不是随意读写全局软元件。

iQ-F 标签化编程:全局标签与局部标签的作用域 全局标签区(项目内所有POU可见) Start_PB : BOOL X0 启动按钮 Stop_PB : BOOL X1 停止按钮 Motor_Run : BOOL Y0 运行输出 Speed_SP : INT D100 速度设定 Speed_PV D200 反馈 作用:物理I/O映射、HMI交互、跨程序共享数据;命名需全局唯一,避免随意读写。 程序组织单元 POU(每个POU内部使用局部标签) POU1:电机启停控制(LD) 局部标签: StartEdge : BOOL StopEdge : BOOL RunLatch : BOOL 仅本POU可见,不占用全局地址 通过全局标签读写I/O POU2:速度处理(ST) 局部标签: RawVal : INT Scaled : REAL i : INT 用于标定计算与循环 结果写回全局Speed_PV POU3:报警处理(FBD) 局部标签: AlmDelay : TON AlmFlag : BOOL FltCode : INT 功能块实例为局部标签 避免多POU定时器冲突

三、用标签完成电机启停程序

下面以一台三相异步电机的启停控制为例,说明标签化程序的完整实现过程。控制要求:按下启动按钮(X0,常开),电机运行(Y0=ON);按下停止按钮(X1,常闭),电机停止;具备过载保护(X2,常闭,过载时断开)。

第一步:定义全局标签。在GX Works3的"全局标签"中建立:

Start_PB     BOOL   X0    启动按钮(常开,按下为ON)
Stop_PB      BOOL   X1    停止按钮(常闭,正常为ON)
Overload_FB  BOOL   X2    过载保护(常闭,正常为ON)
Motor_Run    BOOL   Y0    电机运行输出

第二步:编写LD程序。用标签替代软元件,梯形图网络为:Start_PB常开触点与Motor_Run常开触点并联,再与Stop_PB常闭触点、Overload_FB常闭触点串联,最后驱动Motor_Run线圈。这就是标准的启保停电路:启动按钮提供启动脉冲,Motor_Run自锁保持,停止按钮或过载断开时解除自锁。

第三步:用ST实现同样的逻辑(对比理解)。在ST中,启保停可以写成:

IF Start_PB AND Stop_PB AND Overload_FB THEN
    Motor_Run := TRUE;
ELSIF NOT Stop_PB OR NOT Overload_FB THEN
    Motor_Run := FALSE;
END_IF;

注意这里Stop_PB和Overload_FB是常闭输入,正常状态下为TRUE,所以启动条件是三者都为TRUE;一旦停止按钮被按下(变为FALSE)或过载动作(变为FALSE),Motor_Run立即置FALSE。这段ST与梯形图逻辑等价,但表达方式不同:梯形图靠触点串并联,ST靠条件判断。

第四步:加入局部标签优化。如果希望程序更规范,可以在POU内定义局部标签RunCmd : BOOL作为中间变量,先计算启动条件,再驱动输出。这样做的价值在于:当逻辑变复杂时,中间变量让程序分层,便于调试和复用。

常见错误:把停止按钮和过载保护在标签定义时误设为常开(NO),导致程序逻辑反相。务必确认物理触点的常开/常闭类型与标签定义一致,并在程序中用常闭触点或NOT运算正确处理。另一个常见问题是局部标签与全局标签重名,GX Works3会报错或产生歧义,命名时应加前缀区分,如局部变量用l_、全局变量用g_。

四、结构化编程思维的建立

标签化不只是"给地址起名字",它背后是结构化编程的思想:把一个大程序拆成若干功能独立的POU,每个POU有明确的输入、输出和内部状态,通过全局标签定义的接口进行数据交换。这样做的直接好处是:程序可读性提升、调试范围缩小、功能可以复制到其他项目复用。

建议在实际项目中遵循以下习惯:全局标签只保留I/O映射和跨POU共享数据,数量尽量少;每个功能POU内部的计算、定时器、中间状态都用局部标签;命名采用"对象_功能_类型"的格式,如Motor_Run、Conveyor_Speed_SP;对模拟量、定时器、计数器等功能块实例,一律用局部标签定义,避免多个POU共用同一个定时器软元件造成冲突。