Thuật toán PID: cách hạch toán thay đổi giá trị đầu vào nhanh sau một thời gian trễ


15

Tôi đang cố gắng thực hiện một thuật toán PID cơ bản trên Arduino Leonardo để trộn nước máy nóng và lạnh bằng các van điều khiển bằng servo. Mục tiêu là giữ nhiệt độ càng gần điểm đặt càng tốt. Đặc biệt quan trọng là ngăn nhiệt độ đầu ra vượt quá điểm đặt để bảo vệ người dùng khỏi bị bỏng. Điều quan trọng thứ hai là lấy nhiệt độ gần điểm đặt càng nhanh càng tốt.

Đối với những thay đổi nhỏ về nhiệt độ, việc triển khai chuẩn của thuật toán PID dường như hoạt động tốt. Nhưng tôi không biết làm thế nào để giải thích cho sự chậm trễ kéo dài có thể xảy ra khi chờ nước nóng đến van, vì những độ trễ này dài hơn nhiều so với độ trễ tiêu chuẩn sau khi thay đổi vị trí van.

Rõ ràng tùy thuộc vào độ dài của dòng nước nóng và thời gian kể từ lần sử dụng nước nóng cuối cùng, có thể mất nhiều chục giây để nước nóng đến được van, vì vậy trong thời gian này, nhiệt độ nước vẫn khá ổn định ở nhiệt độ thấp và van nước nóng sẽ sớm mở 100%. Thành phần tích phân bắt đầu tích lũy một giá trị lỗi lớn.

Khi nước nóng cuối cùng đạt đến van, nhiệt độ được phát hiện tăng rất nhanh đến nhiệt độ nước nóng tối đa. Do sai số tích phân lớn, van nước nóng được giữ ở mức 100% trong một thời gian dài sau khi nhiệt độ vượt quá điểm đặt, do chờ giá trị tích phân giảm xuống mức bình thường. Do đó, kết quả là nước có nhiệt độ tối đa trong vài (vài chục) giây.

Tôi không chắc làm thế nào để giải thích cho sự chậm trễ có thể này . Trong trường hợp như vậy, sẽ là khôn ngoan khi đặt giới hạn trên (và dưới) trên giá trị lỗi tích phân, để giới hạn thời gian phản hồi tối đa? Điều này dường như đánh bại mục đích của thành phần không thể thiếu, và vẫn sẽ áp đặt một số độ trễ sau khi đạt đến điểm đặt.

Hoặc có cách nào tốt hơn để xử lý các thay đổi đầu vào nhanh sau một thời gian trễ dài?

Cảm ơn vì lời khuyên!


1
Trên thực tế, tôi tự hỏi liệu bạn có cần I-action không, bởi vì tôi nghĩ rằng sự thay đổi nhiệt độ nước là tương đối chậm so với hoạt động của van. Tệ hơn nữa, bạn có thể có hành vi dao động do biên pha cực kỳ kém mà bạn có thể có được (về mặt lý thuyết, hệ thống của bạn có thể ổn định, nhưng có thể không bao giờ ngừng dao động trong thực tế, vì hành động I thêm độ trễ pha). Ngoài ra, vì bạn có thể sẽ đốt cháy mọi người, tôi không thể đủ căng thẳng để xem ý kiến ​​của Chu và JonRB!
Sanchise

Câu trả lời:


15

Vấn đề của bạn được gọi là Integral Windup , đây là một vấn đề kiểm soát phổ biến. Trong vùng không tuyến tính hoặc giới hạn khác, bộ điều khiển không thể theo dõi điểm đặt và tích phân tăng lên một giá trị lớn. Điều này gây ra sự vượt quá lớn khi điểm đặt cuối cùng đã đạt được, đó chính xác là những gì bạn đã suy luận là vấn đề.

Giải pháp đơn giản nhất là tự giới hạn giá trị Integrator ở mức tối đa hợp lý. Hạn chế sự đóng góp không thể thiếu cũng sẽ hoạt động tốt, bởi vì nhà tích hợp vẫn sẽ đạt được giá trị lớn.

