Export von V.E.Variablen in SPS Strukturen (C22)

1.1 EinleitungPAGEREF _Toc304468528 \h3

1.2 Beschreibung der V.E-Variablenliste 4

1.2.1 Parameter use_extended_string_var (BOOLEAN) 4

1.2.2 Deklaration der V.E-Variablen 5

1.2.3 SCOPE: Speicherbereich der V.E-Variable 5

1.2.4 INDEX: Adressierung des Speichers 6

1.2.5 ARRAY_ELEMENTS: Arrays 9

1.2.5.1 Arrays und Index-Methode 9

1.2.5.1.1 Sonderfall: STRING-Arrays 9

1.2.5.2 Arrays und AutoMem-Methode 9

1.3 Erzeugung der SPS-Struktur aus einer V.E-Variablenliste 10

1.3.1 Die Erzeugung der Ausgabedatei 10

1.3.1.1 CNC-Befehl #EXPORT VE 10

1.3.2 Aufbau der Ausgabedatei 11

1.3.2.1 Abschnitt 1: Statische Typendefinition 11

1.3.2.2 Abschnitt 2: Typendeklaration aus der V.E-Variablenliste 12

1.3.2.3 Abschnitt 3: Kanalspezifische SPS-Parameter 13

1.3.2.4 Abschnitt 4: Globale SPS-Parameter 14

1.3.3 Anmerkungen 15

1.3.3.1 Alignment bei kanalspezifischen und globalen Datentypen 15

1.3.3.2 Ausgabe des Indexwerts in der Ausgabedatei 15

1.4 Überprüfung der V.E-Variablendeklarationen durch das Programm 16

1.4.1 Allgemeine Fehlerprüfung: Gemischte Speicherorganisation 16

1.4.1.1 CHANNEL 16

1.4.1.2 GLOBAL 16

1.4.2 Fehlerprüfung bei der Index-Methode 17

1.4.2.1 Prüfung der Indexwerte 17

1.4.2.2 V.E-Arrayvariablen: Falsche Angabe des Speicherbereiches 17

1.4.2.3 Überlappung von Speicherbereichen 17

1.4.3 Fehlerprüfung bei der AutoMem-Methode 18

1.4.3.1 Index-Werte dürfen nicht programmiert werden 18

1.4.3.2 Speicherbedarfsprüfung 18

1.5 Einschränkungen bei mehrkanaligem Steuerungsaufbau 21

1.6 Typentabelle CNC  SPS 22

1.7 Beispiel 23

1.7.1 VE-Variablenliste 23

1.7.2 Erzeugte PLC-Struktur aus V.E-Variablenliste 24

1.7.3 SPS- Beispiel 25

1.8 Kurzanleitung 26

Mehr:

button Einleitung

button Beschreibung der V.E-Variablenliste

button Erzeugung der SPS-Struktur aus einer V.E-Variablenliste

button Überprüfung der V.E-Variablendeklarationen durch das Programm

button Einschränkungen bei mehrkanaligem Steuerungsaufbau

button Typentabelle CNC - SPS

button Beispiel

button Kurzanleitung


Einleitung

Datenaustausch über V.E.

Nachbildung in PLC

Unterstützung durch #EXPORT VE

V.E-Variablen erlauben es, Daten zwischen einem NC-Programm und der SPS in beliebiger Richtung auszutauschen. Aus Sicht der CNC existieren als Minimum ein kanalunabhängiger 'globaler' und je NC-Kanal je ein weiterer kanalspezifischer V.E-Speicherbereich. Der steuerungsinterne Zugriff auf den von der CNC angelegten Speicher (Shared Memory) der V.E-Speicherblöcke bzw. der darin enthaltenen Variablen erfolgt direkt über Adresszeiger und ist daher sowohl von der SPS als auch CNC zeiteffizient.

Jede der V.E-Variablen entspricht einem "Basistyp" (REAL64, ...) oder selbstdefinierten Strukturen, die wiederum aus Strukturen oder Basistypen bestehen können. Zusätzlich sind (eindimensionale) Arrays adressierbar.

Bisher war es erforderlich, Adresse und Speicherplatz für jede V.E-Variable selbst zu bestimmen. Seit V2.10.1025.00 ist dies nicht mehr notwendig. In Folge scheitert der SPS-Programmierer oft daran, die in den CNC-Listen beschriebenen Strukturen fehlerfrei nachzubilden. Werden zudem alle möglichen Kombination aus Basistypen und/oder Variablenstrukturen sowie selbstdefinierter indexbasierter und automatisierter Adressierung genutzt, verliert der SPS-Programmierer schnell die Übersicht. Hilfskonstruktionen, um Fehlern in der Speicherzuteilung, -adressierung bzw. -überscheibern auf die Spur zu kommen, helfen nur bedingt weiter. Verzögerungen während der Inbetriebnahme sind die Folge.

