summaryrefslogtreecommitdiff
path: root/app/gs.process/1.02/src/ls-Prozess 1 für MUFI als Endgerät
blob: 4d2a5f43fdda994cdc946051d4186d85438c2ad5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
(* 
        
         ********************************************************** 
         ********************************************************** 
         **                                                      ** 
         **                     ls-Prozess 1                     ** 
         **                                                      ** 
         **           Anpassung für  MUFI als Endgerät           ** 
         **                                                      ** 
         **                     Version 1.02                     ** 
         **                                                      ** 
         **                  (Stand : 26.01.90)                  ** 
         **                                                      ** 
         **                                                      ** 
         **         Autoren: Bruno Pollok, Bielefeld             ** 
         **                  Wolfgang Weber, Bielefeld           ** 
         **                                                      ** 
         **    Copyright (C) 1988  Eva Latta-Weber, Bielefeld    ** 
         **    Copyright (C) 1990  ERGOS GmbH, Siegburg          ** 
         ********************************************************** 
         ********************************************************** 
 
                                                                           *) 
PACKET ls prozess 1 DEFINES 
       run pdv,{}       run pdv again,{}       initialisiere interface,{}       schalte alles aus,{}       ausgeben,{}       eingabe,{}       warte,{}       abbruch gewuenscht,{}       tue nichts,{}       trage kanaldaten ein,{}       beende kanaldaten eintragen,{}       hole spannungsbereich,{}       letzte ausgabe,{}       pruefe kanal,{}       pruefe abbruch,{}       teste interface,{}       oeffne interface,{}       schliesse interface,{}       nicht belegt,{}       digital aus,{}       analog aus,{}
       digital ein,{}       analog ein,{}       kanalbreite,{}       ganzzahl obergrenze,{}       adapterart,{}    (* ------------------------- *){}       kanalkoppler,{}       interface kanal,{}       oeffne interface direkt,{}       schliesse interface direkt,{}       initialisiere interface direkt,{}       direkt ausgeben,{}       direkt eingabe:{}(******************** A N P A S S U N G  A N  M U F I ********************){}LET interface test  code = ""27""27"10",{}    interface okay  code = ""27""27"00",{}
    interface open  code = ""27""27"1A18",{}    interface close code = ""25""27""27"13",{}    adresse 0 code       = ""61"",{}    leertakt  code       = ""62"",{}    interface write code =   80  ,{}    interface read  code =   64  ,{}    erwartete zeichen    =    4  ;{}TEXT CONST adapterart   :: "MUFI als Endgerät";{}TEXT PROC interface anpassung (INT CONST kanalnummer, steuerungscode):{}  IF   es ist ein ausgabekanal{}       THEN code (interface write code + device + 4 * steuerungscode){}  ELIF es ist ein eingabekanal{}
       THEN lesecode in abhaengigkeit von der taktzahl{}       ELSE ""{}  FI.{}  es ist ein ausgabekanal:{}    kanal [kanalnummer].betriebsart < 0.{}  es ist ein eingabekanal:{}    kanal [kanalnummer].betriebsart > 0.{}  device:{}    IF kanalnummer < 10{}       THEN 0{}       ELSE kanalnummer DIV 10  -  1{}    FI.{}  lesecode in abhaengigkeit von der taktzahl:{}    SELECT kanal [kanalnummer].taktzahl OF{}      CASE 1: lesecode{}      CASE 2: adresse 0 code + lesecode + lesecode{}      CASE 3: adresse 0 code + lesecode + zwei weitere takte{}
    OTHERWISE "" END SELECT.{}  lesecode  :  code (interface read code + device + 4 * steuerungscode).{}  zwei weitere takte:{}    IF leertakt code = ""{}       THEN lesecode + lesecode{}       ELSE kanal [kanalnummer].taktzahl DECR 1;{}            leertakt code + lesecode{}    FI.{}END PROC interface anpassung;{}(************ H A R D W A R E U N A B H Ä N G I G E R  T E I L ************){}LET       max kanalanzahl          =   49,{}          initcode                 =   50,{}          endcode                  =   51,{}
          alles aus code           =   52,{}          endezeichen              =  "q",{}          abbruchzeichen           =  "h",{}          esc                      =  ""27"";{}INT CONST analog aus               ::  -2,            (* Betriebsarten *){}          digital aus              ::  -1,{}          nicht belegt             ::   0,{}          digital ein              ::   1,{}          analog  ein              ::   2,{}          kanalbreite              ::   8,{}          ganzzahl obergrenze      ::   2 ** kanalbreite,{}
          configuration error code ::  -1,{}          kanal besetzt code       ::  -3,{}          interface error code     ::  -4,{}          not init code            ::  -5;{}INT VAR   interfacechannel         ::   2,{}          dummy;{}TEXT VAR  meldung                  ::  "";{}BOOL VAR  kanaldaten sind eingetragen :: FALSE,{}          endezeichen gegeben         :: FALSE,{}          programm mit pdv gestartet  :: FALSE,{}          fehler zu melden            :: FALSE;{}TASK VAR  interface task              :: niltask;{}
