Kỹ thuật sử dụng vòng lặp trong LabVIEW (phần 4)

0
458

Trong LabVIEW, thông thường khi kết thúc một vòng lặp, nó ngay lập tức bắt đầu thực thi một vòng lặp tiếp theo. Không có một sự ngừng trệ hay trì hoãn giữa các vòng lặp liên tục. Khi đó hệ thống luôn luôn phải dò xét (polling) xem chương trình có thể thực thi được vòng lặp tiếp theo hay chưa và khi nào kết thúc vòng lặp. Giải pháp tạm thời đưa ra là người dùng chỉ cần thêm vào vòng lặp while một hàm Wait (ms) để cho phép vòng lặp được nghỉ trong một khoảng thời gian xác định (Đơn vị ms). Tuy nhiên khi sử dụng hàm Wait trong vòng lặp While lại phát sinh vấn đề sau:

          Nếu người dùng đặt một khoảng thời gian t(ms) rất nhỏ hoặc bằng 0 ms trong hàm Wait thì vòng lặp While cứ lặp đi lặp lại liên tục, điều này dẫn tới việc toàn bộ CPU phải tập trung thực thi ứng dụng của LabVIEW mà không có thời gian và tài nguyên để thực thi các tác vụ khác, nhiều khi dẫn tới máy bị treo.

          Ngược lại nếu nếu thời gian t(ms) lớn hơn tốc độ thực thi của vòng lặp trong chương trình thì sẽ gây ra sự chậm trễ trong thời gian đáp ứng.

Giải pháp đưa ra trong trường hợp trên làđối với những ứng dụng vẫn thường gặp thì người dùng cần phải xác định và kiểm soát tốc độ thực thi vòng lặp của nó, mức độ tần suất thực thi của vòng lặp để CPU có những khoảng thời gian dù nhỏ nhưng rất đáng kể nằm ở trạng thái Idle, Sleep hoặc thực thi các tác vụ khác. Ngoài biện pháp trên , Labview đã phát triển thêm cấu trúcevent-driven với mục đích để tối ưu hóa vòng lặp

Sử dụng cấu trúcsự kiệntrongLabVIEW (Event structure)

Vì sao phải sử dụng cấu trúc sự kiện?

Giả sử ta có một ứng dụng mà người dùng sẽ tương tác với chương trình thông qua một nút bấm trên Front Panel. Mỗi khi người dùng bấm vào nút đó thì chương trình sẽ thực thi tác vụ đã được chỉ định trước. Chương trình đó có thể được thực thi bởi code trong Block diagram sau đây.

Event-Driven, LabVIEW, học LabVIEW, kỹ thuật vòng lặp, thủ thuật vòng lặp trong LabVIEW

Theo đó, mỗi khi người dùng nhấn nút “Do some work?” thì nội dung code trong cấu trúc Case (Trường hợp True) sẽ được thực thi. Ở đây, nội dung code trong cấutrúc Case chỉ là tự động cọng thêm một đơn vị để nhằm tính toán số lần người dùng nhấn nút “Do Some Work?”. Mặc dù chúng ta cũng đã sử dụng kỹ thuật Timing cho vòng lặp đã được trình bày ở các bài trước, song số lần thực thi vòng lặp vẫn còn khá nhiều. Vòng lặp vẫn phải dò xét liệu rằng người dùng đã nhấn nút hay chưa tuy rằng không còn liên tục nữa nhưng điều này cũng chiếm khá nhiều tài nguyên của CPU trong các ứng dụng lớn và phức tạp. Chúng ta thấy dù thực sự chúng ta chỉ cần 3 lần lặp cho 3 lần nhấn nút “Do some work?” nhưng vòng lặp đã thực thi tới 339 lần tổng cộng. Có quá nhiều lần thực thi một cách lãng phí (Đó là các trường hợp ứng “False” trong cấu trúc Case). Vậy có cách nào để giải quyết sự lãng phí tài nguyên CPU này hay không? Câu trả lời nằm ở cách lập trình dưới đây:

Event-Driven, LabVIEW, học LabVIEW, kỹ thuật vòng lặp, thủ thuật vòng lặp trong LabVIEW

