三菱结构化编程是基于 IEC 61131-3 标准的模块化编程方法,核心是将复杂程序拆分为功能块(FB)、功能(FC)、程序组织单元(POU) 等独立模块,提升代码的复用性、可读性和维护性。以下从核心概念、学习路径、实战案例、关键技巧四个维度,系统梳理三菱三菱结构化编程的学习方法:
一、先搞懂结构化编程的核心概念(区别于传统线性编程)
相比传统的 “从头到尾” 线性编程(如三菱早期的 F 系列 PLC),结构化编程的核心是 “模块化拆分”,需先理解三个关键要素:
程序组织单元(POU)整个程序的 “大框架”,包括:
主程序(Main):程序入口,负责调用其他模块(如 FB、FC),自身不处理具体逻辑;
功能(FC,Function):无内部状态的 “工具模块”,输入参数→处理→输出结果(类似数学函数),如 “计算平均值”“单位转换”,调用后不保存数据(如 FC1 被调用 100 次,每次都是独立计算);
功能块(FB,Function Block):带内部状态的 “独立单元”,有自己的 “记忆”(内部变量断电保持),如 “电机控制”“计数器”,调用时需分配背景数据块(DB)存储状态(如 FB1 调用两次,需两个不同 DB,分别记录两台电机的运行状态)。
数据类型与变量
基础类型:BOOL(布尔)、INT(整数)、REAL(浮点数)等;
自定义类型(UDT):将多个基础类型组合成新类型,如 “工件信息”=INT(长度)+REAL(重量)+BOOL(合格标志),简化变量管理;
变量作用域:全局变量(整个程序可访问)、局部变量(仅在模块内部生效,如 FB 的输入 / 输出参数)。
调用与实例化
FC 调用:直接输入参数即可(如
FC_计算平均值(IN1, IN2, OUT)
);FB 实例化:调用时必须分配背景 DB(如
FB_电机控制_DB1(启动信号, 停止信号)
),DB1 会保存该 FB 的当前状态(如是否运行、累计时间)。
二、分阶段学习路径(从软件操作到实战)
以三菱主流 PLC(FX5 系列、Q 系列)和编程软件 GX Works3 为例,分 3 个阶段进阶:
阶段 1:掌握软件操作与基础模块创建
软件环境熟悉
新建结构化工程:GX Works3 中选择 “结构化工程”(区别于 “简单工程”),勾选 “支持 IEC 61131-3”;
理解工程结构:左侧 “导航窗口” 中,“程序” 文件夹存放 POU,“数据” 文件夹存放 DB 和 UDT。
创建第一个 FC(功能)示例:写一个 “两数相加” 的 FC,输入 IN1、IN2(INT 类型),输出 OUT(INT 类型)。
步骤:右键 “程序”→新建→功能(FC)→命名 “FC_加法”;
编辑界面:左侧定义变量(IN1:INT, IN2:INT, OUT:INT),右侧梯形图 / ST 语言编写逻辑(
OUT := IN1 + IN2;
);调用:在主程序中拖拽 “FC_加法”,关联实际变量(如 IN1=D0, IN2=D2, OUT=D4)。
创建第一个 FB(功能块)示例:写一个 “电机启停控制” FB,包含启动、停止、过载保护逻辑,记录运行时间。
输入(IN):启动信号(BOOL)、停止信号(BOOL)、过载信号(BOOL);
输出(OUT):运行状态(BOOL)、故障报警(BOOL);
内部变量(TEMP/STATIC):运行时间(INT,STATIC 类型才会被 DB 保存);
步骤:右键 “程序”→新建→功能块(FB)→命名 “FB_电机控制”,分配背景 DB(如 DB1);
定义变量:
编写逻辑:
stl
// ST语言示例 IF 停止信号 OR 过载信号 THEN 运行状态 := FALSE; 故障报警 := 过载信号; ELSIF 启动信号 THEN 运行状态 := TRUE; 运行时间 := 运行时间 + 1; // 每扫描周期+1(需配合定时器实际计时) END_IF;
实例化调用:在主程序中调用
FB_电机控制_DB1(启动按钮, 停止按钮, 热继信号, 电机运行灯, 报警灯)
,DB1 会自动记录该电机的运行时间和状态。
阶段 2:学习模块化设计思维(核心难点)
结构化编程的关键不是 “会用 FB/FC”,而是 “如何拆分模块”,遵循以下原则:
按功能拆分:将生产线按 “工序” 或 “设备” 拆分为独立 FB,如:
一条包装线可拆分为:
FB_上料机构
、FB_输送机构
、FB_封口机构
、FB_下料机构
;每个 FB 只处理自身逻辑(如
FB_输送机构
仅负责启停、速度调节、故障检测),通过输入 / 输出参数与其他 FB 交互(如FB_上料机构.完成信号
作为FB_输送机构.启动信号
)。高内聚低耦合:
内聚:一个模块只做一件事(如
FB_计数器
只负责计数,不掺杂报警逻辑);耦合:模块间通过参数传递数据,避免直接读写对方的内部变量(如
FB_电机A
不应直接修改FB_电机B.DB
的数据)。复用性设计:
通用功能做成 FC:如 “定时器延时”“数据滤波”“报警复位”,可被多个 FB 调用;
同类设备用同一 FB 实例化:如 3 台输送带,只需一个
FB_输送控制
,通过 3 个不同 DB(DB1/DB2/DB3)分别控制,避免重复编写 3 套代码。
阶段 3:结合实际场景实战(以生产线为例)
以 “小型装配生产线” 为例,完整结构化程序设计流程:
需求分析:生产线包含上料、搬运、检测、下料 4 个工位,需实现自动循环、手动操作、报警功能。
模块拆分:
全局变量:总启动、总停止、急停(供所有模块使用);
工位 FB:
FB_上料
、FB_搬运
、FB_检测
、FB_下料
(各带启动、完成、故障信号);通用 FC:
FC_延时启动
(处理工位间的等待逻辑)、FC_报警处理
(统一管理故障信息);主程序:调用各 FB,按 “上料完成→搬运启动→检测启动→下料启动→循环” 的逻辑串联。
关键代码示例(主程序 ST 语言):
stl
// 主程序逻辑 IF 总停止 OR 急停 THEN // 停止所有工位 FB_上料_DB1(启动:=FALSE, ...); FB_搬运_DB2(启动:=FALSE, ...); ... ELSIF 总启动 THEN // 上料工位启动 FB_上料_DB1(启动:=TRUE, 完成=>上料完成); // 上料完成后,启动搬运 IF 上料完成 THEN FB_搬运_DB2(启动:=TRUE, 完成=>搬运完成); END_IF; // 搬运完成后,启动检测(通过FC延时1秒) FC_延时启动(IN:=搬运完成, 延时:=1000, OUT=>检测启动); FB_检测_DB3(启动:=检测启动, 完成=>检测完成); // 检测完成后启动下料,下料完成后循环 IF 检测完成 THEN FB_下料_DB4(启动:=TRUE, 完成=>下料完成); IF 下料完成 THEN 上料完成 := FALSE; // 复位标志,准备下次循环 END_IF; END_IF; END_IF;
调试技巧:
用 GX Works3 的 “监视模式” 查看各 FB 的背景 DB,实时监控内部变量(如
FB_上料_DB1.运行状态
);单个模块调试通过后再联调,避免多个模块问题交织。
三、避坑指南与进阶技巧
变量管理:
优先用 UDT 定义复杂数据(如 “产品参数”),避免大量零散变量;
全局变量集中放在 “全局 DB” 中,注明用途(如
全局DB.设备状态
),减少 “魔法数字”。FB 与 FC 的选择:
无状态逻辑用 FC(如计算、转换);
有状态保持(需记录历史)用 FB(如电机、阀门,需记住当前是否运行)。
版本控制:
复杂工程建议用 GX Works3 的 “版本管理” 功能,或导出 XML 备份,避免模块修改后无法回溯。
兼容传统梯形图:三菱结构化编程支持 “梯形图 + ST 语言混合编程”,可在 FB 内部用梯形图实现简单逻辑,ST 语言实现复杂运算,兼顾习惯与效率。
四、学习资源推荐
官方手册:《GX Works3 结构化编程入门》《三菱 PLC 功能块应用指南》(官网可下载);
视频教程:三菱电机官方培训视频(B 站搜索 “三菱结构化编程”);
实战练习:用 GX Works3 模拟 “自动门控制”“交通灯控制”,尝试用 FB 拆分逻辑(如
FB_开门
、FB_关门
、FB_传感器检测
)。
从简单的 FB 创建开始,逐步过渡到完整生产线的模块化设计,重点培养 “拆分问题” 的思维 —— 这才是结构化编程的核心价值。