Mathworks có một trang với một số giải pháp khác để tích hợp.

Trong bộ điều khiển PID, bạn thường muốn có ít thuật ngữ tích phân nhất có thể. Trong một van điều khiển nhiệt độ cơ học tiêu chuẩn, chỉ sử dụng điều khiển tỷ lệ và chúng hoạt động tốt. Giữ thuật ngữ tích phân nhỏ nhất có thể - người dùng sẽ không nhận thấy một lỗi nhỏ trong nhiệt độ cuối cùng. Bạn có thể thấy rằng bạn có được hiệu suất chấp nhận được chỉ với PD.

Vì đây là trường hợp rất đặc biệt, được biết đến, bạn có thể cân nhắc việc có một chế độ khác cho bộ điều khiển. Đo nhiệt độ đầu vào nóng, và trong khi nó ở dưới điểm đặt, chỉ cần chạy nóng 100%, lạnh 20%. Khi nó ấm lên, chuyển sang PID, với điều kiện ban đầu tốt.


1
Đúng. Lý tưởng nhất là bạn có thể đo nhiệt độ đầu vào nóng một cách độc lập và ức chế gió theo cách đó.
Brian Drumond

2
Wind-up có thể là một vấn đề, nhưng nếu tích hợp không được thực hiện, ví dụ, hiệu ứng mất ổn định của độ trễ sẽ vẫn còn. Smith Dự đoán là một phương pháp tốt để giảm thiểu tác động của thời gian trễ thuần túy. Giải quyết vấn đề tích hợp một mình không làm gì để khắc phục độ trễ pha vốn có do thời gian trễ.
Chu

2
chính xác, tôi không nghĩ rằng đây hoàn toàn là nhà tích hợp Windup, ngay cả khi nó là như vậy. đó là một mối quan tâm hợp lệ cần luôn được giảm thiểu cho NGAY CẢ nếu các hoạt động bình thường không đạt được các điều kiện cần thiết
JonRB

Wow, câu trả lời tuyệt vời! Tôi đã suy nghĩ theo dòng này (giới hạn giá trị tối đa của nhà tích hợp) nhưng không diễn đạt đúng câu hỏi nên tôi đã bị hiểu lầm. Thật tốt khi thấy rằng tôi ít nhất là trong sân bóng với một giải pháp. Tôi nghĩ giải pháp đơn giản nhất là vô hiệu hóa yếu tố "I" cho đến khi nhiệt độ đạt đến phạm vi có thể kiểm soát được. Điều này sẽ cho phép phản ứng rất nhanh với những thay đổi. Sau đó, khi chúng tôi thấy một số thay đổi nhiệt độ thực tế và đạt được kết quả mong muốn, hãy bật lại tích phân để thêm lực đẩy cần thiết. Cảm ơn câu trả lời chi tiết!
Ryan Griggs

Nhưng thuật ngữ tích phân không có để tăng tốc, nó có thể sửa cho một lỗi hệ thống, đặc biệt là một hệ số tỷ lệ không hoàn toàn đúng. Không? Và trong tình huống này, P coef. không thể hoàn hảo mọi lúc vì nó sẽ thay đổi tùy theo áp lực nước ở cả hai đường ống.
Roman Starkov

4

Chìa khóa để kiểm soát quá trình này một cách hiệu quả là nhận ra rằng vòi nóng và lạnh không hoạt động đối xứng và bất kỳ thuật toán tối ưu nào cũng phải tính đến điều này.

Khi bạn không sử dụng nước nóng trong một thời gian, nó sẽ nguội đi trong đường ống.

Khi bạn không sử dụng nước lạnh trong một thời gian, nó vẫn giống như trước đây (trừ khi nước lạnh được lấy từ bể nước lạnh có máy làm lạnh, sẽ rất tuyệt nếu có trong những ngày hè nóng bức nhưng tôi cá cược khá hiếm trong thực tế).

Do đó, chúng tôi cho rằng chúng tôi không biết những gì chúng tôi nhận được từ ống nước nóng, nhưng chúng tôi có thể phụ thuộc vào đường ống nước lạnh không đổi trong suốt quá trình chạy.