Die nachfolgende Dokumentation beschreibt die Anwendung des #EXPORT Befehls. Der Befehl kann in einem NC-Programm stehen oder als Handsatz ausgeführt werden. Mit dem Befehl werden Dateien erzeugt, die alle in einem CNC-Kanal angelegten V.E-Variablen in deckungsgleiche IEC 61131 Variablen bzw. Strukturen (nach-)deklarieren. Die erzeugten Dateien sind passend für die Entwicklungsumgebungen CoDeSys (3S) und MULTIPROG (KW-Software) und dort direkt importierbar.

Alle im folgenden genannte Beispiele sind in Structured Text (ST) realisiert und werden als 3S kompatibler SPS-Code dargestellt. Die Erzeugungsvariante für KW-Software enthält zusätzliche Strukturdeklarationen, da Arrays innerhalb von Strukturen nicht direkt deklariert werden können.

Die in den Beispielen genannten Bezeichnungen [?] sind Platzhalter für real einzutragende Indizes.


Beschreibung der V.E-Variablenliste

Das Kapitel beschreibt nur diejenigen Schlüsselwörter der V.E-Variablenliste, die für den Export von Bedeutung sind. Für alle anderen Schlüsselwörter sei auf die Dokumentation Externe Variablen [EXTV] verwiesen.

Mehr:

button Parameter use_extended_string_var (BOOLEAN)

button Deklaration der V.E-Variablen

button SCOPE: Speicherbereich der V.E-Variable

button INDEX: Adressierung des Speichers

button ARRAY_ELEMENTS: Arrays


Parameter use_extended_string_var (BOOLEAN)

Der Listenparameter use_extended_string_var legt fest, wie viele ASCII-Zeichen einer V.E-Variable vom Typ STRING maximal zugewiesen werden. Gleichzeitig definiert er (implizit) den je Stringvariable benötigten Speicher.

Parameter-einstellung von use_extended _string_var | Maximale Stringlänge | Implizit reservierter Speicher | Implizites Alignment
0 | 20 ASCII-Zeichen | 24 Byte | 4 Byte
1 | 127 ASCII-Zeichen | 128 Byte | 0 Byte

Das in der Tabelle genannte Alignment beschreibt Kapitel 1.3.3.1.


Deklaration der V.E-Variablen

Eine einzelne V.E.Variable wird über die var[?]-Vereinbarung deklariert. Die für den Export relevanten Attribute zeigt das nachstehende Bild. Sie werden in den folgenden Abschnitten diskutiert.


SCOPE: Speicherbereich der V.E-Variable

In Abhängigkeit vom Verwendungszweck werden V.E-Variable entweder dem kanalspezifischen (var[?].scope = CHANNEL) oder dem globalen Speicherbereich (var[?].scope = GLOBAL) zugeordnet. Die beiden Speicherbereiche sind gleich groß und werden z.B. bei TwinCAT über den SystemManager: CNC-Konfiguration, CNC-Task GEO, Reiter HLI, Feld VE (Eingabe Anzahl) oder in der Hochlaufliste über den Parameter ext_var_max eingestellt.

Der kanalspezifische Speicherbereich ist ausschließlich einem NC-Kanal zugeordnet, während der globale Speicherbereich von jedem NC-Kanal der Steuerung beschrieben bzw. gelesen werden kann.

Aus Sicht der SPS existiert diese Trennung nicht, für sie sind alle Speicherbereiche gleichwertig. Sie kann über mehrere Adresszeiger jeden der Speicher lesend und schreibend erreichen. Aus Sicht der SPS existieren 1+Kanalanzahl, also minimum 2 Speicherbereiche.


INDEX: Adressierung des Speichers

Für die Adressierung jeder Variablen stehen alternativ zwei Methoden zur Verfügung:

1) Index-Methode

Die Adressierung erfolgt durch die Vorgabe eines Indexwertes (var[?].index). Jeder Index umfasst einen Speicher von 24 Byte. Wird der Index-Abstand zweier hintereinander liegenden Variablen zu klein gewählt, kommt es zur Speicherüberlappung. Folge: Der Speicher der folgenden Variable wird überschrieben. Die CNC meldet keinen Fehler, da sie davon ausgeht, dass die Adressierung so gewählt wurde.

2) AutoMem-Methode

