SPS
Nach Hochlauf der Steuerung erhält das SPS-Run-Time-System Zugriff auf die gemeinsamen Speicherbereiche für VE Variablen zwischen CNC und SPS. Diese werden in kanalspezifische und einen globalen Speicherbereich unterschieden.
pVE[iChannelNr]^.addr
pVEGlob^.addr
Um den Zugriff auf die Speicherbereiche zu vereinfachen, werden in einer zusätzlichen Bibliothek TcCncUtilities.lib Funktionen angeboten, welche die Verwaltung der angelegten VE Variablen übernehmen und Zugriffe auch über den Namen ermöglichen.
Hinweis | |
Falls externe Variablen mit benutzerdefinierten Variablentypen konfiguriert sind, kann die SPS-Bibliothek TcCncUtilities.lib nicht verwendet werden. |
Vor Verwendung der Bibliothek muss eine Grundinitialisierung seitens der SPS durchgeführt werden. Hierbei wird die bei der CNC-Konfiguration angegebene Formatbeschreibung der externen Variablen automatisch durch die SPS übernommen.
Dazu tauschen die CNC und die SPS während der Initialisierung die Variablen Beschreibungen aus. Der Speicherbereich der externen Variablen wird während der Initialisierung abgelöscht (Werte = 0).
Zusätzlich werden dabei die einzelnen Formate der Variablen auf ihre Korrektheit hinsichtlich des Speicherindex und des Speicherbereiches geprüft und bei auftretenden Fehlern Meldungen auf dem Logger ausgegeben. Um den Zugriff auf nichtdefinierte Speicherbereiche bei Feldern zu verhindern, wird eine Überprüfung der Zieladresse durchgeführt. Dazu wird die Größe des Zieldatentyps an die jeweilige Bibliotheksfunktion übergeben (siehe Bespiel).
Für den lesenden und schreibenden Zugriff auf die externe Variablen bzw. Arrays von externen Variablen werden Zeiger auf die erwartenden Datenstrukturen erzeugt und mit der jeweils passenden Adresse aus dem HLI Speicherbereich initialisiert Über den dereferenzierten Pointer kann dann direkt auf die Variable strName zugegriffen werden, z,.B.:
POINTER_TO_BOOL = VeBool(1, ‚‘Peter’, 0);
POINTER_TO_BOOL^=23;
Funktion | INPUT | RETURN | Bedeutung |
VeInitialisation() |
| BOOL Status | Initialisiert die Bibliothek damit VE Variablen in der SPS verwendet werden können. |
|
| Status [true/false] | Status der Initialisierung der Bibliothek für Zugriff auf externe Variablen. Solange dieser Wert false ist kann nicht auf VE Variablen zugegriffen werden. |
Ve<DatenTyp>() | UINT iChannel STRING strVeName UINT ISizeArrayByte | POINTER TO <DatenTyp> pDatatype | Funktionen liefern die Speicheradresse einer Variablen mit dem Typ <DatenTyp> , welche über die Angabe eines Namens identifiziert werden. DatenTyp = [Uns08, Sgn08, Uns16, Sgn16, Uns32, Sgn32, Real32, Real64, String] |
| IChannel [1 .. nChannel] |
| Kanalnummer in welchem die Variable strName deklariert wurde. |
| StrVeName [‘String‘] |
| Name der Variablen auf die zugegriffen werden soll (nicht größer als 20 Zeichen) |
| IsizeArrayByte [sizeof(Ziel_Pointer^)] |
| Größe des erwartenden Arrays zur Überprüfung des korrekten Speicherzugriff. Wenn kein Array erwartet wird ist dieser Wert mit 0 zu initialisieren. |
|
| PDatatype [pIntArray ] | Adresse zum Zugriff auf die VE Variable mit dem Namen strVeName . |
Das folgende Beispiel bezieht sich auf die Beispielkonfiguration der VE Variablen aus dieser Dokumentation (s.o. Kapitel Syntax (ab Version V254)). Vor der Verwendung des VE Zugriffs in einem Programm muss das HLI Interface erfolgreich initialisiert (siehe [HLI-Schnittstelle]), die TcCncUtilities.lib Bibliothek im gewünschten Projekt eingefügt sein und folgende Schritte durchgeführt werden:
Programmierbeispiel Zugriff VE-Variablen in der SPS (VeExampleDoku.pro)
VAR
VEInitialisationDone : BOOL;
I : INT;
pCHANNEL_WR : POINTER TO ARRAY [0..9] OF INT := 0;
pGLOBAL_SWR : POINTER TO DINT := 0;
END_VAR
(* Zugriff auf VE Variablen in der SPS *)
IF VEInitialisationDone = FALSE THEN
VEInitialisationDone := VeInitialisation();
IF VEInitialisationDone = TRUE THEN
pCHANNEL_WR := VeSgn32(1,'CHANNEL_WR', SIZEOF(pCHANNEL_WR^));
pGLOBAL_SWR := VeSgn16(1,'GLOBAL_SWR', 0);
ELSE
RETURN;
END_IF
END_IF
(* Jetzt kann direkt schreibend und lesend auf die Variable zugegriffen werden. Zum Testen: - Inhalt der Variable pChannel im Plc Open überprüfen -> 801..802.....
- Zum Test im System Manager V.E.GLOBAL_SWR=20 als einzelnen Handsatz ausführen um aus der CNC diese VeVariable zu schreiben.
- Dadurch sollte anschließend die pChannel Variable automatisch in der SPS auf0 gesetzt sein. *)
IF pCHANNEL_WR <> 0 AND pGLOBAL_SWR <> 0 THEN (* reading access*)
IF pGLOBAL_SWR^ = 20 THEN (* reading access*)
FOR I:=0 TO 9 BY 1 DO
pCHANNEL_WR^[I] := 0; (* writing access*)
END_FOR
ELSE
FOR I:=0 TO 9 BY 1 DO
pCHANNEL_WR^[I] := 800+I; (* writing access*)
END_FOR
END_IF
pGLOBAL_SWR1^:=0; (* writing access*)
Dieses PLC-Beispiel zeigt, wie die V.E Variablen durch Nachbilden der Variablenstrukturen in der PLC verwendet werden können. Vor dem Zugriff auf die Zeiger pVE[iChannelNr]^.addr bzw. pVEGlob^.addr muss das HLI Interface erfolgreich initialisiert sein (s. [HLI-Schnittstelle]).
Programmierbeispiel 2 Zugriff VE-Variablen in der SPS ohneTcCncUtilities.lib Bibliothek (ab Version V2.10.1025.00)
TYPE VECTOR_T :
STRUCT
x : LREAL;
y : LREAL;
z : LREAL;
END_STRUCT
END_TYPE
TYPE TARGET_POINT_T :
STRUCT
point : VECTOR_T;
valid : BOOL;
END_STRUCT
END_TYPE
TYPE TRAJEKTORIE_T :
STRUCT
nbr_points : DINT;
name : STRING(127);
points : ARRAY [0..9] OF TARGET_POINT_T;
END_STRUCT
END_TYPE
Definition der Strukturen für den kompletten, belegten V.E.Speicherbereich:
TYPE VE_GLOBAL:
STRUCT
var_global_1 : DINT;
END_STRUCT
END_TYPE
TYPE VE_CHAN_1:
STRUCT
var_chan_1 : DINT;
array_chan_1 : ARRAY [0..19] OF INT;
name : STRING(127);
Trajektorie : TRAJEKTORIE_T;
END_STRUCT
END_TYPE
PLC-Programm zum Zugriff auf die V.E.Variablen:
PROGAM V_E
VAR
p_ve_chan_1 : POINTER TO VE_CHAN_1;
END_VAR
p_ve_chan_1 := ADR (pVe[1]^.addr^.AHLI_UNS32_Data);
IF (p_ve_chan_1^.name =’’)THEN
p_ve_chan_1^.trajektorie.name := My Path!
p_ve_chan_1^.trajektorie.nbr_points := 2;
p_ve_chan_1^.trajektorie.points[0].valid := TRUE;
p_ve_chan_1^.trajektorie.points[0].point.x := 100.0;
p_ve_chan_1^.trajektorie.points[0].point.y := 200.0;
p_ve_chan_1^.trajektorie.points[0].point.z := 300.0;
p_ve_chan_1^.trajektorie.points[1].valid := TRUE;
p_ve_chan_1^.trajektorie.points[1].point.x := 200.0;
p_ve_chan_1^.trajektorie.points[1].point.y := 400.0;
p_ve_chan_1^.trajektorie.points[1].point.z := 600.0;
END_IF;