phân tích code python Nậm Ban 2
Code này đang quét theo kiểu polling thủ công bằng:
while True:
...
for ioa, p in source_points.items():
p.read()
...
time.sleep(1)
=> Nghĩa là:
-
Nó đọc tuần tự từng tag bằng
p.read() -
Sau khi đọc hết toàn bộ tag thì
sleep(1) - Rồi lặp lại.
Bạn đang có tổng số tag:
-
TI1:
15000 → 15089= 90 tag -
TI3:
25000 → 25005= 6 tag -
TI13:
1 → 59= 59 tag
Tổng:
90 + 6 + 59 = 155 tag
Tần số quét thực tế
Vòng lặp:
for ioa, p in source_points.items():
p.read()
đọc liên tục 155 tag rồi nghỉ 1 giây.
=> Chu kỳ scan toàn bộ khoảng:
~1 giây + thời gian truyền IEC104
Nếu mạng ổn thì:
-
mỗi
p.read()thường vài ms - 155 tag có thể mất khoảng 100~500 ms
=> thực tế:
1.1 → 1.5 giây / vòng
Tần số cập nhật mỗi tag
Mỗi tag được đọc:
~1 lần / 1.2 giây
Tương đương:
~0.8 Hz
Quan trọng
Code này KHÔNG phải scan song song.
Nó đọc kiểu:
Tag1
Tag2
Tag3
...
Tag155
nên:
- càng nhiều tag càng chậm
- 1000 tag sẽ lag rõ
- IEC104 server có thể quá tải nếu read liên tục.
Thực tế IEC104 đúng chuẩn
IEC104 thường không dùng polling từng point như này.
Chuẩn hơn là:
1. GI (General Interrogation)
Gọi:
station.interrogation()
Server tự gửi toàn bộ dữ liệu.
2. Spontaneous
Khi giá trị đổi:
RTU tự push lên
Không cần p.read() liên tục.
Đây mới là cách IEC104 chạy chuyên nghiệp.
Code của bạn hiện tại giống
OPC polling
hơn là IEC104 chuẩn.
Nếu muốn scan nhanh hơn
Giảm:
time.sleep(1)
ví dụ:
time.sleep(0.1)
thì:
~10Hz
NHƯNG:
- CPU tăng
- network tăng
- RTU dễ treo nếu yếu
- CP1243-7 Siemens có thể timeout/nghẽn.
Khuyến nghị thực tế
Nếu dùng IEC104 thật:
- dùng spontaneous
- hoặc GI 5~10 giây/lần
-
không nên
read()từng IOA liên tục.
Ví dụ:
master_station.interrogation()
time.sleep(5)
là đúng kiểu SCADA/IEC104 hơn rất nhiều.

