『7x24小时有问必答』

3个核心技巧+5个实战案例,30分钟搞定iQ-R FB编程

你刚接手三菱iQ-R项目,打开GX Works3想用FB,发现里面一堆标准库函数不会调;自己写个电机控制FB,结果引脚搞错,调用时变量乱飞。不用慌。FB的本质是“搭积木”,三菱官方给R系列准备了300+标准FB,但真正高效的工程人员只自己写20%的业务核心FB,剩下的全用现成库。本文用真实代码和参数表,15分钟让你掌握FB从创建到调试的全流程。

第一章 FB基础:为什么iQ-R系列必须用FB?

1.1 FB不是函数块,是“图纸模板”

传统梯形图写500步电机控制程序,重复出现10次就需要复制10次。FB相当于把这段逻辑封装成一张“图纸”,每次调用只需填参数。三菱iQ-R系列CPU(如R04CPU、R08CPU)支持最大5000个FB实例,每个实例独立占用内存约260字节(R08CPU为例),相比Q系列每个实例占用更高,但R系列CPU时钟频率最高240MHz,完全吃得消。
核心优势
:   
复用率提升80%:一套电机控制FB可在全厂100台设备通用   
调试时间缩短50%:修改FB本体,所有调用点自动更新   
程序可读性:别人看你程序,只看FB名称就能猜功能

1.2 三菱标准FB库与自定义FB的选择

FB类型来源适用场景实例数限制
标准库FB(如M+、MELSEC FB Library)三菱官网/安装包自带通讯、位置控制、PID无限制,但需导入库
系统FB(如ZP、ZT)GX Works3内置硬件中断、高速计数每个CPU固定数量
自定义FB工程师自己写业务逻辑、设备控制受CPU内存限制
选型建议
:对标准功能(如交通灯、电机启停)优先用标准库,减少测试成本;对特殊工艺(如配方管理、安全逻辑)必须自建FB。

第二章 手把手创建第一个自定义FB(ST语言+梯形图混合)

2.1 准备工作:GX Works3工程设置

型号:R08CPU(主基板2槽,电源模块R61P,I/O模块RX40/41)
编程语言:主程序用梯形图,FB内部用ST语言(结构化文本)
命名规范:FB名称前缀FB_,变量前缀根据类型:i_(输入)、o_(输出)、v_(内部变量)

2.2 新建FB步骤

1.在Project View → POU → FB → 右键“Add New Data”2.选择“Function Block”,语言选“ST”(结构化文本)3.定义引脚:在“Variables”选项卡中设置输入/输出
代码块1:FB引脚定义(ST声明区)
( 电机启停控制FB - 带急停与状态反馈 )
FUNCTION_BLOCK FB_MotorControl
VAR_INPUT
i_Start : BOOL;            ( 启动按钮 )
i_Stop : BOOL;             ( 停止按钮 )
i_Emergency : BOOL;        ( 急停按钮(常闭触点) )
i_Overload : BOOL;         ( 过载保护反馈 )
END_VAR
VAR_OUTPUT
o_Run : BOOL;              ( 运行输出(去接触器) )
o_Fault : BOOL;            ( 故障报警 )
o_State : WORD;            ( 状态字: bit0=运行, bit1=急停, bit2=过载 )
END_VAR
VAR
v_RunFF : BOOL;            ( 自保持中间变量 )
v_Timer : TON;             ( 启动延时定时器 )
END_VAR

2.3 写FB逻辑(ST代码)

