强制与写入
调试时常需要人为改变量值,验证逻辑是否走通。Darra 提供两种方式:
| 方式 | 效果 | 何时用 |
|---|---|---|
| 写入 | 写一次,下一个扫描周期被程序覆盖 | 临时触发 |
| 强制 | 持续保持指定值,程序覆盖无效 | 长期屏蔽某个信号 |
写入
在监控表或编辑器中:
- 右键变量 → 写入值 → 输入 → 确定
- 或在监控表的「强制值」列直接改
典型场景:
- 手动点一下
CmdStart = TRUE触发启动流程 - 临时改 PID 设定值测试响应
强制
右键变量 → 强制,输入强制值:
- 变量值锁死,PLC 程序写它无效
- 强制图标在变量名旁显示 F
- 解除:右键 → 取消强制
典型场景:
- 调试某段逻辑时把传感器信号强制为 1,跳过实际设备
- 屏蔽故障信号防止联锁动作
危险
强制是危险操作。投产的机器上强制可能导致事故(例如强制急停为 OFF)。
- 只在调试阶段使用
- 下载新程序或重启 Runtime 会自动清除所有强制
- 下载前检查状态栏的「强制中」计数,确认都清了
强制列表
Ribbon → PLC → 强制列表,列出当前所有被强制的变量,方便一键全部取消。
权限
默认只有管理员账号可以强制。设置对话框 → 用户管理 里可配置哪些角色允许。
强制机制详解
强制 (Force) 的本质是在 PLC 运行时拦截变量写入:
用户程序 → [Force 过滤层] → 内存
↑
强制表: { bSignal → TRUE }
执行流程:
- 程序执行
bSignal := FALSE; - 运行时检查强制表:
bSignal在强制列表中, 值为 TRUE - 丢弃用户程序的 FALSE 写入
- 保持强制值 TRUE 在内存中
- 下次程序读
bSignal仍然得到 TRUE
与写入的关键区别
- 写入 (Write Once): 只覆盖一次, 下周期程序写什么就是什么
- 强制 (Force): 持续覆盖, 直到手动解除, 程序写入无效
强制优先级
多客户端同时操作时的优先级:
优先级 (高 → 低):
1. 急停 / 安全联锁 (硬线) ← 永远优先
2. OB121/122 异常处理 ← PLC 内部
3. 强制 (用户手动) ← 本功能
4. 用户程序写入
5. 默认初始值
多个 IDE 同时连 → 按最后操作者的强制值生效, 但每次操作会写审计日志标注操作者。
批量强制
一次强制多个变量:
- 在监视表中多选变量行 (Ctrl + 点击 或 Shift + 点击)
- 右键 → 强制所选
- 输入统一值或逐项输入
- 确认
批量应用场景:
- 模拟一组传感器同时到位
- 一键打开多个阀门
- 模拟一整行机器人的点位到达信号
强制列表面板
Ribbon → PLC → 强制列表, 列出所有被强制的变量:
┌──────┬──────────────────────┬──────────┬───────────┬──────────┬──────────┐
│ # │ 变量 │ 类型 │ 程序值 │ 强制值 │ 强制人 │
├──────┼──────────────────────┼──────────┼───────────┼──────────┼──────────┤
│ 1 │ bSensor_Home │ BOOL │ FALSE │ TRUE │ wang │
│ 2 │ iTemperature │ INT │ 250 │ 800 │ wang │
│ 3 │ arGrid[3,4] │ REAL │ 0.0 │ 100.0 │ li │
│ 4 │ %QX0.0 │ BOOL │ FALSE │ TRUE │ wang │
└──────┴──────────────────────┴──────────┴───────────┴──────────┴──────────┘
[全部取消] [取消所选] [保存列表] [加载列表]
操作:
| 按钮 | 行为 |
|---|---|
| 全部取消 | 一键释放所有强制 |
| 取消所选 | 只释放选中的 |
| 保存列表 | 导出 XML, 下次调试复用 |
| 加载列表 | 从 XML 恢复一组强制 |
强制的安全控制
投产禁止强制
强制在生产运行的机器上是高风险操作, 可能导致:
- 强制急停 = FALSE → 实际急停失效, 伤人
- 强制限位传感器 = TRUE → 跨越软限位撞机
- 强制通讯心跳 = 正常 → 掩盖实际通讯中断
- 强制产量计数 = 正常值 → 掩盖漏检
永远不要在产线运行时强制。必须调试时:
- 停 PLC
- 在停机状态强制
- 手动触发后, 立刻取消强制
- 下载前检查强制列表为空
权限分级
设置 → 用户管理 → 强制权限:
| 角色 | 强制权限 |
|---|---|
| 观察员 | 无 |
| 操作员 | 无 (仅写入) |
| 工程师 | 可强制非安全变量 |
| 管理员 | 全部 (包括 %Q 输出) |
| 超级管理员 | 全部 + 审批权 |
强制白名单 / 黑名单
配置不可强制的变量 (如急停 / 安全联锁):
<!-- force_blacklist.xml -->
<ForceBlacklist>
<Variable>bEStop</Variable>
<Variable>sfEStop.bReady</Variable>
<Variable>bSafetyDoor</Variable>
<Variable>bAxisLimit_Pos</Variable>
<Variable>bAxisLimit_Neg</Variable>
</ForceBlacklist>
强制这些变量时 IDE 会弹窗拒绝。
强制审计
每次强制操作自动记录:
{"time":"2026-04-18T14:32:05.123","user":"wang","op":"FORCE","variable":"bSensor_Home","oldValue":"FALSE","newValue":"TRUE","reason":"模拟回原到位"}
{"time":"2026-04-18T14:35:12.456","user":"wang","op":"UNFORCE","variable":"bSensor_Home"}
{"time":"2026-04-18T14:40:00.000","user":"system","op":"FORCE_CLEARED","trigger":"Runtime_Restart"}
审计日志路径: %AppData%/DarraPLC/audit/force_YYYYMMDD.log
自动清除时机
强制会在以下情况自动全部清除:
| 事件 | 清除 | 说明 |
|---|---|---|
| 下载新程序 | ✓ | 防止旧强制残留 |
| Runtime 重启 | ✓ | 保证干净状态 |
| PLC 冷启动 | ✓ | OB100 前清空 |
| PLC 热重启 | 可选 | 默认保留, 可配置清空 |
| 连接断开 | ✗ | 保持强制 (即使 IDE 掉线) |
| 超时 (可配) | 可选 | 超过 1 小时自动清除 |
典型使用场景
场景 1: 模拟传感器激活
真实传感器未安装, 先验证逻辑:
// 强制回原到位
bSensor_HomeX := TRUE (F)
// 强制工件到位
bSensor_Workpiece := TRUE (F)
// 强制真空吸紧
bVacuumOK := TRUE (F)
场景 2: 隔离故障信号
某故障信号误报阻塞流程, 临时屏蔽排查原因:
// 强制跳过故障
bFault_Motor := FALSE (F)
// 但在趋势图看实际信号:
// 发现故障信号是高频抖动 → 加 filter 不是逻辑问题
场景 3: 单元测试
FB 单元测试时手动给输入:
// 测试 FB_Motor 状态机
fbMotor.bStart := TRUE (F) // 强制启动
fbMotor.bStop := FALSE (F) // 强制不停
// 观察 fbMotor.bRunning 是否为 TRUE
// 观察 fbMotor.rActSpeed 是否斜坡上升
场景 4: PID 手动模式测试
强制 PID 切换到手动, 验证执行器响应:
bManualMode := TRUE (F)
rManualOut := 50.0 (F)
// 观察执行器是否确实输出 50%
强制列表的保存与复用
调试常用场景可保存为模板:
- 配好一组强制 (如"模拟回原到位")
- Ribbon → 强制列表 → 保存
- 导出为
scenarios/home_position.force.xml - 下次 → 加载 → 一键恢复
场景模板举例:
| 场景文件 | 用途 |
|---|---|
empty_bypass.force.xml | 跳过所有传感器 (用于纯逻辑测试) |
sensor_simulated.force.xml | 模拟全套传感器信号 |
fault_isolated.force.xml | 屏蔽非关键故障 |
pid_manual.force.xml | PID 手动模式测试 |
排错表
| 问题 | 原因 | 解决 |
|---|---|---|
| 强制后变量还是变 | 被更高优先级覆盖 | 查强制列表, 可能是 OB121 在改 |
| 强制标签 F 没显示 | 强制未生效 | 重连 / 检查权限 |
| 下载后强制还在 | 未自动清除 (旧 Runtime) | 手动全部取消 |
| 强制操作被拒绝 | 权限不够或在黑名单 | 管理员授权 / 查黑名单 |
| 找不到"取消强制"按钮 | 强制列表为空 | 右键变量 → 取消强制 |
最佳实践
- 最小化强制数量: 强制越少越安全, 能用写入就不用强制
- 每次强制都记原因: 养成写
reason:的习惯, 便于事后审计 - 调试结束立刻清除: 别留到下次, 会干扰别人
- 配合强制列表面板: 定期看谁强制了什么
- 严禁强制急停 / 限位: 永远不要在黑名单里的变量上强制
- 场景模板化: 常用强制组合保存为 XML, 复用
- 审计归档: 每周导出强制审计日志, 合规行业必备