Do đó, từ nhiệt độ của nước hỗn hợp, và từ việc biết cài đặt van và từ ước tính nhiệt độ của nước lạnh, chúng ta có thể ước tính mức độ nóng của nước từ ống nước nóng. Sau đó, bạn có thể điều chỉnh van để có được nhiệt độ đầu ra chính xác mà không cần PID, chỉ dựa trên đánh giá của một công thức nhiệt động.

Để có được "ước tính nhiệt độ của nước lạnh", bạn có thể chạy nước lạnh trong một thời gian ngắn (vài giây có thể) khi bắt đầu chu kỳ và đọc nhiệt độ. Sau đó, giả sử nó sẽ không thay đổi sau đó, vì bạn không có đủ dữ liệu để giải quyết cho cả hai nhiệt độ.

Sơ đồ này sẽ không hoàn toàn chính xác, nhưng tôi ước tính nó sẽ đáng tin cậy trong sân bóng mà không có khả năng vượt quá quyết liệt. Sau đó, bạn chạy PID trên sơ đồ này để tinh chỉnh kết quả, nhưng giới hạn thay đổi đối với cài đặt van mà PID được phép tạo. Và có thể thiết lập lại trạng thái PID khi bạn có thay đổi đáng kể về nhiệt độ nước nóng.

Giải pháp Fancier là có thể với nhiều cảm biến nhiệt độ.


Một câu trả lời tuyệt vời khác - suy nghĩ bên ngoài hộp PID. Tôi đã xem xét việc chỉ kiểm tra nhiệt độ nước và tạo ra một số loại bảng tra cứu với các vị trí van gần đúng để mang lại nhiệt độ đầu ra mong muốn. Bạn nói đúng rằng cái lạnh tương đối ổn định, mặc dù có thể lạnh hơn vào mùa đông. Các dòng nước được chôn ở khoảng 24-36 inch và chúng ta thường có nhiệt độ ôn hòa ở đây. Sau đó, tôi cũng có thể tính đến nhiệt độ đầu ra của nước nóng tối đa (khoảng 120 F) và tạo một bảng tra cứu để đặt các van một cách thích hợp, sử dụng PID để tinh chỉnh sau khi khởi động.
Ryan Griggs

1
Nước giếng có thể rất mát ngay cả trong mùa hè ấm áp tùy thuộc vào độ sâu / nguồn. Nước "lạnh" nằm trong các ống nhà ấm hơn nước sẽ được bơm từ bên dưới. Vì vậy, nước lạnh thực sự trở nên lạnh hơn khi sử dụng (cho đến khi nó đạt đến nhiệt độ nước ngầm). Tôi luôn "ngạc nhiên" khi đến "thành phố lớn" và nước lạnh không bao giờ bị lạnh.
rickhg12hs

2

Tôi chỉ muốn thêm một chi tiết vào các câu trả lời hay ở trên về những gì các kỹ sư điều khiển làm cho các khả năng khởi động tích hợp. Điều này cũng xảy ra trong nhiều quy trình công nghiệp và nó là một nghệ thuật chứ không phải là khoa học.

Có những hành động sách giáo khoa điển hình chống lại điều này mà không phải hy sinh từ lợi ích tích hợp có thể thực sự cần thiết cho thông số kỹ thuật.

  1. Mỗi khi bạn vượt qua mức lỗi không, bạn đặt lại bộ tích hợp. Điều này làm cho bộ tích hợp trở thành một bộ tích hợp theo yêu cầu của phần tử phi tuyến thay vì bộ tích lũy mù.

  2. Về cơ bản, bạn kết nối khối đầu vào hành động tách rời với một phần tử chỉ định trong vòng lặp. Đây có thể là đầu ra của bộ tích hợp để đánh giá liệu nó có bắt đầu quá trình xây dựng hay không (đòi hỏi sự hiểu biết về quy trình để đưa ra phán đoán đúng đắn). Hoặc bạn kiểm tra xem các bộ truyền động của bạn đã bão hòa hay chưa và hình thành một vòng phản hồi dựa trên thông tin đó. Tôi chỉ chọn ngẫu nhiên liên kết đầu tiên xuất hiện từ google và ở cuối video này có một lời giải thích đồ họa về điểm cuối cùng của tôi. https://www.youtube.com/watch?v=H4YlL3rZaNw


