Cơ chế "Report by Exception" (Chỉ gửi khi đổi giá trị)
Bạn nói đúng một phần: Trong hệ thống ABB 800xA, đúng là ABB sử dụng OPC làm giao thức tiêu chuẩn để máy chủ DCS (Connectivity Server) lấy dữ liệu đẩy lên màn hình vận hành (Workplace).
Tuy nhiên, cách ABB truyền 30.000 – 100.000 tag từ AC 800M $\rightarrow$ OPC $\rightarrow$ DCS không hề bị nghẽn hay giật lag là nhờ 2 bí quyết công nghệ cốt lõi sau:
1. Đường truyền từ AC 800M lên OPC Server: Dùng MMS (Không qua OPC)
Từ Controller AC 800M lên máy chủ chạy OPC Server (ABB OPC Server for AC 800M), truyền thông KHÔNG DÙNG OPC DA hay COM Interop.
ABB dùng giao thức Ethernet truyền thông công nghiệp tên là MMS (Manufacturing Message Specification - ISO 9506 / IEC 61850).
Giao thức MMS chạy thẳng trên lớp TCP/IP mã hóa Binary bằng C++ (ở mức Kernel OS).
Nhờ vậy, AC 800M nhồi hàng chục nghìn biến qua card mạng Ethernet (Module CI854/CI855...) lên máy chủ với băng thông rất nhẹ và tốc độ vài mili-giây.
2. Đường truyền từ OPC Server lên DCS: Dùng OPC DA Custom Interface (C++ Native)
Khi dữ liệu MMS về đến máy chủ, phần mềm ABB OPC Server sẽ chuyển đổi dữ liệu này thành chuẩn OPC DA. Nhưng cách màn hình DCS kết nối vào OPC Server này khác hoàn toàn với cách C# kết nối:
A. ABB dùng "Custom Interface" (C++ Direct Pointers), C# dùng "Automation Interface" (COM Interop)
C# / OPCAutomation.dll: Kết nối qua tầng trung gian tên là Automation Wrapper. Tầng này phải đóng gói (marshal) dữ liệu từ C++ sang C# (Managed Code), cấp phát lại bộ nhớ RAM liên tục cho từng biến, làm CPU vọt lên 100% khi chạy 30.000 tag.
DCS ABB 800xA: Được viết bằng C++ thuần. Nó kết nối vào OPC Server bằng OPC DA Custom Interface (
IOPCServer,IOPCItemMgt). Tầng này đọc thẳng địa chỉ con trỏ bộ nhớ (Memory Pointer / RAM Mapping) của OPC Server. Quá trình lấy 30.000 tag diễn ra trực tiếp trong RAM mà không tốn chi phí CPU chuyển đổi ngữ cảnh.
B. Cơ chế "Report by Exception" (Chỉ gửi khi đổi giá trị)
ABB không bắt 30.000 tag phải cập nhật liên tục mỗi 100ms.
Dưới AC 800M và OPC Server có bộ lọc Deadband (ví dụ: nhiệt độ phải lệch $> 0.5^\circ\text{C}$ mới gửi).
Trong 30.000 tag, thực tế tại 1 thời điểm chỉ có khoảng 300 – 500 tag thực sự thay đổi giá trị. OPC Server chỉ đẩy đúng 500 tag đổi này lên DCS (Report by Exception), giúp giảm tải hệ thống đi 98%.
C. Cơ chế Active Screen Filtering (Chỉ Subcribe Tag đang hiển thị)
DCS ABB chỉ thực sự đăng ký (Subscribe) đọc các Tag đang nằm trên màn hình HMI người vận hành đang mở (ví dụ: màn hình đang mở chứa 50 Tag thì OPC Server chỉ tốn tài nguyên truyền 50 Tag đó). 29.950 Tag còn lại nằm ở trạng thái "ngủ" (Inactive Group), khi nào lưu History/Alarm mới đọc theo chu kỳ chậm.
Tóm tắt luồng truyền của ABB AC 800M
Bài học để bạn áp dụng vào C# Gateway của mình:
Nếu bạn muốn C# cân 30.000 tag mượt như ABB:
Không dùng
OPCAutomation.dllcũ (vì nó là Automation Wrapper rất chậm).Viết Gateway C# dùng OPC UA Client SDK (
OPCFoundation.NETStandard) chạy dạng Async/Await.3.Áp dụng Deadband (chỉ cập nhật khi số thay đổi) và chia Tag thành 2 nhóm: Active (đang mở trên màn hình) và Inactive (chạy ngầm chu kỳ chậm).

