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 项目后,左侧的 Controller Organizer 以树形方式呈现整个项目。它的顶层是控制器节点,向下依次展开任务、程序、例程、标签等。典型层级如下:
- Controller(控制器):根节点,包含控制器型号、固件、通信、时间同步等属性。
- Tasks(任务):分为连续任务、周期任务、事件任务三类,是调度的基本单位。
- Programs(程序):挂在任务下,是逻辑组织的容器,拥有自己的程序级标签和例程。
- Routines(例程):挂在程序下,是真正写梯形图、功能块、结构化文本的地方。
- Controller Tags / Program Tags:控制器级标签全局可见,程序级标签仅在本程序内可见。
- I/O Configuration:描述本地和远程 I/O 模块、通信适配器的组态。
这棵树不是装饰,它直接决定了扫描顺序、标签作用域和代码复用方式。例如,同一个程序下的多个例程可以共享程序级标签;不同程序之间若需交换数据,必须通过控制器级标签或 Produced/Consumed 标签完成。
三、任务与程序的存储方式:树上的“位置”决定行为
在控制器组织器中,任务和程序不是并列关系,而是严格的父子关系:任务 → 程序 → 例程。一个任务下可以挂多个程序,一个程序下可以挂多个例程。理解这一点,就能理解为什么“把代码放错位置”会导致标签找不到、扫描顺序异常或程序无法执行。
三类任务的存储与调度差异如下:
| 任务类型 | 触发方式 | 典型用途 | 存储位置 |
|---|---|---|---|
| 连续任务(Continuous) | 循环扫描,无固定周期 | 常规逻辑、主控流程 | Tasks 下唯一,优先级最低 |
| 周期任务(Periodic) | 按设定周期触发,如 10 ms、50 ms | 闭环控制、定时采样 | Tasks 下可多个,按周期和优先级调度 |
| 事件任务(Event) | 由事件触发,如 I/O 变化、消费标签更新 | 快速响应、故障处理 | Tasks 下可多个,优先级可配置 |
程序(Program)是任务下的逻辑容器。每个程序拥有独立的 Program Tags 和一组例程。程序的主例程(Main Routine)在程序被调度时执行,子例程需要通过 JSR 指令显式调用,故障例程(Fault Routine)则在程序发生故障时执行。这种“程序内聚、例程分工”的方式,使得同一套程序可以复制到不同任务下复用,只需重新映射标签即可。
四、新建项目并识别各层级节点:一次完整的实操路径
下面以新建一个名为 Line1_Control 的项目为例,走一遍从创建到识别节点的过程。示例参数为教学假设,实际项目中应按设备需求调整。
- 新建项目:在 Studio 5000 启动界面选择“New Project”,控制器型号选择
1756-L83E,固件版本按实际控制器选择,项目名称填写Line1_Control,保存为Line1_Control.ACD。 - 观察根节点:Controller Organizer 顶部出现控制器节点,展开后可见 Tasks、I/O Configuration、Controller Tags 等分支。
- 识别任务节点:默认存在一个
MainTask,类型为连续任务。右键可新建周期任务,例如FastTask,周期设为10 ms,优先级设为5。 - 识别程序节点:在
MainTask下默认有MainProgram。右键新建程序ConveyorProgram,并为其指定主例程Conveyor_Main。 - 识别例程节点:展开
ConveyorProgram,可见Conveyor_Main例程。右键新建子例程Conveyor_Jog,类型选择梯形图。 - 识别标签节点:在
ConveyorProgram下可见 Program Tags,新建Conveyor_Run(BOOL)和Conveyor_Speed(REAL)。在 Controller Tags 中新建Line1_Start(BOOL),用于跨程序共享。 - 识别 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 机制中转。
五、从文件到运行:ACD 与控制器项目的对应关系
当点击“Download”时,Logix Designer 会把 ACD 中的项目内容下载到控制器内存。控制器中保存的是运行版本,包括任务配置、程序、例程和标签值。此时若在离线 ACD 中修改了逻辑但未下载,控制器仍按旧版本运行。因此,判断“当前运行的是哪个版本”,要看 ACD 与控制器之间的差异状态,而不是只看 ACD 文件本身。
总结来说,ACD 是项目的离线容器,控制器组织器是项目的树形目录,任务与程序按“任务 → 程序 → 例程”的层级存储。新建项目时,先建立控制器节点,再规划任务类型,然后划分程序和例程,最后分配标签作用域和 I/O 组态。把这棵树的层级关系看清楚,后续的调度、复用和在线调试都会顺畅很多。