Bei dieser Methode übernimmt die CNC das Speichermanagement. Die V.E-Variablen werden nacheinander nicht-überlappend in den Speicher eingetragen. Der Nutzer braucht sich bei dieser Methode über die korrekte Speicherbelegung keine Gedanken zu machen. Kennzeichen der AutoMem-Methode ist, dass die Deklaration des var[?].index Attributs in keiner der Variablen genutzt wird!

Der Nutzer trifft die Entscheidung, nach welcher der Methoden jeweils die beiden Speicher für CHANNEL und GLOBAL organisiert werden.

+ Beide Speicher müssen nicht mit der gleichen Methode organisiert sein - obwohl beide Speicher in einer V.E-Liste deklariert werden!

+ Ein mehrkanaliger Aufbau verkompliziert die Entscheidung. Dies trifft vor allem für GLOBAL-Variablen zu. Anmerkungen hierzu finden sich im Kapitel 1.5.

Die hier beschriebene EXPORT Methode erfordert beim Einsatz der Indexmethode zwingend, dass alle Indexwerte in aufsteigender Reihenfolge eingetragen sind. Diese Einschränkung besteht laut der Dokumentation Externe Variablen ansonsten nicht!


ARRAY_ELEMENTS: Arrays

Grundsätzlich sind nur eindimensionale Arrays möglich. Mehrdimensionale Arrays lassen sich jedoch nachbilden, indem für jede Dimension  siehe im nachfolgenden Beispiel - ein eigener Typ definiert wird.

struct[?].name Array160

struct[?].element[0].name a

struct[?].element[0].type REAL64

struct[?].element[0].array_elements 160

var[?].name Array10x160

var[?].type Array160

var[?].array_elements 10

Im NC-Programm:

V.E.Array10x160[i].a[j] (* wobei i:0..9, j:0..159 *)

In Abhängigkeit von der gewählten Adressierungsart Index-Methode oder AutoMem-Methode sind bei Arrays Besonderheiten zu beachten. Sie werden in den folgenden Abschnitte beschrieben.

Mehr:

button Arrays und Index-Methode

button Arrays und AutoMem-Methode


Arrays und Index-Methode

Die Definition einer V.E-Variable per Indexmethode enthält die folgenden Attribute. Sie bestimmen Speicherlayout und -größe: INDEX, SIZE und ARRAY_ELEMENTS.

Beispiel:

var[4].name Auto

var[4].index 2 (Kennzeichen der Indexmethode)

var[4].type UNS16

var[4].size 2

var[4].array_elements 3

Die Anzahl der Elemente einer Arrayvariable wird über den Parameter array_elements eingestellt. Ist die Variable kein Array, so muss der Wert array_elements=0 sein oder kann ganz entfallen. Über den Parameter .size wird der Speicherbedarf (in Byte) eines jeden Arrayelementes angegeben. Für Einzelelemente hat der Parameter .size keine Bedeutung, bei Arrays muss er angegeben werden.

Beispiel

Beispiel: Die V.E-Variable Auto ist vom Typ UNS16. Soll sie in einem Array verwendet werden, muss das Attribut var[4].size auf 2 eingestellt sein. Wird sie nicht in einem Array genutzt, so ist das Attribut .size überflüssig.

Der hier beschriebene Export-Algorithmus lässt - im Gegensatz zur Funktionsbeschreibung Externe Variablen in der NC, Rev. 8, Seite 13 - es nicht zu, beliebige Werte in var[?].size zu setzen.

Die für eine Variable benötigte Anzahl von Indexwerten (entsprechend belegten Indexblöcken) wird nach der angegeben Formel berechnet:

Benötigte Anzahl
von Indexwerten =

( [image] ) (ganzzahlig aufgerundet)

Mehr:

button Sonderfall: STRING-Arrays


Sonderfall: STRING-Arrays

Bei STRING-Arrays ist der Parameter var[?].size mit den folgenden Werten zu belegen:

Parametereinstellung | Wert von Parameter size bei STRING - Feldvariablen
use_extended_string_var = 0 | var[?].size = 24
use_extended_string_var = 1 | var[?}.size = 128

Beispiel

Es gibt drei Variablen TEXT_1, TEXT_2 und TEXT_3 die (teilweise) Arrays entsprechen. Gilt use_extended_string_var = 0, ergibt sich für das jeweils benötigte Indexattribut die folgende Aufstellung:

