// ====================================// FB名:MtrCtrl
// 功能:电机启停+过载保护逻辑
// ====================================
FUNCTION_BLOCK MtrCtrl
VAR_INPUT
i_Start : BOOL; // 启动按钮
i_Stop : BOOL; // 停止按钮
i_Overload : BOOL; // 过载触点
END_VAR
VAR_OUTPUT
o_Run : BOOL; // 运行输出
o_Fault : BOOL; // 故障输出
END_VAR
VAR
b_Keep : BOOL; // 自保持内部变量(每个实例独立)
END_VAR
// 自保持回路:启动+运行→保持;停止或过载→解除
b_Keep := (i_Start OR b_Keep) AND NOT i_Stop AND NOT i_Overload;
o_Run := b_Keep;
o_Fault := i_Overload;
END_FUNCTION_BLOCK
关键点:b_Keep 在VAR段声明,是FB的"私有内存"。实例A的b_Keep和实例B的b_Keep互不干扰,这是FB能多实例化的根基。
二、为什么必须用FB——4个被验证过的工程价值
价值1:开发效率提升60%以上
某汽车焊装线,128个气缸+64个变频器+32个伺服轴。不用FB时,每个气缸的"两位三通阀+磁感应开关+延时控制"逻辑约30步梯形图,128个=3840步重复代码。用FB封装后,主程序调用128次 CylCtrl(实例名),工程文件体积减少70%。
价值2:现场故障定位从小时级降到分钟级
FB的实例名直接对应现场设备名(Mtr_Pump01、Mtr_Fan03),GX Works3的"FB实例管理"能一键查看每个实例的当前输入输出值。某水处理项目,单台PLC控制40台水泵,检修某台泵故障时直接看 Mtr_Pump15 状态,不用全局搜索。
价值3:版本管理清晰
FB支持"库文件(.fbk)"形式导入导出。同一套电机控制FB,可以从R04CPU项目导出,直接导入R16CPU项目,逻辑零修改。设备厂家调试组和现场调试组用同一份FB库,杜绝"代码漂移"。
价值4:结构化标签自动同步
iQ-R的全局标签+FB本地标签,配合GX Works3的"标签批量替换",改一次设备编号,所有调用点同步更新。
三、3个实战案例:从单设备到产线级
案例1:单电机启停(基础)
主程序调用(
Main.st):
``st
PROGRAM Main
VAR
// 声明FB实例,每个实例独立内存
fb_Mtr_Pump01 : MtrCtrl;
fb_Mtr_Pump02 : MtrCtrl;
fb_Mtr_Fan01 : MtrCtrl;
END_VAR
// Pump01:X0启动,X1停止,X10过载 → Y0运行,Y20故障
fb_Mtr_Pump01(
i_Start := X0,
i_Stop := X1,
i_Overload := X10,
o_Run => Y0,
o_Fault => Y20
);
// Pump02:X2启动,X3停止,X11过载 → Y1运行,Y21故障
fb_Mtr_Pump02(
i_Start := X2,
i_Stop := X3,
i_Overload := X11,
o_Run => Y1,
o_Fault => Y21
);
// Fan01:X4启动,X5停止,X12过载 → Y2运行,Y22故障
fb_Mtr_Fan01(
i_Start := X4,
i_Stop := X5,
i_Overload := X12,
o_Run => Y2,
o_Fault => Y22
);
END_PROGRAM
3台不同设备,逻辑零重复。改过载保护逻辑?只改 MtrCtrl.fbk 一个文件,3处同步生效。
案例2:多段速变频器控制(中等复杂度)
FB定义(VfdMs3.fbk
):FUNCTION_BLOCK VfdMs3
VAR_INPUT
i_Run : BOOL; // 运行命令
i_SpeedSel : INT; // 速度选择 0=停 1=低速 2=中速 3=高速
i_Fault : BOOL; // 外部故障
END_VAR
VAR_OUTPUT
o_Fwd : BOOL; // 正转
o_Rev : BOOL; // 反转
o_Ms1 : BOOL; // 多段速端子1
o_Ms2 : BOOL; // 多段速端子2
o_Rdy : BOOL; // 准备就绪
END_VAR
o_Fwd := i_Run AND (i_SpeedSel > 0) AND NOT i_Fault;
o_Rev := FALSE; // 本项目不允许反转
o_Ms1 := (i_SpeedSel = 1) OR (i_SpeedSel = 3);
o_Ms2 := (i_SpeedSel = 2) OR (i_SpeedSel = 3);
o_Rdy := NOT i_Fault;
END_FUNCTION_BLOCK
案例3:PID温控FB(高级,含定时器+运算)
FUNCTION_BLOCK PidTemp
VAR_INPUT
i_Pv : REAL; // 过程温度(℃)
i_Sv : REAL; // 设定值(℃)
i_Enable : BOOL; // 启用
i_Kp : REAL; // 比例带
i_Ki : REAL; // 积分时间
END_VAR
VAR_OUTPUT
o_Mv : REAL; // 输出0-100%
o_At : BOOL; // 自动调谐中
END_VAR
VAR
r_Err : REAL;
r_Integral : REAL;
fb_Ton : TON; // 嵌套定时器
END_VAR
fb_Ton(IN := i_Enable, PT := T#100ms);
r_Err := i_Sv - i_Pv;
r_Integral := r_Integral + r_Err * 0.1;
o_Mv := LIMIT(0.0, i_Kp r_Err + i_Ki r_Integral, 100.0);
o_At := fb_Ton.Q;
END_FUNCTION_BLOCK
FB支持嵌套调用(FB内调用另一个FB),fb_Ton : TON` 即为定时器FB的实例。
四、iQ-R CPU选型表——FB越多,CPU越要挑对
FB实例化会消耗CPU的程序容量和软元件资源。100个简单FB约需15K步,100个含PID的复杂FB约需80K步。
| 型号 | 程序容量 | FB推荐规模 | 典型应用 |
| R00CPU | 10K步 | ≤20个简单FB | 小型单机 |
| R01CPU | 15K步 | ≤50个简单FB | 小型产线 |
| R02CPU | 20K步 | ≤80个简单FB | 中型设备 |
| R04CPU | 40K步 | ≤200个FB | 主流产线 |
| R08CPU | 80K步 | ≤500个FB | 大型工厂 |
| R16CPU | 160K步 | ≤1200个FB | 整厂控制 |
| R32CPU | 320K步 | ≤3000个FB | 过程控制 |
| R120CPU | 1200K步 | 万级FB | 超大规模 |
选型建议:
●10-50个设备的小项目 → R01CPU/R02CPU
●50-200个设备的产线 → R04CPU(性价比主力,FB库容量够用)
●200+设备或复杂过程控制 → R08CPU及以上
●涉及C语言扩展 → 配R12CCPU-V
●涉及安全功能 → 配R08SFCPU-R16SFCPU
推荐阅读
6步搞定三菱iQ-R FB封装+3套实战代码,PLC编程效率直接翻倍
发布于 2026-06-18
三菱伺服 04:伺服与 PLC 联动实战——从硬件接线、参数配置到 ST 编程,1 套模板搞定单轴定位
发布于 2026-06-13
三菱机械手轨迹规划与编程:从直线到复杂曲线
发布于 2026-06-12
KEYWORDS
PLC, GX Works, MELSEC, 三菱, 梯形图
如果你觉得这篇文章有帮助,请点个在看,分享给更多需要的人!
关注我,获取更多实用干货~
有问题欢迎评论区留言交流!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!