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.
In diesem Fall empfiehlt es sich die Variablenstrukturen in der PLC nachzubilden und mit Hilfe der Zeiger pVE[iChannelNr]^.addr bzw. pVEGlob^.addr direkt auf den jeweiligen V.E Variablenspeicher zuzugreifen (s. Programmierbeispiel 2).

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;