Bezeichner | Array_ elements | size | Index | Bemerkung
V.E. TEXT_1 | 3 | 24 | 0 | Benötigte Anzahl = 3*24/24 = 3
V.E. TEXT_2 | 4 | 24 | 3 | Benötigte Anzahl = 4*24/24 = 4
V.E. TEXT_3 | 0 | 24 | 7 | Benötigte Anzahl = 1*24/24 = 1

Beispiel

Wird use_extended_string_var = 1 gewählt, so zeigt sich das folgende Bild:

Bezeichner | Array_ elements | size | Index | Bemerkung
V.E. TEXT_1 | 3 | 128 | 0 | Benötigte Anzahl = 3*128/24 = 16
V.E. TEXT_2 | 4 | 128 | 16 | Benötigte Anzahl = 4*128/24 = 22 (21,3)
V.E. TEXT_3 | 0 | 128 | 38 | Benötigte Anzahl = 1*128/24 = 6 (5,3)


Arrays und AutoMem-Methode

Die Deklaration einer V.E-Variable lautet:

Beispiel:

var[4].name Auto

var[4].type UNS16

var[4].array_elements 0

Bei der AutoMem-Methode entfallen die Parameter

var[?].index

var[?].size

,wobei vor allem das Fehlen des Parameters var[?].index das signifikante Kennzeichen für die AutoMem-Methode ist.

Der Parameter var[?].size muss ebenfalls entfallen, da ansonsten der Export in SPS-Strukturen nicht möglich ist! Diese Einschränkung existiert ansonsten nicht, denn die Funktionsbeschreibung Externe Variablen in der NC, Rev. 8, Seite 13 lässt den Parameter weiterhin zu.


Erzeugung der SPS-Struktur aus einer V.E-Variablenliste

Mehr:

button Die Erzeugung der Ausgabedatei

button Aufbau der Ausgabedatei

button Anmerkungen


Die Erzeugung der Ausgabedatei

Mit dem NC-Befehl #EXPORT VE wird eine Ausgabedatei erzeugt, die per Import in die SPS - Programmierumgebung geladen werden kann. Derzeit können Variablendeklarationen für TwinCAT (3S - Version 2.x) und KW-Software erzeugt werden. Der Befehl wirkt jeweils für den aktuell angewählten Kanal.

Mehr:

button CNC-Befehl #EXPORT VE


CNC-Befehl #EXPORT VE

Der Aufruf des CNC-Befehl #EXPORT VE benötigt als Parameter zwingend die Angabe des SPS-Zielsystems. Das Ergebnis wird entsprechend benamt.

NC-Befehl #EXPORT VE | Name der Ausgabedatei | Ausgabeverzeichnis
[TWINCAT] | plc_3s_ve_types_ch_?.exp | s.TwinCAT SystemManager : CNC-Konfiguration à CNC-Task GEO à Reiter HLI à Eingabefeld: NC Datei Pfad
[KW] | plc_kw_ve_types_ch_?.exp | applikationsspezifisch

Das Fragezeichen ? im Dateinamen der Ausgabedatei ist Platzhalter für die CNC-Kanalnummer.


Aufbau der Ausgabedatei

Mehr:

button Abschnitt 1: Statische Typendefinition

button Abschnitt 2: Typendeklaration aus der V.E-Variablenliste

button Abschnitt 3: Kanalspezifische SPS-Parameter

button Abschnitt 4: Globale SPS-Parameter


Abschnitt 1: Statische Typendefinition

In Abhängigkeit von der Einstellung use_extended_string_var werden statische Typendeklarationen erzeugt. Von Bedeutung ist für den SPS-Programmierer das Strukturelement [variablenname].token, das letztendlich dem von der NC gelesenen oder geschriebenen String entspricht. Das Strukturelement f1_st dient dem Füllen von ungenutzten Bytes (s. Kap: 1.4.1).

Programmierbeispiel

TYPE STRING_20:

STRUCT

token:STRING(20);

f1_st: ARRAY[0..2] OF BYTE;

END_STRUCT

END_TYPE

TYPE STRING_20_2:

STRUCT

token:STRING(20);

f1_st: ARRAY[0..106] OF BYTE;

END_STRUCT

END_TYPE


Abschnitt 2: Typendeklaration aus der V.E-Variablenliste

In Abschnitt 2 der Exportdatei werden alle in einer V.E-Variablenliste deklarierten eigenen Datentypen eingetragen. Der Schreibvorgang selbst wird über einen Sortieralgorithmus gesteuert, um Forward-Deklarationen zu vermeiden.

Programmierbeispiel

Der Typ Position_und_Index enthält ein Element vom Typ Position_im_Raum.

VE-Deklaration:

struct[1].name Position_im_Raum

struct[1].element[0].name POffsX

