|
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_Start | BOOL | 启动 | | i_PressureOK | BOOL | 压力传感器OK信号 | | i_ManualReset | BOOL | 手动复位计数 | | o_ValveOn | BOOL | 输出阀控制 | | o_Alarm | BOOL | 报警输出 | | o_Count | UINT | 当前计数(可显示) | | i_SetCount | UINT | 设定计数(默认10) | 代码块4:压力机FB内部逻辑(带定时器和计数器)FUNCTION_BLOCK FB_PressStationVAR_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 RETAINv_RunFF : BOOL; END_VAR 4.2 实例数量与性能 R08CPU最大FB实例数5000个,但每个实例会占用程序扫描时间。实测:100个简单FB增加扫描时间约0.2ms;500个增加1ms。建议一个工程内FB实例不超过2000个,否则考虑使用数组或SFC分解。 4.3 常见错误代码与解决方案 | GX Works3错误码 | 含义 | 快速解决 | | 0xC050 | FB实例名重复 | 检查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, 三菱, 结构化文本 如果你觉得这篇文章有帮助,请点个在看,分享给更多需要的人! 关注我,获取更多实用干货~ 有问题欢迎评论区留言交流! 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |