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的视觉逻辑是"数据从哪来、经过什么处理、到哪去",与梯形图的"能流"逻辑不同。
二、全局标签与局部标签
标签按作用范围分为全局标签和局部标签,这是结构化编程的基础。
全局标签(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尽量只依赖自己的局部标签和少量明确的全局接口,而不是随意读写全局软元件。
三、用标签完成电机启停程序
下面以一台三相异步电机的启停控制为例,说明标签化程序的完整实现过程。控制要求:按下启动按钮(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作为中间变量,先计算启动条件,再驱动输出。这样做的价值在于:当逻辑变复杂时,中间变量让程序分层,便于调试和复用。
l_、全局变量用g_。四、结构化编程思维的建立
标签化不只是"给地址起名字",它背后是结构化编程的思想:把一个大程序拆成若干功能独立的POU,每个POU有明确的输入、输出和内部状态,通过全局标签定义的接口进行数据交换。这样做的直接好处是:程序可读性提升、调试范围缩小、功能可以复制到其他项目复用。
建议在实际项目中遵循以下习惯:全局标签只保留I/O映射和跨POU共享数据,数量尽量少;每个功能POU内部的计算、定时器、中间状态都用局部标签;命名采用"对象_功能_类型"的格式,如Motor_Run、Conveyor_Speed_SP;对模拟量、定时器、计数器等功能块实例,一律用局部标签定义,避免多个POU共用同一个定时器软元件造成冲突。