struct[1].element[0].type REAL64

struct[1].element[1].name POffsY

struct[1].element[1].type REAL64

struct[1].element[2].name POffsZ

struct[1].element[2].type REAL64

struct[2].name Position_und_Index

struct[2].element[0].name Index

struct[?].element[0].type SGN32

struct[2].element[1].name Pos

struct[?].element[1].type Position_im_Raum;

In der Export-Datei wird angelegt

TYPE Position_im_Raum:

STRUCT

POffsX: LREAL;

POffsY: LREAL;

POffsZ: LREAL;

END_STRUCT

END_TYPE

TYPE Position_und_Index:

STRUCT

Index: INT;

Pos: Position_im_Raum;

END_STRUCT

END_TYPE


Abschnitt 3: Kanalspezifische SPS-Parameter

Alle V.E-Variablen, die über var[?].scope = CHANNEL den kanalspezifischen Daten zugeordnet sind, werden in einer zusätzlichen SPS-Struktur VE_CHANNEL_DATA_CH_? eingetragen. Das Fragezeichen in der Benamung von VE_CHANNEL_DATA_CH_? steht als Platzhalter für die Kanalnummer.

Programmierbeispiel (s. auch Kap. 1.3.2.2 )

In der V.E-Liste ist deklariert

var[1].name Index_Element

var[1].type Position_und_Index

var[1].scope CHANNEL

In der Export-Datei wird angelegt

TYPE VE_CHANNEL_DATA_CH_1:

STRUCT

Index_Element: Position_und_Index;

END_STRUCT

END_TYPE


Abschnitt 4: Globale SPS-Parameter

Wie bei den kanalspezifischen V.E-Variablen wird für alle Variablen mit var[?].scope = GLOBAL Attribut eine gesonderte Struktur dem VE_GLOBAL_DATA_FROM_CH_? Erzeugt. Auch hier steht das Fragezeichen im Typenbezeichner als Platzhalter für die Kanalnummer.

Programmierbeispiel

In der V.E-Liste ist deklariert

var[2].name AX

var[2].type REAL64

var[2].scope GLOBAL

var[3].name AY

var[3].type REAL64

var[3].array_elements 3

var[3].scope GLOBAL

In der Export-Datei wird daraufhin angelegt

TYPE VE_GLOBAL_DATA_FROM_CH_1:

STRUCT

AX: LREAL;

AY: ARRAY[0..2] OF LREAL;

END_STRUCT

END_TYPE


Anmerkungen

Mehr:

button Alignment bei kanalspezifischen und globalen Datentypen

button Ausgabe des Indexwerts in der Ausgabedatei


Alignment bei kanalspezifischen und globalen Datentypen

Kanalspezifische und globale SPS-Typen entsprechen in ihrem Aufbau der Abbildung des CNC-Übergabespeichers. Da die V.E-Variablen-beschreibung prinzipiell lückenden Speicher zulässt, sind in der SPS-Typendeklaration sogenannte Füllstrukturen (Alignment) notwendig. Die Füllstrukturen werden während des Exports automatisch erzeugt. Ihre Bezeichner beginnen mit einem f gefolgt von einer laufenden Nummer z.B. f1 : ARRAY[0..17] OF BYTE. Ein zusätzlicher Kommentar kennzeichnet die Füllelemente.

Programmierbeispiel

TYPE VE_GLOBAL_DATA_FROM_CH_1:

STRUCT

Kopf_SP: ARRAY[0..2] OF INT;

f1:ARRAY[0..17] OF BYTE; (* Alignment *)

Kopf_AL: ARRAY[0..2] OF INT;

f2:ARRAY[0..17] OF BYTE; (* Alignment *)

Kopf_MPB_N: ARRAY[0..2] OF INT;

f3:ARRAY[0..17] OF BYTE; (* Alignment *)

Kopf_MPB_S: ARRAY[0..2] OF INT;

END_STRUCT

END_TYPE


Ausgabe des Indexwerts in der Ausgabedatei

Wurde für die Organisation des Speichers die Index-Methode gewählt, so erscheint der Indexwert der V.E-Variable (var[?]=index) als Kommentar in der SPS-Struktur.

Programmierbeispiel

TYPE VE_GLOBAL_DATA_FROM_CH_1:

STRUCT

STR: STRING(20); (* index = 8 *)

f2:ARRAY[0..2] OF BYTE;

TEIL_1: UDINT;(* index = 9 *)

END_STRUCT

END_TYPE


Überprüfung der V.E-Variablendeklarationen durch das Programm

