summaryrefslogtreecommitdiff
path: root/prozess/ls-Prozess 2
blob: 3b8d4078ed1fa479b223b68a0da87a780089240f (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
(* 
        
         ********************************************************** 
         ********************************************************** 
         **                                                      ** 
         **                     ls-Prozess 2                     ** 
         **                                                      ** 
         **                     Version 1.02                     ** 
         **                                                      ** 
         **                  (Stand : 06.06.89)                  ** 
         **                                                      ** 
         **                                                      ** 
         **                                                      ** 
         **         Autoren: Bruno Pollok, Bielefeld             ** 
         **                  Wolfgang Weber, Bielefeld           ** 
         **                                                      ** 
         **                                                      ** 
         **    Copyright (C) 1988  Eva Latta-Weber, Bielefeld    ** 
         **    Copyright (C) 1990  ERGOS GmbH, Siegburg          ** 
         ********************************************************** 
         ********************************************************** 
 
                                                                           *) 
PACKET ls prozess 2 DEFINES                   
       wert an analogausgang ausgeben,
       spannungswert ausgeben,
       bitsymbol ausgeben,
       bitmuster ausgeben,
       dezimalwert ausgeben,
       bitmuster gleich,
       bit ist gesetzt,
       wert von analogeingang,
       spannungswert,
       bitsymbol,
       bitmuster,
       dezimalwert:
LET    eins   = "I",
       null   = "O",
       invers = "T",
       egal   = "X";
REAL CONST maximalwert :: real (ganzzahl obergrenze - 1);
(********************* A U S G A B E - B E F E H L E *********************)

PROC wert an analogausgang ausgeben (INT CONST kanal, wert):
  pruefe kanal (kanal, analog aus);
  ausgeben (kanal, wert MOD ganzzahlobergrenze)
END PROC wert an analogausgang ausgeben;
PROC spannungswert ausgeben (INT  CONST kanal, REAL CONST wert):
  pruefe kanal (kanal, analog aus);
  pruefe spannungswert;
  ausgeben (kanal, gewandelte spannung).
  pruefe spannungswert:
    REAL VAR u min, u max;
    hole spannungsbereich (kanal, u min, u max);
    IF wert < u min OR wert > u max
       THEN errorstop ("Der Spannungswert " + text (wert) +

                       " ist nicht zulaessig!")
    FI.
  gewandelte spannung:
    int (((wert - u min) * maximalwert) / (u max - u min) + 0.5).
END PROC spannungswert ausgeben;
PROC bitsymbol ausgeben (INT  CONST kanal, bitnummer, TEXT CONST zeichen):
  pruefe kanal (kanal, digital aus);
  pruefe bitnummer (bitnummer);
  ausgeben (kanal, relativer dezimalwert (zeichen, bitnummer, kanal))
END PROC bitsymbol ausgeben;
PROC bitmuster ausgeben (INT  CONST kanal, TEXT CONST zeichenkette):

  pruefe kanal (kanal, digital aus);
  ausgeben (kanal, relativer dezimalwert (zeichenkette, kanal))
END PROC bitmuster ausgeben;
PROC dezimalwert ausgeben (INT CONST kanal, wert):
  pruefe kanal (kanal, digital aus);
  ausgeben (kanal, wert MOD ganzzahl obergrenze)
END PROC dezimalwert ausgeben;
(********************* E I N G A B E - B E F E H L E *********************)
BOOL PROC bitmuster gleich (INT CONST kanal, TEXT CONST zeichenkette):
  INT CONST eingabewert :: dezimalwert (kanal);

  pruefe zeichenkette;
  eingabe passt zur zeichenkette.
  pruefe zeichenkette:
    IF length (zeichenkette) <> kanalbreite
       THEN errorstop ("Das Bitmuster '" + zeichenkette +
                       "' hat eine unzulaessige Laenge!")
    FI.
  eingabe passt zur zeichenkette:
   INT VAR stelle;
   BOOL VAR abweichung gefunden :: FALSE;
   FOR stelle FROM 1 UPTO kanalbreite REP
     teste bit an dieser stelle
   UNTIL abweichung gefunden PER;
   NOT abweichung gefunden.
 teste bit an dieser stelle:

   TEXT CONST einzelbit :: zeichenkette SUB stelle;
   IF   einzelbit = eins
        THEN teste eingabebit auf eins
   ELIF einzelbit = null
        THEN teste eingabebit auf null
   ELIF einzelbit = egal
        THEN eingabebit ist beliebig
   ELSE errorstop ("'" + einzelbit + "' ist unzulaessiges " +
                   "Bitsymbol in '" + zeichenkette + "'!")
   FI.
 teste eingabebit auf eins:
   IF NOT bit (eingabewert, kanalbreite - stelle)
      THEN abweichung gefunden := TRUE
   FI.

 teste eingabebit auf null:
   IF bit (eingabewert, kanalbreite - stelle)
      THEN abweichung gefunden := TRUE
   FI.
 eingabebit ist beliebig:
   .
END PROC bitmuster gleich;
BOOL PROC bit ist gesetzt (INT CONST kanal, bitnummer):
  pruefe kanal (kanal, digital ein);
  pruefe bitnummer (bitnummer);
  IF bit (eingabe (kanal), bitnummer)
     THEN TRUE
     ELSE FALSE
  FI
END PROC bit ist gesetzt;
INT PROC wert von analogeingang (INT CONST kanal):
  pruefe kanal (kanal, analog ein);

  eingabe (kanal)
END PROC wert von analogeingang;
REAL PROC spannungswert (INT CONST kanal):
  INT CONST dezimalwert :: wert von analogeingang (kanal);
  REAL  VAR u min, u max;
  hole spannungsbereich (kanal, u min, u max);
  round (real (dezimalwert) * (u max - u min) / maximalwert + u min, 3)
END PROC spannungswert;
TEXT PROC bitsymbol (INT CONST kanal, bitnummer):
  pruefe kanal (kanal, digital ein);
  pruefe bitnummer (bitnummer);
  IF bit (eingabe (kanal), bitnummer)
     THEN eins

     ELSE null
  FI
END PROC bitsymbol;
TEXT PROC bitmuster (INT CONST kanal):
  TEXT VAR   zeichenkette :: "";
  INT  CONST wert         :: dezimalwert (kanal);
  wandle wert;
  zeichenkette.
  wandle wert:
    INT VAR zeiger;
    FOR zeiger FROM kanalbreite - 1 DOWNTO 0 REP
      IF bit (wert, zeiger)
         THEN zeichenkette CAT eins
         ELSE zeichenkette CAT null
      FI
    PER.
END PROC bitmuster;
INT PROC dezimalwert (INT CONST kanal):
  pruefe kanal (kanal, digital ein);

  eingabe (kanal)
END PROC dezimalwert;
(******************** H I L F S - P R O Z E D U R E N ********************)
INT PROC relativer dezimalwert (TEXT CONST zeichenkette, INT CONST kanal):
   INT VAR wert := letzte ausgabe (kanal);
   pruefe zeichenkette auf korrekte laenge;
   veraendere alten wert;
   wert.
   pruefe zeichenkette auf korrekte laenge:
     IF length (zeichenkette) <> kanalbreite
        THEN errorstop ("Bitmuster '" + zeichenkette + "' hat "
                                      + "unzulaessige Laenge!")

     FI.
   veraendere alten wert:
     INT VAR zeiger;
     FOR zeiger FROM 1 UPTO kanalbreite REP
       veraendere dieses bit
     PER.
   veraendere dieses bit:
     TEXT CONST einzelbit :: zeichenkette SUB zeiger;
     IF   einzelbit = eins   THEN setze bit
     ELIF einzelbit = null   THEN loesche bit
     ELIF einzelbit = invers THEN invertiere bit
     ELIF einzelbit = egal   THEN lasse bit
     ELSE errorstop ("'" + einzelbit + "' ist unzulaessiges " +
                     "Bitsymbol in '" + zeichenkette + "'!")

     FI.
   setze bit:
     set bit (wert, kanalbreite - zeiger).
   loesche bit:
     reset bit (wert, kanalbreite - zeiger).
   invertiere bit:
     IF bit (wert, kanalbreite - zeiger)
        THEN loesche bit
        ELSE setze bit
     FI.
   lasse bit:
     .
  END PROC relativer dezimalwert;
INT PROC relativer dezimalwert (TEXT CONST bitzeichen,
                                INT  CONST bitnummer, kanal):
    INT VAR wert :: letzte ausgabe (kanal);
    IF   bitzeichen = eins   THEN setze bit

    ELIF bitzeichen = null   THEN loesche bit
    ELIF bitzeichen = invers THEN invertiere bit
    ELIF bitzeichen = egal   THEN lasse bit
    ELSE errorstop ("'" + bitzeichen + "' ist ein unzulaessiges " +
                                       "Bitsymbol!")
    FI;
    wert.
   setze bit:
     set bit (wert, bitnummer).
   loesche bit:
     reset bit (wert, bitnummer).
   invertiere bit:
     IF bit (wert, bitnummer)
        THEN loesche bit
        ELSE setze bit
     FI.
   lasse bit:

     .
END PROC relativer dezimalwert;
PROC pruefe bitnummer (INT CONST bitnummer):
  IF bitnummer < 0  OR  bitnummer > kanalbreite - 1
     THEN errorstop ("Bitnummer " + text (bitnummer) +
                     " ist nicht zulaessig!")
  FI
END PROC pruefe bitnummer
END PACKET ls prozess 2