DATASPACE VAR  ds :: nilspace;{}TYPE KANAL     = STRUCT (INT  betriebsart, taktzahl, TEXT steuercode),{}     SPANNUNG  = STRUCT (REAL minimalwert, maximalwert);{}ROW max kanalanzahl INT      VAR vorherige ausgabe;{}ROW max kanalanzahl KANAL    VAR kanal;{}ROW max kanalanzahl SPANNUNG VAR spannung;{}ROW 5 TEXT CONST fehlermeldung :: ROW 5 TEXT :{}  ("Interface ist noch nicht konfiguriert!",{}   "Interface-Task ist besetzt!",{}   "Interface-Kanal ist belegt!",{}   "Interface meldet sich nicht!",{}   "Interface kann nicht geöffnet werden!");{}
PROC run pdv:{}  run pdv (last param){}END PROC run pdv;{}PROC run pdv (TEXT CONST programmname):{}  enable stop;{}  last param (programmname);{}  programm mit pdv gestartet := TRUE;{}  teste interface;{}  disable stop;{}  run (programmname);{}  IF is error{}     THEN fehlerbehandlung{}     ELSE melde programmende{}  FI;{}  schliesse interface;{}  programm mit pdv gestartet := FALSE;{}  enable stop;{}  IF fehler zu melden{}     THEN errorstop (meldung){}  FI{}END PROC run pdv;{}PROC run pdv again:{}
  enable stop;{}  programm mit pdv gestartet := TRUE;{}  teste interface;{}  disable stop;{}  run again;{}  IF is error{}     THEN fehlerbehandlung{}     ELSE melde programmende{}  FI;{}  schliesse interface;{}  programm mit pdv gestartet := FALSE;{}  enable stop;{}  IF fehler zu melden{}     THEN errorstop (meldung){}  FI{}END PROC run pdv again;{}PROC melde programmende:{}  page;{}  menufootnote ("Programmende! Zum Weitermachen bitte irgendeine Taste tippen.");{}  pause;{}  schalte alles aus{}END PROC melde programmende;{}