Bevor die SPS-Struktur durch das Programm erzeugt wird, erfolgt eine Überprüfung der Deklaration der V.E-Variablen. Aufgetretene Fehlermeldung werden in der (EXPORT-) Ausgabedatei protokolliert! Der Anwender muss diese Fehler zunächst beheben, bevor brauchbarer SPS-Code erzeugt werden kann.

Mehr:

button Allgemeine Fehlerprüfung: Gemischte Speicherorganisation

button Fehlerprüfung bei der Index-Methode

button Fehlerprüfung bei der AutoMem-Methode


Allgemeine Fehlerprüfung: Gemischte Speicherorganisation

Mehr:

button "CHANNEL"

button "GLOBAL"


"CHANNEL"

TwinCAT CNC: Überblick

CHANNEL

Alle V.E-Variablen vom Speicher CHANNEL müssen innerhalb eines Kanals mit derselben Speichermethode deklariert werden. Zur Organisation des Speichers ist entweder die Index-Methode oder die AutoMem-Methode zu verwenden. Ein Mischbetrieb ist nicht zulässig.

Fehlermeldung | ERROR: CHANNEL: Mix up of memory organisation method is not permitted
Abhilfe | Use Index-method or AutoMem-method for memory organisation.


"GLOBAL"

TwinCAT CNC: Überblick

GLOBAL

Die V.E-Variablen vom Speicher GLOBAL müssen mit derselben Speichermethode deklariert werden. Zur Organisation des Speichers ist entweder die Index-Methode oder die AutoMem-Methode zu verwenden.

Fehlermeldung | ERROR: CHANNEL: Mix up of memory organisation method is not permitted
Abhilfe | Use Index-method or AutoMem-method for memory organisation


Fehlerprüfung bei der Index-Methode

Mehr:

button Prüfung der Indexwerte

button V.E-Arrayvariablen: Falsche Angabe des Speicherbereiches

button Überlappung von Speicherbereichen


Prüfung der Indexwerte

Die in der Variablenbeschreibung eingetragenen Indexwerte müssen eine aufsteigende Zahlenfolge bilden. Gleiche oder kleinere Indexnummern in der Zahlenfolge sind unzulässig und werden als Fehler gemeldet.

Fehlermeldung | Index value is not ascending
Abhilfe | Indexnummern in aufsteigender Reihenfolge eintragen.
Beispiel | var[0].index = 0; var[1].index = 5; var[2].index = 6; usw.


V.E-Arrayvariablen: Falsche Angabe des Speicherbereiches

Bei V.E-Variablen mit dem Attribut Array_elements wird überprüft, ob das Attribut size dem verwendeten Variablentyp entspricht.

Fehlermeldung | Size not compatible to variable type.
Abhilfe | Den richtigen Wert für var[?].size eintragen.
Beispiel | Var[3].type = UNS32; (d.h. 4 Byte); var[3].size = 4
Hinweis | Die Methode überprüft nur die Basisdatentypen.


Überlappung von Speicherbereichen

Ist der gewählte Indexbereich für die Aufnahme einer Variablen zu klein dimensioniert, würde der folgende Indexbereich mit Daten beschrieben. Die benachbarten Speicherbereiche überlappen sich. Es findet eine entsprechende Prüfung statt.

Fehlermeldung | Memory overlapping Needed memory: 130Byte
Abhilfe | Vorgesehen Anzahl der Indizierungen vergrößern.
Beispiel | Der durch einen Index belegte Speicher entspricht 24 Byte
Hinweis | Im Fehlerprotokoll wird der benötigte Speicherbedarf für Variable angegeben.


Fehlerprüfung bei der AutoMem-Methode

Mehr:

button Index-Werte dürfen nicht programmiert werden

button Speicherbedarfsprüfung


Index-Werte dürfen nicht programmiert werden

Ist der V.E  Variablenspeicher (GLOBAL oder CHANNEL) nach der AutoMem-Methode organisiert, ist eine Parametrierung mit var[?].index unzulässig.

Fehlermeldung | Declaration of var[?].index not allowed. Delete var[?].index out of the list
Abhilfe | Aus der Variablenbeschreibung den Parameter var[?].index entfernen.


Speicherbedarfsprüfung

Der steuerungsintern berechnete Speicherwert wird gegen - möglicherweise durch die Parametrierung falsch deklarierte - Verwaltungsdaten geprüft. Dieser Fehler tritt typisch dann auf, wenn fälschlicherweise das Attribut var[?].size programmiert wurde.

Anmerkung: Der konfigurierte Wert des var[?].size liegt zum Zeitpunkt des Exports nicht mehr vor. Es kann nur indirekt auf eine Fehlkonfiguration geschlossen werden.

