tínhiệu hoá và lý thuyết chung về tối u luật điều khiển thang máy
1.3. Thuật toán tối u điều khiển thang máy:
Khi thiết kế thuật toán tối u điều khiển thang máy với hệ thống hàng đợi ta thấy có những đặc điểm cần lu ý nh sau :
-Nếu chiều dài hàng đợi lớn quá có thể xảy ra trơng hợp hành khách không đợi đợc đã không đi thang máy .Trong khi đó đến lợt đợc phục vụ thang
Khối điều khiển động cơ cửa Sensor 2 Sensor 1 Sensor 5 Sensor 4 Sensor 3 Sàn tầng Phím gọi xuống Phím gọi lên Sàn tầng
máy vẫn chạy đến đúng vị trí gọi .NH vậy sẽ dẫn đến lãng phí thời gian và giảm hiệu suất hoạt động của thang.Do đó trong trờng hợp này ta chọn chiều dài hàng đợi là 7. Khi xắp xếp hàng đợi 1 vấn đề đặt ra là có thể ở 1 tầng có nhiều tín hiệu gọi thang của nhiều ngơì. Vì vậy mỗi khi có tín hiệu gọi thang cần phải duyệt toàn bộ hàng đợi xem tín hiệu này đã có mặt trong hàng đợi hay cha, trớc khi thêm vào hàng đợi.
Khi hành khách đi vào thang máy và ấn nút gọi tầng, sau quá trình chuyển động thang máy sẽ dừng lại ở vị trí tầng đã gọi. Tuy nhiên có thể tầng này đã có mặt trong hàng đợi và vì vậy coi nh tín hiệu gọi thang đã đợc phục vụ . Vì vậy cần phải loại tín hiệu này ra khỏi danh sãch hàng đợi để quá trình phuạc vụ thang máy không bị nhầm lẫn. Trong quá trình phục vụ có thể có nh- ngx trờng hợp thang máy không phục vụ kịp thời dẫn đến tình trạng mất khách hàng do thang máy đã chuyển động đến tầng gọi nhng không có ngời đi vào thang máy. Vì vậy cần phải có tín hiệu cảm biến sàn ca bin hoặc đặt thời gian trễ để sau khi buồng thang mở của và đã khép lại nhng không có ngời thì tín hiệu gọi thang tiếp theo trong hành đợi sẽ đợc phục vụ.
Tín hiệu gọi đầu tiên sẽ quyết định hành trình đầu tiên của buồng thang. Giả sử thang đang chuyển động lên từ tầng 3 đến tầng 7 trong hành trình lên thì tất cả các tín hiệu gọi từ tầng 3 đến tầng 7 đều đợc phục vụ.
Start Keyboard busy=0 ? Run=0 ? Running=1 Run up Ac_up=0 ? S03=1 ? Keyboard *Temp_up=1 ? Slow_down Stop S04 =1 ? S05 =1 ? ++Current *Curr_up=0 --Ac_up Set TIM00 Call Door TIM00=0 ? Ac_up=0 ? Wt_dn=0 ? Call Door Curr_dn = 0 --Wt_dn Temp=curr+1 Dn_max>curr ? Dn_max=curr ? Run = 1 Ac_dn=Wt_dn Wt_dn =0 Wt_dn=0 ? Over_weight ? Bell Keyboard Keyboard Keyboard Open_fast ? Keyboard Close =1 ? S05=1 ? ++Current Reset S03,S04,S05 Busy = 0 Temp=Dn_max? Keyboard S05 =1 ? ++Current Reset S03,S04,S05 ++Current *Curr_up=0 Ac_dn=Wt_dn Wt_dn=0 Ac_up=0 ? TIM00=0 ? Call Door S04 =1 ? Stop S05 =1 ? Slow_down Open_fast ? Keyboard Busy = 0 Run =1 Set TIM00 Keyboard KeyboardBell
Close =1 ? Over_weight ? Running=1 Run dn --Current Reset S03,S04,S05 S05 =1 ? S03 =1 ? Temp=curr Keyboard Ac_up=0 ? Temp=Up_min? Slow_down *Temp_dn=1 ? Slow_down S04 =1 ? Stop S04 =1 ? Stop S05 =1 ? --Current *Curr_dn=0 Ac_up=Wt_up Wt_up=0 S05 =1 ? --Current *Curr_dn=0 --Ac_dn Set TIM00 Set TIM00Run =0
Keyboard TIM00=0 ? TIM00=0 ? Open_fast ? Call Door Call Door Busy = 0 Ac_up=0 ? Ac_dn=0 ? Wt_up=0 ? Run = 0 Ac_up=Wt_up Wt_up =0 Wt_up=0 ? Call Door Curr_up = 0 --Wt_up Up_min=curr ? Up_min>curr ? Busy = 0 Open_fast ? Keyboard Keyboard ++Current Reset S03,S04,S05 Keyboard S05 =1 ? Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Hình 2-13: L u đồ thuật toán của ch ơng trình chính điều khiển thang máy nhà cao tầng.
1. Gọi chơng trình đọc bàn phím ( Keyboard ), chuyển sang bớc 2.
2. Kiểm tra cờ busy, busy = 0 chuyển sang bớc 1, busy=chuyển sang bớc 3.
3. Kiểm tra cờ run, run = 0 chuyển sang bớc 4, run = 1 chuyển sang bớc 50.
4. Kiểm tra cờ Over_weight ( quá tải ), nếu Over_weight = 0 chuyển sang bớc 6, Over_weight = 1 chuyển sang bớc 5.
5. Báo chuông quá tải, gọi chơng trình Keyboard, chuyển sang bớc 4. 6. Kiểm tra cờ đóng cửa hoàn toàn ( Close ), close = 1 chuyển sang bớc 8,
ngợc lại chuyển sang bớc 7.
7. Gọi chơng trình đọc bàn phím ( Keyboard ), chuyển sang bớc 6.
8. Thiết lập cờ running = 1 ( đang chạy ), và ra lệnh chạy lên, chuyển sang bớc 9.
9. Kiểm tra sensor S03, nếu có chuyển sang bớc 11, ngợc lại chuyển sang bớc 10.
10.Gọi chơng trình đọc bàn phím ( Keyboard ) , chuyển sang bớc 9.
11.Gán Temp = current + 1 ( current là tầng hiện tại ), chuyển sang bớc 12. 12.Kiểm tra Ac_up ( số phần tử có trong hàng đợi lên cần đợc phục vụ
trong hành trình hiện tại ), Ac_up = 0 chuyển sang bớc 37, ngợc lại chuyển sang bớc 13.
13.Kiểm tra xem tầng sắp đến có cần dừng không, nếu có chuyển sang bớc 17, ngợc lại chuyển sang bớc 14.
14.Gọi chơng trình đọc bàn phím ( Keyboard ) , chuyển sang bớc 15.
15.Kiểm tra sensor S05, nếu có chuyển sang bớc 16, ngợc lại chuyển sang bớc 14.
16.Tăng chỉ số tầng hiện tại, Reset các sensor S03, S04, S05, chuyển sang bớc 9.
17.Ra lệnh giảm tốc, chuyển sang bớc 18.
18.Kiểm tra Sensor S04, nếu có chuyển sang bớc 19, ngợc lại chuyển sang bớc 18.
19.Ra lệnh dừng, chuyển sang bớc 20.
20.Kiểm tra sensor S05, nếu có chuyển sang bớc 21, ngợc lại chuyển sang bớc 20.
21.Tăng giá trị tầng hiện tại, xoá hàng đợi, trừ số phần tử trong hàng đợi lên đi một giá trị , set TIM0 ( trễ thời gian chờ mở cửa ), chuyển sang b- ớc 22.
22.Kiểm tra TIM0, nếu hết thời gian trễ chuyển sang bớc 25, ngợc lại chuyển sang bớc 23.
23.Gọi chơng trình đọc bàn phím ( Keyboard ) , chuyển sang bớc 24.
24.Kiểm tra cờ mở cửa nhanh ( Open_fast ), nếu có chuyển sang bớc 25, ngợc lại chuyển sang bớc 22.
25.Gọi chơng trình mở cửa ( door ) , chuyển sang bớc 26.
26.Kiểm tra Ac_up ( số phần tử có trong hàng đợi lên cần đợc phục vụ trong hành trình hiện tại ), Ac_up = 0 chuyển sang bớc 27, ngợc lại chuyển sang bớc 1.
27.Kiểm tra số phần tử trong hàng đợi xuống Wt_dn, Wn_dn = 0 thì chuyển sang bớc 28, ngợc lại chuyển sang bớc 29.
29.So sánh giá trị Dn_max ( phần tử lớn nhất trong hàng đợi xuống ) với tầng hiện tại , nếu Dn_max = current chuyển sang bớc 30, ngợc lại chuyển sang bớc 31.
30.Gọi chơng trình mở cửa, xoá phần tử trong hàng đợi xuống, giảm số phần tử trong hàng đợi xuống đi một giá trị, chuyển sang bớc 32.
31.So sánh giá trị Dn_max ( phần tử lớn nhất trong hàng đợi xuống ) với tầng hiện tại , nếu Dn_max > current chuyển sang bớc 1, ngợc lại chuyển sang bớc 33.
32.Kiểm tra xem có phần tử trong hàng đợi xuống không, nếu có chuyển sang bớc 33, ngợc lại chuyển sang bớc 28.
33.Thiết lập cờ run =1, gán Ac_dn = Wt_dn, gán Wt_dn =0 ( chuyển phần tử từ hàng đợi chờ đợc phục vụ sang hàng đợi cần đợc phục vụ ), chuyển sang bớc 1.
34.So sánh giá trị Temp với Dn_max, nếu Temp = Dn_max thì chuyển sang bớc 38, ngợc lại chuyển sang bớc 35
35.Gọi chơng trình đọc bàn phím ( Keyboard ), chuyển sang bớc 37.
36.Kiểm tra sensor S05, nếu có chuyển sang bớc 36, ngợc lại chuyển sang bớc 37.
37.Tăng giá trị tầng hiện tại, reset các sensor S03, S04 và S05, chuyển sang bớc 9.
38.Ra lệnh giảm tốc, chuyển sang bớc 39.
39.Kiểm tra Sensor S04, nếu có chuyển sang bớc 40, ngợc lại chuyển sang bớc 39.
40.Ra lệnh dừng, chuyển sang bớc 41.
41.Kiểm tra sensor S05, nếu có chuyển sang bớc 42, ngợc lại chuyển sang bớc 41.
42.Tăng giá trị tầng hiện tại, xoá hàng đợi, trừ số phần tử trong hàng đợi xuống đi một giá trị , chuyển Ac_dn = Wt_dn, gán Wt_dn = 0, chuyển sang bớc 44.
43.Thiết lập cờ run =1, set TIM0 ( trễ thời gian chờ mở cửa ),chuyển sang bớc 44.
44.Kiểm tra TIM0, nếu hết thời gian trễ chuyển sang bớc 47, ngợc lại chuyển sang bớc 45.
45.Gọi chơng trình đọc bàn phím ( Keyboard ) , chuyển sang bớc 46.
46.Kiểm tra cờ mở cửa nhanh ( Open_fast ), nếu có chuyển sang bớc 47, ngợc lại chuyển sang bớc 44.
47.Gọi chơng trình mở cửa ( door ) , chuyển sang bớc 48.
48.Kiểm tra Ac_dn ( số phần tử có trong hàng đợi xuống cần đợc phục vụ trong hành trình hiện tại ), Ac_dn = 0 chuyển sang bớc 49, ngợc lại chuyển sang bớc 1.
49.Thiết lập cờ busy = 0, chuyển sang bớc 1.
50.Kiểm tra cờ Over_weight ( quá tải ), nếu Over_weight = 0 chuyển sang bớc 51, Over_weight = 1 chuyển sang bớc 50.
52.Kiểm tra cờ đóng cửa hoàn toàn ( Close ), close = 1 chuyển sang bớc 53, ngợc lại chuyển sang bớc 54.
53.Gọi chơng trình đọc bàn phím ( Keyboard ), chuyển sang bớc 52.
54.Thiết lập cờ running = 1 ( đang chạy ), và ra lệnh chạy xuống, chuyển sang bớc 55.
55.Kiểm tra sensor S03, nếu có chuyển sang bớc 57, ngợc lại chuyển sang bớc 56.
56.Gọi chơng trình đọc bàn phím ( Keyboard ) , chuyển sang bớc 57. 57.Gán Temp = current ( current là tầng hiện tại ), chuyển sang bớc 58. 58.Kiểm tra Ac_dn ( số phần tử có trong hàng đợi lên cần đợc phục vụ
trong hành trình hiện tại ), Ac_dn = 0 chuyển sang bớc 80, ngợc lại chuyển sang bớc 59.
59.Kiểm tra xem tầng sắp đến có cần dừng không, nếu có chuyển sang bớc 63, ngợc lại chuyển sang bớc 60.
60.Gọi chơng trình đọc bàn phím ( Keyboard ) , chuyển sang bớc 61.
61.Kiểm tra sensor S05, nếu có chuyển sang bớc 62, ngợc lại chuyển sang bớc 59.
62.Giảm chỉ số tầng hiện tại, Reset các sensor S03, S04, S05, chuyển sang bớc 55.
63.Ra lệnh giảm tốc, chuyển sang bớc 64.
64.Kiểm tra Sensor S04, nếu có chuyển sang bớc 65, ngợc lại chuyển sang bớc 64.
65.Ra lệnh dừng, chuyển sang bớc 66.
66.Kiểm tra sensor S05, nếu có chuyển sang bớc 67, ngợc lại chuyển sang bớc 66.
67.Giảm giá trị tầng hiện tại, xoá hàng đợi, trừ số phần tử trong hàng đợi xuống đi một giá trị , set TIM0 ( trễ thời gian chờ mở cửa ), chuyển sang bớc 68.
68.Kiểm tra TIM0, nếu hết thời gian trễ chuyển sang bớc 69, ngợc lại chuyển sang bớc 71.
69.Gọi chơng trình đọc bàn phím ( Keyboard ) , chuyển sang bớc 70.
70.Kiểm tra cờ mở cửa nhanh ( Open_fast ), nếu có chuyển sang bớc 71, ngợc lại chuyển sang bớc 68.
71.Gọi chơng trình mở cửa ( door ) , chuyển sang bớc 72.
72.Kiểm tra Ac_dn ( số phần tử có trong hàng đợi lên cần đợc phục vụ trong hành trình hiện tại ), Ac_dn = 0 chuyển sang bớc 73, ngợc lại chuyển sang bớc 1.
73.Kiểm tra số phần tử trong hàng đợi xuống Wt_up, Wn_up = 0 thì chuyển sang bớc 74, ngợc lại chuyển sang bớc 75.
74.Thiết lập cờ busy = 0, chuyển sang bớc 1.
75.So sánh giá trị Up_min ( phần tử nhỏ nhất trong hàng đợi lên ) với tầng hiện tại , nếu Up_min = current chuyển sang bớc 77, ngợc lại chuyển sang bớc 76.
76.Gọi chơng trình mở cửa, xoá phần tử trong hàng đợi lên, giảm số phần tử trong hàng đợi lên đi một giá trị, chuyển sang bớc 78.
77.So sánh giá trị Up_min ( phần tử nhỏ nhất trong hàng đợi lên ) với tầng hiện tại , nếu Up_min > current chuyển sang bớc 1, ngợc lại chuyển sang bớc 79.
78.Kiểm tra xem có phần tử trong hàng đợi lên không, nếu có chuyển sang bớc 79, ngợc lại chuyển sang bớc 74.
79.Thiết lập cờ run =1, gán Ac_up = Wt_up, gán Wt_up =0 ( chuyển phần tử từ hàng đợi chờ đợc phục vụ sang hàng đợi cần đợc phục vụ ), chuyển sang bớc 1.
80.So sánh giá trị Temp với Up_min, nếu Temp = Up_min thì chuyển sang bớc 84, ngợc lại chuyển sang bớc 81.
81.Gọi chơng trình đọc bàn phím ( Keyboard ), chuyển sang bớc 82.
82.Kiểm tra sensor S05, nếu có chuyển sang bớc 83, ngợc lại chuyển sang bớc 80.
83.Giảm giá trị tầng hiện tại, reset các sensor S03, S04 và S05, chuyển sang bớc 55.
84.Ra lệnh giảm tốc, chuyển sang bớc 85.
85.Kiểm tra Sensor S04, nếu có chuyển sang bớc 86, ngợc lại chuyển sang bớc 85.
86.Ra lệnh dừng, chuyển sang bớc 87.
87.Kiểm tra sensor S05, nếu có chuyển sang bớc 88, ngợc lại chuyển sang bớc 87.
88.Giảm giá trị tầng hiện tại, xoá hàng đợi, trừ số phần tử trong hàng đợi lên đi một giá trị , chuyển Ac_up = Wt_up, gán Wt_up = 0, chuyển sang bớc 89.
89.Thiết lập cờ run =1, set TIM0 ( trễ thời gian chờ mở cửa ),chuyển sang bớc 90.
90.Kiểm tra TIM0, nếu hết thời gian trễ chuyển sang bớc 93, ngợc lại chuyển sang bớc 91.
91.Gọi chơng trình đọc bàn phím ( Keyboard ) , chuyển sang bớc 92.
92.Kiểm tra cờ mở cửa nhanh ( Open_fast ), nếu có chuyển sang bớc 93, ngợc lại chuyển sang bớc 90.
93.Gọi chơng trình mở cửa ( door ) , chuyển sang bớc 94.
94.Kiểm tra Ac_up ( số phần tử có trong hàng đợi xuống cần đợc phục vụ trong hành trình hiện tại ), Ac_up = 0 chuyển sang bớc 95, ngợc lại chuyển sang bớc 1.
95.Thiết lập cờ busy = 0, chuyển sang bớc 1.
Trên cơ sở các thuật toán đã trình bày, chơng trình điều khiển thang máy đã đợc viết theo sơ đồ Ladder trên phần mềm SYSMAC do hãng OMRON cung cấp, đã đợc soát lỗi và nạp vào PLC. Tuy nhiên do không có đủ điều kiện (thiếu các bàn phím đầu vào, các rơ le trung gian v.vv... ) nên không thể chạy thử nghiệm chơng trình. Do đó trong phần tiếp theo, em sẽ trình bày chơng trình mô phỏng thang máy trên máy tính.