GET_NAMED_MEMORY_RETAIN-Baustein
Derzeit ist der GET_NAMED_MEMORY_RETAIN-Baustein analog zum GET_NAMED_MEMORY-Baustein, wobei GET_NAMED_MEMORY_RETAIN die Referenz auf einen anderen Speicherbereich als GET_NAMED_MEMORY liefert (siehe " Beispiel mit Referenz auf anderen Speicherbereich ").
Beachten Sie: Der
GET_NAMED_MEMORY_RETAIN-Baustein liefert die →Referenz auf einen →gepufferten Speicherbereich, dessen Namen Sie am Eingang NAME
eingeben
. Mit Hilfe des SAVE_ALL_NAMED_MEMORY_RETAIN-Bausteins oder SAVE_NAMED_MEMORY_RETAIN-Bausteins ist es möglich, alle gepufferten Speicherbereiche oder nur einen in den permanenten Speicher zu speichern.
Standardmäßig wird die entsprechende Datei im Unterverzeichnis PLC des logi.RTS-Installationsverzeichnisses abgelegt. Falls Sie die Ablage in einem anderem Verzeichnis bevorzugen, kontaktieren Sie Ihren Systemintegrator und bitten Sie darum, die Konfiguration des Systemdiensts zu ändern.
Kurz-Information
Name |
GET_NAMED_MEMORY_RETAIN |
→POE-Typ |
|
Kategorie |
IEC-Baustein, MemoryEnh, Baustein mit interner Fehlerdiagnose |
Konform zur →IEC-Norm |
nicht in IEC-Norm vorgesehen |
Grafische Schnittstelle |
|
Verfügbar ab |
|
Beispiel mit Referenz auf anderen Speicherbereich
Das folgende Beispiel enthält 2 Programminstanzen: eine schreibt einen Konfigurationswert in einen gepufferten Speicherbereich mit einem Namen, die andere liest ihn aus:
CONFIGURATION LocalConfiguration
RESOURCE local ON BuiltInPlc { ON_CHANNEL := LocalChannel }
TASK DefaultTask(INTERVAL := TIME#500ms, PRIORITY :=
38229
);
PROGRAM ProgramInstance1 WITH DefaultTask :
Program1;
PROGRAM ProgramInstance2 WITH DefaultTask :
Program2;
END_RESOURCE
END_CONFIGURATION
Da der Programmtyp Program2 fälschlicherweise GET_NAMED_MEMORY() verwendet, um den benannten Speicherbereich anzufordern. wird eine andere Referenz als erwartet geliefert:
PROGRAM Program1
VAR
ReferenceToInteger : REF_TO INT;
END_VAR
ReferenceToInteger := GET_NAMED_MEMORY_RETAIN(
'IntegerBlock'
);
IF ReferenceToInteger <> NULL THEN
ReferenceToInteger^ :=
42
;
END_IF;
END_PROGRAM
PROGRAM Program2
VAR
ReferenceToInteger : REF_TO INT;
END_VAR
ReferenceToInteger := GET_NAMED_MEMORY(
'IntegerBlock'
);
IF ReferenceToInteger <> NULL THEN
/* The following assertion will fail since 'Program2' erroneously requested
* a named memory block that is NOT retained, thus gets a different block
* than 'Program1'. For this reason, the value stored in the block is not '42' as
* expected, but the initial value of zero...
*/
Assert(ReferenceToInteger^ =
42
);
END_IF;
END_PROGRAM
Um das Problem zu beheben, müssen Sie den Aufruf GET_NAMED_MEMORY() durch den Aufruf GET_NAMED_MEMORY_RETAIN() ersetzen.