Fehlermeldung | Declaration of var[?].size not allowed. Delete var[?].size out of the list.
Abhilfe | Den Parameter var[?].size aus der Variablenbeschreibung entfernen.


Einschränkungen bei mehrkanaligem Steuerungsaufbau

Beim Hochlauf der CNC werden für jeden NC-Kanal die GLOBAL deklarierten Variablen zu bereits evtl. vorhandenen Variablen inkrementell hinzugefügt. Erst nach Abschluss des Hochlaufs steht das Layout des Speichers in der Gesamtheit fest. Die Anfangsadresse auf den gemeinsamen Speicher wird dann der SPS zur Verfügung gestellt.

Die #EXPORT-Funktion kann nur jeweils in einem Kanal gestartet werden.

o Sie kennt daher nur die in diesem Kanal deklarierten GLOBAL Variablen. Variablen aus anderen Kanälen, die z.B. mit anderen Index-Werten belegt sind, sind unsichtbar. Sie werden daher auch nicht in der Struktur VE_GLOBAL_DATA_FROM_CH_? eingetragen.

o Je kanalspezifischer V.E-Liste entsteht eine eigenständige
VE_GLOBAL_-DATA_FROM_CH_? Struktur wobei

o der durch eine ungünstige GLOBAL Deklarationen mögliche Mischbetrieb von indexbasierter Adressierung und Auto_Mem-Methode über mehrere Kanäle hinweg nicht detektiert werden kann.

Eine Lösung der Problemstellungen kann nur durch den SPS-Programmierer erfolgen oder muss in enger Zusammenarbeit mit demjenigen erarbeitet werden, der die V.E-Listen erstellt. Eine "typische" Vorgehensweise gibt es jedoch nicht.

Im Folgenden werden einige Vorschläge gezeigt, die helfen sollen, eine Entscheidung über das letztendlich angewendete Vorgehen zu fällen:

Szenario (A)

Alle GLOBAL-Variablen werden in jedem Kanal (als Kopie) deklariert und (evtl.) nur durch Zugriffsmethoden (var[?].access_rights) unterschieden. In der Folge sind alle kanalweise erzeugten VE_GLOBAL_DATA_-FROM_CH_? -Strukturen identisch. Für den Zugriff von Seiten der SPS reicht es aus, eine der Strukturen als Basis für den Zugriff auf den GLOBAL Speicher zu nutzen.

Szenario (B)

Die GLOBAL Variablen der verschiedenen Kanäle unterscheiden sich teilweise oder komplett. Somit sind die erzeugten SPS-Strukturen unterschiedlich.

Ein erster Ansatz ist, die exportierten Strukturen manuell zu mischen und mit einer neuen selbstdefinierten Struktur auf den Speicher zuzugreifen. Nachteilig ist hier, dass die Verantwortung für den richtigen Zugriff wieder beim SPS-Programmierer liegt. Zudem muss der Vorgang wiederholt werden, wenn sich nur eine der V.E-Listen ändert und ein neues #EXPORT ausgelöst wird.

Ein zweiter möglicher Ansatz belässt die Unterscheidung nach Kanälen und definiert in der SPS mehrere eigenständige kanalspezifische Zeiger (auf den identischen GLOBAL Speicher). Hier muss der SPS-Programmierer Sorge tragen, dass mit der richtigen SPS-Variable auf die gewünschte Variable zugegriffen wird.


Typentabelle CNC - SPS

TwinCAT CNC: Überblick

Typentabelle CNC  SPS

Typgegenüber
stellung

CNC-TYP | SPS-TYP
BOOLEAN | BOOL
UNS08 | USINT
UNS16 | UINT
UNS32 | UDINT
SGN08 | SINT
SGN16 | INT
SGN32 | DINT
REAL64 | LREAL
STRING | Automatische Typen mit Alignment-zuordnung.


Beispiel

In den nachfolgenden Unterkapiteln beschreibt dieses Beispiel die Darstellung der V.E. Variablen ausgehend von der V.E.-Variablenliste über die Darstellung in der exportierten Datei bis hin zur Integration in ein bestehendes SPS Projekt.

Mehr:

button VE-Variablenliste

button Erzeugte PLC-Struktur aus V.E-Variablenliste

button SPS- Beispiel


VE-Variablenliste

Belegung in V.E.
Variablenliste

#

use_extended_string_var 0

#

anzahl_belegt 4

#

var[0].name FARBE

var[0].index 0

var[0].type UNS16

var[0].scope CHANNEL

