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 | →Funktion |
Kategorie | IEC-Baustein, MemoryEnh, Baustein mit interner Fehlerdiagnose |
Konform zur →IEC-Norm |
|
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.