Entstehung dynamisch belegter Systemressourcen bei der Meldungserzeugung mit den Anweisungen "ALARM_DQ" und "ALARM_D"
Bei der Meldungserzeugung mit "ALARM_DQ" und "ALARM_D" belegt das Betriebssystem temporär Speicherplatz im Systemspeicher.
Wenn Sie z. B. einen in der CPU vorhandenen FB mit "ALARM_DQ" - oder "ALARM_D" -Aufrufen löschen, kann es vorkommen, dass die zugehörigen Systemressourcen dauerhaft belegt bleiben. Wenn Sie den FB mit "ALARM_DQ"- oder "ALARM_D" -Aufrufen erneut laden, kann es vorkommen, dass die Anweisungen "ALARM_DQ" und "ALARM_D" nicht mehr ordnungsgemäß bearbeitet werden.
Beschreibung
Mit der Anweisung "READ_SI" können Sie momentan verwendete Systemressourcen auslesen, die bei der Meldungserzeugung mit "ALARM_DQ" und "ALARM_D" belegt wurden. Dies geschieht über die dort verwendeten Werte von EV_ID und CMP_ID. Diese werden der Anweisung "READ_SI" im Parameter SI_ID übergeben.
Die Anweisung "READ_SI" hat 4 mögliche Betriebsarten, die in der folgenden Tabelle erläutert werden. Die gewünschte Betriebsart stellen Sie über den Parameter MODE ein.
|
MODE |
Welche der von "ALARM_DQ" / "ALARM_D"belegten Systemressourcen werden ausgelesen? |
|---|---|
|
1 |
Alle (Aufruf von "READ_SI" erfolgt mit SI_ID:=0) |
|
2 |
Diejenige Systemressource, die beim "ALARM_DQ" / "ALARM_D"-Aufruf mit EV_ID:=ev_id belegt wurde (Aufruf von READ_SI erfolgt mit SI_ID:=ev_id) |
|
3 |
Alle Systemressourcen, die beim "ALARM_DQ" / "ALARM_D"-Aufruf mit CMP_ID:=cmp_id belegt wurden (Aufruf von READ_SI erfolgt mit SI_ID:=cmp_id) |
|
0 |
Weitere Systemressourcen, die beim vorherigen Aufruf mit MODE=1 oder MODE=3 nicht ausgelesen werden konnten, weil Sie das Zielfeld SYS_INST zu klein gewählt hatten |
Arbeitsweise
Wenn Sie beim Aufruf von READ_SI mit MODE=1 oder MODE=3 den Zielbereich SYS_INST ausreichend groß gewählt haben, enthält er nach dem Aufruf den Inhalt aller über den Parameter MODE ausgewählten Systemressourcen, die aktuell belegt sind.
Falls aktuell sehr viele Systemressourcen belegt sind, ist die Laufzeit entsprechend hoch. Bei hoher Auslastung Ihrer CPU kann dann die projektierte maximale Zyklusüberwachungszeit überschritten werden.
Dieses Laufzeitproblem können Sie wie folgt umgehen: Sie wählen den Zielbereich SYS_INST relativ klein. Falls die Anweisung nicht alle auszulesenden Systemressourcen in SYS_INST eintragen kann, wird Ihnen dies über RET_VAL=W#16#0001 mitgeteilt. Dann rufen Sie READ_SI mit MODE=0 und gleicher SI_ID wie beim vorherigen Aufruf so lange auf, bis RET_VAL den Wert W#16#0000 annimmt.
|
Hinweis Da das Betriebssystem keine Koordinierung der zu einem Leseauftrag gehörenden READ_SI-Aufrufe vornimmt, sollten Sie alle READ_SI-Aufrufe in ein und derselben Prioritätsklasse durchführen. |
Parameter
Die folgende Tabelle zeigt die Parameter der Anweisung "READ_SI":
|
Parameter |
Deklaration |
Datentyp |
Speicherbereich |
Beschreibung |
|---|---|---|---|---|
|
MODE |
Input |
INT |
E, A, M, D, L oder Konstante |
Auftragskennung Zulässige Werte:
|
|
SI_ID |
Input |
DWORD |
E, A, M, D, L oder Konstante |
Kennung für die auszulesende(n) Systemressource(n) Zulässige Werte:
|
|
RET_VAL |
Return |
INT |
E, A, M, D, L |
Rückgabewert (Fehlerinformation bzw. Auftragszustand) |
|
N_SI |
Output |
INT |
E, A, M, D, L |
Anzahl der in SYS_INT ausgegebenen Systemressourcen |
|
SYS_INST |
Output |
ANY |
D |
Zielbereich für die gelesenen Systemressourcen |
Weitere Informationen zu den gültigen Datentypen finden Sie unter "Übersicht über die gültigen Datentypen".
Parameter RET_VAL
|
Fehlercode (W#16#...) |
Erläuterung |
|---|---|
|
0000 |
Es ist kein Fehler aufgetreten. |
|
0001 |
Es konnten nicht alle Systemressourcen gelesen werden, da Sie den Zielbereich SYS_INST zu kurz gewählt haben. |
|
8081 |
(nur bei MODE=2 oder 3) Sie haben SI_ID den Wert 0 zugewiesen. |
|
8082 |
(nur bei MODE=1) Sie haben SI_ID einen von 0 verschiedenen Wert zugewiesen. |
|
8083 |
(nur bei MODE=0) Sie haben SI_ID einen anderen Wert zugewiesen als beim vorangegangenen Aufruf mit MODE=1 oder 3. |
|
8084 |
Sie haben MODE einen unzulässigen Wert zugewiesen. |
|
8085 |
READ_SI wird bereits in einem anderen OB bearbeitet. |
|
8086 |
Der Zielbereich SYS_INST ist zu klein für eine Systemressource. |
|
8087 oder 8092 |
Der Zielbereich SYS_INST liegt nicht in einem DB oder Fehler im ANY-Pointer. |
|
8xyy |
allgemeine Fehlerinformation Siehe auch: ALARM_D: Stets quittierte PLC-Meldungen erzeugen |
Parameter Zielbereich SYS_INST - Aufbau
Der Zielbereich für die gelesenen belegten Systemressourcen muss in einem DB liegen. Sinnvollerweise definieren Sie den Zielbereich als Feld von Strukturen, wobei eine Struktur wie folgt aufgebaut ist:
|
Strukturelement |
Datentyp |
Beschreibung |
|---|---|---|
|
SFC_NO |
WORD |
Nr. der Anweisung, die die Systemressource belegt hat |
|
LEN |
BYTE |
Länge der Struktur in Bytes, inkl. SFC_NO und LEN: B#16#0C |
|
SIG_STAT |
BOOL |
Signalzustand |
|
ACK_STAT |
BOOL |
Quittierungszustand des kommenden Ereignisses (steigende Flanke) |
|
EV_ID |
DWORD |
Meldungsnummer |
|
CMP_ID |
DWORD |
Kennung zur Identifikation des Teilsystems |