var[0].access_rights READ_WRITE

var[0].array_elements 3

var[0].size 2

#

var[1].name TEXT

var[1].index 1

var[1].type STRING

var[1].scope CHANNEL

var[1].access_rights READ_WRITE

var[1]. array_elements 2

var[1].size 24

#

var[2].name INFO_IN

var[2].type OFF

var[2].scope GLOBAL

var[2].access_rights READ_WRITE

var[2]. array_elements 2

#

var[3].name INFO_OUT

var[3].type OFF

var[3].scope GLOBAL

var[3].access_rights READ_WRITE

var[3]. array_elements 2

var[3].create_hmi_interface 0

#

struct[0].name OFF

struct[0].element[0].name X

struct[0].element[0].type UNS16

struct[0].element[1].name Y

struct[0].element[1].type UNS16

#


Erzeugte PLC-Struktur aus V.E-Variablenliste

Darstellung in der exportierten Datei

TYPE STRING_20:

STRUCT

token:STRING(20);

f1_st: ARRAY[0..2] OF BYTE;

END_STRUCT

END_TYPE

TYPE STRING_20_2:

STRUCT

token:STRING(20);

f1_st: ARRAY[0..106] OF BYTE;

END_STRUCT

END_TYPE

TYPE OFF:

STRUCT

X: UINT;

Y: UINT;

END_STRUCT

END_TYPE

TYPE VE_CHANNEL_DATA_CH_1:

STRUCT

FARBE: ARRAY[0..2] OF UINT;(* index = 0 *)

f1:ARRAY[0..17] OF BYTE;

TEXT: ARRAY[0..1] OF STRING_20;(* index = 1 *)

END_STRUCT

END_TYPE

TYPE VE_GLOBAL_DATA_FROM_CH_1:

STRUCT

INFO_IN: ARRAY[0..1] OF OFF;

INFO_OUT: ARRAY[0..1] OF OFF;

END_STRUCT

END_TYPE


SPS- Beispiel

Integration in laufender SPS

Ein SPS-Programm zur Kontrolle der erzeugten SPS-Struktur aus Kap. 1.7.2

VAR

(* Nutzen der erzeugten Strukturbeschreibungen *)

p_ve_chan_1 : POINTER TO VE_CHANNEL_DATA_CH_1;

p_ve_globe : POINTER TO VE_GLOBAL_DATA_FROM_CH_1;

text : STRING(20);

END_VAR

(* Sicherstellung, dass die internen Verwaltungsdaten initialisiert sind *)

Hli(bStart := TRUE);

IF Hli.bInitialized = TRUE AND Hli.bError = FALSE THEN

(* Zeiger auf Struktur(en) bereitstellen *)

p_ve_chan_1 := ADR( pVE[1]^.addr^.AHLI_UNS32_Data);

p_ve_globe := ADR(pVEGlob^.addr^.AHLI_UNS32_Data);

(* Mit den Variablen arbeiten (lesen, schreiben) *)

text := p_ve_chan_1^.TEXT[0].token;

p_ve_chan_1^.FARBE[1] := 2;

END_IF


Kurzanleitung

Kurzanleitung zur
Nutzung der Exportfunktionalität bei V.E- Variablen.

Vorgehensweise anhand von TwinCAT

1. Exportieren der V.E.Variablen aus der CNC mit dem Export-Befehl
 #EXPORT VE[TWINCAT]

2. Öffnen der Exportdatei mit einem Editor und auf eventuelle Warnungen oder Fehler prüfen. Diese werden textuell in der Datei dargestellt.

3. Importieren der Exportdatei in das bestehende SPS Projekt, ein Zugriff auf das HLI ist erforderlich

4. Zeiger auf Strukturen anlegen
 (* Nutzen der erzeugten Strukturbeschreibungen *)
p_ve_chan_1 : POINTER TO VE_CHANNEL_DATA_CH_1;
p_ve_globe : POINTER TO VE_GLOBAL_DATA_FROM_CH_1;

5. Zyklisch die Zeiger auf die Struktur aktualisieren
 (* Zeiger auf Struktur(en) bereitstellen *)
p_ve_chan_1 := ADR( pVE[1]^.addr^.AHLI_UNS32_Data);
p_ve_globe := ADR(pVEGlob^.addr^.AHLI_UNS32_Data);

6. Lese- und Schreibzugriffe auf Strukturen integrieren
 p_ve_globe^.VARIABLE_1 := 22; (*Schreibzugriff*)
gl_ar_var_3 := p_ve_globe^.VARIABLE_1; (*Lesezugriff*)