2. 控制器项目文件组织

在 Studio 5000 Logix Designer 中,一个控制器项目并不是“一个程序文件”那么简单。它是一棵由控制器、任务、程序、例程、标签、数据类型、I/O 配置等节点共同构成的层级化对象树,最终以 ACD(Logix Designer Project)文件的形式保存在磁盘上。理解这棵树的结构,是后续做任务划分、程序复用和在线下载的前提。本节从 ACD 文件本身讲起,再进入控制器组织器(Controller Organizer)的树形视图,最后落到“任务与程序到底存在哪里、以什么方式被组织”。

一、ACD 文件是什么:一个容器,而不是一份源码

ACD 是 Studio 5000 的项目归档文件,扩展名为 .ACD。它本质上是一个压缩容器,内部包含控制器项目的全部离线信息:控制器属性(型号、固件版本、通信路径)、任务与程序的层级定义、例程代码、标签与数据类型数据库、I/O 模块配置、以及安全、报警、趋势等附加对象。可以用一个直观的类比:ACD 相当于“整个项目的打包箱”,而控制器组织器树就是打开这个箱子后看到的目录结构。

需要区分两个容易混淆的概念:ACD 是离线工程文件,保存在工程师电脑或版本库中;控制器内存中的项目是下载后的运行版本。二者结构一致,但 ACD 还额外保存了注释、历史、未下载的修改等离线内容。因此,ACD 文件可以理解为“设计态快照”,控制器中的项目是“运行态副本”。

ACD 文件不能直接用文本编辑器查看内部结构。若需要查看或对比项目内容,应使用 Logix Designer 打开,或导出为 L5K/L5X 文本格式后再分析。

二、控制器组织器树形视图:项目的“目录树”

打开一个 ACD 项目后,左侧的 Controller Organizer 以树形方式呈现整个项目。它的顶层是控制器节点,向下依次展开任务、程序、例程、标签等。典型层级如下:

  • Controller(控制器):根节点,包含控制器型号、固件、通信、时间同步等属性。
  • Tasks(任务):分为连续任务、周期任务、事件任务三类,是调度的基本单位。
  • Programs(程序):挂在任务下,是逻辑组织的容器,拥有自己的程序级标签和例程。
  • Routines(例程):挂在程序下,是真正写梯形图、功能块、结构化文本的地方。
  • Controller Tags / Program Tags:控制器级标签全局可见,程序级标签仅在本程序内可见。
  • I/O Configuration:描述本地和远程 I/O 模块、通信适配器的组态。

这棵树不是装饰,它直接决定了扫描顺序、标签作用域和代码复用方式。例如,同一个程序下的多个例程可以共享程序级标签;不同程序之间若需交换数据,必须通过控制器级标签或 Produced/Consumed 标签完成。

控制器组织器树形视图与 ACD 文件对应关系 ACD 项目文件 (.ACD 压缩容器) 控制器属性 任务定义 程序与例程代码 标签与数据类型 I/O 组态 注释与历史 安全/报警/趋势 离线设计态 可含未下载修改 可版本管理 打开/下载 Controller Organizer 树形结构 Controller (控制器) Tasks (任务) 连续任务 周期任务 事件任务 Programs (程序) 主例程 子例程 故障例程 Controller Tags (全局) Program Tags (局部) I/O Configuration (本地/远程 I/O、通信适配器) 作用域提示 控制器级标签 全局可见 程序级标签 仅本程序可见 例程共享 所属程序标签 任务决定 扫描与优先级 程序可复用 例程可调用

三、任务与程序的存储方式:树上的“位置”决定行为

在控制器组织器中,任务和程序不是并列关系,而是严格的父子关系:任务 → 程序 → 例程。一个任务下可以挂多个程序,一个程序下可以挂多个例程。理解这一点,就能理解为什么“把代码放错位置”会导致标签找不到、扫描顺序异常或程序无法执行。

三类任务的存储与调度差异如下:

任务类型 触发方式 典型用途 存储位置
连续任务(Continuous) 循环扫描,无固定周期 常规逻辑、主控流程 Tasks 下唯一,优先级最低
周期任务(Periodic) 按设定周期触发,如 10 ms、50 ms 闭环控制、定时采样 Tasks 下可多个,按周期和优先级调度
事件任务(Event) 由事件触发,如 I/O 变化、消费标签更新 快速响应、故障处理 Tasks 下可多个,优先级可配置