PROC initialisiere interface:{}  enable stop;{}  pruefe abbruch;{}  IF programm mit pdv gestartet{}     THEN schalte alles aus{}     ELSE errorstop ("PDV-Programme müssen mit 'run pdv' gestartet werden!"){}  FI{}END PROC initialisiere interface;{}PROC schalte alles aus:{}  INT VAR k;{}  FOR k FROM 1 UPTO max kanalanzahl REP{}    vorherige ausgabe [k] := 0{}  PER;{}  forget (ds); ds := nilspace;{}  call (interface task, alles aus code, ds, dummy){}END PROC schalte alles aus;{}PROC ausgeben (INT CONST kanalnummer, wert):{}
  merke wert;{}  gib wert aus.{}  merke wert:{}    vorherige ausgabe [kanalnummer] := wert.{}  gib wert aus:{}    call (interface task, 256 * kanalnummer + wert, ds, dummy).{}END PROC ausgeben;{}INT PROC eingabe (INT CONST kanalnummer):{}  INT VAR eingabewert;{}  call (interface task, kanalnummer, ds, eingabewert);{}  eingabewert{}END PROC eingabe;{}PROC warte (REAL CONST sekunden):{}  TEXT VAR eingabe;{}  pruefe abbruch;{}  eingabe := incharety (int (sekunden * 10.0 + 0.5));{}  IF eingabe = esc{}
     THEN untersuche naechstes zeichen{}  FI.{}  untersuche naechstes zeichen:{}    eingabe := incharety (30);{}    IF   eingabe = endezeichen{}         THEN endezeichen gegeben := TRUE{}    ELIF eingabe = abbruchzeichen{}         THEN errorstop ("Programm-Abbruch durch <ESC><"{}                             + abbruchzeichen + ">!"){}    FI.{}END PROC warte;{}PROC warte (INT CONST sekunden):{}  TEXT VAR eingabe;{}  pruefe abbruch;{}  eingabe := incharety (sekunden * 10);{}  IF eingabe = esc{}     THEN untersuche naechstes zeichen{}
  FI.{}  untersuche naechstes zeichen:{}    eingabe := incharety (30);{}    IF   eingabe = endezeichen{}         THEN endezeichen gegeben := TRUE{}    ELIF eingabe = abbruchzeichen{}         THEN errorstop ("Programm-Abbruch durch <ESC><"{}                             + abbruchzeichen + ">!"){}    FI.{}END PROC warte;{}BOOL PROC abbruch gewuenscht:{}  pruefe abbruch;{}  BOOL VAR entscheidung :: endezeichen gegeben;{}  endezeichen gegeben := FALSE;{}  entscheidung{}END PROC abbruch gewuenscht;{}PROC tue nichts:{}
  pruefe abbruch{}END PROC tue nichts;{}PROC trage kanaldaten ein (INT CONST  kanalnummer,{}                           ROW 2 REAL CONST spannungsbereich,{}                           ROW 3 INT  CONST kanalparameter):{}   spannung [kanalnummer].minimalwert := spannungsbereich [1];{}   spannung [kanalnummer].maximalwert := spannungsbereich [2];{}   kanal [kanalnummer].betriebsart    := kanalparameter   [1];{}   kanal [kanalnummer].taktzahl       := kanalparameter   [2];{}   kanal [kanalnummer].steuercode     := interface anpassung{}
                                         (kanalnummer, kanalparameter [3]){}END PROC trage kanaldaten ein;{}PROC beende kanaldaten eintragen:{}  loesche interface task;{}  begin (PROC kanal koppler, interface task);{}  kanaldaten sind eingetragen := TRUE.{}  loesche interface task:{}    disable stop;{}    end (interface task);{}    IF is error{}       THEN clear error{}    FI;{}    enable stop.{}END PROC beende kanaldaten eintragen;{}PROC hole spannungsbereich (INT CONST kanalnummer, REAL VAR  u min, u max):{}
  u min := spannung [kanalnummer].minimalwert;{}  u max := spannung [kanalnummer].maximalwert{}END PROC hole spannungsbereich;{}INT PROC letzte ausgabe (INT CONST kanalnummer):{}  vorherige ausgabe [kanalnummer]{}END PROC letzte ausgabe;{}PROC pruefe kanal (INT CONST kanalnummer, gewuenschte betriebsart):{}  pruefe abbruch;{}  pruefe kanalnummer;{}  pruefe betriebsart.{}  pruefe kanalnummer:{}    IF kanalnummer < 1 OR kanalnummer > max kanalanzahl{}       THEN errorstop ("Kanalnummer " + text (kanalnummer) +{}
                        " ist unzulaessig !"){}    FI.{}  pruefe betriebsart:{}    IF gewuenschte betriebsart <> kanal [kanalnummer].betriebsart{}       THEN errorstop ("An Kanal " + text (kanalnummer) +{}                          " keine " +  wunsch + " moeglich!"){}    FI.{}  wunsch:{}    IF   gewuenschte betriebsart = analog aus{}         THEN "Analog-Ausgabe"{}    ELIF gewuenschte betriebsart = digital aus{}         THEN "Digital-Ausgabe"{}    ELIF gewuenschte betriebsart = digital ein{}         THEN "Digital-Eingabe"{}
    ELIF gewuenschte betriebsart = analog ein{}         THEN "Analog-Eingabe"{}         ELSE "Ein- oder Ausgabe"{}    FI.{}END PROC pruefe kanal;{}PROC pruefe abbruch:{}  IF incharety = esc{}     THEN pruefe weiter{}  FI.{}  pruefe weiter:{}    TEXT CONST zeichen :: incharety (30);{}    IF   zeichen = endezeichen{}         THEN endezeichen gegeben := TRUE{}    ELIF zeichen = abbruchzeichen{}         THEN errorstop ("Programm-Abbruch durch <ESC><"{}                             + abbruchzeichen + ">!"){}
    FI.{}END PROC pruefe abbruch;{}PROC oeffne interface (INT VAR status):{}  enable stop;{}  forget (ds); ds := nilspace;{}  IF kanaldaten sind eingetragen{}     THEN pingpong (interfacetask, initcode, ds, status){}     ELSE status := configuration error code{}  FI;{}  IF status > 0 THEN status DECR maxint FI;{}  forget (ds); ds := nilspace{}END PROC oeffne interface;{}PROC schliesse interface:{}  enable stop;{}  forget (ds); ds := nilspace;{}  pingpong (interface task, end code, ds, dummy);{}  forget (ds); ds := nilspace{}
