simulate PID thực hiện và vẽ biểu đồ
Mình sẽ xem cấu trúc thư viện mẫu motor_ctrl.zip trước, rồi viết thư viện mô phỏng PV theo đúng định dạng đó.
Đang viết xong FB Sim_PV (PV phản hồi theo OUT của PID + các dạng sóng cài đặt được). Giờ mình chạy thử logic với một bộ PI giả lập để chắc PV hội tụ về SP, rồi gửi zip.
Mình đã viết xong FB Sim_PV theo khung của motor_ctrl.zip, nhưng chưa nạp thử vào LadderDriver nên chưa biết nó có import được không. Mình chỉ chạy thử logic bằng Python với một bộ PI giả lập.
Cách nối với PID_INT trong ảnh của bạn
pid_outnối từData_block_1.PID_1.OUT.pvnối vàoData_block_1.PID_1.PV.dt_msđặt bằng Scan time (ảnh của bạn đang là 4 ms).speed_x100 = 100là thời gian thực,1000là chạy nhanh 10 lần để xem trend nhanh hơn.
Các quy luật PV cài đặt được (mode)
- 0, Process: PV đuổi theo OUT như thiết bị thật. Các tham số là
tau_ms(quán tính bậc 1),tau2_ms(bậc 2, tạo độ trễ dạng chữ S),gain_x100,pv_min/pv_maxvàout_min/out_max(khớp với Lim 0–10000 của PID). - 1, 2, 3: sine, tam giác, vuông. Chỉnh bằng
offset,amp,period_ms. - 4: hằng số bằng
offset. - Dùng chung mọi mode:
noise: nhiễu đo ±biên độ.dist: nhiễu tải cộng vào PV đích, đổi lúc đang chạy để xem PID bù.init_pvvàreset: đặt lại PV.target: ngõ ra phụ, tiện vẽ lên trend cùng SP.
Kết quả chạy thử logic
- Với Kp 1.5, Ki 0.5, SP 3000, PV hội tụ về 3000 ở cả mô hình bậc 1 và bậc 2.
- Bậc 2 vọt lố lên khoảng 4050.
- Thêm nhiễu tải 500 giữa chừng thì PI kéo PV về lại 3000.
Phần mình đoán, cần bạn xác nhận
- Mẫu motor_ctrl chỉ có Ladder, nên mình đoán cách lưu một network SCL trong
ladderfb.json("Kind":"SCL","Code"). Phần khai báo biến thì chắc chắn vì theo đúng mẫu. - Mình dùng kiểu
Realcho biến nội bộ và tham chiếu biến bằng tên trần (không có#). Nếu app không nhận, báo mình sửa. - Nếu import không nhận phần SCL, bạn dùng nút + SCL và dán nội dung
sim_pv.sclvào, các biến vẫn có sẵn từ zip. Tốt nhất bạn xuất giúp mình một FB có SCL từ nút “Tạo thư viện FB (Ladder + SCL)”, mình sẽ khớp đúng định dạng.
Files are in /tmp/claude-0/-home-claude/419fee0a-5db1-50e1-b25e-58cf50b2aa2b/scratchpad:
- sim_pv.zip
- sim_pv.sclFB đã nạp được. Bạn nhập các giá trị sau vào từng chân, theo đúng bài toán trong ảnh (SP 3000, PV ban đầu 2000, OUT giới hạn 0–10000):
Chân Nhập Ý nghĩa enable TRUECho chạy mô phỏng reset FALSEMuốn PV về lại init_pvthì cho 1 xung TRUEmode 0Mô phỏng PV theo OUT của PID pid_out Data_block_1.PID_1.OUTTag, nối từ OUT của PID out_min 0Khớp Lim thấp của PID out_max 10000Khớp Lim cao của PID pv_min 0PV ổn định khi OUT = 0 pv_max 10000PV ổn định khi OUT = 10000 gain_x100 100Hệ số khuếch đại 1.0 tau_ms 5000Quán tính bậc 1 là 5 giây tau2_ms 2000Bậc 2 là 2 giây; nhập 0nếu muốn đáp ứng đơn giảndist 0Nhiễu tải; lúc đang chạy đổi thành 500để xem PID bùnoise 0Thử nhiễu đo thì nhập 30init_pv 2000PV khởi tạo amp 1000Chỉ dùng cho mode 1, 2, 3 offset 2000Chỉ dùng cho mode 1, 2, 3, 4 period_ms 10000Chu kỳ 10 giây, chỉ dùng cho mode 1, 2, 3 dt_ms 4Bằng Scan time hiện tại (4 ms); nếu Scan đổi thì sửa theo speed_x100 100Thời gian thực; nhập 1000để chạy nhanh 10 lầnpv Data_block_1.PID_1.PVTag ngõ ra, trùng với chân PV của PID target Data_block_1.Var_1Tag bất kỳ để vẽ trend; có thể bỏ trống Vì gain là 1.0 và dải PV bằng dải OUT, PV sẽ ổn định ở 3000 khi OUT bằng 3000.
Để xem tuyến PID, bạn vẽ trend cho SP, PV và OUT (thêm
targetnếu muốn). Chỉnh Kp, Ki, Kd để so sánh đáp ứng. Nếu PV chạy quá chậm, nângspeed_x100lên1000.Nếu muốn thử PV chạy theo sóng mà không cần OUT, đặt
mode = 1(sine),offset = 3000,amp = 500.Sim_PV không chạy vì 2 lỗi cấu hình trong ảnh của bạn, và mình chưa thấy lỗi nào từ chính FB:- Network 1 chưa cấp nguồn cho FB. Trước Sim_PV có tiếp điểm
Data_block_1.Var_2đang hiển thị TRUE. Dây sau tiếp điểm chuyển sang nét đứt xanh (tức OFF), nên FB bị chặn, không thực thi vàpvkhông được cập nhật. Có hai cách sửa:- Nếu tiếp điểm là NC, đặt
Var_2 = FALSE. - Hoặc xoá tiếp điểm đó để FB luôn chạy, vì Sim_PV đã có chân
enable = TRUE.
- Nếu tiếp điểm là NC, đặt
- Hai chân chưa nhập tag:
pid_outđang trống, hãy nhậpData_block_1.PID_1.OUT.pvđang trống(tag), hãy nhậpData_block_1.PID_1.PV. Vì chưa có tag này nên PV vẫn kẹt ở 7000.
Ngoài ra, Scan đã tăng lên 6–8 ms, nên đổi
dt_mstừ 4 thành 8 để đúng thời gian thực.Còn dòng “19 network lỗi”: ảnh đầu tiên của bạn (chưa có Sim_PV) cũng đã báo 19, nên con số này không đến từ FB mới. Chắc là các network ở khối khác như Main, OB_2, Prog_2 nhưng mình không xem được nên chưa chắc. Bạn lướt qua các khối đó để tìm network bị viền đỏ.
Sửa xong 2 mục trên mà PV vẫn không nhúc nhích, bạn bấm nút Xem logic online trên Sim_PV và gửi mình nội dung (hoặc thông báo lỗi nếu có). Khi đó mình sẽ chỉnh lại phần SCL cho khớp trình biên dịch của app.Mình nghĩ Sim_PV đang không chạy phần SCL, và nguyên nhân nhiều khả năng là do mình.
Lý do là PV đang đứng yên ở 3000. Nếu FB chạy, ngay scan đầu tiên nó đã đặt PV về
init_pv= 2000, sau đó kéo dần theo OUT = 2640. PV không hề dịch chuyển thì FB gần như chưa tính gì. Có thể app nạp được các chân (nên FB hiện ra đủ) nhưng không đọc được phần thân SCL, vì cách lưu network SCL trongladderfb.jsonlà do mình đoán.Bạn kiểm tra nhanh 2 việc này để xác nhận:
- Bấm Xem logic online trên Sim_PV. Nếu cửa sổ trống hoặc báo lỗi thì chắc chắn là lỗi định dạng của mình, và bạn chụp lại gửi mình.
- Nối chân
targetvào một tag, ví dụData_block_1.Var_1. Nếu nó luôn bằng 0 thì thân SCL không chạy. Còn nếutarget≈ 2640 mà PV vẫn đứng yên thì FB đang chạy, mình sẽ tra tiếp phần ghipv.
Để mình sửa đúng định dạng, bạn làm giúp mình một lần: bấm Tạo thư viện FB (Ladder + SCL), tạo một FB thử có 1 biến vào, 1 biến ra và 1 network SCL đơn giản (ví dụ
y := x + 1;), rồi xuất ra file .zip gửi mình. Mình sẽ đóng lại Sim_PV theo đúng định dạng đó.Lúc đó mình cũng xem luôn app hỗ trợ lệnh nào trong SCL (
EXP,SIN,REAL_TO_DINT). Nếu app thiếu lệnh nào, mình sẽ viết lại bằng phép tính đơn giản hơn.Code Sim_PV chưa đúng, và đây là nguyên nhân khiến PV đứng yên.Dòng ghi chú đầu network SCL trong file bạn gửi nói rõ: biến của FB phải viết dạng
#tên, và#tênnào không khai báo ở bảng Interface sẽ bị coi là biến cục bộ. Code của mình viết tên trần (pv,lag1,enable…) nên app không nối được với các chân. Kết quả là FB chạy trên biến rỗng và không ghi gì rapv.Mình đã thêm
#trước mọi biến giao diện trong phần SCL và gói lại thành sim_pv_v102.zip. Cấu trúc file (Type: SCL,Scl) mình giữ nguyên như bản bạn xuất, vì định dạng đó đúng. Mình chỉ kiểm tra bằng script là không còn tên trần nào sót. Chưa nạp thử vào LadderDriver.Bạn làm như sau:
- Xoá FB cũ trong Widget lib, rồi Add file .zip mới.
- Kéo FB mới vào Network và điền lại các chân như bảng trước.
- Nối
targetvào một tag để theo dõi. Nếu chạy đúng, ngay scan đầu PV sẽ về 2000 (init_pv), sau đó đi theo OUT. Với SP 2000, PV sẽ ổn định ở 2000.
Nếu vẫn lỗi, bạn bấm Xem logic online và gửi mình thông báo. Có thể app chưa hỗ trợ
EXP,SINhoặcREAL_TO_DINT. Khi đó mình sẽ thay bằng phép tính đơn giản hơn. - Network 1 chưa cấp nguồn cho FB. Trước Sim_PV có tiếp điểm