Điểm tốt, cảm ơn vì đã mở rộng về ý tưởng. Cảm ơn video, nó giải thích vấn đề rất tốt.
tomnexus

1

Đôi khi có thể hữu ích khi có nhiều bộ tham số PID, cho các giai đoạn chi tiết thô của phạm vi hoạt động của hệ thống, mà bạn thay đổi nhanh chóng khi hệ thống chuyển từ giai đoạn hành vi này sang giai đoạn hành vi khác. Ví dụ: một bộ Kp, Ki, & Kd khi bạn bật vòi nước nóng và chỉ lấy nước lạnh; sau đó một khi bạn bắt đầu thấy nhiệt độ tăng vọt, hãy chuyển sang một bộ Kp, Ki & Kd khác. Sau đó điều chỉnh hai cho phù hợp.

Bạn có đang sử dụng Thư viện PID trong Sân chơi Arduino của Brett Beauregard không? Cái này khá đẹp Và cũng có một ví dụ 'thích nghi' về điều này.


Cảm ơn những lời đề nghị. Không sử dụng thư viện pid, tôi đã tự viết nó để tìm hiểu thêm về cách thức hoạt động của nó.
Ryan Griggs

Bạn đã xem xét thức ăn chuyển tiếp? Giống như những thay đổi nhanh chóng ảnh hưởng đến đầu ra thông qua vòng lặp mở, vì vậy bạn đừng chờ đợi vòng lặp đóng để phản ứng.
Gregory Kornblum

Tôi đang cố gắng bọc bộ não của mình xung quanh việc "tiến về phía trước" sẽ hoạt động như thế nào trong trường hợp này. Đầu vào sẽ là nhiệt độ mong muốn và đầu ra sẽ đặt các van về vị trí được xác định trước (như đã thảo luận trong nhận xét khác của tôi ở trên) bằng cách sử dụng bảng tra cứu hoặc phương trình đơn giản?
Ryan Griggs

Bạn có thể sử dụng feedforward ngoài phản hồi của bạn (PID vòng kín). Bạn chỉ cần thêm hành động của bộ điều khiển phản hồi vào hành động của bộ điều khiển feedforward. Lý tưởng nhất là bộ điều khiển tiếp liệu sẽ là một mô hình nghịch đảo của van. Feedforward về cơ bản cung cấp cho bạn hành động tức thì về thay đổi điểm đặt. Ngay cả với feedforward cộng với thông tin phản hồi, bạn vẫn cần tính toán cho Windup trong bộ bù điều khiển phản hồi. Thành phần phản hồi cần được bao gồm trong.
docscience

1

Bạn đã mô hình hóa hệ thống?

Bạn có một số dữ liệu dựa trên thời gian hiển thị phần vượt quá - đặc biệt là freq

Đây là hai câu hỏi nên được hỏi với bất kỳ truy vấn dựa trên kiểm soát.

Từ những gì bạn đã mô tả, mức tăng tích phân của bạn quá cao, từ cao đến cao. Nó có thể là do Windup tích hợp: mã được hiển thị có một số mối quan tâm thực tế thực sự, một trong số đó không phải là lớn nhất của các nhà tích hợp rời rạc

  • Cấu trúc liên kết rời rạc rất kém
  • Không có kẹp / giới hạn nào ở đầu ra I chứ đừng nói đến đầu ra P + I

Nó cũng có thể là bởi vì nó rất cao và cần có thời gian để giảm xuống.

Vì vậy, có, giá trị được lưu trữ trong đăng ký tôi có thể có nghĩa là ... 1000C vì P + tôi không được đặt thành phản hồi của hệ thống và sau đó nó phải tắt.

