跳到主要内容

强制与写入

调试时常需要人为改变量值,验证逻辑是否走通。Darra 提供两种方式:

方式效果何时用
写入写一次,下一个扫描周期被程序覆盖临时触发
强制持续保持指定值,程序覆盖无效长期屏蔽某个信号

写入

在监控表或编辑器中:

  • 右键变量 → 写入值 → 输入 → 确定
  • 或在监控表的「强制值」列直接改

典型场景:

  • 手动点一下 CmdStart = TRUE 触发启动流程
  • 临时改 PID 设定值测试响应

强制

右键变量 → 强制,输入强制值:

  • 变量值锁死,PLC 程序写它无效
  • 强制图标在变量名旁显示 F
  • 解除:右键 → 取消强制

典型场景:

  • 调试某段逻辑时把传感器信号强制为 1,跳过实际设备
  • 屏蔽故障信号防止联锁动作
危险

强制是危险操作。投产的机器上强制可能导致事故(例如强制急停为 OFF)。

  • 只在调试阶段使用
  • 下载新程序或重启 Runtime 会自动清除所有强制
  • 下载前检查状态栏的「强制中」计数,确认都清了

强制列表

Ribbon → PLC → 强制列表,列出当前所有被强制的变量,方便一键全部取消。

权限

默认只有管理员账号可以强制。设置对话框 → 用户管理 里可配置哪些角色允许。

强制机制详解

强制 (Force) 的本质是在 PLC 运行时拦截变量写入:

用户程序 → [Force 过滤层] → 内存

强制表: { bSignal → TRUE }

执行流程:

  1. 程序执行 bSignal := FALSE;
  2. 运行时检查强制表: bSignal 在强制列表中, 值为 TRUE
  3. 丢弃用户程序的 FALSE 写入
  4. 保持强制值 TRUE 在内存中
  5. 下次程序读 bSignal 仍然得到 TRUE
与写入的关键区别
  • 写入 (Write Once): 只覆盖一次, 下周期程序写什么就是什么
  • 强制 (Force): 持续覆盖, 直到手动解除, 程序写入无效

强制优先级

多客户端同时操作时的优先级:

优先级 (高 → 低):
1. 急停 / 安全联锁 (硬线) ← 永远优先
2. OB121/122 异常处理 ← PLC 内部
3. 强制 (用户手动) ← 本功能
4. 用户程序写入
5. 默认初始值

多个 IDE 同时连 → 按最后操作者的强制值生效, 但每次操作会写审计日志标注操作者。

批量强制

一次强制多个变量:

  1. 在监视表中多选变量行 (Ctrl + 点击 或 Shift + 点击)
  2. 右键 → 强制所选
  3. 输入统一值或逐项输入
  4. 确认

批量应用场景:

  • 模拟一组传感器同时到位
  • 一键打开多个阀门
  • 模拟一整行机器人的点位到达信号

强制列表面板

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 → 跨越软限位撞机
  • 强制通讯心跳 = 正常 → 掩盖实际通讯中断
  • 强制产量计数 = 正常值 → 掩盖漏检

永远不要在产线运行时强制。必须调试时:

  1. 停 PLC
  2. 在停机状态强制
  3. 手动触发后, 立刻取消强制
  4. 下载前检查强制列表为空

权限分级

设置 → 用户管理 → 强制权限:

角色强制权限
观察员
操作员无 (仅写入)
工程师可强制非安全变量
管理员全部 (包括 %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%

强制列表的保存与复用

调试常用场景可保存为模板:

  1. 配好一组强制 (如"模拟回原到位")
  2. Ribbon → 强制列表 → 保存
  3. 导出为 scenarios/home_position.force.xml
  4. 下次 → 加载 → 一键恢复

场景模板举例:

场景文件用途
empty_bypass.force.xml跳过所有传感器 (用于纯逻辑测试)
sensor_simulated.force.xml模拟全套传感器信号
fault_isolated.force.xml屏蔽非关键故障
pid_manual.force.xmlPID 手动模式测试

排错表

问题原因解决
强制后变量还是变被更高优先级覆盖查强制列表, 可能是 OB121 在改
强制标签 F 没显示强制未生效重连 / 检查权限
下载后强制还在未自动清除 (旧 Runtime)手动全部取消
强制操作被拒绝权限不够或在黑名单管理员授权 / 查黑名单
找不到"取消强制"按钮强制列表为空右键变量 → 取消强制

最佳实践

  • 最小化强制数量: 强制越少越安全, 能用写入就不用强制
  • 每次强制都记原因: 养成写 reason: 的习惯, 便于事后审计
  • 调试结束立刻清除: 别留到下次, 会干扰别人
  • 配合强制列表面板: 定期看谁强制了什么
  • 严禁强制急停 / 限位: 永远不要在黑名单里的变量上强制
  • 场景模板化: 常用强制组合保存为 XML, 复用
  • 审计归档: 每周导出强制审计日志, 合规行业必备

相关文档