home *** CD-ROM | disk | FTP | other *** search
- PROC Fuellen(CHAN M,Z,INT x)
- SEQ
- x:=x+1 -- Zahl der Personen erhöhen
- Z ! 1 -- An Hauptsensorproze₧ melden
- IF
- x=1 -- War Rolltreppe bisher leer?
- M ! starten -- Dann Motor starten
- TRUE
- SKIP
- :
-
- PROC Leeren(CHAN M,INT x)
- SEQ
- x:=x-1 -- Zahl der Personen vermindern
- IF
- x=0 -- Ist Rolltreppe jetzt leer?
- M ! halten -- Dann Motor anhalten
- TRUE
- SKIP
- :
-
-
- PROC Aussen(CHAN OF INT S.ein,S.aus,M,Z)
- -- S.ein = Sensor am Eingang S.aus = Sensor am Ausgang
- -- M = Motor Z = Hauptsensorproze₧
- INT x : -- Zahl Personen auf der Rolltreppe
- SEQ
- x:=0 -- Am Anfang keine Person
- WHILE TRUE
- ALT
- S.ein ? ANY -- Eine Person betritt Rolltreppe
- Fuellen(M,Z,x) -- Zahl erhoehen/Motor starten
- S.aus ? ANY -- Eine Person verlä₧t Rolltreppe
- Leeren(M,x) -- Zahl vermindern/Motor anhalten
- :
-
-
- PROC Sensor(CHAN Z.aus,Z.inn,S,W,VAL INT zeit1)
- -- Z.aus = äu₧ere Rolltreppe Z.inn = innere Rolltreppe
- -- S = Hauptsensor W = Alarmproze₧
- VAL sec IS 15625 : -- entspricht 1 Sekunde Timer-Wert
- INT x,zeit0 :
- SEQ
- x:=0 -- Am Anfang keine Person
- WHILE TRUE
- PRI ALT -- Priorisierte Alternative
- S ? ANY -- Betritt jemand den Bereich?
- x:=x+1 -- Zahl der Personen erhöhen
- Z.aus ? ANY -- Betritt jemand die äu₧ere Treppe?
- x:=x-1 -- Zahl der Personen erniedrigen
- Z.inn ? ANY -- Betritt jemand die innere Treppe?
- x:=x-1 -- Zahl der Personen erniedrigen
- Uhr ? zeit0 -- Zeit abfragen
- IF
- (zeit0 AFTER zeit1) >= sec -- Eine Sekunde vergangen?
- SEQ
- W ! x -- Meldung an Alarmproze₧
- zeit1:=zeit1 PLUS sec -- Neuen Zeit-Anfangswert
- TRUE
- SKIP
- :
-
-
- PROC Alarm(CHAN W.ob,W.unt,A)
- -- W.ob = oberer Hauptsensor W.unt = unterer Hauptsensor
- -- A = Alarm an innere Rolltreppe
- VAL max IS 40 : -- Grenzwert zum Alarmgeben
- INT x.ob,x.unt,alarm :
- WHILE TRUE
- SEQ
- W.ob ? x.ob -- Oberen Hauptsensor lesen
- W.unt ? x.unt -- Unteren Hauptsensor lesen
- IF
- (x.ob<max) AND (x.unt<max) -- oben und unten
- alarm:=0 -- wenige Personen
- (x.ob>max) AND (x.unt<max) -- oben viele, unten
- alarm:=-2 -- wenige Personen
- (x.ob<max) AND (x.unt>max) -- unten viele, oben
- alarm:=2 -- wenige Personen
- TRUE -- oben und unten
- IF -- viele Personen
- (x.ob-x.unt)>max -- oben wesentlich mehr
- alarm:=-2 -- als unten
- (x.unt-x.ob)>max -- unten wesentlich mehr
- alarm:=2 -- als oben
- x.ob>x.unt -- oben mehr als unten
- alarm:=-1
- TRUE -- unten mehr als oben
- alarm:=1
- A ! alarm -- Alarm senden
- :
-
-
- INT FUNCTION status.neu(VAL INT status,x)
- INT s :
- VALOF
- SEQ
- IF
- x=0
- s:=0
- TRUE
- s:=status
- RESULT s
- :
-
- PROC Innen(CHAN S.ob,S.unt,L.ob,L.unt,M,R,A,Z.ob,Z.unt)
- -- S.ob = oberer Sensor S.unt = unterer Sensor
- -- L.ob = obere Lampe L.unt = untere Lampe
- -- M = Motor R = Richtung des Motors
- -- A = Alarmproze₧
- -- Z.ob = oberer Hauptsensor Z.unt = unterer Hauptsensor
- INT x,alarm,status :
- SEQ
- L.ob ! rot -- Oberen Eingang sperren
- L.unt ! rot -- Unteren Eingang sperren
- status:=0 -- Am Anfang keine Bewegung
- x:=0 -- Am Anfang keine Person
- WHILE TRUE
- PRI ALT -- Priorisierte Alternative
- A ? alarm -- Alarmproze₧ meldet sich
- IF
- (alarm=-2) AND (status=1) -- Richtungsänderung
- L.unt ! rot -- Eingang sperren
- (alarm=2) AND (status=-1) -- Richtungsänderung
- L.ob ! rot -- Eingang sperren
- (alarm<0) AND (status=0) -- Bisher Stillstand
- SEQ -- nun abwärts
- R ! ab -- Richtung stellen
- L.ob ! gruen -- Eingang freigeben
- status:=-1 -- Status setzen
- (alarm>0) AND (status=0) -- Bisher Stillstand
- SEQ -- nun aufwärts
- R ! auf -- Richtung stellen
- L.unt ! gruen -- Eingang freigeben
- status:=1 -- Status setzen
- alarm=0 -- Stillstand gewünscht
- SEQ
- L.ob ! rot -- Eingänge
- L.unt ! rot -- sperren
- TRUE -- Ansonsten bleibt
- SKIP -- alles beim alten
- S.ob ? ANY -- Jemand passiert oberen Sensor
- CASE status
- -1 -- Im Fall Status abwärts
- Fuellen(M,Z.ob,x) -- betritt er die Treppe
- 1 -- Im Fall Status aufwärts
- SEQ -- verlä₧t er die Treppe
- Leeren(M,x)
- status:=status.neu(status,x)
- S.unt ? ANY -- Jemand passiert unteren Sensor
- CASE status
- -1 -- Im Fall Status abwärts
- SEQ -- verlä₧t er die Treppe
- Leeren(M,x)
- status:=status.neu(status,x)
- 1 -- Im Fall Status aufwärts
- Fuellen(M,Z.unt,x) -- betritt er die Treppe
- :
-
-
- VAL auf IS 1, ab IS -1 : -- Motorrichtungen
- VAL starten is 1, halten IS -1 : -- Motor an/aus
- VAL rot IS 1, gruen IS -1 : -- Lampenzustände
- CHAN L1o,L1u,L2o,L2u,L3o,L3u : -- Lampen
- CHAN S1o,S1u,S2o,S2u,S3o,S3u : -- Sensoren an den Rolltreppen
- CHAN So,Su -- Hauptsensoren
- CHAN M1,M2,M3,R1,R2,R3 : -- Motoren und Richtungen
- CHAN Z1o,Z2o,Z2u,Z3u : -- Leitungen Hauptsensorproze₧
- CHAN Ao,Au,A : -- Leitungen Alarmproze₧
- TIMER Uhr : -- globaler Timer
- INT zeit1 : -- für Timer-Initialisierung
- ... Definition von PROC Fuellen
- ... Definition von PROC Leeren
- ... Definition von PROC Aussen
- ... Definition von PROC Sensor
- ... Definition von PROC Alarm
- ... Definition von FUNCTION status.neu
- ... Definition von PROC Innen
- SEQ
- L1o ! gruen -- Rolltreppe 1 vorbereiten
- L1u ! rot
- R1 ! ab
- L3o ! rot -- Rolltreppe 3 vorbereiten
- L3u ! gruen
- R3 ! auf
- Uhr ? zeit1 -- Timer-Initialisierung
- PAR
- Sensor(Z1o,Z2o,So,Ao,zeit1) -- oberer Hauptsensorproze₧
- Sensor(Z3u,Z2u,Su,Au,zeit1) -- unterer Hauptsensorproze₧
- Alarm(Ao,Au,A) -- Alarmproze₧
- Aussen(S1o,S1u,M1) -- Rolltreppe 1
- Innen(S2o,S2u,L2o,L2u,M2,R2,A,Z2o,Z2u) -- Rolltreppe 2
- Aussen(S3u,S3o,M3) -- Rolltreppe 3
-