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 message đến, và có thể:
- publish đế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à duy trì trạng thái, chẳng hạn như bộ đếm và các giá trị cuối cùng đã thấy
Nó không bao giờ thay đổi judgment: việc quyết định OK hay NG là nhiệm vụ của recipe script. Nó tiếp tục chạy qua 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 nó chạy
Script xuất các hook. Mỗi hook đều tùy chọn: một script có thể chỉ xuất onResult, hoặc chỉ xuất subscriptions và onMessage.
| Hook | Chạy |
|---|---|
onStart() | Khi script được tải: 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. Xuất options = { setup_results: true } để nhận cả kết quả Setup |
onMessage(msg) | Đối với message trên một 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 phải 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ột tại một thời điểm. Các hook chạy lần lượt mộ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 lên đến 64 kết quả và 256 message; khi hàng đợi đầy, sự kiện cũ nhất bị loại 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. Đọc lại state sau một await, không phải trước nó.
Thời gian. Một 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ẽ xuất hiện trong Log của script và dưới dạng cảnh báo, các cuộc gọi mà nó đã khởi tạo bị hủy, và sự kiện tiếp theo chạy như bình thường.
Những gì nó có thể sử dụng
| Global | Chức năng |
|---|---|
mqtt.publish(topic, payload, opts?) | Publish text, bytes hoặc object (gửi dưới dạng JSON). Options: 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 string literal. Cho phép ký tự đại diện + 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 tên, tối thiểu 100 ms |
alert.raise(title, detail?) | Phát cảnh báo. Cùng một title đượ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 tải lại |
csv(rows), xml.build(), xml.parse() | Tạo text CSV, và tạo hoặc phân tích 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 message kết quả: recipe, trigger, judgment và reason cuối cùng, kết quả của từng tool, vars, metadata, tags, image.url và nhiều hơn nữa. Xem MQTT.
Những gì camera script không thể làm
- Thay đổi judgment hoặc ghi PLC User Results. Chỉ recipe script mới có thể
- Truy cập các file của camera, hoặc mạng ngoài trừ qua MQTT
- Duy trì trạng thái qua một lần tải lại hoặc khởi động lại:
statevà timer bắt đầu lại - Kích hoạt một inspection hoặc chuyển đổi recipe. PLC và HTTP API vẫn làm điều đó
Giới hạn của nó: 16 MiB bộ nhớ bao gồm state, tối đa 16 cuộc gọi đang thực hiện, 32 timer, 256 KiB mỗi message MQTT nhận được, 50 dòng log mỗi giây, và 10 title cảnh báo mỗi phút.
Nếu script hết bộ nhớ, nó sẽ được reset: state và timer bị xóa và onStart chạy lại. Giữ state nhỏ, ví dụ dùng số đếm thay vì danh sách tất cả các kết quả.
Template
| Nhóm | Template |
|---|---|
| Publish results | Publish mỗi kết quả đến một topic MQTT · Publish heartbeat theo timer |
| Receive data from the line | Trả lời các yêu cầu JSON-RPC qua MQTT · Sao chép một field của message JSON từ nhà cung cấp vào một biến |
| Monitor production | Đếm số OK và NG mỗi ca và publish CSV · Phát cảnh báo sau các lần từ chối 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ó phát lại 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 gử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 sẽ được ghi lại dưới dạng lỗi.