thực hiện sql đơn giản để kepware đọc
Nhìn ảnh của bạn thì vấn đề không phải ở SQL nữa — vì PowerShell đã đọc PostgreSQL OK (có value đầy đủ). Nhưng sang OPC KEPServerEX thì:
- Value = Unknown
- Quality = Bad
=> Kết luận nhanh: ODBC Client trong Kepware không lấy được dữ liệu runtime, chứ không phải query sai cú pháp.
🔎 Nguyên nhân hay gặp (đúng case của bạn 90%)
1. ❌ Query không phù hợp với ODBC Driver của Kepware
Kepware ODBC không hỗ trợ tốt các query kiểu:
SELECT ...
FROM ts_kv_latest ts
JOIN key_dictionary kd ...
WHERE ts.entity_id = (SELECT id FROM device ...)
👉 Đặc biệt là:
-
subquery
(SELECT id FROM device ...) - JOIN phức tạp
➡️ PowerShell chạy được, nhưng Kepware thì fail silently → trả về Bad
✅ Cách xử lý (chuẩn công nghiệp)
✔️ Cách 1: Tạo VIEW trong PostgreSQL (khuyên dùng)
Trong DB tạo view:
CREATE VIEW v_kepware_data AS
SELECT
kd.key AS TagName,
ts.bool_v,
ts.long_v,
ts.dbl_v,
ts.str_v
FROM ts_kv_latest ts
JOIN key_dictionary kd ON ts.key = kd.key_id
WHERE ts.entity_id = (
SELECT id FROM device WHERE name = 'Nam_Ban_2_IOT_KEPWARE' LIMIT 1
);
Sau đó Kepware chỉ gọi:
SELECT * FROM v_kepware_data;
👉 Cực kỳ ổn định
✔️ Cách 2: Hardcode entity_id (test nhanh)
Chạy PowerShell:
SELECT id FROM device WHERE name = 'Nam_Ban_2_IOT_KEPWARE';
Giả sử ra 123
➡️ Sửa query:
SELECT kd.key AS TagName, ts.bool_v, ts.long_v, ts.dbl_v, ts.str_v
FROM ts_kv_latest ts
JOIN key_dictionary kd ON ts.key = kd.key_id
WHERE ts.entity_id = 123;
👉 Kepware đọc OK ngay
✔️ Cách 3: Kiểm tra DSN ODBC
Trong Windows:
- ODBC Data Source (64-bit)
- Test connection
👉 Quan trọng:
- Kepware chạy 64-bit → phải dùng ODBC 64-bit
- Driver PostgreSQL phải đúng (psqlODBC)
✔️ Cách 4: Check cấu hình trong Kepware
Trong channel ODBC:
- Poll Rate (để 1000ms test)
- Enable Logging
-
Check:
- “Allow NULL values”
- “Use ANSI SQL” (tùy driver)
✔️ Cách 5: Mapping Tag sai kiểu
Bạn đang thấy:
-
Double -
String
Nhưng query trả nhiều cột:
👉 Kepware cần mapping rõ:
| Tag | Column |
|---|---|
| Gia_Tri_So_Row4 | dbl_v |
| Tag_Name_Row1 | TagName |
Nếu không mapping đúng → Unknown
🔥 Chốt nguyên nhân chính
👉 95% là do:
- Query quá phức tạp (JOIN + subquery)
- Kepware ODBC không parse được
🚀 Hướng tốt nhất cho bạn (chuẩn dự án thật)
- Tạo VIEW trong PostgreSQL
- Kepware chỉ SELECT đơn giản
- Mapping từng tag rõ ràng
Nếu bạn muốn mình tối ưu luôn
Gửi mình:
-
Cấu trúc bảng (
ts_kv_latest,key_dictionary) - Bạn muốn lấy bao nhiêu tag
👉 Mình viết luôn:
- VIEW chuẩn
- Query Kepware
- Mapping tag
Cho chạy ổn định 100% 👍

