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

NameGET_NAMED_MEMORY_RETAIN
→POE-Typ→Funktion
KategorieIEC-Baustein, MemoryEnh, Baustein mit interner Fehlerdiagnose
Konform zur →IEC-Norm

(plus) nicht in IEC-Norm vorgesehen

Grafische Schnittstelle

Verfügbar ab
  • Version 1.53.0 (für logi.CAD 3 ) und Version 3.0.8 bzw. 2.3.1801 von logi.RTS
    (warning) Dieser Baustein wird nur für die integrierte SPS unterstützt.
  • Version 1.109.0 (für logi.CAD 3 ) und Version 3.19.0 von logi.RTS: liefert die Referenz auf gleichen Speicherbereich wie GET_NAMED_MEMORY
    (warning) Dieser Baustein wird nur für die integrierte SPS und die Plattformen WindowsX86 und LinuxX86 unterstützt.
  • Version 3.2.2 (für Bibliothek Standard) – Erweiterung: breitere Schnittstelle; liefert die Referenz auf anderen Speicherbereich als GET_NAMED_MEMORY

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.