Export/Import von PLC-Meldetextlisten - TIAPortal

TIA Portal Openness: API für die Automatisierung von Engineering-Workflows

ft:publication_title
TIA Portal Openness: API für die Automatisierung von Engineering-Workflows
Product
TIAPortal
Version
V20
Publication date
01/2025
Language
de-DE
Export/Import von PLC-Meldetextlisten

Voraussetzung

Einleitung

Sie können mit TIA Portal Openness PLC-Meldetextlisten exportieren und importieren. Der Export/Import erfolgt im Format XLSX.

Struktur der Excel-Datei

Die generierte XLSX-Datei besteht aus zwei Tabellenblättern – einem für die Textlisten und einem für die Einträge. Die erstellte XLSX-Datei empfängt bei dem Vorgang eine benutzerdefinierte Eigenschaft namens FileContent mit dem Wert "Alarm text lists". Wenn diese Eigenschaft fehlt oder ungültig ist (keinen oder einen abweichenden Wert enthält), wird der Import abgelehnt.

Die Daten der beiden Arbeitsblätter sind miteinander verknüpft. Dabei verweist das übergeordnete TextListEntry.Parent auf TextList.Name

Modell des Engineering-Objekts

Die Definition des Engineering-Objektmodells für den neu eingeführten Typ PlcAlarmTextListProvider. Der Zugriff darauf erfolgt über die Engineering-Objekte PlcUnit und PlcSoftware.

Exportieren

Für den Exportvorgang stehen die zwei API-Methoden zur Verfügung. Wenn alle Textlisten einer PLC-/Software Unit in allen aktivierten Projektsprachen exportiert werden sollen, ist der einzige benötigte Parameter "path".

Er definiert den Speicherort, an dem sich die XLSX-Ergebnisdatei nach erfolgreichem Export befinden soll.

Kopiert den nachfolgenden Programmcode in die Zwischenablage.

FileInfo fileInfo = new FileInfo(Path.Combine(Environment.CurrentDirectory, $"{xlsxName}.xlsx"));

PlcAlarmTextListProvider textListProvider = GetTextListProvider(unitName);

textListProvider.ExportToXlsx(fileInfo);

Wenn nicht alle Textlisten einer PLC/Software Unit exportiert werden müssen oder wenn die Sprachen – für die der Textlistenexport vorgesehen ist – gefiltert werden sollen, ist in der API eine andere Methode verfügbar.

Damit werden die zu exportierenden Textlisten über die Liste der Textlistennamen angegeben und die Sprachen, für die der Export erfolgen soll, über die Liste der Sprachen angegeben.

Fehlerbehandlung:

  • Wenn die angegebene Sprache nicht als Projektsprache aktiviert ist, wird die UserException ausgelöst. Beispielsweise kann "Erforderliche Sprache 'Konkani (Indien)' nicht exportiert werden, weil es sich dabei nicht um eine im Projekt verwendete Sprache handelt. Die gültigen Sprachen sind dagegen 'Deutsch (Deutschland)', 'Englisch (USA)'"

  • Wenn keine Anwendertextliste vorhanden ist, wird eine UserException (TextListNotFoundException) mit folgender Meldung ausgelöst: "Zu folgendem Element ist keine Textliste vorhanden: <PLCName>."

  • Wenn ein bestimmter Textlistenname nicht vorhanden ist oder wenn er vorhanden ist, aber keine Anwendertextliste dazu existiert, wird eine UserException ausgelöst. Beispiele: "Textliste Benutzer_1 wird unter PLC_1 nicht gefunden."
    "Textliste SYSTEM_SDiag_CmpCpuName kann nicht exportiert werden, da es sich nicht um eine Anwendertextliste handelt."

Beispiel für die Verwendung der Aktion ExportToXlsx:

Kopiert den nachfolgenden Programmcode in die Zwischenablage.

private void ExportPlcOrUnit(

string stationName,

string plcName,

string xlsxName,

string[] textListNames,

string[] cultureCodes,

string unitName = null)

