Symbol-Initialisierung und Retain-Variablen
Symbol-Initialisierung und *Retain-Variablen sind zwei verschiedene Mechanismen zur persistenten Datenhaltung in TwinCAT-PLC-Projekten. Über das Automation Interface lassen sich beide per ProduceXml auf der PLC-Instanz auslesen. Initialisierungswerte können zusätzlich per ConsumeXml gesetzt werden.
Voraussetzungen
- TwinCAT XAE ist installiert und gestartet.
- Eine DTE-Verbindung zur Zielinstanz ist aktiv.
ITcSysManagerist in einem STA-Thread initialisiert.- Ein PLC-Projekt mit einer PLC-Instanz ist in der Solution vorhanden.
Symbol-Initialisierung
Variablen können im PLC-Code mit dem Pragma {attribute 'TcInitSymbol'} markiert werden. TwinCAT stellt daraufhin über das Automation Interface einen XML-Zugriff auf die Initialisierungswerte bereit. Dieses Feature steht ab TwinCAT Build 4024.17 zur Verfügung.
PLC-Deklaration
VAR
{attribute 'TcInitSymbol'}
nCount : INT;
END_VAR
Initialisierungswerte lesen (C#)
// Look up PLC instance (under TIPC^<ProjectName>^<InstanceName>)
ITcSmTreeItem plcInstance = sysManager.LookupTreeItem(@"TIPC^PLC1^PLC1 Instance");
// Read symbol initialization values
string initXml = plcInstance.ProduceXml();
// The XML contains <InitSymbolValues> for all variables marked with {attribute 'TcInitSymbol'}
Beispiel-XML (ProduceXml-Ausgabe)
<TreeItem>
<TcModuleInstance>
<Module>
<InitSymbolValues>
<Value>
<Name>MAIN.nRem1</Name>
<Value>0</Value>
</Value>
</InitSymbolValues>
</Module>
</TcModuleInstance>
</TreeItem>
Initialisierungswert setzen (ConsumeXml, C#)
string setInitXml = @"<TreeItem>
<Instance>
<SymbolInit>
<Symbol>
<Name>MAIN.nInitValue</Name>
<Value>42</Value>
</Symbol>
</SymbolInit>
</Instance>
</TreeItem>";
plcInstance.ConsumeXml(setInitXml);
Retain-Variablen
![]() | Der Zugriff auf Retain-Variablen über das Automation Interface ist rein lesend. |
Retain-Variablen werden im PLC-Code über den VAR RETAIN-Abschnitt deklariert und behalten ihren Wert über einen Neustart der SPS hinweg.
PLC-Deklaration
PROGRAM MAIN
VAR
END_VAR
VAR RETAIN
nRem1 : INT;
END_VAR
Beispiel-XML (ProduceXml-Ausgabe der PLC-Instanz)
<TreeItem>
<TcModuleInstance>
<Module>
<DataAreas>
<DataArea>
<AreaNo AreaType="RetainSrc" CreateSymbols="true">4</AreaNo>
<Name>PlcTask Retains</Name>
<ContextId>0</ContextId>
<ByteSize>11534336</ByteSize>
<Symbol>
<Name>MAIN.nRem1</Name>
<Comment><![CDATA[{attribute 'TcInitSymbol'}]]></Comment>
<BitSize>16</BitSize>
<BaseType GUID="{18071995-0000-0000-0000-000000000006}">INT</BaseType>
<BitOffs>3096576</BitOffs>
</Symbol>
<Symbol>
<Name>myProg.nRemain</Name>
<BitSize>16</BitSize>
<BaseType GUID="{18071995-0000-0000-0000-000000000006}">INT</BaseType>
<BitOffs>3137088</BitOffs>
</Symbol>
</DataArea>
</DataAreas>
</Module>
</TcModuleInstance>
</TreeItem>
<TreeItem>
<TcModuleInstance>
<Module>
<RetainDataMappings>
<RetainDataMapping AreaNo="4" OTCID="#x03020001"/>
</RetainDataMappings>
</Module>
</TcModuleInstance>
</TreeItem>
