TIA Mit Openness Variablen importieren, XML Struktur

mnuesser

Level-1
Beiträge
1.022
Reaktionspunkte
165
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich würde gerne eine bzw. mehrere Variablen in eine Variablentabelle per Openness importieren.
Ich habe mir dazu mal eine aktuelle Tabelle exportiert, um den Aufbau mir anzuschauen...

Die exportierten Variablentabellen bestehen für mich aus drei Teilen:

1. dem Header
Code:
<DocumentInfo>
    <Created>2019-10-10T06:33:20.5545645Z</Created>
    <ExportSetting>WithDefaults</ExportSetting>
    <InstalledProducts>
      <Product>
        <DisplayName>Totally Integrated Automation Portal</DisplayName>
        <DisplayVersion>V15.1 Update 3</DisplayVersion>
      </Product>
      <OptionPackage>
        <DisplayName>TIA Portal Openness</DisplayName>
        <DisplayVersion>V15.1</DisplayVersion>
      </OptionPackage>
      <OptionPackage>
        <DisplayName>TIA Portal Teamcenter Gateway</DisplayName>
        <DisplayVersion>V15.1</DisplayVersion>
      </OptionPackage>
      <Product>
        <DisplayName>STEP 7 Professional</DisplayName>
        <DisplayVersion>V15.1 Update 3</DisplayVersion>
      </Product>
      <OptionPackage>
        <DisplayName>STEP 7 Safety</DisplayName>
        <DisplayVersion>V15.1</DisplayVersion>
      </OptionPackage>
      <Product>
        <DisplayName>WinCC Advanced</DisplayName>
        <DisplayVersion>V15.1 Update 3</DisplayVersion>
      </Product>
    </InstalledProducts>
  </DocumentInfo>

  <!---Hier muss die Tabelle TagTableDefinition.xml dann rein--->
  
  </Document>

Ihr seht, ich habe mir diese Daten schon mal separat exportiert und mir ne Einfügemarke erstellt.

Danach kommt eine Art Tabellendefinition:

Code:
<SW.Tags.PlcTagTable ID="0">
    <AttributeList>
      <Name>Standard-Variablentabelle</Name>
    </AttributeList>
    <ObjectList>


    <!-- Hier müssen dann die Variablen rein -->


    </ObjectList>
</SW.Tags.PlcTagTable>

und zum guten Schluß dann noch die Definition für jede einzelne Variable:

Code:
<SW.Tags.PlcTag ID="1" CompositionName="Tags">
        <AttributeList>
          <DataTypeName>Byte</DataTypeName>
          <ExternalAccessible>true</ExternalAccessible>
          <ExternalVisible>true</ExternalVisible>
          <ExternalWritable>true</ExternalWritable>
          <LogicalAddress>%MB1</LogicalAddress>
          <Name>TaktmerkerByte</Name>
        </AttributeList>
        <ObjectList>
          <MultilingualText ID="2" CompositionName="Comment">
            <ObjectList>
              <MultilingualTextItem ID="3" CompositionName="Items">
                <AttributeList>
                  <Culture>de-DE</Culture>
                  <Text>Simulation ist ein</Text>
                </AttributeList>
              </MultilingualTextItem>
              <MultilingualTextItem ID="4" CompositionName="Items">
                <AttributeList>
                  <Culture>en-GB</Culture>
                  <Text>Simulation running</Text>
                </AttributeList>
              </MultilingualTextItem>
            </ObjectList>
          </MultilingualText>
        </ObjectList>
      </SW.Tags.PlcTag>

hier seht Ihr die Version mit nur zwei Sprachen, aber das Prinzip bleibt bei jeder weiteren Sprache gleich.

Meine Frage lautet: braucht der wirklich so viele Daten nur für eine Variable?
Oder gibt es ein vereinfachtes Modell welches man beim Import benutzen kann?

Wo bekomme ich die MultilingualTextItem IDs her, und wo die MultilingualText IDs, sowie die SW.Tags.PlcTag IDs?

gruss Markus
 
Zuletzt bearbeitet:
Gut, nach etwas rumfummeln und Googlen sieht es folgendermaßen aus:

Ich habe immer noch das ganze in drei logische Teile gespalten, den Header bzw. den Rumpf der XML-Datei, dann die Tabellendefinition und dann noch die Variablendefinition.
Das sieht dann bei mir so aus:

Code:
<?xml version="1.0" encoding="utf-8"?>
<Document>
  <Engineering version="V15.1" />
  <DocumentInfo>
  </DocumentInfo>
  {TagTableDefinition}  
  </Document>

Wenn ich nun die Datei parse, und auf {TagTableDefinition} treffe, füge ich dort die Variablendefinition ein:

Code:
<SW.Tags.PlcTagTable ID="0">    <AttributeList>
      <Name>{TagTableName}</Name>
    </AttributeList>
	<ObjectList>
		{Tags}
	</ObjectList>
</SW.Tags.PlcTagTable>

Dort füge ich bei {TagTableName} den Tabellennamen ein, und bei {Tags} füge ich die Variablendefinitionen ein. Hier müsste man noch die ID von SW.Tags.PlcTagTable ID="0" erhöhen, für jede weitere Tabelle die angelegt wird.

Code:
<SW.Tags.PlcTag ID="{Iterate}" CompositionName="Tags">
        <AttributeList>
          <DataTypeName>{DataType}</DataTypeName>
          <ExternalAccessible>{SetpExternalAccessible}</ExternalAccessible>
          <ExternalVisible>{SetpExternalVisible}</ExternalVisible>
          <ExternalWritable>{SetpExternalWriteable}</ExternalWritable>
          <LogicalAddress>{Adress}</LogicalAddress>
          <Name>{TagName}</Name>
        </AttributeList>
        <ObjectList>
          <MultilingualText ID="{Iterate}" CompositionName="Comment">
            <ObjectList>
              <MultilingualTextItem ID="{Iterate}" CompositionName="Items">
                <AttributeList>
                  <Culture>{SetpCulture}</Culture>
                  <Text>{TagComment}</Text>
                </AttributeList>
              </MultilingualTextItem>
            </ObjectList>
          </MultilingualText>
        </ObjectList>
      </SW.Tags.PlcTag>

Und so sieht dann die Variablendefinition aus (für aktuell nur eine Sprache). {Iterate} ist einfach eine Integerzahl, die jeweils um eins erhöht wird, in die XML Datei dann aber per Hexadezimalformatierung eingefügt werden muss. {DataType} ist der Siemens Datentyp, {SetpExternalAccessible} ist "Erreichbar aus HMI/OPC UA, {SetpExternalVisible} ist "Sichtbar in HMI Engineering", {SetpExternalWriteable} ist "Schreibbar aus HMI/OPC UA", {Adress} die physikalische Adresse, {TagName} ist das Symbol, {SetpCulture} ist die Sprachdefinition für den Kommentar (de-DE bei mir), {TagComment} ist dann der Variablenkommentar.

Die Variablendefinition setze ich nun entsprechend oft hintereinander, bis ich alle meine Variablen definiert habe, importiere das ins Tia Portal und gut is.

Für Verbesserungsvorschläge bin ich offen :)
Jetzt muss ich erstmal den c# Code aufräumen und kommentieren...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir nutzen für das ganze T4 Templates, hat den Vorteil du kannst C# Code direkt in dein Template einbetten...

Sieht dann etwa so aus:

Code:
  <SW.Tags.PlcTagTable ID="<#= id++ #>">
    <AttributeList>
      <Name>General</Name>
    </AttributeList>
    <ObjectList>
      <SW.Tags.PlcUserConstant ID="<#= id++ #>" CompositionName="UserConstants">
        <AttributeList>
          <DataTypeName>Int</DataTypeName>
          <Name>HIGHEST_PLACE_NUMBER</Name>
          <Value><#= highestPlaceNumber.ToString() #></Value>
        </AttributeList>
        <ObjectList>
          <MultilingualText ID="<#= id++ #>" CompositionName="Comment">
            <ObjectList>
              <MultilingualTextItem ID="<#= id++ #>" CompositionName="Items">
                <AttributeList>
                  <Culture>de-DE</Culture>
                  <Text>Höchste Platznummer im Projekt</Text>
                </AttributeList>
              </MultilingualTextItem>
              <MultilingualTextItem ID="<#= id++ #>" CompositionName="Items">
                <AttributeList>
                  <Culture>en-GB</Culture>
                  <Text />
                </AttributeList>
              </MultilingualTextItem>
            </ObjectList>
          </MultilingualText>

zwischen <# #> kannst dann code einbetten
 
Zurück
Oben