代码块2:核心执行逻辑
( 急停检测:急停信号为常闭,0表示急停按下 )
IF i_Emergency = FALSE THEN
o_Fault := TRUE;
v_RunFF := FALSE;
ELSE
o_Fault := FALSE;
END_IF;
( 过载保护 )
IF i_Overload = TRUE THEN
o_Fault := TRUE;
v_RunFF := FALSE;
END_IF;
( 启停自保持逻辑 )
IF i_Start = TRUE AND o_Fault = FALSE THEN
v_RunFF := TRUE;
END_IF;
IF i_Stop = TRUE OR o_Fault = TRUE THEN
v_RunFF := FALSE;
END_IF;
( 启动延时2秒 )
v_Timer(IN := v_RunFF, PT := T#2S);
o_Run := v_Timer.Q;
( 状态字打包 )
o_State.0 := o_Run;
o_State.1 := NOT i_Emergency;   ( 急停按下时bit1=1 )
o_State.2 := i_Overload;

2.4 在主程序中调用FB

代码块3:梯形图调用FB(在Main程序中)
// 调用FB_MotorControl实例,实例名为MC1
// 网络注释:1#电机控制
[FB]   FB_MotorControl
MC1
+--+--+--+--+
|   i_Start |---X0
|   i_Stop  |---X1
|   i_Emergency|---X2
|   i_Overload|---X3
+--+--+--+--+
|   o_Run   |---Y20
|   o_Fault |---Y21
|   o_State |---D100
+--+--+--+--+
关键数据
:与传统做法对比
指标传统梯形图(5个电机)FB方式(5个实例)
梯形图步数250步40步(FB内部)+ 5步调用 = 45步
变量数量30个全局变量5个实例变量 + 5个输入/输出点
调试修改时间修改5处修改FB本体1次
可读性需逐段分析看FB名称即懂

第三章 实战案例:带定时器/计数器的多工位压力机FB

3.1 工艺要求

4个工位,每个工位需要:
启动后保压5秒   
加压次数计数到10自动停止   
检测到压力不足报警并停机

3.2 创建高级FB结构

FB引脚设计:
引脚数据类型说明
i_StartBOOL启动
i_PressureOKBOOL压力传感器OK信号
i_ManualResetBOOL手动复位计数
o_ValveOnBOOL输出阀控制
o_AlarmBOOL报警输出
o_CountUINT当前计数(可显示)
i_SetCountUINT设定计数(默认10)
代码块4:压力机FB内部逻辑(带定时器和计数器)
FUNCTION_BLOCK FB_PressStation
VAR_INPUT
i_Start : BOOL;
i_PressureOK : BOOL;
i_ManualReset : BOOL;
i_SetCount : UINT := 10;    ( 默认设定值 )
END_VAR
VAR_OUTPUT
o_ValveOn : BOOL;
o_Alarm : BOOL;
o_Count : UINT;
END_VAR
VAR
v_CycleFF : BOOL;           ( 循环自保持 )
v_TimerTOF : TOF;           ( 保压延时(下降沿延时) )
v_Counter : CTU;            ( 加计数 )
v_AlarmFF : BOOL;
END_VAR
( 启动自保持 )
IF i_Start = TRUE THEN
v_CycleFF := TRUE;
ELSIF i_ManualReset = TRUE THEN
v_CycleFF := FALSE;
END_IF;
( 压力检测失败超时报警 )
IF v_CycleFF = TRUE AND i_PressureOK = FALSE THEN
v_AlarmFF := TRUE;
o_Alarm := TRUE;
ELSIF i_ManualReset = TRUE THEN
v_AlarmFF := FALSE;
o_Alarm := FALSE;
END_IF;
( 无报警时输出阀 )
IF v_CycleFF = TRUE AND v_AlarmFF = FALSE THEN
o_ValveOn := TRUE;
ELSE
o_ValveOn := FALSE;
END_IF;
( 保压5秒:压力OK后延时关闭 )
v_TimerTOF(IN := o_ValveOn, PT := T#5S);
IF v_TimerTOF.Q = TRUE AND o_ValveOn = TRUE THEN
v_CycleFF := FALSE;   ( 一个周期结束 )
END_IF;
( 计数:每次启动+压力OK上升沿计数 )
v_Counter(CU := i_Start AND i_PressureOK, R := i_ManualReset, PV := i_SetCount);
o_Count := v_Counter.CV;
( 达到设定计数自动停止 )
IF v_Counter.Q = TRUE THEN
v_CycleFF := FALSE;
o_Alarm := TRUE;      ( 提示计数到 )
END_IF;

3.3 调用并测试

![简图示意] 实际上需要连接:工位1用变量Press1,工位2用Press2,只需复制实例即可。每个实例独立运行,互不干扰
数据对比
:传统方式写4个工位需要800步梯形图,FB方式仅需150步(FB本体100步 + 4个调用各12步)。调试时如果保压时间需要改为3秒,修改FB内部
T#5S
T#3S
,4个工位同时生效。

第四章 常见坑与调试技巧(附报警代码表)

4.1 变量作用域陷阱

FB内部变量默认是“静态”的(即掉电保持?)。三菱iQ-R系列中,FB内部VAR变量默认是RETAIN类型?注意:在GX Works3中,FB内的所有变量默认是VAR(不保持)。如果需要保持,必须显式声明RETAIN属性。很多工程师在这里翻车:电机启动后断电重启,FB内部自保持丢失。
正确做法
:对需要保持的变量,在变量声明时加
RETAIN
关键字:
VAR RETAIN
v_RunFF : BOOL;
END_VAR

4.2 实例数量与性能

R08CPU最大FB实例数5000个,但每个实例会占用程序扫描时间。实测:100个简单FB增加扫描时间约0.2ms;500个增加1ms。建议一个工程内FB实例不超过2000个,否则考虑使用数组或SFC分解。

4.3 常见错误代码与解决方案

GX Works3错误码含义快速解决
0xC050FB实例名重复检查POU树,删除重复实例
0x1001引脚数据类型不匹配检查调用时变量类型,如BOOL不能连INT
0x2010内部变量未初始化给所有VAR变量赋初始值,如v_CycleFF := FALSE;
0x3005定时器/计数器使用冲突检查多个FB是否共用同一定时器号?FB内定时器要声明为局部变量

总结:FB入门的3个关键点

1.引脚设计是灵魂:输入输出命名清晰(i_/o_),数据类型严格匹配,不要偷懒用ANY类型   2.内部变量先赋初值:所有VAR块中的非保持变量,在FB初始化段(或第一次扫描)赋默认值,避免上电抖动   3.一个FB只做一个功能:比如电机控制FB不要包含报警灯延时闪5秒这种无关逻辑,拆成两个FB
互动问题
:你在写FB时最头疼的坑是什么?是引脚冲突、定时器复用还是调试看不到内部变量?评论区说出你的故事,下一期专攻“FB调试技巧”。
推荐阅读
6步搞定三菱iQ-R FB封装+3套实战代码,PLC编程效率直接翻倍
发布于 2026-06-18
6步搞定三菱iQ-R FB封装+3套实战代码,PLC编程效率直接翻倍
发布于 2026-06-18
三菱伺服 04:伺服与 PLC 联动实战——从硬件接线、参数配置到 ST 编程,1 套模板搞定单轴定位
发布于 2026-06-13
KEYWORDS
GX Works, MELSEC, iQ-R, 三菱, 结构化文本
如果你觉得这篇文章有帮助,请点个在看,分享给更多需要的人!
关注我,获取更多实用干货~
有问题欢迎评论区留言交流!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码