跳到主要內容

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

後續內容​