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()。釋出失敗且沒有任何等待處理時會被記錄為錯誤。