mỗi ngày khoảng 250 kiện,
Nếu hệ thống của bạn mỗi ngày khoảng 250 kiện, và PLC S7-1200 chỉ có nhiệm vụ lưu tạm dữ liệu rồi đẩy sang Database, thì tôi khuyên chọn giải pháp 2: một DB dạng mảng, mỗi phần tử là một kiện, dữ liệu được phân biệt bằng mã + thời gian.
So sánh
| Tiêu chí | Giải pháp 1: nhiều DB/Array riêng | Giải pháp 2: 1 DB + Array |
|---|---|---|
| Quản lý PLC | ❌ Khó | ✅ Dễ |
| Tìm kiếm dữ liệu | ❌ Khó | ✅ Dễ |
| Mở rộng 250 → 1000 kiện/ngày | ❌ Phức tạp | ✅ Rất dễ |
| SQL/Node.js đọc dữ liệu | ❌ Nhiều logic | ✅ Đơn giản |
| Backup/khôi phục | ❌ Phức tạp | ✅ Đơn giản |
| Xóa dữ liệu cũ | ❌ Khó | ✅ Dễ |
| Theo dõi mã kiện | ⚠️ | ✅ |
| Theo dõi thời gian | ⚠️ | ✅ |
| Tốc độ PLC | Tốt | ✅ Tốt |
| Khuyến nghị | Không nên | Nên dùng |
Tôi sẽ thiết kế như này
Không nên tạo:
DB_Kien_001 DB_Kien_002 DB_Kien_003 ... DB_Kien_250
Mà tạo một DB duy nhất:
DB_Production └── Kien[1..500]
Ví dụ một phần tử:
Kien[1] MaKien : STRING Ngay : DATE ThoiGian : TIME_OF_DAY SoLuong : DINT KhoiLuong : REAL TrangThai : BOOL DaGhiDB : BOOL
Sau đó:
Kien[1] → 08:01:15 → K001 Kien[2] → 08:04:32 → K002 Kien[3] → 08:08:21 → K003 ... Kien[250] → 16:42:10 → K250
Mã kiện + DateTime chính là khóa để xác định từng bản ghi.
Nhưng có một điểm tôi khuyên bạn thay đổi
Nếu Database là SQL Server/PostgreSQL, thì không nên lưu lịch sử lâu dài trong PLC.
Nên chia thành 2 tầng:
PLC S7-1200 │ │ DB_Production Array[1..500] │ │ Node.js/SCADA │ ▼ SQL Server │ ┌───────────┼───────────┐ ▼ ▼ ▼ Ngày Tháng Năm
PLC chỉ giữ khoảng 500–1000 kiện gần nhất.
Database mới là nơi lưu lịch sử:
Production ------------------------------------------------ ID MaKien DateTime SoLuong KhoiLuong May Ca Operator Status ------------------------------------------------
Ví dụ ngày 24/08:
ID MaKien DateTime KhoiLuong 1 K0001 2026-08-24 08:01:15 1025.5 2 K0002 2026-08-24 08:04:32 1018.2 3 K0003 2026-08-24 08:08:21 1021.7 ... 250 K0250 2026-08-24 16:42:10 1023.1
Ngày hôm sau không cần tạo DB mới. Vẫn là bảng Production, chỉ khác DateTime.
Nếu muốn hệ thống chạy ổn định nhất
Tôi khuyên kiến trúc:
PLC:
DB_Production │ ├── CurrentKien │ ├── MaKien │ ├── DateTime │ ├── SoLuong │ └── ... │ └── History[1..500] ├── MaKien ├── DateTime ├── SoLuong └── ...
Khi một kiện hoàn thành:
1. PLC tạo mã kiện 2. Ghi DateTime 3. Ghi dữ liệu kiện vào History[Index] 4. Đặt DataReady = TRUE 5. Node.js/SCADA đọc dữ liệu 6. Ghi vào SQL 7. SQL trả OK 8. PLC đặt DataReady = FALSE 9. Index + 1
Đặc biệt nên có DataReady và DataSaved/ACK, để mất mạng PLC ↔ Database thì kiện hàng không bị mất dữ liệu.
Nếu hệ thống của bạn đúng là 250 kiện/ngày, tôi còn khuyên không cần 250 phần tử, mà nên làm Array[1..1000] trong PLC. Như vậy có dư khoảng 4 ngày dữ liệu, và khi SQL mất kết nối vài giờ vẫn có thể bù dữ liệu sau đó. Đây là cách tôi thấy phù hợp hơn cho hệ thống PLC + SQL của bạn.