Trong cách lập trình này, chúng ta đã sử dụng cấu trúc Event Driven để giải quyết vấn đề chương trình, vòng lặp cứ phải liên tục polling (Dò xét) liệu khi nào thì người dùng nhấn nút “Do some work?”. Ở đây, vòng lặp chỉ thực thi khi người dùng nhấn nút mà thôi, trong thời gian người dùng không tương tác, nhấn nút thì vòng lặp rơi vào trạng thái ngủ đông (Idle), tài nguyên của máy được giải phóng hoàn toàn. Số lần lặp thực thi tương ứng với số lần người dùng nhấn nút (5-5) như hình trên.

Định nghĩa sự kiện:

Giống như cấu trúc Case Structure, Event driven bao gồm nhiều sơ đồ con, trong số đó được cấu hình để xử lý một hoặc nhiều sự kiện. Sự kiện là những hành động người dùng trên front panel,chẳng hạn như nhấn vào một phím (Key Down) hoặc di chuyển chuột (Mouse Move) có thể thêm một Event Structure để sơ đồ khối giống như bất cứ câu trúc nào khác của LabVIEW. Như trường hợp trên, sự kiện ở đây là trường hợp nút nhấn “Do some work?” thay đổi giá trị. Cứ mỗi lần nút nhấn có kiểu dữ liệu Boolean này thay đổi trạng thái từ True sang False hoặc ngược lại thì tác vụ tương ứng với sự kiện đó được thực thi.

Cách thức sử dụng và cấu hình sự kiện:

Người dùng cóthểsử dụngcấu trúcevent-drivenđểxử lýcác sự kiệntrong một ứng dụng giống nhưcấu trúcCase Structure, có thểthêmnhiềutrường hợpsự kiện và có thể cấu hìnhnhữngtrường hợpđểxử lýmột hoặcnhiềusự kiện. Khinhữngsự kiệnxảy ra,LabVIEWthực hiệncáctrường hợptương ứng.

Khi các Event Structure đã xử lý một sự kiện, nó đã hoàn tất thực hiện. Event Structure không tự động lặp để xử lý nhiều sự kiện, điều này đòi hỏi bổ sung một vòng lặp while ngoài Event Structure. Đó cũng chính là lí do chúng tôi coi việc sử dụng Event Structure là một trong những kỹ thuật sử dụng vòng lặp và nội dung này được trình bày trong serial bài viết cho chủ đề này.

Các hình ảnh dưới đây mô tả các thao tác để đặt một cấu trúc sự kiện Event-driven trong Block diagram cũng như cách cấu hình cho một sự kiện

Event-Driven, LabVIEW, học LabVIEW, kỹ thuật vòng lặp, thủ thuật vòng lặp trong LabVIEW

Lựa chọncác sự kiện bằng clickphải chuột lênbiên cấu trúc sự kiệnvà chọnEdit Events Handled by This Casetừ menu.Sử dụnghộp thoạiEditsự kiệnxuất hiệnđểchỉnh sửamột hoặcnhiều trường hợp

Event-Driven, LabVIEW, học LabVIEW, kỹ thuật vòng lặp, thủ thuật vòng lặp trong LabVIEW

Những lưu ý khi sử dụng cấu trúc Event-driven:

  1. 1.    Ứng dụng đang chạy không phải dùngpolling
  2. 2.    Khi ứng dụng không hoạt động, hệ điều hành giải phóng tài nguyên, có thời gian xử lý các chương trình khác. Điều này làm cho VI và các ứng dụng khác hiệu quả hơn và nâng cao hiệu suất.
  3. 3.      Mỗi lần một sự kiện xảy ra, nó được lưu trữ trong dữ liệu đang chờ xử lí của hệ điều hành. Khi các event-driven được tác động, sự kiện đầu tiên trong dữ liệu đang chờ xử lí được thực hiện, sau đó là sự kiện tiếp theo và cứ như vậy người dùng không phải lo lắng về việc thiếu một sự kiện thay đổi nhanh chóng trên Front Panel:
  4. 4.      Không bao giờ đặt một cấu trúc event-driven bên trong một cấu trúc event-driven khác, khi đó Chương trình VI sẽ ngưng hoạt động.

Để tìm hiểu và thực hành thêm về cấu trúc sự kiện, chúng ta có thể tham khảo ví dụ demo dưới đây về cách sử dụng cấu trúc sự kiện Event-Driven

File : demo_event_driven.zip
Type : zip
Size : 485.1 KB