73. Kiểm tra số phần tử trong hàng đợi xuống Wt_up,
Wn_up = 0 thì chuyển sang bước74, 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ước77,ngược lại chuyển sang bước76.
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ước78.
16 trang |
Chia sẻ: thienmai908 | Lượt xem: 1419 | Lượt tải: 0
Nội dung tài liệu Chương trình ngắt đọc phím gọi thang, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Chương 7: Ch−ơng trình ngắt đọc phím
gọi thang
1. Kiểm tra xem phím bấm tr−ớc đó đã đ−ợc xử lý ch−a, nếu
ch−a ( key_buff
= 1 ) thì sang b−ớc 3, rồi ( key_buff2 = 0 ) thì sang b−ớc 2.
2. Tính toán và đ−a ra mã của phím đ−ợc gọi ( Scan code ), set
key_buff2=1.
3. Kết thúc ch−ơng trình.
Keyboard
2.7 Ch−ơng trình chính
S
ta
rt
Ke
yb
oa
rd
Keyboard BellKeyboard Y
e
s
bu
sy
=0
?
B
e
llKeyboard
Yes Y
e
s
Yes Yes
Close =1 ?Over_weight ? Run=0?
Over_weight?
Close=1?
Y
e
s
Keyboard
Ru
nni
ng
=1Rundn
S0
3
=1
?
Y
e
s
--
Cu
rre
ntResetS03,S04,S05
Y
e
s
S0
5
=1
?
++
Cu
rre
ntResetS03,S04,S05
Y
e
s
S0
5
=1
?
Running=1Run up
S03=1 ?
Keyboard
Y
e
s
Temp=curr Keyboard Ke
yb
oard
++Current
*Curr_up=0
Ac_dn=Wt_dn
Wt_dn=0
Run =1
Set TIM00
--Current
*Curr_dn=0
Ac_up=Wt_up
Wt_up=0
Run =0
Set TIM00
Temp=curr+1
++CurrentResetS03,S04,S05
S05 =1 ?
Ke
yb
oa
rd
Ac_u
p=0
?
Yes
*Te
mp
_dn
=1
?
Y
e
s
Te
mp
=U
p_
min
?
Y
e
s
Slo
w_
do
wn
Te
mp
=D
n_
ma
x?
Y
e
s
Slo
w_
do
wn
YesAc_up=0 ?
*Te
mp
_up
=1
?
Y
e
s
Ke
yb
oa
rd
++
Cu
rre
ntResetS03,S04,S05
Yes
S0
5=
1
?
Slow_down S04 =1 ?
Yes
S0
4
=1
?
Y
e
s
Slow_down
S04 =1 ?
Yes
S
t
o
p
S
t
o
p
S0
4
=1
?
Y
e
s
Stop S05 =1 ?
Yes
S05 =1 ?
Yes
--Current*Curr_dn=0--Ac_dnSet TIM00
S0
5
=1
?
Y
e
s
S
t
o
p
S05 =1 ?
Yes
++
es Call Door
Call Door
Curr_dn = 0
--Wt_dn
Current*Curr_up=0--Ac_up
Set
TI
M00
Open_f
ast ?
Ke
yboard
TI
M0
0=
0 ?
TI
M0
0=
0 ?
Ke
yb
oa
rd
Ke
yb
oa
rd
TI
M0
0=
0 ?
TI
M0
0=
0 ?
Keyboard
Open_f
ast ?
Yes Yes
Call Door
Ca
ll
Do
or
YesOpen_fast?
Open_fast ?Y
Y
e
s
Y
es
Ca
ll
Do
or
Yes
Busy = 0
Cal
l
Do
orCurr_up =0--Wt_up
Wt
_u
p=
0 ?
Y
e
s
Y
e
s
Y
e
s
Ac
_d
n=
0 ?
Y
e
s
Wt
_u
p=
0 ?
Up
_m
in=
cur
r ?
Up
_m
in>
cur
r ?Yes
Ac
_u
p=
0 ?
Y
e
s
Bu
sy
=
0
Bu
sy
=
0
Y
e
s
Ac
_u
p=
0 ?
Ac_
up=
0 ?
Y
e
s
Wt_
dn=0
?
Yes
YesDn_max=curr ?
Yes
Dn_m
ax>cu
rr ?
YesWt_dn=0 ?
Busy
= 0
Run = 0Ac_up=Wt_upWt_up =0
R
un =
1
Ac_dn=Wt_dnWt_dn =0
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.
28. Thiết lập cờ busy = 0, chuyển sang b−ớc 1.
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.
51. Báo chuông quá tải, gọi ch−ơng trình Keyboard, 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.
Các file đính kèm theo tài liệu này:
- chuong_7_356.pdf