TÀI LIỆU ĐƯỢC HỖ TRỢ BỞI AI
Bạn muốn biết điều gì?
Camera Script
Camera script là một script duy nhất cho toàn bộ camera. Nó phản ứng với mọi inspection đã hoàn thành và với các thông điệp đến, và có thể:
- publish lên bất kỳ topic MQTT nào, theo định dạng của riêng bạn
- đặt biến, để recipe script đọc
- phát cảnh báo, hiển thị trong Diagnostic Logs
- chạy timer và giữ trạng thái, chẳng hạn như bộ đếm và các giá trị gần nhất
Nó không bao giờ thay đổi judgment: việc quyết định OK hay NG là công việc của recipe script. Nó tiếp tục chạy xuyên suốt các lần chuyển đổi recipe.
Mở Integration > Camera Script. Không có gì chạy cho đến khi bạn bật script lên, vì vậy bạn có thể viết và kiểm tra trước.

Cách thức chạy
Script export các hook. Mỗi hook là tùy chọn: một script có thể chỉ export onResult, hoặc chỉ subscriptions và onMessage.
| Hook | Chạy khi |
|---|---|
onStart() | Khi script được load: sau khi lưu, khi bạn bật nó lên, và khi camera khởi động. Khởi tạo timer và thiết lập trạng thái tại đây |
onResult(result) | Sau mỗi inspection ở production mode. Export options = { setup_results: true } để nhận cả kết quả Setup |
onMessage(msg) | Khi có thông điệp trên topic trong subscriptions, hoặc khi User Data của PLC thay đổi |
onTimer(name) | Khi một timer kích hoạt |
onStop() | Trước khi phiên bản mới tiếp quản, khi bạn tắt script, và khi tắt máy (không áp dụng khi mất điện) |
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 });
}
Mỗi lần một hook. Các hook chạy lần lượt, vì vậy trạng thái không bao giờ thay đổi trong khi một hook đang chạy. Các sự kiện mới chờ trong hàng đợi tối đa 64 kết quả và 256 thông điệp; khi hàng đợi đầy, sự kiện cũ nhất sẽ bị bỏ và được đếm lại.
Awaiting. Trong khi một hook đang await mqtt.publish hoặc vars.set, hook của sự kiện tiếp theo có thể chạy. Hãy đọc lại state sau một await, không phải trước nó.
Thời gian. Mỗi hook có 1 giây cho đến await đầu tiên, và 50 ms cho mỗi phần sau đó. Một hook chạy lâu hơn sẽ bị dừng.
Lỗi. Khi một hook ném lỗi hoặc bị dừng, lỗi sẽ hiển thị trong Log của script và dưới dạng cảnh báo, các lệnh gọi mà nó đã khởi động bị hủy, và sự kiện tiếp theo chạy bình thường.
Những gì script có thể dùng
| Global | Chức năng |
|---|---|
mqtt.publish(topic, payload, opts?) | Publish văn bản, byte hoặc đối tượng (gửi dưới dạng JSON). Tùy chọn: qos (0, 1 hoặc 2), retain, và các thuộc tính MQTT v5 content_type, response_topic, correlation_data, user_properties, message_expiry_s |
mqtt.status() | "disabled", "connecting", "connected" hoặc "disconnected" |
subscriptions | Danh sách các topic để lắng nghe, dưới dạng chuỗi ký tự. Cho phép dùng wildcard + và # |
vars.get(name) / vars.set(name, value) | Đọc bất kỳ biến nào; đặt các biến có nguồn là Camera script |
timers.set(name, ms, { repeat }) / timers.clear(name) | Timer có tên, tối thiểu 100 ms |
alert.raise(title, detail?) | Phát cảnh báo. Cùng một tiêu đề được phát tối đa một lần mỗi phút |
state | Bộ nhớ tạm tồn tại giữa các sự kiện, cho đến khi script được load lại |
csv(rows), xml.build(), xml.parse() | Xây dựng văn bản CSV, và xây dựng hoặc parse XML |
pack, unpack, crc, log | Các helper giống như trong recipe script |
result trong onResult có cấu trúc giống như một thông điệp result: recipe, trigger, judgment và reason cuối cùng, kết quả của từng tool, vars, metadata, tags, image.url và hơn thế nữa. Xem MQTT.
Những gì camera script không thể làm
- Thay đổi judgment hoặc ghi vào PLC User Results. Chỉ recipe script mới có thể
- Truy cập file của camera, hoặc truy cập mạng ngoài MQTT
- Giữ trạng thái qua lần reload hoặc restart:
statevà timer sẽ khởi động lại - Kích hoạt inspection hoặc chuyển recipe. PLC và HTTP API vẫn làm việc đó
Các giới hạn: 16 MiB bộ nhớ bao gồm state, tối đa 16 lệnh gọi đang chờ, 32 timer, 256 KiB cho mỗi thông điệp MQTT nhận được, 50 dòng log mỗi giây, và 10 tiêu đề cảnh báo mỗi phút.
Nếu script hết bộ nhớ nó sẽ bị reset: state và timer bị xóa và onStart chạy lại. Giữ state nhỏ gọn, ví dụ chỉ lưu bộ đếm thay vì danh sách tất cả kết quả.
Templates
| Nhóm | Templates |
|---|---|
| Publish results | Publish mỗi kết quả lên một topic MQTT · Publish heartbeat theo timer |
| Receive data from the line | Trả lời yêu cầu JSON-RPC qua MQTT · Sao chép một trường từ thông điệp JSON của nhà cung cấp vào một biến |
| Monitor production | Đếm OK và NG theo ca và publish file CSV · Phát cảnh báo sau một số lần NG liên tiếp |

// 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,
});
}
}
Dry run
Test chạy bản nháp của bạn dưới dạng dry run: nó replay các kết quả gần đây qua onStart, onResult và onStop, và ghi lại mọi lần publish, ghi biến, timer, cảnh báo và dòng log mà không thực sự gửi đi bất cứ thứ gì. Các kết quả gần đây được lưu trong bộ nhớ, vì vậy danh sách sẽ trống sau khi khởi động lại.
Bảo vệ các lệnh publish bằng mqtt.status() === "connected", như các template đã làm, và await chúng hoặc thêm .catch(). Một lệnh publish thất bại mà không có gì chờ đợi nó sẽ được ghi log là lỗi.