Bài 1: Điều khiển, Hiển thị và các Khái niệm cơ bản (Tác giả: Đỗ Trung Hiếu - CYBERLAB JSC.) 1. Giao di ện LabVIEW
Đây là giao diện ban đầu khi khởi động chương trình LabVIEW. Từ đây các bạn có thể tạo một chương trình ban đầ u (Blank VI), tạo một project tr ống (ấn vào Empty Project), t ạo một chương trình theo mãu (VI from Template), hoặc nhiều lựa chọn khác. Bạn cũng có thể mở m một chương trình có sẵn (Browse)
2. Chương trình của LabVIEW: VI hay là Virtual Instruments Chương trình cơ bản của LabVIEW là một VI, hay là Virtual Instruments: Thi ết bị
ảo. Để tạo 1 chương trình mớ i,i, ta ấn vào nút Blank VI. LabVIEW s ẽ hiện ra 2 cửa sổ: Front Panel và Block Diagram.
Đó là 2 thành phần cơ bản của LabVIEW. Front Panel (từ đây gọi là FP) là giao di ện của chương trình với ngườ i dung. Tại đây lưu trữ • Các Biến điều khiển như: nút bấ m (Button), thanh g ạt (Slide), Núm vặn (Knob), TextBox để nhậ p chuỗi ký t ự… đượ c gọi chung là các bi ến điều khiển, nơi ngườ i dùng có thể điều chỉnh giá tr ị của các biến đó bằng tương tác trự c tiế p với chương trình • Các Biến hiển thị: Đồng hồ (Meter), Đồ thị (Chart), Biểu đồ (Graph), đèn báo (LED), hình ảnh (Picture) hay hình ảnh 3D (3D picture)…gọ i chung là các bi ến hiển thị, nơi ngườ i dung có th ể quan sát thay đổ i của các biến một cách tr ực quan. • Các biến điều khiển và các biến hiển thị không có sự phân biệt rõ ràng trong LabVIEW, ngoài hướng tương tác với ngườ i dùng và v ớ i máy tính. Trong LabVIEW coi 2 loại biến này đều là các biến, có thể đượ c lập trình để thay đổi tr ực tiế p • Mỗi khi t ạo 1 Biến Điều khiển hoặc Hiển thị trong Front Panel (FP), một biểu ng (Icon) sẽ xuất hiện tương ứng trong Block Diagram (BD). Kích đúp vào tượ ng Biến trên FP, Icon tương ứ ng trong BD sẽ đượ c tự động biểu hiện. • Mũi tên được đánh dấu d ấu là nút RUN, dùng để bắt đầu chạy chương trình. Khi nút
ảo. Để tạo 1 chương trình mớ i,i, ta ấn vào nút Blank VI. LabVIEW s ẽ hiện ra 2 cửa sổ: Front Panel và Block Diagram.
Đó là 2 thành phần cơ bản của LabVIEW. Front Panel (từ đây gọi là FP) là giao di ện của chương trình với ngườ i dung. Tại đây lưu trữ • Các Biến điều khiển như: nút bấ m (Button), thanh g ạt (Slide), Núm vặn (Knob), TextBox để nhậ p chuỗi ký t ự… đượ c gọi chung là các bi ến điều khiển, nơi ngườ i dùng có thể điều chỉnh giá tr ị của các biến đó bằng tương tác trự c tiế p với chương trình • Các Biến hiển thị: Đồng hồ (Meter), Đồ thị (Chart), Biểu đồ (Graph), đèn báo (LED), hình ảnh (Picture) hay hình ảnh 3D (3D picture)…gọ i chung là các bi ến hiển thị, nơi ngườ i dung có th ể quan sát thay đổ i của các biến một cách tr ực quan. • Các biến điều khiển và các biến hiển thị không có sự phân biệt rõ ràng trong LabVIEW, ngoài hướng tương tác với ngườ i dùng và v ớ i máy tính. Trong LabVIEW coi 2 loại biến này đều là các biến, có thể đượ c lập trình để thay đổi tr ực tiế p • Mỗi khi t ạo 1 Biến Điều khiển hoặc Hiển thị trong Front Panel (FP), một biểu ng (Icon) sẽ xuất hiện tương ứng trong Block Diagram (BD). Kích đúp vào tượ ng Biến trên FP, Icon tương ứ ng trong BD sẽ đượ c tự động biểu hiện. • Mũi tên được đánh dấu d ấu là nút RUN, dùng để bắt đầu chạy chương trình. Khi nút
RUN đó bị gãy, tức là chương trình đang có lỗ i (Error), không chạy đượ c Block Diagram (DB) : Là nơi chương trình LabVIEW đượ c lậ p trình, chứa nội dung (code) chương trình. • Tương tự trong Simulink của Matlab, việc lậ p trình trong DB bằng cách nối các biến vớ i nhau và v ớ i các khối biểu diễn phép toán gi ống như đi dây trong thiế t bị điện. • Trên Block Diagram cũng biể u diễn các vòng l ặ p, Cấu trúc lậ p trình, và các thuật toán. • Khi chương trình VI chạ y Block Diagram không hi ển thị giao diện tương tác vớ i ngườ i dùng. ng • Có thể chạy chế độ Debug trên Block Diagram b ằng cách ấn vào bi ểu tượ ng Bóng đèn trong BD (Highlight Execution). Các dòng dữ liệu sẽ đượ c biểu diễn chạy tuần tự để biểu thị sự thay đổi chi tiết các bi ến trong chương trình • Để tạo ra một chương trình sáng sủ a, gọn gàng nh ằm đơn giản hóa việc kiểm tra, kiểm soát chương trình, một chương trình LabVIEW thông thường đượ c lậ p trình theo trình t ự: Từ trên xuống dướ i,i, trái sang phải. 3. Tạo project LabVIEW
Để tạo 1 Project trong LabVIEW, ta ấn vào Empty Project. Trong các bài vi ết tiế p đây chúng ta hầu như làm việ c bằng cách tạo Empty VI, việc tạo Project là chưa thực sự cần thiết. 4. Các kiểu dữ liệu cơ bản trong LabVIEW Trong LabVIEW có nhi ều kiểu biến: Biến số (Numeric), Biến ký tự (String), Biến Mảng, Biến Cluster, Bi ến Logic (Boolean)…
Mỗi biến đượ c phân bi ệt bằng các màu trong Block Diagram. Ví d ụ: • Kiểu Numeric dạng Float (số 64 bit d ấu phảy động) là kiểu biến có dải giá tr ị lớ n nhất, với độ chính xác cao nh ất nhưng tốn nhiều dung lượng chương trình nhất, biểu diện bằng màu vàng da cam • Các kiểu Numeric Integer: Int8, Int16, Int32, Int64 (s ố nguyên 8, 16, 32, 64 bit) và U8, U16, U32, U64 (s ố nguyên không d ấu 8,16,32,64 bit) đượ c biểu diễn màu xanh da tr ờ ờ i • String: Chuỗi ký tự, biểu diễn màu hồng • Boolean : Kiểu Logic, là kiểu biến cho các nút b ấm, đèn led và các giá trị logic khác, biểu diễn bằng màu xanh lá cây 5. Các phép toán trong LabVIEW:
Như ta đã biết, trong LabVIEW n ội dung chương trình đượ c thiết lậ p trong Block Diagram. Bạn có thể tìm thấy các thư viện hàm để thực thi các thuật toán từ đơn giản đến phức tạ p bằng cách: Ấn chuột phải, chọn mũi tên (như hình vẽ ) và chọn Programming Programm ing (để chọn các khối hàm cơ bản) hoặc chọn các khối hàm nâng cao hơn (ví dụ như khối Mathematics)
LabVIEW là một môi trườ ng ng lậ p trình cực k ỳ đa dạng cho phép ta có th ể thực thi gần như bất cứ phép toán, thu ật toán nào v ớ i r ất nhiều kiểu biến, ví dụ: • Các phép toán cơ bản: Cộng, Tr ừ, Nhân, Chia, C ộng 1, Tr ừ 1, Bình phương, Đảo dấu, Hàm Random, D ịch bit, ….
• Các phép so sánh
• Các phép toán Logic
• Các phép toán vớ i Mảng • Các hàm vớ i Chuỗi ký t ự • Các hàm toán học phức tạp: Lũy thừa, Logarit, hàm lượ ng giác, hàm v ớ i các Ma tr ận, hàm nội suy, hàm tối ưu
• Và nhiều khối hàm khác Bạn cũng có thể gọi một chương trình bên ngoài, viế t bằng C hoặc Matlab…
Đặc biệt, bạn có thể tạo 1 chương trình con để có thể gọi lại trong các chương trình về sau, hoặc để làm gọn chương trình chính. Một chương trình con trong labVIEW gọi là SubVI. Để thực thi một phép toán trong LabVIEW, b ạn đơn giản nối các tham số vào đầu vào của khối hàm, và nối đầu ra. Xem các ví d ụ dưới đây:
Các bạn chú ý: đầu vào của các khối hàm thườ ng là các bi ến Điều khiển (Controls), đầu ra thườ ng là các bi ến Hiển thị (Indicators). Mặc dù việc lậ p trình trong LabVIEW khá t ự do theo bất cứ hướ ng nào, trình t ự nào, nhưng các hàm thường đượ c thực thi theo hướ ng từ trái sang phải. Vì th ế khi lậ p trình trong LabVIEW, ta nên chú ý sắ p xếp chương trình theo hướng đó để đảm bảo sự thống nhất trong chương trình, tiệ n lợ i cho vi ệc theo dõi, debug v ề sau. Đến đây ta tạm thờ i k ết thúc phần tìm hiểu các Khái ni ệm trong LabVIEW. Tất nhiên còn r ất r ất nhiều khái niệm khác mà tôi chưa thể trình bày h ết ra đây, nhưng như vậy cũng tạm đủ để chúng ta tiế p tục tìm hiểu các khái ni ệm và thuật toán cao hơn, tiến tớ i lậ p trình một chương trình hoàn chỉ nh. Sau này, khi có các khái ni ệm mới, tôi cũng sẽ bổ sung thêm trong các bài b ổ sung, hoặc trong chính mục Khái niệm này.
Bài 2: Array và Cluster (Đỗ Trung Hiếu - CYBERLAB JSC.) Array (Mảng dữ liệu) và Cluster (bó d ữ liệu) là 2 khái ni ệm cơ bản r ất quan tr ọng trong lậ p trình LabVIEW. 1. Array: Mảng dữ liệu: Array hay mảng dữ liệu là khái ni ệm chỉ tậ p hợ p hữu hạn được đánh số (index) các giá tr ị có cùng kiểu dữ liệu. Ví dụ: Mảng số thực, mảng số nguyên, mảng ký tự, mảng giá tr ị logic, mảng của mảng (mảng đa chiều), mảng đối tượng… Để tạo 1 mảng các biến điều khiển/hiển thị, thực hiện theo thao tác sau: Trên Front Panel, click chu ột phải, chọn : Modern -> Array, Matrix & Cluster -> Array
Sẽ tạo ra một biểu tượ ng Array tr ống (Empty Array - Array chưa có phần tử hay quy định kiểu phần tử.
Để quy định kiểu phần tử vào mảng, chọn một Control hay Indicator b ất k ỳ bằng cách click chu ột phải vào Front Panel, r ồi di vào bên trong ô Array tr ống vừa tạo. Ví dụ ta đượ c một Nummeric Array (mảng số)
Đánh dấu đỏ là chỉ số của mảng. Để tạo thêm thành ph ần (element) cho mảng, ta nhậ p giá tr ị vào mảng. Bạn có thể tạo một mảng vớ i kiểu giá tr ị bất k ỳ: Số, số nguyên, số FLOAT, chuỗi
ký tự, giá tr ị logic, Cluster, m ảng các mảng, đườ ng dẫn file,…Xem ví dụ dưới đây:
Ví dụ này mô tả nhiều dạng Array có thể đượ c tạo trong LabVIEW: m ảng Numeric, mảng Biến Logic điều khiển (dạng nút b ấm), mảng biến logic hi ển thị (dạng đèn Led), mảng String, mảng biến Numeric dạng Slide Bar (thanh trượ t), mảng biến Numeric dạng Tank (bình ch ứa). Xem Front Panel:
Trong ví dụ, tôi nối dây giữa các đầu vào Logic Control Array và Slide Bar Array với đầu ra Logic Indicator Array và Tank Array. Ch ạy chương trình (nút Run mũi tên) ta có k ết quả như hình trên. Quay tr ở lại Block Diagram, ta nh ận thấy các đườ ng dẫn tải dữ liệu dạng Array cũng có màu biểu thị kiểu dữ liệu mà nó mang (màu xanh lá cho ki ểu Logic, và màu Da cam cho ki ểu Numeric Float), nhưng có sự khác biệt về độ dày. Đườ ng mang dữ liệu Array có độ dày hơn đườ ng mang dữ liệu đơn giá trị thông thườ ng.
2. Array các Array, các hàm v ớ i Array: 2.1 Các hàm vớ i Array: LabVIEW cũng hỗ tr ợ một thư viện tương đối phong phú các hàm v ớ i Array, các bạn có thể tìm thư viện này trong: Block Diagram >> Programming >> Array
Trong thư viện này, có chưa các hàm: • Tìm kích thướ c mảng : Array Size • Tìm phần tử trong mảng theo Index: Index Array • Tạo Array: Build Array • Tìm phần tử lớ n nhất/ nhỏ nhất; Max & Min • Xóa phần tử trong mảng: Delete From Array • Chèn phần tử trong mảng: Insert Into Array • Sắ p xế p mảng 1 chiều : Sort 1D Array • Vân vân Trong bài viết nhỏ này tôi không th ể liệt kê tất cả các hàm về mảng cũng như về bất k ỳ lĩnh vực gì, vì th ế để thành thạo labview và s ử dụng trong th ực tế, các bạn phải chịu khó tự tìm hiểu và thử nghiệm vớ i các ví dụ tự tạo ra. Sau đây là mộ t ví dụ mẫu:
Ví dụ này sử dụng các hàm để tính kích thướ c mảng, tìm ph ần tử (index =3) trong mảng, chèn phần tử mớ i vào vị trí có index =3, và tìm ra ph ần tử có giá tr ị max, min và index của các phần tử đó Dưới đây là Front panel biể u thị k ết quả
2.2 Mảng các mảng hay Mảng 2 chiều: Bạn cũng có thể tạo một mảng của các mảng, hay là mảng 2 chiều bằng cách đưa 1 mảng vào thành ph ần tử của các mảng khác. Trong trườ ng hợ p này, các hàm Array vớ i loại mảng này sẽ có 2 tham s ố đầu vào
(hoặc ra): X Index và Y Index. Ví d ụ hàm Index Array. 3. Cluster: Cluster là kiểu giá tr ị do người dùng quy định, tương tự như kiểu Structure trong lậ p trình C. Với Cluster, ngườ i dùng có th ể tạo một kiểu biến là tổng hợ p của nhiều kiểu biến cơ bản. Ví dụ: Kiểu biến có tên Sinh viên, v ớ i các thuộc tính con: • Tên: Dũng (kiểu String) • ID: 01 (Numeric Integer) • Tuổi: 25 (Numeric Integer • Ngày tháng năm sinh: 01 -01-1987 (string) • Điểm TB: 8.2 (Float) Để tạo kiểu biến Cluster, ta làm như sau: Tương tự cách tạo Array như trên, nhưng trong mụ c Array, Matrix, Cluster, ta chọn Cluster Tạo các biến điều khiển dạng Numeric Integer, String, Float và đưa vào trong khố i Cluster trông vừa chọn -Trong Block Diagram, ch ọn Cluster vừa tạo, ấn chuột phải, chọn Creat >> Indicator, một Cluster mớ i dạng Indicator (hiển thị) đượ c tạo ra và nối vớ i Cluster Student trước đó. Cluster mới đặ t tên là Student Indicator -Chạy chương trình, toàn bộ thông tin t ừ Student đã đượ c chuyển sang Student Indicator - Để tách các thu ộc tính con bên trong Cluster Student v ừa tạo, ta tr ở lại Block Diagram, chọn biến Cluster Student, ấn chuột phải, chọn Cluster, Class, Variant Pallete >> Unbundle by Name
Ấn vào khối Unbundle by Name v ừa tạo, hoặc kéo ra thêm các thuộc tính con để
lựa chọn như trong hình trên, ta có thể trích ra các thuộc tính con c ủa Cluster Student. Chạy chương trình ta thấ y các giá tr ị trích ra đã đượ c hiển thị:
Bài 3: Vòng lặ p While , Shift Register, Feedback node và Local Variable
(Đỗ Trung Hiếu - CYBERLAB JSC.) 1. Vòng lặ p While: Trong các bài trướ c mà tôi đã đăng, các chương trình đề u chỉ thực hiện một lần sau khi ấn nút Run, th ực thi thu ật toán, xu ất k ết quả, và dừng lại. Để chương trình có thể thực và cậ p nhật giá tr ị liên tục, và chỉ dừng khi ta muốn, chúng ta sử dụng vòng lặ p While. Vòng lặ p While thuộc dạng vòng l ặp có điều kiện, chỉ dừng lại khi điều kiện đó đượ c thỏa mãn. Để tạo 1 vòng l ặ p While, ta ấn chuột phải trong Block Diagram, ch ọn Programming >> Structure >> While Loop Sau đó, bạn có th ể vẽ 1 hình chữ nhật với kích thướ c bất k ỳ. Đó chính là Vò ng lặ p While.
Nút màu đỏ là điều kiện dừng của vòng lặ p. Khi giá tr ị logic đưa vào Điều kiện dừng có giá tr ị đúng (True) thì vòng lặ p dừng, nếu không, vòng l ặ p sẽ tiế p tục thực hiện. Ấn vào nút Điều kiện dừng, nút đó chuyển thành bi ểu tượng như hình bên. Đó là điều kiện chạy. Khi đầu vào logic điề u kiện chạy có giá tr ị đúng, vòng lặ p tiế p tục chạy. Nếu không, vòng l ặ p sẽ dừng. Ô có chữ (i) màu xanh lam ở góc của vòng lặ p là itoration (biến đếm vòng lặ p). Mỗi khi vòng l ặ p thực hiện xong 1 chu k ỳ lặ p, i sẽ tăng lên 1 đơn vị. i đến tăng từ 0. Xem ví dụ sau đây: thực hiện 2 vòng lặ p While khác nhau, cùng ch ạy đủ 100 lần lặp (i đếm từ 0 đến 99 thì d ừng. K ết quả cuối cùng của i đều là 99.
2. Thờ i gian th ực thi vòng l ặ p và các hàm Delay: Trong ví dụ trên, ta có th ể thấy thờ i gian th ực thi vòng l ặ p While là r ất nhanh, đó là vì máy tính th ực hiện các task trong vòng l ặ p vớ i thờ i gian r ất nhỏ (nhưng không nhỏ hơn 1ms) Để có thể thiết lậ p thờ i gian thực thi cho các vòng l ặ p này một cách gần đúng, ta sử dụng các hàm Delay. Click chuột phải trên Block Diagram, ch ọn Programming >> Timming >> Wait
(ms) hoặc Wait Until ms Multiple
Hai hàm trên đề u có tác dụng thực thi một tác vụ delay vớ i số mili giây b ằng đầu vào của hàm. Sự khác nhau là: Hàm Wait th ực hiện phép Delay th ời gian cho trướ c sau khi thực hiện các tác v ụ trong hàm While, còn hàm Wait Until ms Multiple c ố định thờ i gian thực hiện các tác vụ trong hàm While trong kho ảng thời gian định trướ c, bất k ể các tác vụ trong hàm là gì. Thiết lập đầu vào cho hàm Delay, thêm vào một Slide bar control, và m ột Chart như trong hình:
Chạy chương trình, di chuyể n Slide bar, ta th ấy k ết quả đượ c hiển thị trên Chart, vớ i tốc độ 100ms mỗi vòng. Thay đổi đầu vào hàm Delay để quan sát tốc độ nhanh chậm của vòng lặ p. 3. Shift Register Shift Register là một cách để lưu dữ liệu lại cho các vòng l ặ p sau. Ví dụ khi bạn muốn thực hiện chương trình nhấ p nháy Led, thuật toán là sau mỗi vòng lặ p, bạn đảo tr ạng thái c ủa Led ở thời điểm trước đó. Để làm đượ c vậy, bạn cần lưu trạng thái của Led, sử dụng Shift Register.
Click chuột phải vào rìa bên trái c ủa vòng lặ p While, chọn Add Shift Register, được như hình dướ i:
Ô có mũi tên bên trái lưu giá trị đượ c cậ p nhật ở vòng lặp trước, ô có mũi tên bên phải lưu giá trị mới đượ c cậ p nhật cho vòng lặp sau. Ban đầu Shift Register chưa chứa kiểu giá tr ị nào. Để đặt giá tr ị ban đầu cho Shift Register, đưa vào đó 1 giá trị bất k ỳ, ví dụ: kiểu logic
Đặt một hàm Not để đảo giá tr ị của biến logic lưu trong Shift Register sau mỗ i vòng lặ p, và nối một Led Indicator vào đó. Ta đã thự c hiện một thuật toán nhấ p nháy Led. Để có thể thấy Led nháy chậm như dự kiến, đưa vào chương trình một hàm Delay. Chạy chương trình để thấy Led nháy (xem file ví d ụ) 4. Ví dụ tạo và hiển thị hàm Sin: Trong ví dụ này ta sẽ thực hiện các hàm Sin(t), Sin (2t), Sin (3t) v ớ i t là th ờ i gian thực. Giá tr ị sẽ đượ c tín toán và xu ất ra vớ i chu k ỳ 50ms • Vì giá trị đượ c tính toán và xu ất ra vớ i chu k ỳ 50ms, ta cần vòng l ặ p có hàm
Delay 50ms. • Để thực hiện đúng hàm Sin (t) vớ i t là th ờ i gian thực tính bằng giây, ta có th ể sử dụng biến đếm i. Ta sẽ có: t = (i*50)/1000 (s) = i * 0.05 • Thực hiện hàm Sin (t) = Sin (i*0.05), tương tự vớ i các hàm khác. • Ta có 3 đầu ra, để hiển thị cùng lúc 3 đầ u ra trên 1 Chart, ta s ử dụng khối Bundle trong Programming >> Cluster, Class, Variant • Bố trí chương trình như hình dướ i
Chạy chương trình, ta đượ c k ết quả:
* Chú ý: Khối Formula node là kh ối cho phép l ậ p trình dạng dòng l ệnh các phép toán phức tạp, dướ i dạng ngôn ng ữ lập trình tương tự C. Đây là một công cụ hết sức hiệu quả và mạnh mẽ trong LabVIEW, chúng ta s ẽ quay tr ở lại vớ i nó sau này. Để tạo Formula node, ta click chu ột phải vào Block Diagram, ch ọn Programming >> Structures >> Formula Node Ví dụ tính toán đạo hàm và tích phân: Sau đây ta sẽ tận dụng kiến thức đã biết về Shift Register để thực thi các đạo hàm và tích phân của hàm vừa tạo. Công thức tính gần đúng đạo hàm của hàm y = f(x): • Y'(n) = [f(n) - f(n-1)] / dt • hoặc phương pháp chính xác hơn : y'(n-2) = [-f(n)+8*f(n-1)-8*f(n-3)+f(n-4)] Ở đây ta sẽ sử dụng phương pháp đầu tiên. Chú ý: dt = 50ms=0.05s.
Trong ví dụ trên, ta sử dụng Shift Register để lưu trữ đầu ra f(n). Do đó có thể coi đầu ra từ shift register giá tr ị của đầu vào nhưng củ a vòng lặp trướ c. K ết quả hiển thị trên Front Panel, ta đượ c hàm gần đúng Cos (t), là đạo hàm của Sin (t).
Các bạn cũng có thể thực hiện gần đúng bằng phương pháp thứ 2, sử dụng Shift Register để lưu trữ giá tr ị của trước đó 2,3,4… vòng lặ p, bằng di chuột xuống dướ i đầu vào shift register và kéo xu ống:
Trong ví dụ trên sử dụng Shift Register lưu trữ giá tr ị của 4 vòng l ặp trước đó của đầu vào biến đếm i, k ết quả ra là giá tr ị đã được lưu trữ của 1, 2, 3, 4 vòng l ặ p:
5. Feedback Node Trong mục trên ta đã biết sử dụng Shift Register để thực hiện các thuật toán lưu trữ giá tr ị của vòng lặp trướ c. Tuy nhiên một nhược điểm của Shift Register là t ốn không gian trong chương trình, vì cần phải nối từ đầu này tớ i tận đầu kia của vòng lặp, do đó trong lậ p trình đồ họa như LabVIEW, là mộ t bất lợ i. Vì thế có một số cách khác để giải quyết điều này, đó là Feedback Node và Local Variable. Để tạo một Feedback Node, tao Click chu ột phải Block Diagram, ch ọn Programming >> Strutures >> Feedback Node Điều khác biệt của Feedback Node so vớ i các hàm khác trong LabVIEW, là Đầu vào feedback node ở bên phải, cậ p nhật giá tr ị cho vòng lặp sau, và đầu ra ở bên trái, là giá tr ị ở vòng lặp trước đó.
Ví dụ, quay tr ở lại bài toán nh ấp nháy đèn Led đã nói ở trên, ta lậ p trình sử dụng Feedback Node:
Ta thấy chương trình đã gọ n hơn rất nhiều so với chương trình trước đó. Điể m lợ i của Feedback node so vớ i Shift register là có th ể đặt dễ dàng ở bất cứ vị trí nào trong chương trình, tuy nhiên lại không lưu trữ đượ c giá tr ị ở nhiều hơn 1 vòng lặ p trước đó. 6. Local Variable Trong các ví dụ trướ c kia tôi mớ i chỉ giớ i thiệu các chương trình chạ y vớ i 1 vòng lặ p. Một trong những điểm mạnh nhất của LabVIEW, đó là cho phép ngườ i dùng lập trình đa luồng, đa lõi và đa tác vụ một cách hết sức dễ dàng (những ai biết sâu về lậ p trình C, C++, C# có lẽ đều hiểu lập trình đa luồng là một lĩnh vực không thực sự đơn giản) Vớ i LabVIEW, b ản thân ngôn ng ữ ngay từ đầu đã hỗ tr ợ lập trình đa luồ ng. Trong một chương trình, bạ n có thể bố trí nhiều vòng lặp để thực hiện nhiều tác vụ khác nhau, ví d ụ: • Vòng lặ p Xử lý Giao di ện ngườ i dùng (User Interface Loop) • Vòng lặ p xử lý các tác vụ-sự kiện (Event-Task Loop) • Vòng lặ p thu thậ p dữ liệu (Data Acquisition) • Vòng lặ p hiển thị/lưu trữ dữ liệu • Vân vân… Và đương nhiên, các vòng lặp này cũng cần đượ c giao tiếp, trao đổi dữ liệu vớ i nhau. Local Variable là một công cụ hỗ tr ợ cho việc trao đổi dữ liệu đó.
Ví dụ tạo 2 vòng lặ p khác nhau, một vòng lặp cho người dùng thay đổ i giá tr ị Slide bar, bật tắt các Led, và d ừng chương trình, vòng lặ p kia hiển thị giá tr ị Slide Bar và tr ạng thái các Led. Mỗi vòng l ặ p chạy vớ i chu k ỳ khác nhau. Để tạo ra Local Variable c ủa một biến (ví dụ Slide bar), bạn click chu ột phải vào biến đó, chọn Creat >> Local Variable. Khi khở i tạo 1 Local Variable, có th ể mặc định ở tr ạng thái đầu vào (Write), để chuyển sang tr ạng thái đầu ra (Read), Click chu ột phải vào Local Variable đó, chọn Change to Read. Làm tương tự khi muốn chuyển sang Write. Bạn cũng có thể thay đổi biến tham chi ếu của Local Variable đó bằ ng các click chuột trái, chọn biến khác. Thiết k ế chương trình như sau:
Lúc này có thể bạn chưa thể chạy được chương trình (cứ thử chạy xem, sẽ báo lỗi !). Đó là vì Thiết lập Cơ khí của các nút (Mechanical Action) không tương thích để có thể sử dụng Local Variable cho nó. Để sửa đúng, quay tr ở lại Front Panel chương trình, click phả i lên các nút Stop và OK Button, chọn Mechanical Action >> Switch Until Released (trướ c kia là Latch when released). Bây giờ chương trình đã có thể chạy. Thay đổi các giá tr ị của Slide, ấn nút OK, thay đổi Boolean và quan sát các hi ển thị, bạn thấy 2 vòng l ặp đã liên lạc đượ c vớ i nhau. Ấn Stop để dừng chương trình, 2 vòng lặ p sẽ cùng dừng. Các ví dụ down t ại: • Led toggle using feedback node.vi • local variable sample.vì (hết bài 3 )
Bài tiế p theo: Bài 4: Vòng lặp FOR và các thủ thuật vớ i Array
Bài 4: Vòng lặ p FOR và các thủ thuật với Array (Đỗ Trung Hiếu - CYBERLAB JSC.) Trong mục này, chúng ta s ẽ tìm hiểu một cấu trúc vòng lặp khác cũng rất thông dụng: vòng l ặ p FOR. 1. Vòng lặ p FOR: Trong khi vòng lặ p While là cấu trúc lặp có điều kiện, vòng l ặ p For là vòng lặ p không điều kiện. Vòng lặ p For thực hiện một số lượ ng vòng lặp xác định trướ c khi dừng. Để tạo vòng lặ p For, ta chọn Programming >> Strutures >> For loop. Và t ạo giống như vòng lặ p While. Chú ý trong vòng lặp For, đầu vào N là số vòng lặp đượ c thực hiện. Còn lại cách thực thi vòng l ặ p For giống vớ i vòng l ặ p While. Biến đếm i sẽ chạy từ 0 cho đến (N-1). Vòng lặp For cũng có thể tạo điều kiện dừng và điều kiện chạy như vòng lặ p While, bằng cách click ph ải vào 1 cạnh của vòng l ặ p, chọn Conditional Terminal. Vớ i cách này ta có th ể dừng vòng lặ p ngay cả khi số vòng lặp chưa đạt đến giá tr ị đặt.
Bạn cũng có thể tạo Shift Register, Feedback node và Local Variable trong vòng lặp For tương tự vớ i cách của vòng lặp While. Chương trình dưới đây sử dụng vòng lặp For để tính toán ra giá tr ị thứ N của một dãy Fibonacy, quy lu ật của dãy là:
• F(0)=0; • F(1)=1; • F(n+2)=F(n+1)+F(n);
2. Vòng lặ p FOR và mảng (Array):
Sau đây tôi muốn giớ i thiệu một thủ thuật khá thú v ị khi làm vi ệc vớ i mảng của vòng lặ p For. Ta có thể sử dụng vòng lặp For để duyệt một mảng, trong khi không c ần phải biết số phần tử trong mảng, bằng cách đơn giản nối mảng đó vào trong vòng lặ p. Vòng lặ p sẽ tự động tính ra s ố vòng lặp để duyệt hết mảng, và mỗi vòng lặ p lần lượ t tách ra phần tử thứ (i) trong mảng đó. Khi nối đầu ra từ trong vòng l ặp For ra ngoài, ta cũng có thể tạo một mảng vớ i số phần tử bằng số vòng lặ p của For.
Ví dụ trên tạo ra 1 mảng 20 phần tử (Loop 1), r ồi phân tích m ảng đó ra từng phần tử, nhân mỗi phần tử vớ i 2, r ồi tạo ra 1 mảng 20 ph ần tử khác từ các k ết quả đó.
Bạn cũng có thể truyền nguyên vẹn giá tr ị của mảng hay giá tr ị vào trong vòng l ặ p hoặc từ vòng l ặ p ra bằng cách click chu ột phải vào vị trí nối ở trên rìa vòng l ặ p, chọn Disable Indexing 3. Ví dụ Sử dụng vòng lặ p For và mảng để tạo tín hi ệu tuần hoàn: Một số bài toán t ạo tín hi ệu có thể phải sử dụng các phép tính toán h ọc phức tạ p, tốn kém tài nguyên và b ộ nhớ máy tính. Để giảm tải công việc tính toán cho máy tính ta thườ ng sử dụng một Mảng ghi nhớ sẵn các giá tr ị của hàm đó (nếu hàm đó tuần hoàn) và công vi ệc tính toán s ẽ chỉ cần thực hiện một lần. Ví dụ thực hiện tạo tín hiệu có giá tr ị tuần hoàn theo th ờ i gian là hàm sau: Y(t) = sin(2pi*t) + sin(2*2pi*t) + cos (3*3pi*t) Vớ i thời gian tăng mỗi đơn vị là 0.01 s • Ta đã biết hàm trên là một hàm tuần hoàn có chu k ỳ là T = 1s • Vì thế chỉ cần thực hiện tính toán trong 1 chu k ỳ của hàm đó, rồi lặ p lại ở các chu
k ỳ sau • Trướ c tiên s ử dụng vòng l ặp FOR để tạo mảng: • Vớ i thời gian tăng mỗi đơn vị là 0.01s, một chu k ỳ sẽ bao gồm 100 phần tử. • Để tạo mảng như vậy ta lập trình như sau:
Trong đó T là mảng lưu trữ giá tr ị thờ i gian, và Y là mảng lưu trữ giá tr ị tín hiệu cần tạo. Để hiển thị toàn bộ tín hiệu vừa tạo ta sử dụng XY Graph trong Front Panel: Click phải vào Front Panel, ch ọn Graph Indicators >> XY Graph, Đấu dây như hình trên. Tiế p theo, ta sử dụng vòng l ặ p While và vòng l ặ p FOR k ết hợp để thực hiện biểu diễn xuất tín hi ệu tuần hoàn từ mảng vừa tạo. K ết quả:
* Chú ý: Thay vì s ử dụng vòng lặ p For , ta cũng có thể sử dụng hàm Index Array để tách tín hi ệu tử mảng. Down ví dụ signal gen For loop.vi Bài tậ p: Sử dụng vòng lặ p For và XY Graph vừa học để lậ p trình vẽ các đồ thị sau: a) Đồ thị đườ ng tròn từ 1000 điểm trên đường tròn đó, bán kính 1 đơn vị . b) Đồ thị hàm số y = 2x^4+3x^3-5x^2+x+1., v ớ i x từ [-10 đến 10], lấy 100 giá tr ị. 4. Bài giải Trong bài trước, tôi có để lại 2 bài tậ p nho nhỏ, chắc các bạn đều đã giải quyết được. Đối vớ i những bạn chưa biết cách giải, tôi xin tóm t ắt đáp án như sau: Bài 1: Vẽ đồ thị đườ ng tròn từ 1000 điểm trên đường tròn đó, bán kính 1 đơn vị . Phân tích: Chúng ta đều biết tọa độ các điểm trên đườ ng tròn có th ể biểu diễn bằng hàm lượ ng giác sau: X = sin (phi); Y = cos (phi) v ớ i phi = [0,2pi]. Như vậy để vẽ 1000 điểm trên đườ ng tròn, ta dung vòng l ặ p For trong 1000 vòng lặp, và phi = i*2pi/1000 (vì có 1000 điể m, nên mỗi vòng lặp phi tăng 2pi/1000 (rad) Từ đó ta có mảng các tọa độ các điểm (X[i],Y[i]) Chương trình như sau:
K ết quả:
Vớ i bài còn l ại cách làm tương tự , không khó l ắm nên tôi nghĩ không cầ n giải nữa. Các bạn cũng có thể thay đổi chương trình để giải các bài toán v ẽ đồ thị phức tạ p hơn. Tôi rất mong các bạn đóng góp các ý tưở ng và ví du. Một số đồ thị sau cũng khá thú v ị các bạn có th ể thử. 5. Vòng lăp For và mảng đa chiều: Trong Bài 2: Array và Cluster, tôi đã giớ i thiệu qua v ề mảng 2 chi ều (2D Array), đó là một mảng của các mảng 1 chiều. Sau đây tôi xin nói rõ hơn về loại mảng này và các ứng dụng của nó, cũng như thao tác vớ i mảng đa chiều sử dụng For loop. Mảng đa chiều là một tập hơp các phần tử cùng loại, đượ c sắ p xế p theo tọa độ hàng và cột. Có nhiều cách để tạo mảng đa chiều: • Cách 1: Tạo mảng hằng số
• Cách 2: Tạo mảng dạng biến điều khiển • Cách 3: Tạo bằng vòng lặ p For Vớ i 2 cách trên r ất đơn giản nhưng diễn giải thì dài dòng, các b ạn tự tìm hiểu. Tôi chỉ xin giớ i thiệu cách thứ 3: Ví dụ: Tạo mảng 2 chiều vớ i 4 cột, 5 hàng, v ớ i số phần tử tăng dần từ phần tử đầu tiên cho đến cuối cùng, tăng từ trái sang phải, trên xuống dướ i. K ết quả ra sẽ phải như sau:
Ta sẽ sử dụng 2 vòng l ặ p For lồng trong nhau, vòng l ặp trong để tạo từng hàng 4 phần tử, và vòng l ặp ngoài để tạo mảng 2 chiều từ 5 mảng 1 chiều vừa tạo (vòng For có 5 lần lặp). Để ý chú thích.
Cũng giống như vớ i mảng 1D, bạn cũng có thể sử dụng For loop để tách mảng 2 chiều ra từng phần tử (phần tử mảng hoặc phần tử số). Bạn phải làm theo trình t ự, đầu tiên tách t ừng mảng 1 chi ều ra từ mảng 2 chiều, sau đó tách từng phần tử trong mảng một chiều:
Trong chương trình như hình, tôi giớ i thiệu 2 cách để cộng từng phần tử trong mảng 2 chiều trong LabVIEW: cách dùng vòng l ặ p For tách từng phần tử và thực hiện phép cộng, và cách đơn giả n là dùng phép c ộng vào mảng Ví dụ trên down mang 2 chieu va For loop.vi Sau đây tôi tạ m k ết thúc bài giớ i thiệu về vòng lặ p For. Còn nhiều ví dụ và bài tậ p thú vị liên quan đến vòng lặp này, nhưng cần thêm ki ến thức bổ sung, vì th ế ta sẽ tr ở lại vớ i vòng lặ p này sau. Bài 5: Cấu trúc CASE, SEQUENCE, EVENT và FORMULA NODE (Đỗ Trung Hiếu - CYBERLAB JSC.) Trong bài này ta s ẽ tìm hi ểu một số cấu trúc còn lại hay đượ c sử dụng trong
LabVIEW. 1. Cấu trúc CASE: Cấu trúc CASE trong LabVIEW có tác d ụng giống như cấu trúc r ẽ nhanh CASE trong lập trình C/C++. Đó là dạ ng cấu trúc r ẽ nhánh cho phép chương trình có nhiều lựa chọn khác nhau tùy thu ộc vào đầu vào. Để tạo cấu trúc CASE, ta click chu ột phải chọn Programming >> Structures >> Case structure Ta tạo một cấu trúc case trên block diagram như sau:
Khi mớ i khở i tạo, điều kiện đầu vào có kiểu dữ liệu Logic (Boolean). Điều kiện đầu vào cũng có thể là chuỗi ký t ự, số, enum… Khi muốn chuyển sang Case khác, ví d ụ hiện tại là True case, ta ấn vào mũi tên tam giác chỉ xuống cạnh chữ True, chọn False, nội dung bên trong case structure s ẽ chuyển sang hiển thị False case. Ví dụ: Viết chương trình cảnh báo tr ạng thái của biến đầu vào, nếu biến lớn hơn giá trị đặt, đèn Led nhấ p nháy, nếu không đèn Led không sang.
Chương trình như sau:
Đây là chương trình khi điề u kiện đầu vào lớn hơn giá trị đặt (10) thỏa mãn, ta thực hiện một phép đảo giá tr ị Led (nhấ p nháy Led Alarm) sau mỗi vòng lặ p. Còn đây là chương trình khi điề u kiện đầu vào là False:
Ta cũng có thể thiết lập đầu vào của Case là dạng khác Boolean, ví d ụ: • Dạng string: bạn chú ý khi đặt đầu vào là String, ta ph ải chú ý nhập đúng chính xác tên của điều kiện trong dấu ngoặc kép, n ếu không LabVIEW s ẽ coi như đó là một trườ ng hợ p khác. • Dạng enum: enum là một kiểu số Integer nhưng được đại diện bở i một tên nhất định. Sử dụng kiểu Enum ta sẽ ít gặ p phải khả năng bị nhầm tên như khi sử dụng String, hơn nữa, sử dụng Enum cũng sẽ giảm bớt đáng kể dung lượ ng bộ nhớ đượ c sử dụng. Ví dụ sau thực thi phép toán: • Cho đầu vào là 1 s ố nguyên X và 1 đèn Led
• Nếu X=0 thì đèn Led tắt • Nếu X=1 Led nháy v ớ i chu k ỳ 100ms • Nếu X=2 Led nháy v ớ i chu k ỳ 200ms • Các trườ ng hợ p khác Led sáng Bài toán này là một ví dụ về việc đầu vào của Case là số. Chương trình vớ i từng trườ ng hợ p của đầu vào đượ c lậ p trình như sau:
Chú ý: • Để tạo thêm 1 case mớ i, ta click ph ải vào cạnh của Case structure, chọn "Add case after" hoặc "Add case before". • Default Case là trườ ng hợp trong đó X bằ ng giá tr ị điều kiện, hoặc bằng bất cứ giá tr ị nào chưa đượ c nêu trong điều kiện đó. Ví dụ trong bài toán này, Default case phải là 3 hoặc 4 hoặc bất cứ số nào khác 0,1,2. • Thườ ng mặc định ban đầu X=0 sẽ là "Default case", mu ốn "default case" là 3, ta tạo Case X=3, và click chu ột phải vào Case structure, chọn "Make this the default case" Enum: Enum bản chất tậ p hợ p các số thông thường, nhưng mỗ i số được đại diện bằng 1 tên riêng. Để tạo Enum trong Front panel, ta ch ọn: Modern >> Ring & Enum >> Enum Biểu tượ ng trong Block Diagram và Front Panel c ủa 1 Enum như sau
Để tạo thêm phần tử trong Enum, ta click ph ải vào biểu tượ ng, chọn Properties >> Edit Items
Ta thêm các phần tử với các tên tương ứng như sau hình trên. Như vậy ta đã tạo ra các phần tử với các tên: "So 0" tương ứng với 0; "So 1" tương ứng với 1; "So 2" tương ứng vớ i 2; Ta có th ể thêm phần tử cuối là "So con lai" tương ứng vớ i 3. Sau đó ta sẽ thay th ế Enum vừa tạo cho số X trong ví dụ Case Structure trên, ta thấy Case structure t ự nhận tậ p hợ p các số Enum vừa tạo như là tên của từng trườ ng hợ p.
Sau này, ta sẽ thấy Enum đượ c sử dụng r ất thông dụng trong các bài toán s ử dụng Case, đặc biệt là các bài toán s ử dụng Máy tr ạng thái mà tôi sẽ nói đến trong nh ững phần sau của mục này. Bài toán: Lậ p trình hiển thị đèn giao thông với đầ u vào là các tr ạng thái của đèn. Trong bài toán này ta s ẽ sử dụng Enum, case structure để lậ p trình 1 hệ thống đèn giao thông. Vớ i 3 tr ạng thái của đèn: Green, Red, Yellow Bước 1: Trướ c tiên ta t ạo 3 đèn Xanh, đỏ , vàng. Ta tạo 3 đèn Led. Hiệ n cả 3 đèn đều có màu Xanh. Để đổi màu từng đèn, ta kích chuột phải vào Led đã tạo, chọn Properties>>Appearance, kích chu ột trái vào màu đèn ON/OFF và chọ n màu tùy ý K ết quả ta được 3 đèn với 3 màu như sau:
Bướ c 2: Tạo Enum với 3 Items: Red, Yellow, Green đạ i diện cho 3 tr ạng thái của đèn giao thông. Bướ c 3: Tạo 1 Case structure và l ậ p trình cho từng đèn. Ở đây để cho gọn chương trình ta sẽ sử dụng 1 Constant array để lưu trạng thái của đèn cho từng trườ ng hợ p.
Chạy chương trình, thay đổi Enum STATE, ta thấy đèn giao thông đượ c hiển thị đúng như tr ạng thái định trướ c. Bướ c 4: Lậ p trình chuyển đổi tr ạng thái Trong bướ c này ta sẽ sử dụng một phương pháp gọi là "State Machine" hay máy tr ạng thái để biểu diễn chuyển đổi của hệ đèn giao thông theo như dự kiến: Red >> Green >> Yellow >> Red. Ở đây, ngoài việc xuất ra tín hiệu cho hệ đèn, ta còn phải quy đị nh cả Tr ạng thái tiế p theo (tức là giá tr ị của Enum) cho đèn đó ở vòng lặ p sau. Vì thế ta cần sử dụng đến Shift Register. Ngoài ra mỗi trườ ng hợp cũng quy định thờ i gian delay c ủa tr ạng thái, ví d ụ: Đèn Đỏ chờ 8s, đèn Vàng chờ 3s, đèn Xanh chờ 5s Lập trình như sau:
K ết quả hiển thị:
Đây là một ví dụ đơn giản của một phương pháp lậ p trình gọi là State Machine. Phương pháp này còn có 1 biế n thể ưu việt hơn mà tôi sẽ nói trong một Bài khác. Có thể tóm tắt các bướ c của phương pháp này như sau: • Xác định từng tr ạng thái của hệ thống • Vẽ sơ đồ tr ạng thái (Sơ đồ chuyển tr ạng thái, và các điề u kiện chuyển tr ạng thái) • Lậ p trình cho từng tr ạng thái, trong đó quy định: Chương trình sẽ hoạt động thế nào, và tr ạng thái ti ế p theo là gì. Các ví dụ down t ại đây: * case sample.vi * case sample with enum.vi * simple traffic light sample.vi 2. Cấu trúc SEQUENCE: Cấu trúc SEQUENCE đượ c dùng trong nh ững bài toán mà trong đó các tác vụ cần đượ c thực hiện theo trình t ự cho trướ c. Ví dụ trong bài toán thu th ậ p và xử lý dữ liệu, các bước chương trình cầ n thực hiện là như sau: • Cấu hình ch ế độ đo (chọn thiết bị đo, tốc độ đo, số mẫu đo về, độ phân giải, chế độ đo…) • Thu thậ p tín hiệu đo • Xử lý tín hi ệu (lọc…)
• Hiển thị tín hiệu • Lưu trữ. Để tạo 1 Sequence, tao ch ọn Programming >> Flat Sequence, r ồi tạo như vớ i vòng lặ p While. Flat Sequence đượ c biểu thị giống như một thướ c phim, mang hàm ý các tác v ụ thực hiện tuần tự giống như các Frame trong mộ t bộ phim. Ban đầu Flat Sequence mớ i chỉ có 1 Frame. Để thêm Frame mớ i, ta click chu ột phải vào rìa của Sequence, chọn Add Frame Before (nếu click vào rìa trái) ho ặc Add Frame After (nếu click vào rìa phải). Sequence sẽ thực hiện tuần tự các tác vụ trong mỗi Frame theo trình t ự từ trái sáng phải. Bạn cũng có thể chèn thêm 1 frame vào giữa 2 Frame bằng cách click chu ột phải vào giữa 2 frame, chọn Insert Frame. Bạn cũng có thể gộ p 2 Frame bằng cách chọn Merge Frames.
Ví dụ: Chương trình thự c hiện tuần tự: xuất tín hi ệu, thu th ậ p tín hiệu, xử lý và hiển thị
Code chương trình đượ c thực hiện như trên. Frame đầ u tiên xu ất tín hiệu có kèm theo nhiễu tr ắng (sử dụng hàm random). Frame thứ 2 xử lý tín hi ệu bằng bộ lọc thông thấ p, và Frame cuối cùng hiển thị tín hiệu trướ c và sau khi l ọc. K ết quả hiển thị:
Trong ví dụ trên ta thấy chương trình chỉ có 3 Frame cần thực hiện tuần tự, nếu như bài toán đòi hỏ i có nhiều Frame hơn (có nhữ ng bài toán c ần đến hàng chục Frame thực hiện tuần tự, ví dụ như các ứng dụng mô tả hoạt động của máy, các ứng dụng xử lý chuỗi ký tự hoặc xử lý giao ti ế p) thì Flat Sequence tr ở nên quá cồng k ềnh và khó qu ản lý. Để thay th ế Flat Sequence, ta s ử dụng Stacked Sequence. Cách t ạo Stacked Sequence cũng như vớ i Flat Sequence, ch ọn Programming >> Structures >> Stacked Sequence Ban đầu Stacked Sequence không khác Flat Sequence, nhưng khi ta thêm các Frame mớ i vào (bằng lệnh Add Frame Before/After) thì có s ự khác biệt. Stacked Sequence lưu trữ các Frame trong các page khác nhau gi ống như vớ i cấu trúc Case. Các Frame được đánh số từ 0, 1, 2… Xem ví dụ dưới đây, ta thấ y với Stacked Sequence, chương trình đã nhỏ gọn hơn nhiều.
*Chú ý: • Để truyền các giá tr ị từ Frame này đến Frame khác trong Stacked Sequence, ta s ử dụng Sequence local, b ằng cách click ph ải vào rìa Frame, chọn Add Sequence Local. • Bạn cũng có thể chuyển đổi dễ dàng từ Flat Sequence sang Stacked Sequence và ngượ c lại một cách tự động, sử dụng Replace (các b ạn tự tìm hiểu) Để chạy chương trình liên t ục, ta cũng có thể đưa toàn bộ Sequence v ừa tạo vào trong 1 vòng lặ p While. 3. Cấu trúc EVENT Trong LabVIEW, cấu trúc EVENT hoạt động đóng vai trò giống như ngắ t trong lập trình Vi điề u khiển (Interrupt). Cấu trúc này cho phép ngườ i lậ p trình tạo ra các r ẽ nhánh đặc biệt với điều kiện là các sự kiện đặt trướ c. Một ưu điểm của cấu trúc này là cho phép chương trình chuyể n lậ p tức sang chương trình ngắt bất k ỳ khi nào điều kiện ngắt đượ c thỏa mãn. Điều này giúp quản lý chương trình hiệ u quả hơn, và giảm đáng kể bộ nhớ và tác vụ sử dụng. Để tạo cấu trúc EVENT, ta chọn Programming >> Structures >> Event structure Để hiểu và thấy được ưu điểm của cấu trúc EVENT, ta theo dõi ví d ụ sau theo 2 cách thực hiện: Có sử dụng EVENT và không s ử dụng cấu trúc EVENT. Ví dụ: Viết chương trình điều khiển một đại lượ ng X (ví dụ X là lượng nướ c trong bình chứa) bằng 3 nút bấm: Increase, Decrease, và Unchange. N ếu ấn Unchange thì X không đổ i, ấn Increase thì X tăng, ấ n Decrease thì X gi ảm. Ta có thể sử dụng 2 phương pháp để thực thi bài toán trên, m ột phương pháp sử dụng EVENT và 1 phương pháp không sử dụng cấu trúc EVENT. Bài 5: Cấu trúc CASE, SEQUENCE, EVENT và FORMULA NODE (Đỗ Trung Hiếu - CYBERLAB JSC.)
Tiế p tục bài 5.... 3. Cấu trúc EVENT Trong LabVIEW, cấu trúc EVENT hoạt động đóng vai trò giống như ngắ t trong lập trình Vi điề u khiển (Interrupt). Cấu trúc này cho phép ngườ i lậ p trình tạo ra các r ẽ nhánh đặc biệt với điều kiện là các sự kiện đặt trướ c. Một ưu điểm của cấu trúc này là cho phép chương trình chuyể n lậ p tức sang chương trình ngắt bất k ỳ khi nào điều kiện ngắt đượ c thỏa mãn. Điều này giúp quản lý chương trình hiệ u quả hơn, và giảm đáng kể bộ nhớ và tác vụ sử dụng. Để tạo cấu trúc EVENT, ta chọn Programming >> Structures >> Event structure Để hiểu và thấy được ưu điểm của cấu trúc EVENT, ta theo dõi ví d ụ sau theo 2 cách thực hiện: Có sử dụng EVENT và không s ử dụng cấu trúc EVENT. Ví dụ: Viết chương trình điều khiển một đại lượ ng X (ví dụ X là lượng nướ c trong bình chứa) bằng 3 nút bấm: Increase, Decrease, và Unchange. N ếu ấn Unchange thì X không đổ i, ấn Increase thì X tăng, ấ n Decrease thì X gi ảm. Ta có thể sử dụng 2 phương pháp để thực thi bài toán trên, m ột phương pháp sử dụng EVENT và 1 phương pháp không sử dụng cấu trúc EVENT.
Cấu trúc Event Time out: thờ i gian mà cấu trúc Event ch ờ (tính b ằng mili giây) để một sự kiện xảy ra. Nếu quá thờ i gian này mà không có s ự kiện nào xảy ra
Cấu trúc EVENT cũng tương tự như cấu trúc CASE, với các “case” chứa các chương trình tương ứng vớ i mỗi sự kiện khác nhau. Case mặc định ban đầu là case “time out”, chưa code chương trình trong trườ ng hợ p không có sự kiện nào xảy ra. Ta ví dụ tạo 1 chương trình thự c hiện một bộ đếm, đếm số lần 1 biến logic thay đổi (ví dụ số lần ấn nút ADD). M ỗi lần ấn nút ADD s ẽ kích ho ạt 1 Event Case để tăng giá tr ị 1 biến Count lên 1 đơn vị . Để xóa bộ đếm, ta sử dụng nút Clear. Khi nút ấn, một Event Case đượ c kích ho ạt để xóa giá tr ị của biến Count. Cuối cùng, ta s ử dụng nút STOP để kích hoạt event case dừng chương trình. Đầu tiên ta t ạo vòng lặ p While chứa chương trình chính. Tạo event structure, đưa đầ u vào Time out là 10, th ể hiện Event structure s ẽ thực hiện chờ 10ms cho mỗi sự kiện tiế p theo. Nếu sau 10ms không có s ự kiện nào xảy ra, sẽ thực hiện 1 vòng lặ p k ế tiế p.
Để tạo 1 Case mớ i, ta click chu ột phải vào rìa của Event structure, ch ọn Add Event Case
Mở ra cửa sổ Edit Events. Đầu tiên ta ch ọn tạo Sự kiện ADD button value changed. Chọn như hình dướ i. Ấn OK để tạo Event mới, đó là Event case củ a sự kiện nút ADD đượ c ấn.
Trong Even Structure bây gi ờ xuất hiện 1 case mới, đó là case của sự kiện “value chang” của nút ADD. Để thực hiện việc thêm 1 giá tr ị vào Count khi s ự kiện này diễn ra, ta sử dụng 2 Local Variable c ủa biến Count. 1 Local Variable là d ạng Read, local Variable còn l ại ở dạng Write. Thực hiện như hình dưới đây, ta có thể coi như đã thực hiện 1 lệnh: Count = Count +1.
Tương tự như vớ i cách tạo Case trên, ta t ạo thêm Case CLEAR: value change. Vớ i Case này, th ực hiện lệnh Count = 0 để xóa giá tr ị bộ đếm.
Cuối cùng ta tạo Case: Stop : Value change. Nếu Case này xảy ra, ta đưa giá trị True vào STOP Condition c ủa vòng lặ p While bên ngoài để dừng chương trình.
Chạy chương trình, vớ i giao diện như dưới đây. Khi ấ n nút ADD, bi ến COUNT đếm tăng thêm 1 đơn vị . Khi ấn CLEAR, COUNT nạ p lại giá tr ị 0. Khi ấn STOP, chương trình dừng.
Cuối cùng, ta th ử đưa các biến, nút ấn trên ra khỏi vòng lặ p, chạy chương trình, ta vẫn thấy k ết quả như vậy. Việc đưa các nút bấm ra khỏi chương trình chứng tỏ trong vòng l ặ p không cần thực hiện việc kiểm tra tr ạng thái của các biến mà thực hiện các Sự kiện trong EVENT Structure như các ngắt trong Vi điề u khiển. Điều này cho phép gi ảm bớ t r ất nhiều tài nguyên c ủa máy tính khi th ực hiện chương trình, đồ ng thời tăng thêm khả năng đáp ứng nhanh của các vòng lặ p. Sử dụng EVENT Structure, b ạn cũng có thể quản lý chương trình đơn giả n và dễ dàng hơn vớ i các sự kiện khác nhau.
Đưa các biến ra ngoài vòng l ặ p. Dưới đây là 1 ví d ụ về chương trình đếm tương tự như trên nhưng sử dụng CASE Structure. CASE ngoài cùng check giá tr ị của nút ADD, nếu là True sẽ tăng thêm biến đếm COUNT 1 đơn vị . Nếu là FALSE thì check giá tr ị của nút CLEAR. N ếu nút CLEAR là true thì xóa giá tr ị của biến đến COUNT. Nếu không, gi ữ nguyên giá tr ị. Bạn có thể thấy chương trình phứ c tạp hơn nhiều và cũng tốn tài nguyên hơn nhiề u do phải thườ ng xuyên ki ểm tra tr ạng thái của các biến, đồng thờ i trong các CASE có thể chưa các chương trình phức tạ p, sẽ không đảm bảo đượ c thờ i gian th ực thi 1
Case kéo dài bao lâu.
Mô phỏng động cơ một chiều không s ử dụng Control Design and Simulation Toolkit
(Đỗ Trung Hiếu- Cyberlab JSC.) Đây là một đề tài mà tôi t ừng giúp đỡ một bạn Sinh viên năm cuối để làm đồ án tốt nghiệp liên quan đến LabVIEW: Mô ph ỏng động cơ điện một chiều (không sử dụng Control Design and Simulation Toolkit) và thi ết k ế bộ điều khiển PID, Mờ và Thích nghi cho động cơ đó. Ở đây tôi chỉ đưa ra 2 phần: mô phỏng động cơ và bộ điều khiển PID Đầu tiên là mô phỏng động cơ, tôi có sử dụng mô hình v ật lý của động cơ để mô phỏng với đầu vào là Điện áp (Voltage) và Moment quán tính (Torque), đầ u ra là Vận tốc và Dòng điện. Tất cả gói gọn trong 1 chương trình con "dc_motor_model (SubVI)" Các tham số động cơ đượ c nhậ p ở Cluster "Motor_para", gồm điện tr ở trong, h ằng số điện, moment quán tính c ủa tr ục động cơ, không có L (tính gần đúng), và dt là đơn vị thờ i gian mỗi lần tính toán (dt càng nh ỏ thì phép mô ph ỏng càng gần đúng, ở đây tôi đặt dt=1uS)
Tôi cũng thiết lậ p một chương trình con khác (dc_motor_body(SubVI)) mô phỏ ng động cơ trong không gian 3 chiề u, vớ i vận tốc quay đầu tr ục đúng bằng vận tốc quay của động cơ đượ c tính toán t ừ "dc_motor_model(SubVI)"
Thay đổi đầu vào U(điệ n áp) và T(moment tr ục) để quan sát thay đổi vận tốc, dòng điện:
Thiết k ế hệ điều khiển PID: Tôi cũng gửi kèm theo file thi ết k ế và mô phỏng bộ điều khiển động cơ sử dụng thuật toán PID:
Chương trình gồm 2 vòng lặ p For: Vòng lặ p tạo tín hi ệu đặt vận tốc, và vòng lặ p mô phỏng gồm bộ điều khiển PID và mô hình động cơ. Kế t quả đượ c xuất ra tín 2