恭喜,你发布的帖子
发布于 2026-06-21 19:55:21
1楼
1. 核心定义与用途不同
FB 实例表 (FB Instance Table)
用途:专门用于定义功能块 (FB) 的实例。当您调用一个功能块时,系统需要为这个调用分配一块独立的存储空间来保存该实例的静态变量(STATIC)和状态数据。FB 实例表就是用来管理这些特定于某个 FB 调用的数据块的。
数据归属:表中的变量属于特定的 FB 实例。例如,如果您调用了两次同一个 FB,系统会创建两个不同的实例,每个实例在 FB 实例表中都有对应的条目,它们拥有各自独立的静态数据区。
关联关系:它直接关联到功能块的调用,确保每次调用都有独立的上下文环境 [1] [2]。
全局变量表 (Global Variable Table)
用途:用于定义全局变量,这些变量可以在程序的所有程序组织单元 (POU) 中访问。它适用于存储器地址(如 I, Q, M, V, DB2 等)或常量值的命名。
数据归属:定义的变量适用于全局范围,不局限于某个特定的 FB 实例。
灵活性:您可以为任何地址或常量指定一个易读的符号名称,方便在程序逻辑中引用 [1]。
2. 变量作用域与生命周期
FB 实例表:
其中的变量(主要是 FB 的静态变量)的生命周期与 FB 实例绑定。
它们主要用于保存 FB 内部需要保持状态的数据(如计数器当前值、中间状态标志等),这些数据在 FB 未被调用时依然保留在内存中,但仅对该 FB 实例可见或由其管理 [2]。
在 V3.0 版本中,未绑定的全局变量和 FB 实例的存储器被统一分配在 DB2 区域中 [3]。
全局变量表:
变量一旦定义,就在整个项目中有效,任何 POU(主程序、子程序、中断程序、功能块)都可以直接通过变量名访问。
它们通常用于定义输入/输出映射、全局状态标志、共享数据等 [1]。
3. 为什么两者都能填入 FB 管脚?
您观察到的现象(两者都能填入 FB 管脚)是因为 STEP 7-Micro/WIN SMART V3 的编程逻辑允许通过符号访问来传递参数,但这背后的机制不同:
填入 FB 实例表中的变量:
这通常是指将 FB 实例的静态变量 (STATIC) 或输出/输入/输出参数直接映射。
当您在 FB 实例表中定义变量时,这些变量是 FB 内部逻辑的一部分。在调用 FB 时,系统会自动处理这些实例数据的传递和存储。
例如,FB 内部定义的 STATIC 变量,其存储位置就在 FB 实例表中定义的地址范围内 [2]。
填入全局变量表中的变量:
这是指将外部全局变量作为参数传递给 FB。
您可以在全局变量表中定义一个变量(例如 Input_Speed),然后在调用 FB 时,将这个全局变量名填入 FB 的输入管脚(IN)。
此时,FB 读取的是全局变量表中该变量所指向的内存地址(如 V 区或 DB2 区)的数据。
如果未选中“绑定”选项,系统会在编译时自动分配地址;如果选中“绑定”,则直接关联到具体地址 [1]。
4. 总结与使用建议
特性
FB 实例表
全局变量表
主要对象 功能块 (FB) 的实例数据 全局符号、常量、地址映射
作用域 特定于 FB 实例(内部静态数据) 全局(所有 POU 可访问)
典型用途 保存 FB 内部状态、静态变量 定义 I/O 映射、全局共享数据、常量
存储区域 通常位于 DB2 (V3.0+) I, Q, M, V, DB2 等
参数传递 自动管理实例数据 作为外部参数传入 FB
建议:
如果您需要定义 FB 内部需要保持状态、且不希望外部程序直接随意修改的变量(如 FB 内部的计数器、状态机变量),应使用 FB 实例表 中的静态变量定义。
如果您需要定义一个在程序多处使用的信号(如启动按钮、停止按钮、全局速度设定值),或者需要将外部物理地址映射为符号,应使用 全局变量表。
在调用 FB 时,将全局变量表中的变量填入管脚,意味着该 FB 将使用外部共享的数据;而 FB 实例表中的变量则是 FB 自身“私有”或“实例化”的数据容器。
通过区分这两者,您可以更好地管理程序的模块化结构,避免变量冲突,并确保数据流向清晰
请填写推广理由:
分享
只看
楼主