home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 04 / occam.prg < prev    next >
Encoding:
Text File  |  1988-02-01  |  7.9 KB  |  195 lines

  1. PROC Fuellen(CHAN M,Z,INT x)
  2.   SEQ
  3.     x:=x+1                    -- Zahl der Personen erhöhen
  4.     Z ! 1                     -- An Hauptsensorproze₧ melden
  5.     IF
  6.       x=1                     -- War Rolltreppe bisher leer?
  7.         M ! starten           -- Dann Motor starten
  8.       TRUE
  9.         SKIP
  10. :
  11.  
  12. PROC Leeren(CHAN M,INT x)
  13.   SEQ
  14.     x:=x-1                    -- Zahl der Personen vermindern
  15.     IF
  16.       x=0                     -- Ist Rolltreppe jetzt leer?
  17.         M ! halten            -- Dann Motor anhalten
  18.       TRUE
  19.         SKIP
  20. :
  21.  
  22.  
  23. PROC Aussen(CHAN OF INT S.ein,S.aus,M,Z)
  24.      -- S.ein = Sensor am Eingang  S.aus = Sensor am Ausgang
  25.      -- M     = Motor              Z     = Hauptsensorproze₧
  26.   INT x :                     -- Zahl Personen auf der Rolltreppe
  27.   SEQ
  28.     x:=0                      -- Am Anfang keine Person
  29.     WHILE TRUE
  30.       ALT
  31.         S.ein ? ANY           -- Eine Person betritt Rolltreppe
  32.           Fuellen(M,Z,x)      -- Zahl erhoehen/Motor starten
  33.         S.aus ? ANY           -- Eine Person verlä₧t Rolltreppe
  34.           Leeren(M,x)         -- Zahl vermindern/Motor anhalten
  35. :
  36.  
  37.  
  38. PROC Sensor(CHAN Z.aus,Z.inn,S,W,VAL INT zeit1)
  39.      -- Z.aus = äu₧ere Rolltreppe  Z.inn = innere Rolltreppe
  40.      -- S     = Hauptsensor        W     = Alarmproze₧
  41.   VAL sec IS 15625 :          -- entspricht 1 Sekunde Timer-Wert
  42.   INT x,zeit0 :
  43.   SEQ
  44.     x:=0                      -- Am Anfang keine Person
  45.     WHILE TRUE
  46.       PRI ALT                 -- Priorisierte Alternative
  47.         S ? ANY               -- Betritt jemand den Bereich?
  48.           x:=x+1                 -- Zahl der Personen erhöhen
  49.         Z.aus ? ANY           -- Betritt jemand die äu₧ere Treppe?
  50.           x:=x-1                 -- Zahl der Personen erniedrigen
  51.         Z.inn ? ANY           -- Betritt jemand die innere Treppe?
  52.           x:=x-1                 -- Zahl der Personen erniedrigen
  53.         Uhr ? zeit0           -- Zeit abfragen
  54.           IF
  55.             (zeit0 AFTER zeit1) >= sec  -- Eine Sekunde vergangen?
  56.               SEQ
  57.                 W ! x                   -- Meldung an Alarmproze₧
  58.                 zeit1:=zeit1 PLUS sec   -- Neuen Zeit-Anfangswert
  59.             TRUE
  60.               SKIP
  61. :
  62.  
  63.  
  64. PROC Alarm(CHAN W.ob,W.unt,A)
  65.      -- W.ob  = oberer Hauptsensor W.unt = unterer Hauptsensor
  66.      -- A     = Alarm an innere Rolltreppe
  67.   VAL max IS 40 :             -- Grenzwert zum Alarmgeben
  68.   INT x.ob,x.unt,alarm :
  69.   WHILE TRUE
  70.     SEQ
  71.       W.ob ? x.ob             -- Oberen Hauptsensor lesen
  72.       W.unt ? x.unt           -- Unteren Hauptsensor lesen
  73.       IF
  74.         (x.ob<max) AND (x.unt<max)           -- oben und unten
  75.           alarm:=0                              -- wenige Personen
  76.         (x.ob>max) AND (x.unt<max)           -- oben viele, unten
  77.           alarm:=-2                             -- wenige Personen
  78.         (x.ob<max) AND (x.unt>max)           -- unten viele, oben
  79.           alarm:=2                              -- wenige Personen
  80.         TRUE                                 -- oben und unten
  81.           IF                                    -- viele Personen
  82.             (x.ob-x.unt)>max            -- oben wesentlich mehr
  83.               alarm:=-2                    -- als unten
  84.             (x.unt-x.ob)>max            -- unten wesentlich mehr
  85.               alarm:=2                     -- als oben
  86.             x.ob>x.unt                  -- oben mehr als unten
  87.               alarm:=-1
  88.             TRUE                        -- unten mehr als oben
  89.               alarm:=1
  90.       A ! alarm               -- Alarm senden
  91. :
  92.  
  93.  
  94. INT FUNCTION status.neu(VAL INT status,x)
  95.   INT s :
  96.   VALOF
  97.     SEQ
  98.       IF
  99.         x=0
  100.           s:=0
  101.         TRUE
  102.           s:=status
  103.   RESULT s
  104. :
  105.  
  106. PROC Innen(CHAN S.ob,S.unt,L.ob,L.unt,M,R,A,Z.ob,Z.unt)
  107.      -- S.ob  = oberer Sensor      S.unt = unterer Sensor
  108.      -- L.ob  = obere Lampe        L.unt = untere Lampe
  109.      -- M     = Motor              R     = Richtung des Motors
  110.      -- A     = Alarmproze₧
  111.      -- Z.ob  = oberer Hauptsensor Z.unt = unterer Hauptsensor
  112.   INT x,alarm,status :
  113.   SEQ
  114.     L.ob ! rot                -- Oberen Eingang sperren
  115.     L.unt ! rot               -- Unteren Eingang sperren
  116.     status:=0                 -- Am Anfang keine Bewegung
  117.     x:=0                      -- Am Anfang keine Person
  118.     WHILE TRUE
  119.       PRI ALT                 -- Priorisierte Alternative
  120.         A ? alarm             -- Alarmproze₧ meldet sich
  121.           IF
  122.             (alarm=-2) AND (status=1)   -- Richtungsänderung
  123.               L.unt ! rot                  -- Eingang sperren
  124.             (alarm=2) AND (status=-1)   -- Richtungsänderung
  125.               L.ob ! rot                   -- Eingang sperren
  126.             (alarm<0) AND (status=0)    -- Bisher Stillstand
  127.               SEQ                          -- nun abwärts
  128.                 R ! ab                       -- Richtung stellen
  129.                 L.ob ! gruen                 -- Eingang freigeben
  130.                 status:=-1                   -- Status setzen
  131.             (alarm>0) AND (status=0)    -- Bisher Stillstand
  132.               SEQ                          -- nun aufwärts
  133.                 R ! auf                      -- Richtung stellen
  134.                 L.unt ! gruen                -- Eingang freigeben
  135.                 status:=1                    -- Status setzen
  136.             alarm=0                     -- Stillstand gewünscht
  137.               SEQ
  138.                 L.ob ! rot                 -- Eingänge
  139.                 L.unt ! rot                -- sperren
  140.             TRUE                        -- Ansonsten bleibt
  141.               SKIP                         -- alles beim alten
  142.         S.ob ? ANY            -- Jemand passiert oberen Sensor
  143.           CASE status
  144.             -1                     -- Im Fall Status abwärts
  145.               Fuellen(M,Z.ob,x)       -- betritt er die Treppe
  146.             1                      -- Im Fall Status aufwärts
  147.               SEQ                     -- verlä₧t er die Treppe
  148.                 Leeren(M,x)
  149.                 status:=status.neu(status,x)
  150.         S.unt ? ANY           -- Jemand passiert unteren Sensor
  151.           CASE status
  152.             -1                     -- Im Fall Status abwärts
  153.               SEQ                     -- verlä₧t er die Treppe
  154.                 Leeren(M,x)
  155.                 status:=status.neu(status,x)
  156.             1                      -- Im Fall Status aufwärts
  157.               Fuellen(M,Z.unt,x)      -- betritt er die Treppe
  158. :
  159.  
  160.  
  161. VAL auf IS 1, ab IS -1 :           -- Motorrichtungen
  162. VAL starten is 1, halten IS -1 :   -- Motor an/aus
  163. VAL rot IS 1, gruen IS -1 :        -- Lampenzustände
  164. CHAN L1o,L1u,L2o,L2u,L3o,L3u :     -- Lampen
  165. CHAN S1o,S1u,S2o,S2u,S3o,S3u :     -- Sensoren an den Rolltreppen
  166. CHAN So,Su                         -- Hauptsensoren
  167. CHAN M1,M2,M3,R1,R2,R3 :           -- Motoren und Richtungen
  168. CHAN Z1o,Z2o,Z2u,Z3u :             -- Leitungen Hauptsensorproze₧
  169. CHAN Ao,Au,A :                     -- Leitungen Alarmproze₧
  170. TIMER Uhr :                        -- globaler Timer
  171. INT zeit1 :                        -- für Timer-Initialisierung
  172. ... Definition von PROC Fuellen
  173. ... Definition von PROC Leeren
  174. ... Definition von PROC Aussen
  175. ... Definition von PROC Sensor
  176. ... Definition von PROC Alarm
  177. ... Definition von FUNCTION status.neu
  178. ... Definition von PROC Innen
  179. SEQ
  180.   L1o ! gruen                      -- Rolltreppe 1 vorbereiten
  181.   L1u ! rot
  182.   R1 ! ab
  183.   L3o ! rot                        -- Rolltreppe 3 vorbereiten
  184.   L3u ! gruen
  185.   R3 ! auf
  186.   Uhr ? zeit1                      -- Timer-Initialisierung
  187.   PAR
  188.     Sensor(Z1o,Z2o,So,Ao,zeit1)    -- oberer Hauptsensorproze₧
  189.     Sensor(Z3u,Z2u,Su,Au,zeit1)    -- unterer Hauptsensorproze₧
  190.     Alarm(Ao,Au,A)                           -- Alarmproze₧
  191.     Aussen(S1o,S1u,M1)                       -- Rolltreppe 1
  192.     Innen(S2o,S2u,L2o,L2u,M2,R2,A,Z2o,Z2u)   -- Rolltreppe 2
  193.     Aussen(S3u,S3o,M3)                       -- Rolltreppe 3
  194.  
  195.