拖拽式编程 (CFC)
CFC (Continuous Function Chart,连续功能图) 是 Darra PLC 的拖拽式数据流编程语言,是三种 PLC 逻辑编辑器之一(SCL、LAD、CFC)。它采用数据流范式:在画布上拖入功能块(box),用接线(wire)把一个块的输出针脚(pin)连到下一个块的输入针脚,数据沿连线流动。无需写文本代码,适合搭建信号处理链、过程控制回路、模拟量运算等以"数据流向"为主线的逻辑。

基本概念
CFC 程序由三类元素构成:
| 元素 | 说明 |
|---|---|
| 功能块 (Box) | 画布上的矩形框,封装一个运算(逻辑门、定时器、PID、数学运算、自定义 FB 等) |
| 针脚 (Pin) | 块左侧为输入针脚、右侧为输出针脚,每个针脚有名称和数据类型 |
| 接线 (Wire) | 从某块的输出针脚拉到另一块的输入针脚,表示数据从前者流向后者 |
bSensor1 ──●
├──►┤ AND ├──►●──►┤ TON ├──► bOutput
bSensor2 ──● └─────┘ │ PT := T#2s │
└────────────┘
- 块的输入针脚可连接:变量、常量,或上一个块的输出针脚。
- 块的输出针脚可连到:变量,或下一个块的输入针脚(可一对多分叉)。
- 接线两端数据类型必须匹配,类型不符时 IDE 在连线时报错。
与 LabVIEW 的相似之处
CFC 的"框 + 针脚 + 接线"数据流范式与 LabVIEW 的图形化数据流编程理念相同:数据顺着连线在框之间流动,框的输入针脚到齐后才计算并向下游输出。
执行顺序
CFC 是数据流编程,块的执行顺序由数据依赖决定,而不是从上到下的书写顺序:
- 拓扑排序 — 编译器根据接线构成的有向图做拓扑排序,确保每个块在其所有输入就绪后才执行。
- 顺序号显示 — 每个块的左上角显示执行序号(1、2、3…),方便核对运行先后。
- 手动调整 — 当多个块之间没有数据依赖(彼此独立)时,可手动指定执行序号,控制谁先谁后。
执行序: 1 → 2 → 3 → 4
[读输入块] → [AND] → [TON] → [写输出块]
反馈回路
CFC 允许把后级输出接回前级输入构成反馈回路(如积分、状态保持)。遇到回路时编译器会插入一个周期延迟:本周期写入的值在下一个扫描周期被读取,避免循环求值死锁。带反馈的针脚在画布上以特殊标记显示。
典型用途
CFC 最适合以下场景:
| 场景 | 说明 |
|---|---|
| 模拟量信号链 | 采集 → 标定 → 滤波 → 限幅 → 报警判断,一条连线串起来一目了然 |
| 过程控制回路 | PID、前馈、串级控制等,把测量、设定、控制器、执行器块连成回路 |
| 混合逻辑运算 | 逻辑门、比较、选择、数学块混合编排,比纯文本更直观 |
| 复用功能块编排 | 把自定义 FB 当作黑盒块拖入,专注于"块之间怎么连"而非块内部实现 |
工具箱
CFC 编辑器的工具箱按西门子风格分组(基础 → 显示 → 输入 → 容器 → 图表 → 工艺对象),以网格图标排布,鼠标悬浮显示中文名与一句话提示。常用块包括:
- 逻辑:AND、OR、NOT、XOR、RS / SR 触发器
- 定时器:TON、TOF、TP
- 计数器:CTU、CTD、CTUD
- 数学:ADD、SUB、MUL、DIV、MOD、ABS、SQRT
- 比较 / 选择:GT、LT、EQ、MUX、SEL、LIMIT
- 工艺对象:PID、斜坡、滤波器
- 自定义 FB:项目中定义或库导入的功能块
编辑操作
| 操作 | 方法 |
|---|---|
| 添加块 | 从工具箱拖到画布,或双击画布搜索块名 |
| 连线 | 鼠标按住输出针脚拖到目标输入针脚 |
| 删除连线 | 选中接线后 Delete |
| 设置常量 | 双击输入针脚直接输入常量值 |
| 关联变量 | 把变量从项目树拖到针脚上 |
| 调整执行序 | 选中块后在属性面板修改序号 |
在线监视
下装运行后,CFC 画布支持在线监视:每条接线上实时显示流过的当前值,布尔量用颜色区分(绿=TRUE / 灰=FALSE),模拟量直接显示数值。这样可以一眼看出数据流到哪一步出了问题。在线强制写入与监视的通用说明见 在线监视 与 强制写入。