{

LanguageSettings languageSettings = Project.LanguageSettings;

LanguageComposition supportedLanguages = languageSettings.Languages;

IEnumerable<Language> cultureInfos = null;

if (cultureCodes != null)

{

cultureInfos = cultureCodes.Select(i => supportedLanguages.Find(CultureInfo.GetCultureInfo(i)));

}

FileInfo fileInfo = new FileInfo(Path.Combine(Environment.CurrentDirectory, $"{xlsxName}.xlsx"));

PlcAlarmTextListProvider textListProvider = GetTextListProvider(stationName, plcName, unitName);

TextListXlsxResult result = null;

string exceptionMessage = string.Empty;

ExceptionMessageData? userExceptionMessageData = null;

try

{

result = textListProvider.ExportToXlsx(fileInfo, textListNames, cultureInfos);

}

catch (EngineeringTargetInvocationException e)

{

exceptionMessage = e.ToString();

userExceptionMessageData = e.DetailMessageData.FirstOrDefault();

}

}

private PlcAlarmTextListProvider GetTextListProvider(string stationName, string plcName, string unitName = null)

{

DeviceComposition devices = Project.Devices;

Device device = devices.Where(station => station.Name == stationName).FirstOrDefault();

if (device == null)

{

throw new InvalidOperationException($"The requested '{stationName}' station is not found");

}

PlcSoftware plcTarget = (PlcSoftware)FindSoftwareTarget(device, plcName);

if (plcTarget == null)

{

throw new InvalidOperationException($"The requested '{plcName}' PLC SW is not found")

}

if (unitName != null)

{

PlcUnitProvider unitProvider = plcTarget.GetService<PlcUnitProvider>();

PlcUnit unit = unitProvider.UnitGroup.Units.Where(unit => unit.Name == unitName).FirstOrDefault();

if (unit == null)

{

throw new InvalidOperationException($"The requested '{unitName}' unit is not found");

}

return unit.GetService<PlcAlarmTextListProvider>();

}

return plcTarget.GetService<PlcAlarmTextListProvider>();

}

Importieren

Der folgende Importvorgang ist unter der Klasse PLCAlarmTextListProvider verfügbar. Der Parameter ImportFromXlsx akzeptiert fileInfo path als erforderlichen Parameter, der den Speicherort einer importierten XLSX-Datei festlegt.

Mit dem Parameter importOptions als zweitem Parameter in ImportFromXlsx kann festgelegt werden, ob beim Import vorhandene Textlisten überschrieben werden sollen.

Wenn der Parameter importOptions auf ImportOptions.None gesetzt ist und beim Import eine bereits vorhandene Textliste aktualisiert werden soll, wird eine UserException ausgelöst.

Wurde der Parameter importOptions auf ImportOptions.Override gesetzt, werden die bereits vorhandenen Textlisten beim Import aktualisiert.

Vorhandene Textlisten werden über ihren Namen identifiziert. Neue Daten (Textliste, Eintrag) werden an vorhandene Daten angehängt. Vorhandene Textlisten werden nur gelöscht, wenn es in der Importdatei entsprechende Daten gibt.

Enthält also die Excel-Datei Textlisteneinträge für eine bereits vorhandene Textliste, werden die vorhandenen Einträge gelöscht und die in der Excel-Datei enthaltenen Einträge werden in das TIA-Projekt für die

betreffende Textliste importiert (dabei werden keine Textlisteneinträge zusammengeführt).

Beispiel für die Verwendung der Aktion ImportFromXlsx:

Kopiert den nachfolgenden Programmcode in die Zwischenablage.

private TextListXlsxResultState ImportPlcOrUnit( string xlsxName, string unitName = null)

{

    FileInfo fileInfo = new FileInfo(Path.Combine(Environment.CurrentDirectory, $"{xlsxName}.xlsx"));

    PlcAlarmTextListProvider textListProvider = GetTextListProvider(unitName);

    // Definition of GetTextListProvider is at previous Export example.

    TextListXlsxResult result = null;

    try

    {

    //Import

    result = textListProvider.ImportFromXlsx(fileInfo, ImportOptions.Override);

    }

    catch (EngineeringTargetInvocationException e)

    {

     //Critical error case: No data imported. E.g. Missing or invalid xlsx file.

     System.Diagnostics.Debug.WriteLine(e.Message);

     // Write the place and the reason of the error.

     System.Diagnostics.Debug.WriteLine(e.DetailMessageData.First().Text);

     // Write the the reason of the error only.

     return TextListXlsxResultState.Error;

    }

    if (result.State == TextListXlsxResultState.OK)

    {

    System.Diagnostics.Debug.WriteLine("All Xlsx imported successfully.");

    }

    else if (result.State == TextListXlsxResultState.Warning)

    {

     //Some text list has not imported. E.g. Duplicated row, invalid range, invalid project language.

     System.Diagnostics.Debug.WriteLine($"Xlsx imported partially. More details at {result.LogFilePath} file.");

    }

    return result.State;

}

