Beruflich Dokumente
Kultur Dokumente
for(anz=1;anz<4;++anz)
{
*pqs+= w/md;
w%=md;
md/=10;
}
qs_alt=(*pqs>qs_alt)?*pqs:qs_alt;
if ( *pqs==qs_alt)return true;
return false;
}
int main() {
uint8_t val[4] = {0,231,19,112};
uint8_t i, qs = 0;
bool result;
for (i = 0; i < 4; i++) {
result = fqs(val[i], &qs);
// (*)
}
// andere Programmaufgaben
}
Welche Aussagen hierzu sind richtig?
Aussage Ja nein
Die Funktion fqs berechnet mit jedem Aufruf in *pqs die Summe aus X
dem aktuellen Wert von w und dem alten Wert von *pqs.
Wenn der neue Wert für *pqs gleich dem Ergebnis des letzten Aufrufs X
ist, gibt die Funktion den Wert true zurück.
Der Wert von qs_alt kann maximal 19 erreichen. X
Bei i=1 an der Stelle (*) hat qs den Wert 6. X
Bei i=2 an der Stelle (*) hat result den Wert false. X
Zu Frage
i) Die Funktion fqs berechnet mit jedem Aufruf in *pqs die Summe aus der
Quersumme von w und dem alten Wert von *pqs.
ii) qs_alt enthält immer den alten Wert von *pqs. Ändert sich dieser nicht, wird qs-alt
auch nicht geändert, und die Abfrage "if (*pqs==qs_alt) ist wahr. Also wird true
zurückgegeben.
iii) Da *pqs in der Funktion nicht initialisiert wird, kann der Wert bis 255 steigen.
iv) Bei i=1 wird val[1]=231 als w übergeben; die Quersumme von 231 ist 6.
v) Die Funktion gibt immer true zurück. Die Überlegung dazu ist ähnlich wie in ii)
Aussage Ja nein
Die architecture beschreibt einen Codeumsetzer vom Dualcode in
einen einschrittigen Code. X
Z Q0 Q1 Q2 A0 D0
0 1 1 1 0 0
1 0 1 1 0 1
2 1 0 1 0 0
3 0 1 0 0 0
4 0 0 1 0 1
5 1 0 0 0 1
6 1 1 0 0 1
7=0 1 1 1
iii. Endzustand nach spätestens 2 Zuständen 1,1,1: Da D0 dann 1 ist, schiebt sich die 1
in max 3 Zuständen zunächst in Q0, dann Q1, dann Q2.
b) Das folgende STD mit Ein- und Ausgabevektor für eine C-Umsetzung ist gegeben:
bool fsm_STD_1809(
bool reset, // reset of fsm
PtrInVector_STD_1809 inV, // input signals
PtrOutVector_STD_1809 outV // output signals
);
i. Warum ist das STD nicht eindeutig? Markieren Sie die entsprechende Stelle im STD mit
einem '*' und geben Sie hier eine für Eindeutigkeit ausreichende Übergangsbedingung
an.
outV->y = xmin;
case Normal:
outV->y = x;
}
return (true);
}
Port B Port C
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
v7 v6 v5 v4 v3 v2 v1 v0 v11 v10 v9 v8
Sensorwert v mit den Bitstellen 11..0
a) Schreiben Sie auf Basis der IO-Bibliothek (s. Anhang) eine Funktion
uint8_t readSensValue(DSCB bhdl, uint16_t *val)
zum sofortigen Lesen eines Sensorwerts (kein Vorheizen). Der Wert wird über
val zurückgegeben, der Ergebniscode des letzten IO-Aufrufs ist der
Rückgabewert. Bei einem IO-Fehler ist die Funktionsbearbeitung abzubrechen.
BYTE readSensValue(DSCB bhdl, uint16_t *val) {
BYTE valPB, valPC, ioresult;
if ((ioresult=InputByte(bhdl, PB, &valPB))!= IO_OK)
return ioresult;
if ((ioresult=InputByte(bhdl, PC, &valPC))!= IO_OK)
return ioresult;
*val = (((uint16_t) valPC &0xf0 ) <<4) | valPB ;
// 16-Bit-Wert bilden
// |Bit 7..4 von valPC nehmen |
// |links nach Pos.11..8 verschieben|
// |valPB in 7..0 einfügen |
return IO_OK;
}
c) Die Steuerungsfunktion für den Sensor ist die Schnittstelle zum Rest der
Software. Sie wird wie eine Automatenfunktion zyklisch immer wieder aufgerufen
und arbeitet auf der Basis eines intern gehaltenen Zeitstempels wie folgt:
a. Ist seit der letzten Messung 14'30'' vergangen, wird die Heizung
angestellt. Die Funktion merkt sich, dass sie im Zustand Vorheizen ist,
und gibt über den Parameter status eine 1 zurück.
b. Wird sie im Zustand Vorheizen aufgerufen und ist die Zeit für das
Vorheizen (30'') abgelaufen, führt sie die Messung aus, speichert den
Wert im Messwertespeicher values an Stelle (Index) ix, schaltet die
Vorheizung wieder aus, startet eine neue Zeitnahme für den nächsten
Messvorgang und gibt über den Parameter status eine 2 zurück.
c. Wird die Funktion in den Wartezeiten aufgerufen, führt sie keine Aktion
durch und gibt den Statuswert 0 zurück.
d. Der Rückgabewert ist im Fall a) und b) der Ergebniscode der DIO-
Funktion und bei c) 0.
Schreiben sie die Funktion mit folgender Schnittstelle:
ioResult=vorheizAnAus(bhdl, false);
// Heizung wieder ausschalten
*status = 2;
// Statuswert 2 setzen
lastClk = now;
// Zeitstempel setzen
cstate = Aus;
// nun ist wieder aus
return ioResult;
}
else { // weiter auf Vorheiz-Ende warten
*status = 0;
return 0;
}
}
}
1
Aus Sicht der Steuerung
Die Anforderungen an den Automaten sind in den folgenden Punkten (Requirements R1,..,R7)
zusammengefasst:
R1) Nach dem Einschalten soll die Tür geöffnet werden, wenn sie nicht bereits vollständig
geöffnet ist.
R2) Durch Betätigung des jeweiligen Tasters soll die Tür geöffnet (geschlossen) werden.
R3) Während der Bewegung soll die Tür durch Betätigen eines beliebigen Tasters
angehalten werden.
R4) Nach einem Halt durch einen Taster soll die Tür nach erneutem Betätigen eines
beliebigen Tasters in die damit angeforderte Richtung wieder gestartet werden.
R5) Bei Erreichen der jeweiligen Endschalter für langsame Fahrt soll die Tür mit
entsprechend verringerter Geschwindigkeit bis zum Erreichen des offenen
(geschlossenen) Zustands weiterfahren.
R6) Bei Fahrt mit geringer Geschwindigkeit darf kein Anhalten über einen Taster mehr
erfolgen.
R7) Wird während des Schließvorgangs der Blockadesensor ausgelöst, so soll die Tür
angehalten werden.
R8) Nach dem Halt durch den Bockadesensor soll die Tür nur durch Betätigen des Tasters
für die Öffnung geöffnet werden können. Ein weiteres Schließen soll nicht möglich sein.
Beschreiben Sie das gewünschte Verhalten mit einem Zustands-Übergangsdiagramm unter
Verwendung der o.g. Ein- und Ausgabesignale des Automaten.
Anhang
C-Vorgaben
Die folgenden Typen sind für alle C-Aufgaben bereits definiert:
Typname Bedeutung Typname Bedeutung
uint8_t Positive Zahl, 8 Bit int8_t Ganze Zahl, 8 Bit
BYTE
uint16_t Positive Zahl, 16 Bit int16_t Ganze Zahl, 16 Bit
uint32_t Positive Zahl, 32 Bit int32_t Ganze Zahl, 32 Bit
BOOL Aufzählungstyp mit Werten FALSE = 0 und TRUE = 1
Die Treiberbibliothek DIO (Digital Input/Output) stellt die folgenden Vereinbarungen und
Portzugriffsfunktionen zur Verfügung:
typedef enum {PA=0,PB,PC} PORT;
typedef enum {K0=0,K1,K2,K3,K4,K5,K6,K7} CHANNEL;
Digitale Eingabe:
BYTE InputByte (DSCB BoardHandle, PORT PortName, BYTE* ReadValue)
Eingabe: PortName {PA, PB, PC}
Ausgaben: *ReadValue = gelesenes Byte, Returnwert <> 0: Fehler
Digitale Ausgabe:
BYTE OutputByte(DSCB BoardHandle, PORT PortName, BYTE WriteValue)
Eingaben: PortName {PA, PB, PC}, WriteValue = auszugebendes Byte
Ausgabe: Returnwert <> 0: Fehler
Die folgenden Konstanten und Funktionen stehen zur Zeiterfassung basierend auf dem
ganzzahligen Typ clock_t zur Verfügung:
clock_t CLK_PER_SEC; // Anzahl der Clock-Werte (Ticks) pro Sekunde
clock_t clock(); // Abfrage der Clock; Ergebnis in Ticks