END PROC schliesse interface;{}PROC teste interface:{}  INT VAR test;{}  oeffne interface (test);{}  IF test < 0{}     THEN errorstop (fehlermeldung [min (5, abs (test))]){}     ELSE fehler zu melden           := FALSE;{}          endezeichen gegeben        := FALSE{}  FI{}END PROC teste interface;{}PROC fehlerbehandlung:{}  meldung := errormessage;{}  IF meldung <> ""{}     THEN meldung CAT fehlerzeile;{}          fehler zu melden := TRUE{}  FI;{}  clear error;{}  initialisiere interface.{}  fehlerzeile:{}
    IF errorline = 0{}       THEN ""{}       ELSE " (bei Zeile " + text (errorline) + ")"{}    FI.{}END PROC fehlerbehandlung;{}(********************  EIN-/AUSGABE AM INTERFACE-KANAL ********************){}PROC kanalkoppler:{}  IF name (myself) <> "-"{}     THEN errorstop ("Unzulässiges Kommando!"){}     ELSE warte auf anrufe{}  FI.{}  warte auf anrufe:{}    TASK      VAR absender;{}    TEXT      VAR dummy;{}    INT       VAR codenummer, antwort;{}    disable stop;{}    REP forget (ds);{}        wait (ds, codenummer, absender);{}
        IF codenummer = initcode{}           THEN kopple an interface kanal;{}                IF interface ist betriebsbereit{}                   THEN bearbeite weitere auftraege{}                   ELSE gib negative rueckmeldung{}                FI;{}                gib kanal frei{}           ELSE antwort := not init code;{}                gib negative rueckmeldung{}        FI{}    PER.{} kopple an interface kanal:{}  continue (interface channel);{}  IF is error{}     THEN clear error;{}          antwort := kanal besetzt code{}
     ELSE oeffne interface direkt (antwort){}  FI.{} interface ist betriebsbereit:  antwort = 0.{} gib negative rueckmeldung:     send (absender, antwort, ds).{} gib kanal frei:{}   break (quiet);{}   send  (absender, 0, ds, antwort);{}   collect heap garbage.{} bearbeite weitere auftraege:{}   REP   call (absender, antwort, ds, codenummer);{}         IF   codenummer > 255{}              THEN sende wert an interface{}         ELIF codenummer <  50{}              THEN hole wert von interface{}         ELIF codenummer = alles aus code{}
              THEN initialisiere interface direkt{}         FI{}   UNTIL codenummer = endcode PER;{}   IF is error THEN clear error FI;{}   schliesse interface direkt.{}  sende wert an interface:{}    out (kanal [codenummer DIV 256].steuercode);{}    out (code (codenummer)).{}  hole wert von interface:{}    out (kanal [codenummer].steuercode);{}    SELECT kanal [codenummer].taktzahl OF{}      CASE 1 :  antwort := erstes  zeichen{}      CASE 2 :  antwort := zweites zeichen{}      CASE 3 :  antwort := drittes zeichen{}
      OTHERWISE antwort := -1{}    END SELECT.{}    erstes zeichen:{}      code (incharety (1)).{}    zweites zeichen:{}      dummy := incharety (1);{}      code (incharety (1)).{}    drittes zeichen:{}      dummy := incharety (1);{}      dummy := incharety (1);{}      code (incharety (1)).{}END PROC kanalkoppler;{}PROC interface kanal (INT CONST kanalnummer):{}  enable stop;{}  IF kanalnummer < 1 OR kanalnummer > 24{}     THEN errorstop ("Unzulaessige Kanalnummer"){}     ELSE interface channel := kanalnummer{}
  FI{}END PROC interface kanal;{}INT PROC interface kanal:{}  interface channel{}END PROC interface kanal;{}PROC oeffne interface direkt (INT VAR status):{}  leere puffer;{}  out (interface test code);{}  fange antwort;{}  IF antwort = interface okay code{}     THEN status := 0;{}          out (interface open code){}     ELSE status := interface error code{}  FI.{}  leere puffer:{}    REP  UNTIL incharety = "" PER.{}  fange antwort:{}    INT  VAR zaehler;{}    TEXT VAR antwort :: "";{}    FOR zaehler FROM 1 UPTO erwartete zeichen REP{}
      antwort CAT incharety (1){}    PER.{}END PROC oeffne interface direkt;{}PROC schliesse interface direkt:{}  out (interface close code){}END PROC schliesse interface direkt;{}PROC initialisiere interface direkt:{}  schalte alles aus.{}  schalte alles aus:{}    INT VAR kanalnummer, kanalbetriebsart;{}    FOR kanalnummer FROM 1 UPTO max kanalanzahl REP{}        kanalbetriebsart := kanal [kanalnummer].betriebsart;{}        IF   kanalbetriebsart = digital aus{}             THEN direkt ausgeben (kanalnummer, 0){}
        ELIF kanalbetriebsart = analog aus{}             THEN direkt ausgeben (kanalnummer, gewandelte nullspannung){}        FI{}    PER.{}  gewandelte nullspannung:{}    int(- real (ganzzahl obergrenze) * u min / (u max - u min) + 0.5).{}    u max :  spannung [kanalnummer].maximalwert.{}    u min :  spannung [kanalnummer].minimalwert.{}END PROC initialisiere interface direkt;{}PROC direkt ausgeben (INT CONST kanalnummer, wert):{} out (kanal [kanalnummer].steuercode);{} out (code (wert)){}END PROC direkt ausgeben;{}
