Fehler beim Bearbeiten eines SPS-Objekts im Editor

In diesem Abschnitt finden Sie alle Fehler, die beim Bearbeiten eines SPS-Objekts im Editor auftreten können.

Meldungen zu den verbindlichen Elementen

  • Fehlendes IEC-Schlüsselwort oder IEC-Bezeichner
  • Unerwartetes Zeichen 'name'
  • Konnte die Referenz auf 'Name' nicht auflösen.
  • Unerwartetes Dateiende
  • Bezeichner 'Name' bereits deklariert
  • Wert außerhalb des gültigen Bereichs
  • Ungültiger Wert für ADDRESS
  • Ungültiger Wert für PORT
  • Plattform "Name" existiert nicht
  • Ungültige Taskpriorität (gültiger Bereich: 0 - 65535).

  • Ungültige Zykluszeit (maximal zulässig: TIME#20d)

  • Zykluszeit zu klein (minimal zulässig: Wert)
    Die minimale Zykluszeit entspricht dem Wert für die Standard-Timer-Auflösung. Diese Standard-Timer-Auflösung finden Sie in "Zielsystem-spezifische Eigenschaften und Einschränkungen" pro Zielsystem angeführt.

  • Kein Task für diese Ressource definiert.

  • Keine Programminstanz für diese Ressource definiert.

  • Kein Kommunikationskanal für diese Ressource definiert.

Als Lösung für diese Fehler gilt: Löschen Sie die fehlerhafte Zeichen/Zeilen oder ersetzen Sie diese durch die korrekte Syntax für das SPS-Objekt.
Allgemeine Empfehlung: Mit Hilfe der Schnellkorrektur und Inhaltshilfe können Sie den Code schneller korrigieren. Informieren Sie sich im Abschnitt "SPS-Vorgaben im Editor für SPS-Objekt", welche Punkte Sie beim Bearbeiten eines SPS-Objekts beachten müssen.

Für die Plattform "Name" ist es nicht möglich, eine Anwendung zu erstellen. Der Installationspfad ist möglicherweise zu lange. Verwenden Sie die Einstellung "substPluginsFolder", um den Pfad für den Compiler zu substituieren.
Lösung: Siehe "Zu langer Installationspfad verhindert das Erstellen/Laden der Anwendung".

Die Kombination aus absolutem Projektpfad, Konfigurationsname und Ressourcename ist um Zahl Zeichen zu lange.
Eine Folge dieser Meldung ist, dass die Anwendung nicht erstellt und auf die SPS geladen werden kann.
Lösung für ein neu zu erstellendes Projekt: Kürzen Sie den Namen oder Pfad des Projekts, indem Sie einen kürzeren Namen/Pfad beim Erstellen eingeben/auswählen.
Lösung 1 für ein bestehendes Projekt: Kürzen Sie den Namen oder Pfad eines bereits bestehenden Projekts, indem Sie z.B. das Projekt entsprechend umbenennen oder verschieben.
Lösung 2 für ein bestehendes Projekt: Kürzen Sie den Namen für die →Konfiguration oder →Ressource im SPS-Objekt. Da diese Namen in die Kombination doppelt einfließen, ist es ausreichend, wenn Sie die Namen um etwa die Hälfte der erwähnten Zeichen kürzen. Beispiel: Falls die Kombination um 9 Zeichen zu lange ist, ist es bereits ausreichend, den Namen für die Konfiguration um 5 Zeichen zu kürzen.
Lösung 3 für ein bestehendes Projekt: Kombinieren Sie Lösung 1 und 2 nach Belieben.

Anwendung kann aufgrund eines ungültigen Projektpfads nicht erstellt werden.
und
Projektpfad enthält ungültige Zeichen. Pfad: Name. Gültige Zeichen: A-Z, a-z, 0-9, '.', '_', '-'
Lösung: Stellen Sie sicher, dass keine Leerzeichen oder Sonderzeichen (wie Umlaute, z.B. ä, ö, ü) im Projektnamen und keine Sonderzeichen im Pfad vorhanden sind. Falls doch, wird logi.CAD 3 die Anwendung nicht auf die SPS laden können.
Für die Pfade bzw. Projektnamen sind Buchstaben A – Z bzw. a – z (ohne Umlaute), Ziffern 0 – 9, Punkte (Zeichen .), Unterstriche (Zeichen _) und Bindestriche (Zeichen -) zulässig. Beispiele für zulässige Projektnamen: mein.Projekt, mein-Projektmein_Projekt_01

Diese Plattform unterstützt keine Kommunikation via Gateway.
Lösung: Tragen Sie eine Plattform ein, für die Kommunikation via Gateway möglich ist. Beispiele für solche Plattformen: ControllinoMINIControllinoMAXIControllinoMEGAArduinoNanoV3 

Fehlende Angaben für Kommunikation via Gateway
Lösung: Vervollständigen Sie die Angaben, wie diese für eine Kommunikation via Gateway benötigt werden (siehe "Korrekte Syntax für SPS-Objekt" für mehr Informationen).

C-Code für Metadaten konnte nicht erstellt werden. Stellen Sie sicher, dass das SPS-Objekt fehlerfrei ist.
Lösung: Korrigieren Sie alle Fehler im SPS-Objekt. Danach speichern Sie das SPS-Objekt, um den benötigten C-Code erstellen zu lassen.

Meldungen zu den optionalen Elementen

Einige Elemente im SPS-Objekt sind optional. Unter "Korrekte Syntax für SPS-Objekt" sind diese Elemente mit dem Kommentar // Optional... angeführt.

Zugriff auf einen IO-Provider

IO-Service "Name": Der Wert "Name" für den Parameter "GLOBALS" wird ignoriert. und
IO-Service "Name": Der Wert "Name" für den Parameter "PARAMS" wird ignoriert.
Lösung: Löschen Sie den angegebenen Parameter, falls der generische IO-Provider verwendet wird (siehe "Revolution Pi-Projekte oder logi.RTS für Revolution Pi auf Verwendung des generischen IO-Providers umstellen" für ein Beispiel eines Code-Blocks).

Weitere Meldungen zum IO-Provider sind unter "Fehler beim Synchronisieren mit einem IO-Provider" zu finden.

Deklaration von Ressource- oder Konfigurations-globalen Variablen: VAR_GLOBAL ... END_GLOBAL

Beim Deklarieren von Ressource- oder Konfigurations-globalen Variablen können Fehler auftreten, wie sie beim Erstellen des ST-Codes auftreten. Informieren Sie sich unter "Fehler und Warnungen in ST" über die entsprechende Lösung.

Deklaration von zusätzlichen Tasks

Zahl Tasks ohne IO-Service für das Synchronisieren von IOs gefunden, aber nur einer unterstützt.
Lösung: Zeichnen Sie nur einen der Tasks als IO-Task aus. Weitere Informationen zu Tasks und IO-Tasks finden Sie unter "Mehrere Tasks im SPS-Objekt deklarieren".

Mehrere Tasks verwenden das IO-Service "Name" für das Synchronisieren von IOs. Nur ein Task darf jeweils ein IO-Service verwenden.
Lösung: Verwenden Sie unterschiedliche IO-Services pro IO-Task. Alternative, falls noch kein IO-Task ohne IO-Service spezifiziert ist: Löschen Sie das IO-Service für einen IO-Task.

IO-Service "Name" ist nicht definiert.
Lösung: Geben Sie ein bereits definiertes IO-Service an. Ein IO-Service wird z.B. bei der Angabe für IO_IMPORT definiert.

Mehr als Zahl Tasks sind nicht erlaubt.
Lösung: Reduzieren Sie die Anzahl an eingetragenen Tasks. Siehe "Zielsystem-spezifische Eigenschaften und Einschränkungen" für Informationen, wie viele Tasks für die verwendete SPS möglich sind.

Der Task "Name" muss eine eindeutige Priorität haben, aber "Zahl" wird mehrmals verwendet.
Lösung: Korrigieren Sie die Priorität für den angegebenen Task. Kontaktieren Sie Ihren Systemintegrator, falls Sie mehr Informationen benötigen.

Deklaration von zusätzlichen Programminstanzen

Mehr als Zahl Programminstanzen sind nicht erlaubt.
Lösung: Reduzieren Sie die Anzahl an eingetragenen Programminstanzen. Siehe "Zielsystem-spezifische Eigenschaften und Einschränkungen" für Informationen, wie viele Programminstanzen für die verwendete SPS möglich sind.

Mehrere Instanzen eines Programms mit globalen Variablen sind nicht erlaubt.
Lösung: Löschen Sie die zusätzliche Programminstanz oder geben Sie ein anderes Programm dafür an, in dem Programm-→globalen Variablen deklariert sind und das noch nicht in der Ressource instanziiert ist. Grund: E
in Programm mit globalen Variablen kann nicht mehrmals in der Ressource instanziiert werden.

Instanzspezifische Zuweisungen des Speicherorts für symbolisch dargestellte Variablen

Zusätzlich zum nachfolgend angeführten Fehler können bei den instanzspezifischen Zuweisungen des Speicherorts für symbolisch dargestellte Variablen auch Fehler auftreten, wie sie beim Erstellen des ST-Codes auftreten. Informieren Sie sich unter "Fehler und Warnungen in ST" über die entsprechende Lösung, falls Sie einen Fehler nicht in diesem Abschnitt angeführt finden.

Element "Name" im VAR_CONFIG-Abschnitt ist mehrmals angegeben.
Lösung: Benennen Sie die überzähligen Elemente um, sodass nur mehr ein Element mit dem angegebenen Namen vorhanden ist.

Element "Name" im VAR_CONFIG-Abschnitt ist nicht eindeutig.
Lösung: Benennen Sie das entsprechende Element um, sodass es mit einem eindeutigen →IEC-Bezeichner als Namen deklariert ist. Alternative: Verwenden Sie den Präfix VAR_GLOBAL oder PROGRAM, um vorzugeben, ob es sich bei dem Element um eine globale Variable oder eine Programminstanz handelt. Siehe "VAR_CONFIG-Abschnitte im SPS-Objekt deklarieren" für Details über die Verwendung des Präfixes.

Element "Name" im VAR_CONFIG-Abschnitt kann nicht aufgelöst werden.
Lösung: Stellen Sie sicher, das das entsprechende Element deklariert ist. Siehe "VAR_CONFIG-Abschnitte im SPS-Objekt deklarieren" für Details, welche Elemente im VAR_CONFIG-Abschnitt möglich sind.

"Name" mehrmals inkludiert.
Lösung: Geben Sie einen anderen Namen bei der INCLUDE_VARCFG-Anweisung an. Siehe "VAR_CONFIG-Abschnitt im VarCfg-Objekt deklarieren" für Details zur Anweisung INCLUDE_VARCFG.

"Name" darf nur auf Ressourcenebene inkludiert werden.
Lösung: Verschieben Sie die INCLUDE_VARCFG-Anweisung in die Zwischenablage (= Befehl "Ausschneiden") und fügen Sie den Inhalt an der geeigneten Stelle für die Ressource im SPS-Objekt ein. Siehe "VAR_CONFIG-Abschnitt im VarCfg-Objekt deklarieren" für Details zur Anweisung INCLUDE_VARCFG.

"Name" darf nur auf Konfigurationsebene inkludiert werden.
Lösung: Verschieben Sie die INCLUDE_VARCFG-Anweisung in die Zwischenablage (= Befehl "Ausschneiden") und fügen Sie den Inhalt an der geeigneten Stelle für eine Konfiguration im SPS-Objekt ein. Siehe "VAR_CONFIG-Abschnitt im VarCfg-Objekt deklarieren" für Details zur Anweisung INCLUDE_VARCFG.

Bezeichner "Name" sowohl mit als auch ohne Präfix deklariert.
Lösung: Löschen Sie eines der Elemente oder vergeben Sie einen Präfix für das Element ohne Präfix. Siehe "VAR_CONFIG-Abschnitte im SPS-Objekt deklarieren" für Details, welche Präfixe in einem VAR_CONFIG-Abschnitt möglich sind.

Kann Element "Name" des qualifizierten Namens "Name1.Name2.Name3..." nicht finden.
Lösung: Stellen Sie sicher, dass das Element (z.B. ein Strukturelement) im angegebenen Namen vorhanden ist.

Zu tiefe Verschachtelung bei "Name : Datentyp".
Lösung: Reduzieren Sie die Verschachtelungen für den angegebenen Datentyp.

Element "Name des qualifizierten Namens "Name1.Name2.Name3..." ist nicht eindeutig.
Lösung: Benennen Sie das entsprechende Element um, sodass es mit einem eindeutigen →IEC-Bezeichner als Namen deklariert ist. Alternative: Verwenden Sie den Präfix VAR_GLOBAL oder PROGRAM, um vorzugeben, ob es sich bei dem Element um eine globale Variable oder eine Programminstanz handelt. Siehe "VAR_CONFIG-Abschnitte im SPS-Objekt deklarieren" für Details über die Verwendung des Präfixes.

Die IEC-Hardware-Adresse "Adresse" der Variable "Name" ist ungültig: fehlender Byte-Offset.
Zusatzinformation: Falls Sie einen 
IO-Provider und/oder IO-Services verwenden (durch die Angabe für IO_IMPORT im SPS-Objekt), ist es zwingend erforderlich, einen Byte-Offset in IEC-Hardware-Adressen anzugeben. Das bedeutet, Sie müssen mindestens 2 Zahlen bei Hardware-Adressen angeben (z.B. %IB1.27 für Eingang, Byte am Byte-Offset 27 vom IO-Service 1). Hardware-Adressen mit einer Zahl (wie z.B. %IB1sind ungültig, sofern im SPS-Objekt eine Angabe für IO_IMPORT vorhanden ist und die interne IO-Service-ID 1 verwendet wird (dies ist der Fall z.B. unter Windows EtherCAT, bei Revolution Pi der generische Service für die angeschlossenen IO-Module, bei Raspbian das PiFace-Modul).
Lösung 1, falls die Angabe für IO_IMPORT benötigt wird: Geben Sie mindestens 2 Zahlen für die Hardware-Adresse an (siehe "Erforderlicher Aufbau für physikalische Adresse" unter "Deklaration von globalen Variablen in ST", falls Sie Informationen zur Syntax benötigen).
Lösung 2, falls Sie das IO-Service nicht verwenden: Löschen Sie die Angabe für IO_IMPORT.

Korrekte Syntax für SPS-Objekt

logi.CAD 3 unterstützt folgende Syntax für das SPS-Objekt:

Syntax
{
    CHANNEL channel-name
    // Angaben bei Kommunikation mit einem Zielsystem über TCP/IP, z.B. für die integrierte SPS
        TCP
            ADDRESS := address;  // Beispiel: 127.0.0.1
            PORT := port;        // Beispiele: 1534 (= Standard-Port für die integrierte SPS)
                                 //            1535 (= Standard-Port für Kommunikation via Gateway)

        END_TCP
}
 
// Optional: Die Angaben 'TARGET ... END_TARGET' sind nur bei einer Kommunikation via Gateway erforderlich.
{            
    TARGET target-name
    // Der Systemintegrator stellt die korrekten Kommunikationsparameter 'string' zur Verfügung.
    PARAMS := 'string';          // Beispiel: siehe nachfolgendes "Beispiel für Kommunikation mit Gateway"
    END_TARGET
}
 
CONFIGURATION configuration-name_1
    // Optional: Deklaration von Konfigurations-globalen Variablen durch den Verweis auf ein Global-Objekt hinzufügen
       {INCLUDE_GLOBALS name_1}
       {INCLUDE_GLOBALS name_2}
       ... 
        
    // Optional: Deklaration Konfigurations-globaler Variablen; Davor ist eine USING-Namespace-Anweisung möglich.
       VAR_GLOBAL (* optional_begin *) CONSTANT RETAIN NON_RETAIN {DMA := 'string'} (* optional_end *)
         name_1, name_2, ..., name_n (* optional_begin *) {'key'} AT %address (* optional_end *) : data-type := initial-value;
         ...
 
    RESOURCE resource-name_1 ON platform-name { [ON_CHANNEL := channel-name]|[ON_TARGET := target-name, VIA_CHANNEL := channel-name]}
        // Die Angabe 'ON_CHANNEL' wird bei einer Kommunikation ohne Gateway benötigt (siehe Beispiel unten).
        // Optionale Alternative: Angaben 'ON_TARGET ... VIA_CHANNEL' - Diese werden bei einer Kommunikation via Gateway benötigt (siehe Beispiel unten).

     // Optional: Zugriff auf einen IO-Provider
     // Möglichkeit 1: Zugriff auf einen IO-Provider für EtherCAT-Feldbusse
     //           Die Deklaration der Ressource-globalen Variable erfolgt auf Basis einer Datei (durch das Attribut 'PARAMS').
     //           Aufgrund einer Synchronisation wird die Deklaration in einem Global-Objekt erstellt (durch das Attribut 'GLOBALS') .
        { IO_IMPORT PROVIDER := EtherCatProvider, SERVICE := EtherCAT, PARAMS := 'path/name_A.xml', GLOBALS := 'path/name_1' }
        { IO_IMPORT PROVIDER := EtherCatProvider, SERVICE := EtherCAT, PARAMS := 'path/name_B.xml', GLOBALS := 'path/name_2' } 
     //           Ohne dem optionalen Attribut 'GLOBALS' werden die Ressource-globalen Variable nicht automatisch deklariert. Dies ist sinnvoll,
     //           falls Sie z.B. instanzspezifischen Zuweisungen des Speicherorts in einem VAR_CONFIG-Abschnitt verwenden wollen (siehe unten).
        { IO_IMPORT PROVIDER := EtherCatProvider, SERVICE := EtherCAT, PARAMS := 'path/name_C.xml' } 
     // Möglichkeit 2: Zugriff auf einen generischen IO-Provider für Revolution Pi oder PiFace
        { IO_IMPORT PROVIDER := GenericProvider, SERVICE := RevolutionPi|PiFace }
        ... 
 
     // Optional: Deklaration von Ressource-globalen Variablen durch den Verweis auf ein Global-Objekt hinzufügen
        {INCLUDE_GLOBALS name_1}
        {INCLUDE_GLOBALS name_2}
        ... 
        
     // Optional: Deklaration Ressource-globaler Variablen; Davor ist eine USING-Namespace-Anweisung möglich.
        VAR_GLOBAL (* optional_begin *) CONSTANT RETAIN NON_RETAIN {DMA := 'string'} (* optional_end *)
          name_1, name_2, ..., name_n (* optional_begin *) {'key'} AT %address (* optional_end *) : data-type := initial-value;
          ...
        END_VAR
 
        TASK task-name1(INTERVAL := TIME#numberms, PRIORITY := number);
     // Optional: weitere Tasks, max. 32 Tasks.
     // Ein Task kann für das Synchronisieren von IOs ausgezeichnet werden. Mehrere Tasks können ausgezeichnet werden, sofern zumindest ein IO-Service für die weiteren IO-Tasks spezifiziert wird.
        { IO } TASK task-name2(INTERVAL := TIME#numberms, PRIORITY := number);
        { IO := EtherCAT} TASK task-name2(INTERVAL := TIME#numberms, PRIORITY := number);
        ...
        TASK task-name32(INTERVAL := TIME#numberms, PRIORITY := number);
        PROGRAM instance-name_1 WITH task-name1 :
            program-type-name_1;
     // Optional: weitere Programminstanzen, die dem gleichen oder einem anderen Task zugeordnet sind
        PROGRAM instance-name_2 WITH task-name1 :
            program-type-name_2;
        ...
        PROGRAM instance-name_n WITH task-name32 :
            program-type-name_n;
 
   // Optional für Ressource: instanzspezifische Zuweisungen des Speicherorts für symbolisch dargestellte Variablen durch Verweis hinzufügen
       {INCLUDE_VAR_CFG name}
   // Optional für Ressource: instanzspezifische Zuweisungen des Speicherorts für symbolisch dargestellte Variablen direkt in Ressource einfügen
      VAR_CONFIG
        name AT %address (* optional_begin *) {SIZE := value} (* optional_end *);
        ...
      END_VAR
    END_RESOURCE
 
    RESOURCE resource-name_2 ON ...
    ...
    END_RESOURCE
    ...
    RESOURCE resource-name_n ON ...
    ...
    END_RESOURCE

 // Optional für Konfiguration: instanzspezifische Zuweisungen des Speicherorts für symbolisch dargestellte Variablen durch Verweis hinzufügen
       {INCLUDE_VAR_CFG name} 
 // Optional für Konfiguration: instanzspezifische Zuweisungen des Speicherorts für symbolisch dargestellte Variablen direkt in Konfiguration einfügen
    VAR_CONFIG
      name AT %address (* optional_begin *) {SIZE := value} (* optional_end *);
      ...
    END_VAR
END_CONFIGURATION
 
CONFIGURATION configuration-name_2
...
END_CONFIGURATION
...
CONFIGURATION configuration-name_n
...
END_CONFIGURATION

Beispiel für Kommunikation ohne Gateway

Nachdem Sie ein Projekt erstellt haben, hat das darin vorgegebene SPS-Objekt local folgenden Inhalt:

Beispiel
{
  CHANNEL LocalChannel
    TCP
      ADDRESS := 127.0.0.1;
      PORT    := 1534;
    END_TCP
  END_CHANNEL
}
CONFIGURATION LocalConfiguration
  RESOURCE local ON BuiltInPlc { ON_CHANNEL := LocalChannel }
    TASK DefaultTask(INTERVAL := TIME#500ms, PRIORITY := 38229);
    PROGRAM Program1 WITH DefaultTask :
      Program1;
  END_RESOURCE
END_CONFIGURATION

Beispiel für Kommunikation mit Gateway

Das folgende Beispiel zeigt die erforderlichen Einstellung, falls das Gateway über RS-232 mit dem Zielsystem kommuniziert.

Beispiel für Controllino Mini
{
	CHANNEL ControllinoMINIChannel
		TCP
			ADDRESS := 127.0.0.1;
			PORT := 1535;
		END_TCP
	END_CHANNEL
}

{
	TARGET targetControllinoMINI
		PARAMS := '{
			"transport": {
				"type": "RS232",
				"parameters": {
					"port": 3,
					"baud": 115200
				}
			},
			"infrastructure": {
				"programmer": "AVRDUDE",
				"parameters": {
					"port": 3,
					"baud": 115200,
					"programmer": "arduino",
					"processor": "atmega328p"
				}
			}
		}';
	END_TARGET
}

CONFIGURATION ControllinoMINIConfiguration
	RESOURCE controllinoMINI ON ControllinoMINI { ON_TARGET := targetControllinoMINI, VIA_CHANNEL := ControllinoMINIChannel }
		TASK DefaultTask ( INTERVAL := TIME#500ms , PRIORITY := 38229 );
		PROGRAM Program1 WITH DefaultTask :
			Program1;
	END_RESOURCE
END_CONFIGURATION