Điều đầu tiên tôi sẽ làm là thu thập dữ liệu thời gian thực để xử lý bài. Tiếp theo tôi sẽ chỉ chạy P và đảm bảo mức tăng tỷ lệ đạt được ALMOST nhiệt độ mong muốn (lý thuyết điều khiển nói rằng nó sẽ không). Tùy thuộc vào việc

  1. Phân tích dữ liệu chụp hiện tại tạo điều kiện thuận lợi trong việc xác định mức tăng phù hợp
  2. Một mô hình nhà máy được tạo ra để tạo ra lợi ích phù hợp

Tôi sẽ bắt đầu bằng cách thay đổi mã PID để trở thành một triển khai tốt hơn và sau đó thêm một chút I, chỉ để chứng minh một điểm.

Bạn thực sự cần phải xác định những lợi ích này có nghĩa là gì để chống lại. Đầu vào là nhiệt độ, đầu ra là ... dòng chảy? do đó cần có một luồng truyền / C và hàm truyền Flow / Cs.


Cũng trả lời tốt, cảm ơn. Tôi chưa mô hình hóa hệ thống, vì tôi chưa biết thế nào - mới bắt đầu bị ướt chân trong nghiên cứu này. Bạn đúng rằng giá trị I tăng ra ngoài giới hạn hợp lý. Bạn có thể hướng tôi đến một thuật toán triển khai tốt hơn cho Trình tích hợp không? Pseudocode là tốt nhất, vì nó cho phép tôi học và đặt mã vào các từ của riêng tôi, thay vì sao chép / dán. Ngoài ra, bạn có thể hướng tôi đến bất kỳ lời giới thiệu nào để mô hình hóa các hệ thống đơn giản như thế này không? Bạn đã đúng rằng các mức lưu lượng (hỗn hợp nóng và lạnh) là đầu ra của hệ thống này. Hiện tại nó chỉ là H / C tỷ lệ nghịch.
Ryan Griggs

1
Ill thêm một tinh chỉnh trong thời gian ngắn
JonRB

1

Một cách tôi muốn giải quyết Integup Windup là ngừng tích lũy lỗi bất cứ khi nào đầu ra điều khiển của bạn ở độ lệch tối đa . Hoặc mở rộng nó bằng khoảng cách từ độ lệch tối đa. Vì vậy, bất cứ khi nào bộ điều khiển của bạn xuất ra "nước nóng 100%, nước lạnh 0%", chỉ cần không tích lũy lỗi, nhưng cũng không đặt lại về 0.

Tôi không muốn giới hạn tích phân đến mức tối đa bởi vì sau đó có giới hạn đối với lỗi hệ thống mà PID của bạn có thể bù đắp.

Tôi cũng đề nghị thay vì tạo ra một bộ "câm" chỉ có một tham số mà nó đang cố kiểm soát mà không biết về hệ thống cơ bản, bạn cài đặt thêm hai cảm biến nhiệt độ, trên cả đầu vào nóng và lạnh. Sau đó, bạn cố gắng tìm một hàm gần đúng vị trí mong muốn dựa trên nhiệt độ đầu vào và bạn chỉ sử dụng vòng lặp PID để điều chỉnh lỗi trong đầu ra của hàm này.

Lỗi sẽ rất nghiêm trọng vì bạn không đo lưu lượng (tốt, trừ khi bạn làm tất nhiên), điều này không chỉ phụ thuộc vào vị trí van (đã biết) mà còn phụ thuộc vào áp lực nước (chưa biết).

Tuy nhiên, điều này sẽ giúp ích rất nhiều cho vấn đề nước nóng cuối cùng chạm đến vòi vì trong vòng lặp PID được làm ẩm tốt, bạn phải dựa vào yếu tố D được hiệu chỉnh tốt để nhanh chóng giảm lưu lượng nóng. Theo kinh nghiệm của tôi, việc lấy hệ số đạo hàm chính xác thường là khó nhất. Nhưng nếu bạn có hai cảm biến phụ, đầu ra chính sẽ thay đổi chính xác nhanh như nhiệt độ nước đầu vào, về cơ bản là tức thời, không cần bất kỳ yếu tố phái sinh nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.