Bỏ qua để đến nội dung

Datasource đầu ra

Một datasource đầu ra ghi dữ liệu ra một hệ thống bên ngoài — một PLC, broker, hoặc ứng dụng điều khiển. Dùng Output Mapping để ánh xạ các kênh dự đoán tới một tag hoặc cột đích; bạn cũng có thể gửi trực tiếp một payload bằng một lần ghi thử theo yêu cầu.

Giao thứcKhả năng
OPC-UAGhi vào một node (đồng bộ)
MQTTPublish tới một topic ở QoS 1, retain tắt theo mặc định
CSVThêm dòng vào một tệp xoay vòng — một cột cho mỗi tag đã ánh xạ, cộng với timestamp_utc
  1. Vào Datasources → Output, bấm + Create, và chọn giao thức.

  2. Mỗi giao thức có các trường riêng. Các trường bí mật bị che thành *** sau khi lưu.

    {
    "endpoint": "opc.tcp://your-plc-host:4840",
    "securityPolicy": "None",
    "authentication": "Anonymous"
    }
  3. Mở Output Mapping trên hàng và ánh xạ ít nhất một kênh dự đoán tới một tag đích — một topic MQTT, một cột CSV, hoặc một địa chỉ node OPC-UA. Tag đã ánh xạ chính là địa chỉ gốc của sink, giữ nguyên: một tag MQTT là test sẽ publish tới topic test, không thêm tiền tố nào.

  4. Lưu đầu ra, rồi bật nó. Một đầu ra phải được bật trước khi nó chuyển dự đoán hoặc chấp nhận một lần ghi thử.

Sink MQTT publish ở QoS 1, không phải QoS 0. Ở QoS 0, broker không xác nhận gì cả, nên một tin nhắn bị rớt — thường gặp nhất là một topic bị ACL từ chối — vẫn trả về một lần ghi thành công mà không có thông báo nào; QoS 1 nhận được một xác nhận thật (hoặc một mã lý do) từ broker.

retain vẫn giữ false: một tin nhắn được retain sẽ phát lại cho mọi subscriber trong tương lai, nên một dashboard được mở sau nhiều giờ sẽ đọc một giá trị cũ như thể là giá trị hiện tại — đây là một lựa chọn có chủ đích theo từng lần triển khai, chứ không phải một giá trị mặc định có thể đoán được.

MQTT: kết nối lại, client id, và chẩn đoán Test Connection

Phần tiêu đề “MQTT: kết nối lại, client id, và chẩn đoán Test Connection”

Sink MQTT kết nối lại theo backoff sau khi broker ngắt kết nối — một kết nối chỉ để publish không có gì để đăng ký lại, nên việc khôi phục chỉ đơn giản là kết nối lại. Nếu không có cơ chế này, một sự cố tạm thời trước đây từng trở thành vĩnh viễn.

Một Client ID tường minh giờ đây có hậu tố theo vai trò (<id>-in cho một đầu vào, <id>-out cho một đầu ra) tại thời điểm kết nối. Điều này áp dụng cho mọi cấu hình đã lưu, kể cả một cấu hình vẫn còn lưu mặc định aiboard chia sẻ cũ — nên một đầu vào và đầu ra được xây từ cùng một cấu hình không còn trục xuất lẫn nhau khỏi broker nữa, và không cần chỉnh sửa cho cặp đó. Một id để trống vẫn tự sinh một id duy nhất.

Việc trục xuất (SessionTakenOver) vẫn xảy ra nếu bạn tường minh dùng lại một Client ID giữa hai datasource cùng vai trò (hai đầu vào, hoặc hai đầu ra), hoặc nếu một client MQTT bên ngoài kết nối với cùng id như một trong các datasource của bạn — trong trường hợp đó, hãy đặt mỗi bên một giá trị khác biệt, hoặc xóa trống trường.

Test Connection phân loại lỗi ở tầng socket thay vì hiển thị tên exception thô: lỗi không thể kết nối/bị từ chối/DNS được ánh xạ thành connect_failed, còn một lần kết nối bị hủy được ánh xạ thành timeout. Trong Docker, localhostcontainer backend, không phải máy của bạn — đây là nguyên nhân phổ biến nhất khiến một broker có thể kết nối được từ client trên desktop nhưng không kết nối được từ AIBOARD. Hãy dùng tên service của broker thay thế (ví dụ mqtt://mosquitto:1883 trong phòng lab).

Các kết nối đầu ra dùng cùng các trường bảo mật và thang bậc như đầu vào — Insecure cho bàn thử, TLS kèm thông tin đăng nhập cho staging, và xác thực bằng chứng chỉ lẫn nhau cho sản xuất. Các chứng chỉ được đọc từ mount /certs. Xem Chế độ bảo mật: Insecure, TLS và Secure để biết các bảng trường theo từng giao thức; chúng áp dụng nguyên văn cho đầu ra.

Hai lưu ý riêng cho đầu ra:

  • MQTT publish ở QoS 1 trên đường sản xuất để một broker làm rớt một tin nhắn (trường hợp kinh điển là một topic bị ACL từ chối) hiện ra thành lỗi thay vì một thành công âm thầm. Hãy cấp cho tài khoản của sink quyền publish đúng vào các topic đã ánh xạ.
  • Đầu ra CSV chỉ ghi bên trong thư mục đầu ra đã cách ly; giới hạn xoay vòng khống chế dung lượng đĩa. Hãy bảo vệ volume, chứ không phải giao thức.

Lệnh ghi thử được gửi qua API — POST /api/datasources/output/{id}/test-write, chỉ dành cho quản trị viên. Giao diện không còn nút Test Write. Mỗi sink xác thực khuôn dạng payload riêng: MQTT cần một topic, CSV cần columns/values, còn OPC-UA cần một mảng writes. Hãy dùng ví dụ tương ứng bên dưới.

{
"writes": [
{ "nodeId": "ns=2;s=Temperature", "value": 42.5 }
]
}

Một lần ghi thành công trả về kết quả thành công; một lỗi giao thức trả về một thông báo như OPC UA: node not found hoặc MQTT: publish refused.

Triệu chứngNguyên nhân khả dĩ
connect_failed khi Test ConnectionBroker/endpoint không thể truy cập được, bị từ chối, hoặc lỗi DNS — kiểm tra đường mạng, host, và cổng (MQTT 1883, OPC-UA 4840). Trong Docker, localhost nghĩa là container backend, không phải máy của bạn.
timeout khi Test ConnectionLần thử kết nối bị hủy trước khi hoàn tất — kiểm tra đường mạng và cổng.
Kích hoạt thất bại với no_output_tags_mappedHãy ánh xạ ít nhất một kênh đầu ra tới một tag trước, qua Output Mapping.
Lỗi datasource bị tắtBật đầu ra trước khi gửi một lần ghi thử.
Node not found (OPC-UA)Kiểm tra định dạng NodeId và rằng node tồn tại trên máy chủ.
Admin only (403)Lệnh ghi thử cần một tài khoản admin.
Hai đầu vào MQTT (hoặc hai đầu ra) liên tục ngắt kết nối lẫn nhauCả hai dùng chung một Client ID tường minh — hãy xóa trống một bên hoặc đặt giá trị khác nhau cho mỗi bên. Một đầu vào và đầu ra MQTT trên cùng một cấu hình không bị ảnh hưởng: mỗi bên tự động có hậu tố (-in/-out) tại thời điểm kết nối, kể cả trên một mặc định aiboard cũ.

Xem runbook Khắc phục sự cố để biết thêm.