返回主站|会员中心|保存桌面

西门子(SIEMENS)服务商    

框架断路器、塑壳断路器、隔离开关、软启动、变频器、电机 、PLC、触摸屏

联系方式
  • 联系人:吴经理
  • 电话:18576370666
新闻分类
  • 暂无分类
站内搜索
 
首页 > 新闻中心 > 博图当中如何把一个函数块中步序程序分为两个函数块程序!
新闻中心
博图当中如何把一个函数块中步序程序分为两个函数块程序!
发布时间:2025-07-09        浏览次数:0        返回列表

在西门子TIA Portal(博图)中,将一个函数块(FB)中的步序程序拆分为两个独立的函数块,是模块化编程提高代码复用性的常见操作。以下是详细步骤和关键注意事项:


一、拆分前的规划

1. 明确拆分逻辑

  • 功能边界:确定原FB中哪些步骤属于独立功能(如“自动模式”和“手动模式”可拆分为两个FB)。

  • 输入/输出接口:分析原FB的输入(IN)、输出(OUT)、临时变量(Temp)和静态变量(Static),明确哪些需要传递给新FB。

  • 共享数据:若原FB使用背景数据块(DB)存储共享变量,需规划如何通过接口或全局DB传递数据。

2. 示例场景

假设原FB FB_Process 包含以下步序:

  1. 初始化(检查传感器、复位输出)

  2. 自动运行(根据条件执行动作)

  3. 手动调试(独立控制输出)

拆分目标:将自动运行手动调试拆分为两个独立FB(FB_AutoRunFB_ManualCtrl)。


二、拆分步骤

步骤1:创建新函数块

  1. 右键项目树 → 添加新对象 → 函数块(FB)

    • 创建FB_AutoRunFB_ManualCtrl

  2. 设置语言:选择与原FB相同的编程语言(如LAD、SCL或FBD)。

步骤2:定义新FB的接口

1. 输入/输出参数

  • 原FB分析:打开原FB的接口定义,复制相关变量到新FB。

    • FB_AutoRun的输入:

    • FB_AutoRun的输出:

    • Enable(BOOL):启用自动运行

    • Sensor1(BOOL):传感器信号

    • MotorCmd(BOOL):电机控制命令

    • 示例

  • 关键原则

    • 新FB的接口应自包含,仅保留必要参数。

    • 避免直接引用原FB的临时变量(Temp),改用输入/输出传递。

2. 静态变量处理

  • 若原FB使用静态变量(如步序计数器),需通过以下方式处理:示例

    scl

    // 原FB中的静态变量
    VAR_STATIC
    StepCounter : INT;
    END_VAR

    // 拆分后:通过全局DB传递
    VAR_INPUT
    StepCounter_In : INT;  // 从外部传入
    END_VAR
    VAR_OUTPUT
    StepCounter_Out : INT; // 返回更新值
    END_VAR
    • 方案1:将静态变量移至全局DB,通过接口传递给新FB。

    • 方案2:在新FB中重新定义为静态变量(需确保逻辑独立性)。

步骤3:迁移步序逻辑

1. 复制相关代码

  • 从原FB中剪切或复制与新FB功能相关的步序代码(如FB_AutoRun的自动运行逻辑)。

  • 注意

    • 删除原FB中与拆分部分强耦合的代码(如直接操作其他步序的变量)。

    • 若存在跨步序的跳转指令(如JMP),需替换为函数块调用或状态机设计。

2. 修改调用方式

  • 原FB中的调用(假设拆分前为顺序执行):

    scl// 原FB_Process中的自动运行部分IF AutoMode THEN// 自动运行逻辑...MotorCmd := Sensor1 AND NOT Fault;END_IF;
  • 拆分后

    • 在原FB中调用FB_AutoRun,并传递参数:

      scl// 实例化FB_AutoRun"FB_AutoRun_Inst"(Enable := AutoMode,Sensor1 := Sensor1,MotorCmd => Local_MotorCmd);// 将Local_MotorCmd赋值给原输出MotorCmd := Local_MotorCmd;

步骤4:处理数据交互

1. 通过接口传递数据

  • 简单参数:直接通过IN/OUT参数传递(如传感器信号、控制命令)。

  • 复杂数据:使用结构体(STRUCT)或数组封装相关变量。

    示例

    scl

    // 定义结构体
    TYPE AutoRundata: STRUCT
    Enable : BOOL;
    Sensor1 : BOOL;
    MotorCmd : BOOL;
    END_STRUCT;

    // 在FB接口中使用
    VAR_INPUT
    DataIn : AutoRunData;
    END_VAR
    VAR_OUTPUT
    DataOut : AutoRunData;
    END_VAR

2. 使用全局DB(谨慎使用)

  • 若新FB需共享大量数据(如工艺参数),可创建全局DB并通过指针访问:

    scl

    // 在FB中声明指针
    VAR
    pGlobaldata: POINTER TO GlobalDataType;
    END_VAR

    // 初始化时绑定地址
    pGlobaldata:= ADR("Global_DB".Data);

三、优化与测试

1. 逻辑验证

  • 单步调试:使用TIA Portal的在线调试功能,监控新FB的输入/输出是否符合预期。

  • 边界条件:测试新FB在极端输入(如传感器故障、通信中断)下的行为。

2. 性能优化

  • 减少数据拷贝:避免通过接口频繁传递大块数据(如数组),改用引用传递。

  • 并行执行:若新FB逻辑独立,可考虑在OB中并行调用(需确保无资源冲突)。

3. 文档更新

  • 修改原FB和新FB的注释,说明功能划分和调用关系。

  • 更新项目文档中的函数块调用图(如使用TIA Portal的“项目导航”功能生成依赖关系图)。


四、常见问题解决

问题1:新FB执行顺序错误

  • 原因:原FB中的步序可能依赖扫描周期或执行顺序。

  • 解决方案

    • 在原FB中明确调用顺序(如先调用FB_AutoRun,再调用FB_ManualCtrl)。

    • 使用状态机(S7-Graph)替代顺序步序,确保逻辑清晰。

问题2:数据不一致

  • 原因:新FB修改了共享变量但未及时更新。

  • 解决方案

    • 通过OUT参数返回所有修改的变量。

    • 在原FB中统一更新共享数据(如使用MOVE指令批量拷贝)。

问题3:编译错误(接口不匹配)

  • 原因:新FB的接口与调用处参数类型或数量不一致。

  • 解决方案

    • 检查接口定义是否完全匹配(包括数据类型、数组维度)。

    • 使用TIA Portal的“比较工具”对比原FB和新FB的接口差异。


五、总结


步骤关键操作
规划拆分明确功能边界、接口参数、共享数据
创建新FB添加FB并设置语言,定义输入/输出/静态变量
迁移逻辑复制相关代码,修改为函数块调用,处理静态变量
数据交互通过接口或全局DB传递数据,使用结构体优化复杂参数
测试与优化单步调试、性能优化、更新文档


通过合理拆分,可将复杂FB转化为多个高内聚、低耦合的模块,显著提升代码的可维护性和复用性。对于大型项目,建议结合面向对象编程(OOP)理念,进一步封装通用功能(如设备驱动、工艺算法)为独立FB。

收缩
  • QQ咨询

  • 电话咨询

  • 18576370666
  • 添加微信客服