AI 驱动文档
您想了解什么?
相机脚本
相机脚本是适用于整个相机的一个脚本。它对每次完成的检测以及传入的消息作出响应,可以:
- 发布到任意 MQTT 主题,使用您自己的格式
- 设置变量,供程序脚本读取
- 发出警报,警报将显示在诊断日志中
- 运行计时器和保持状态,例如计数器和最近观察到的值
它绝不更改判定:判定通过或失败是程序脚本的工作。它在程序切换时持续运行。
打开Integration > Camera Script。在您开启脚本之前,脚本不会运行,因此您可以先编写和测试。

它如何运行
脚本导出钩子。每个钩子都是可选的:脚本可以只导出 onResult,或只导出 subscriptions 和 onMessage。
| 钩子 | 运行时机 |
|---|---|
onStart() | 脚本加载时:保存后、开启脚本时以及相机启动时。在此处启动计时器并设置状态 |
onResult(result) | 每次生产检测之后。导出 options = { setup_results: true } 以同时获取设置模式的结果 |
onMessage(msg) | 对 subscriptions 中某个主题的消息,或 PLC 用户数据的变化 |
onTimer(name) | 计时器触发时 |
onStop() | 新版本接管之前、关闭脚本时以及关机时(断电时不会调用) |
export const subscriptions = ["plant/line3/cmd"]; // MQTT topics this script listens on
export function onStart() {
state.results = 0;
timers.set("heartbeat", 30 * 1000, { repeat: true });
}
export function onResult(result) {
state.results = Number(state.results ?? 0) + 1;
}
export async function onTimer(name) {
if (name !== "heartbeat" || mqtt.status() !== "connected") return;
await mqtt.publish("plant/line3/alive", { alive: true, results: state.results }, { qos: 0 });
}
一次一个。 钩子一次运行一个,因此在钩子运行期间状态不会改变。新事件在队列中等待,最多 64 个结果和 256 条消息;队列满时,最早的事件会被丢弃并计入统计。
等待。 在钩子等待 mqtt.publish 或 vars.set 期间,下一个事件的钩子可以运行。请在 await 之后再次读取 state,而不是在其之前。
时间。 钩子在首次 await 之前有 1 秒钟的时间,之后每一段有 50 毫秒。运行超时的钩子将被停止。
失败。 当钩子抛出异常或被停止时,错误会出现在脚本的日志中并作为警报显示,它启动的调用会被取消,下一个事件照常运行。
可用的内容
| 全局 | 作用 |
|---|---|
mqtt.publish(topic, payload, opts?) | 发布文本、字节或对象(以 JSON 形式发送)。选项:qos(0、1 或 2)、retain,以及 MQTT v5 属性 content_type、response_topic、correlation_data、user_properties、message_expiry_s |
mqtt.status() | "disabled"、"connecting"、"connected" 或 "disconnected" |
subscriptions | 要监听的主题列表,使用字符串字面量。允许 + 和 # 通配符 |
vars.get(name) / vars.set(name, value) | 读取任意变量;设置源为相机脚本的变量 |
timers.set(name, ms, { repeat }) / timers.clear(name) | 命名计时器,至少 100 毫秒 |
alert.raise(title, detail?) | 发出警报。相同标题每分钟最多发出一次 |
state | 事件之间保留的临时内存,直到脚本重新加载 |
csv(rows)、xml.build()、xml.parse() | 构建 CSV 文本,构建或解析 XML |
pack、unpack、crc、log | 与程序脚本中相同的辅助函数 |
onResult 中的 result 与结果消息具有相同的结构:程序、触发、最终的 judgment 和 reason、每个工具的结果、vars、metadata、tags、image.url 等。参见 MQTT。
相机脚本不能做的事
- 更改判定或写入 PLC User Results。只有程序脚本可以做到
- 访问相机文件,或通过 MQTT 以外的方式访问网络
- 在重新加载或重启后保持状态:
state和定时器会重新开始 - 触发检测或切换程序。这仍然由 PLC 和 HTTP API 完成
其限制:包括 state 在内共 16 MiB 内存,最多 16 个并发调用,32 个定时器,每条接收的 MQTT 消息 256 KiB,每秒 50 行日志,每分钟 10 个警报标题。
如果脚本内存耗尽,它将被重置:state 和定时器被清空,onStart 会再次运行。保持 state 较小,例如使用计数而不是每个结果的列表。
模板
| 分组 | 模板 |
|---|---|
| 发布结果 | 将每个结果发布到 MQTT 主题 · 按定时器发布心跳 |
| 从产线接收数据 | 通过 MQTT 响应 JSON-RPC 请求 · 将供应商 JSON 消息的某个字段复制到变量中 |
| 监控生产 | 按班次统计通过和失败数量并发布 CSV · 连续拒收后触发警报 |

// Raise an alert after consecutive rejects
export function onResult(result) {
state.streak = result.judgment === "fail" ? Number(state.streak ?? 0) + 1 : 0;
if (state.streak === 3) {
alert.raise("Reject streak", {
streak: state.streak,
recipe: result.recipe.name,
reason: result.reason,
});
}
}
试运行
测试将您的草稿作为试运行运行:它通过 onStart、onResult 和 onStop 重放最近的结果,并记录每次发布、变量写入、定时器、警报和日志行,但不会实际发送任何内容。最近的结果保存在内存中,因此重启后列表为空。
像模板那样使用 mqtt.status() === "connected" 守护发布,并对其使用 await 或添加 .catch()。发布失败且没有任何等待处理时会被记录为错误。