Wenn die Datei ungültige Einträge enthält, wird die Textliste mit den ungültigen Einträgen nicht importiert. (Beispiele für ungültige Einträge: Überschneidung zwischen Einträgen oder Datentyp abweichend vom Datentyp der Textliste, die die Einträge enthält).

Die Texte werden nur in den Sprachen importiert, die im Projekt aktiv sind. Wenn die Datei mehr Sprachen als das Projekt enthält, wird der Text in den zusätzlichen Sprachen nicht importiert und eine Warnung

wird protokolliert. Wenn das Projekt mehr Sprachen als die Datei umfasst, werden Texte, für die keine entsprechenden Daten in der Datei vorhanden sind, nicht bearbeitet (oder bleiben leer, falls beim Import neue Textlisten oder Textbereiche eingefügt werden).

In ein schreibgeschütztes Projekt können keine Daten importiert werden. Falls ein Benutzer versucht, Daten in ein schreibgeschütztes Projekt zu importieren, müsste eine UserException ausgelöst werden.

Ein Import ist ein komplexer Vorgang, bei dem verschiedenartige Fehler auftreten können. Wenn der Fehler kein kritischer Fehler ist, wird der Importvorgang beendet und die Methode gibt ein Objekt TextListXlsxResult zurück, das

den Pfad zur Protokolldatei enthält (die wiederum die während des Imports erzeugten Meldungen enthält) und das den Status TextListXlsxResultState.Warning hat.

Wenn der Fehler ein kritischer Fehler ist, wird eine UserException ausgelöst, die Details zum Fehler enthält. Handelt es sich um einen fatalen Fehler, wird eine NonRecoverableException ausgelöst.

Kopiert den nachfolgenden Programmcode in die Zwischenablage.

<?xml version="1.0" standalone="no"?>

<?xml-stylesheet type='text/xsl' href='MassDataHandlerLogFile.xsl'?>

<LogFile titleName="PLCAlarmTextLists_InvalidLanguage.xlsx__2019.06.07_13.46.45.070__Import_Log.xml" projectName="D:\TIA\dev\WM5_WinCC_HW_Work\binaries\Debug\x64\Tests\Siemens.Simatic.AlarmServices.Integration.Test.Openness\TextListXlsxFiles\PLCAlarmTextLists_InvalidLanguage.xlsx" typeText="Type" messageText="Message" timeText="Time">

<LogEntry type="Warning" dateTime="3:46:45 PM">

<Message>The language ID in column 'Comment [abcd-EF]' is missing or is invalid (sheet 'TextList'). The texts in this language are not imported.</Message>

</LogEntry>

<LogEntry type="Warning" dateTime="3:46:45 PM">

<Message>The language ID in column 'Text [abcd-EF]' is missing or is invalid (sheet 'TextListEntry'). The texts in this language are not imported.

</Message>

</LogEntry>

<LogEntry type="Information" dateTime="3:46:45 PM">

<Message>Import completed: 2 text lists with 9 entries.</Message>

</LogEntry>

</LogFile>

Hinweis

  • Für die XLSX-Dateien, die beim Export durch TIA Portal V16 erzeugt werden, müsste die benutzerdefinierte Eigenschaft FileVersion mit dem Wert 1 angegeben werden.

  • Für die XLSX-Dateien, die beim Export durch TIA Portal V16 erzeugt werden, müsste die benutzerdefinierte Eigenschaft FileContent mit dem Wert Alarm text lists angegeben werden.

  • Die Protokolldatei wird während des Importvorgangs im Ordner "Protokolle" des TIA-Projekts erzeugt.

Ergebnis

Das Objekt TextListXlsxResult enthält Informationen über das Ergebnis des Exports bzw. Imports. Es umfasst ein FileInfo-Attribut namens LogFilePath, das auf die Protokolldatei für den beendeten Vorgang verweist. Als Status

(vom Typ TextListXlsxResultState) wird der Endzustand des Vorgangs angezeigt, der entweder OK, "Warning" oder "Error" lautet. Beim Ergebnis "Error" ist der Vorgang fehlgeschlagen, bei "Warning" war der Vorgang teilweise

erfolgreich.