程序(Program)是任务下的逻辑容器。每个程序拥有独立的 Program Tags 和一组例程。程序的主例程(Main Routine)在程序被调度时执行,子例程需要通过 JSR 指令显式调用,故障例程(Fault Routine)则在程序发生故障时执行。这种“程序内聚、例程分工”的方式,使得同一套程序可以复制到不同任务下复用,只需重新映射标签即可。

四、新建项目并识别各层级节点:一次完整的实操路径

下面以新建一个名为 Line1_Control 的项目为例,走一遍从创建到识别节点的过程。示例参数为教学假设,实际项目中应按设备需求调整。

  1. 新建项目:在 Studio 5000 启动界面选择“New Project”,控制器型号选择 1756-L83E,固件版本按实际控制器选择,项目名称填写 Line1_Control,保存为 Line1_Control.ACD。
  2. 观察根节点:Controller Organizer 顶部出现控制器节点,展开后可见 Tasks、I/O Configuration、Controller Tags 等分支。
  3. 识别任务节点:默认存在一个 MainTask,类型为连续任务。右键可新建周期任务,例如 FastTask,周期设为 10 ms,优先级设为 5。
  4. 识别程序节点:在 MainTask 下默认有 MainProgram。右键新建程序 ConveyorProgram,并为其指定主例程 Conveyor_Main。
  5. 识别例程节点:展开 ConveyorProgram,可见 Conveyor_Main 例程。右键新建子例程 Conveyor_Jog,类型选择梯形图。
  6. 识别标签节点:在 ConveyorProgram 下可见 Program Tags,新建 Conveyor_Run(BOOL)和 Conveyor_Speed(REAL)。在 Controller Tags 中新建 Line1_Start(BOOL),用于跨程序共享。
  7. 识别 I/O 节点:展开 I/O Configuration,添加本地 1756-IB16 输入模块和 1756-OB16E 输出模块,槽号按实际机架填写。

完成上述操作后,树形结构大致如下:

Line1_Control (Controller)
├── Tasks
│   ├── MainTask (连续任务)
│   │   ├── MainProgram
│   │   │   └── MainRoutine
│   │   └── ConveyorProgram
│   │       ├── Conveyor_Main (主例程)
│   │       ├── Conveyor_Jog (子例程)
│   │       └── Program Tags: Conveyor_Run, Conveyor_Speed
│   └── FastTask (周期任务, 10 ms, 优先级 5)
├── Controller Tags: Line1_Start
└── I/O Configuration
    ├── 1756-IB16 (本地输入)
    └── 1756-OB16E (本地输出)

识别节点的关键在于:看层级、看类型、看作用域。层级决定调度关系,类型决定执行方式,作用域决定标签能否被访问。例如,Conveyor_Run 是程序级标签,只能在 ConveyorProgram 内的例程中直接引用;若 MainProgram 需要读取它,必须通过控制器级标签或 Produced/Consumed 机制中转。

新建项目后不要急于写逻辑。先规划任务类型和程序划分,再分配标签作用域,可以避免后期大量返工。尤其是周期任务,周期设置过小会导致控制器 CPU 占用过高,建议从 20 ms 起步,根据实际扫描时间逐步调整。

五、从文件到运行:ACD 与控制器项目的对应关系

当点击“Download”时,Logix Designer 会把 ACD 中的项目内容下载到控制器内存。控制器中保存的是运行版本,包括任务配置、程序、例程和标签值。此时若在离线 ACD 中修改了逻辑但未下载,控制器仍按旧版本运行。因此,判断“当前运行的是哪个版本”,要看 ACD 与控制器之间的差异状态,而不是只看 ACD 文件本身。

总结来说,ACD 是项目的离线容器,控制器组织器是项目的树形目录,任务与程序按“任务 → 程序 → 例程”的层级存储。新建项目时,先建立控制器节点,再规划任务类型,然后划分程序和例程,最后分配标签作用域和 I/O 组态。把这棵树的层级关系看清楚,后续的调度、复用和在线调试都会顺畅很多。