INT PROC direkt eingabe (INT CONST kanalnummer):{}  gib lesecode aus;{}  erhaltene antwort.{}  gib lesecode aus:{}    out (kanal [kanalnummer].steuercode).{}  erhaltene antwort:{}    TEXT VAR dummy;{}    SELECT kanal [kanalnummer].taktzahl OF{}      CASE 1 :  erstes  zeichen{}      CASE 2 :  zweites zeichen{}      CASE 3 :  drittes zeichen{}      OTHERWISE -1{}    END SELECT.{}    erstes zeichen:{}      code (incharety (1)).{}    zweites zeichen:{}      dummy := incharety (1);{}      code (incharety (1)).{}
    drittes zeichen:{}      dummy := incharety (1);{}      dummy := incharety (1);{}      code (incharety (1)).{}END PROC direkt eingabe;{}PROC initialisiere die kanaele:{}  INT VAR kanalnummer;{}  FOR kanalnummer FROM 1 UPTO max kanalanzahl REP{}      trage kanaldaten ein (kanalnummer, keine spannung, leere karte);{}      vorherige ausgabe [kanalnummer] := 0{}  PER.{}  keine spannung:{}    ROW 2 REAL : (0.0, 0.0).{}  leere karte:{}    ROW 3 INT : (nicht belegt, 0, 0).{}END PROC initialisiere die kanaele;{}
initialisiere die kanaele;{}END PACKET ls prozess 1{}