PLC 编程概述
Darra Software PLC 基于 IEC 61131-3 国际标准实现, 提供三种 PLC 逻辑编辑器、抢占式多任务模型和完善的在线调试能力。
三种 PLC 逻辑编辑器
| 语言 | 缩写 | 分类 | 适用场景 | 特点 |
|---|---|---|---|---|
| SCL (Structured Control Language) | SCL | 文本 | 复杂算法、数据处理 | 类似 Pascal 的文本语言 |
| 梯形图 | LAD | 图形 | 开关逻辑、继电器替换 | 电气工程师熟悉 |
| 拖拽式编程 (Continuous Function Chart) | CFC | 图形 | 信号处理、过程控制 | 框 + 针脚 + 接线的数据流编程 |
混合编程
程序组织单元 (POU) 可在三种语言间互相调用。同一项目允许混合使用: 联锁逻辑用 LAD, 复杂算法用 SCL 写, 信号处理与控制回路用 CFC 串联 — 各语言编译为同一套中间代码。
程序组织单元 (POU)
IEC 61131-3 将可执行代码组织为三种 POU:
| POU 类型 | 关键字 | 用途 | 是否有实例 | 示例 |
|---|---|---|---|---|
| 程序 | PROGRAM | 主入口 (OB) | 一个 | PROGRAM Main |
| 功能块 | FUNCTION_BLOCK | 有状态的对象 | 多实例 | FUNCTION_BLOCK FB_Motor |
| 函数 | FUNCTION | 无状态纯函数 | 无实例 | FUNCTION Average : REAL |
- PROGRAM: 被 OB 调度器调用, 持有全局状态
- FUNCTION_BLOCK: 封装逻辑 + 内部状态, 必须实例化后使用
- FUNCTION: 只依赖输入, 相同输入永远产生相同输出, 无副作用
任务模型 (Task Model)
PLC 执行不是单线程循环, 而是多任务抢占式调度:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ OB1 主任务 │ │ OB30 周期10ms│ │ OB35 周期 1ms│
│ 优先级 1 │ ←抢占│ 优先级 12 │ ←抢占│ 优先级 14 │
└──────────────┘ └──────────────┘ └──────────────┘
↑ ↑ ↑
│ │ │
┌───┴───────────────── 任务调度器 ───────────────┴────┐
│ 基于优先级抢占 + 同优先级 FIFO + 看门狗保护 │
└──────────────────────────────────────────────────────┘
每个任务独立配置:
| 参数 | 说明 | 示例 |
|---|---|---|
| 周期时间 | 任务执行间隔 | 1ms / 2ms / 4ms / 10ms |
| 优先级 | 1~31, 数字越大越高 | OB1=1, OB30=12, OB35=14 |
| 看门狗 | 单次最长允许时间 | 200ms → OB80 |
| 绑定 POU | 任务调用的 PROGRAM | Main, FastControl |
三段式扫描周期
每个任务内部遵循经典三段式:
┌──────────────┐
│ 1. 输入合并 │ ← 读取 IO 映像表 (I 区刷新)
├──────────────┤
│ 2. 程序扫描 │ ← 执行 POU 代码
├──────────────┤
│ 3. 输出分发 │ ← Q 区写入硬件
└──────────────┘
↓
下一周期 (1ms/2ms/4ms/10ms/50ms 可配)
一致性
一个完整周期内, 程序看到的输入始终是周期开始时的瞬时快照, 输出在周期末尾统一写出。这保证了程序逻辑不会在中途受到 IO 变化干扰 (Input Image / Output Image 机制)。
内存模型
PLC 采用标准 IEC 61131-3 内存地址 + 符号变量双模型:
| 区域 | 前缀 | 用途 | 持久化 | 示例 |
|---|---|---|---|---|
| I 区 | %I | 物理输入 (DI/AI) | 每周期刷新 | %IX0.0, %IW100 |
| Q 区 | %Q | 物理输出 (DO/AO) | 每周期刷新 | %QX0.0, %QW100 |
| M 区 | %M | 标记位 / HMI 交互 | 非易失可配 | %MX0.0, %MD200 |
| D 区 | %D | 数据块 (DB) | 持久化 | %D10.DBW0 |
| S 区 | %S | 系统状态 (只读) | 运行时 | %SW0 (扫描时间) |
每个区域支持 X (位) / B (字节) / W (字) / D (双字) / L (长字) 访问。
符号优先
推荐使用符号变量 (VAR) 而非直接地址访问。编译器自动分配地址, 变量表支持符号→地址双向查找, 维护性更好。
运行模式
| 模式 | 适用场景 | 特性 |
|---|---|---|
| 离线仿真 | 开发阶段, 无硬件 | 内置仿真 Runtime, 在线监视/强制/趋势全支持 |
| 在线连接 | 开发阶段, 真实硬件 | IDE 连接 Runtime, 实时监视/强制/趋势/报警 |
| Deploy 部署 | 生产运行 | Runtime 独立运行, IDE 可选离线 |
调试约束
DarraRT PLC 不提供断点 / 单步 / F9 / F10 等传统代码调试手段 — 产线实时控制不允许程序暂停。调试通过在线监视 + 强制赋值 + 趋势图 + 报警 + 日志 + 任务扫描统计组合进行, 详见 在线调试 。

切换方式: Ribbon → PLC → 仿真 / 在线。
OB 组织块
PLC 支持 12 种 OB 类型, 按优先级调度:
| OB 类型 | 功能 | 优先级 | 典型用途 |
|---|---|---|---|
| OB1 | 主循环 (每个扫描周期) | 1 (最低) | 主程序逻辑 |
| OB10~OB17 | 异步事件 | 8~9 | 通讯回调、报警处理 |
| OB20~OB23 | 时间触发 (TOD) | 10 | 定时任务 |
| OB30~OB38 | 周期中断 | 12~15 | 闭环控制 (PID) |
| OB40~OB47 | 硬件中断 | 16~17 | 边沿触发、紧急响应 |
| OB80 | 时间错误 (超时) | 20 | 看门狗处理 |
| OB82 | IO 错误 | 18 | IO 模块离线 |
| OB100 | 冷启动 | 启动时 | 初始化 |
| OB121/122 | 运行时异常 | 22 | 除零/越界/溢出 |
功能特性一览
- 标准功能块库: 定时器 (TON/TOF/TP)、计数器 (CTU/CTD/CTUD)、触发器 (SR/RS/R_TRIG/F_TRIG)
- IEC 61800-5-2 安全库: 13 个安全功能块 (STO/SS1/SS2/SLS/SLP/SBC/SDI 等), SIL 2 / PL d
- PID 控制器: 带抗积分饱和、输出限幅、自整定、前馈、死区、级联
- 配方管理: 工艺参数批量切换 (焊接参数、工具偏移)
- 在线调试: 变量监视、强制写入、趋势图、报警管理、任务统计
- OOP 支持: FUNCTION_BLOCK 继承 (EXTENDS)、接口实现 (IMPLEMENTS)、方法 (METHOD)
- 交叉引用: 变量 where-used 分析, 安全重命名
- 代码模板库: 标准动作块 (Cylinder/Motor/Conveyor), 可导入导出
- 冗余架构: 双机热备 1ms 切换 (详见 冗余配置)
