# Variablendeklaration in den Bausteinen



## Simon_ (3 September 2010)

Hallo, ich hab ein Problem bei der Deklaration von Variablen. Und zwar deklariere ich meine Variablen, die nacher Aus- bzw. Eingänge in der Peripherie zugwiesen werden, bislang im Deklarationskopf der jeweiligen Bausteine. Dies möchte ich auch gerne so lassen, um eine klare Struktur zu haben. Jetzt habe ich das Problem, dass wenn ich die Bausteine global bekannt mache, dass nur in "Variablen_Konfiguration" geht. Dort muss ich aber leider die absoluten Adressen festlegen
 ( z.B.  MAIN.fbEINS.Ausgang AT %IW3 : INT;)

Zu meiner Frage: Gibt es eine Möglichkeit diese Variablen in die automatische Adressverwaltung aufzunehmen?

Vielen Dank schon einmal im Vorraus

Gruß Simon


----------



## klausbre (3 September 2010)

Hallo Simon,

EAs sind typische GLOBALE Variablen und so würde ich 
sie auch unbedingt deklarieren. Also unter Ressourcen/Globale Variablen


----------



## Simon_ (3 September 2010)

Danke Klausbre für die rasche Antwort, leider bin ich nicht ganz zufrieden damit. 

Gibt es denn eine Möglichkeit Globale Variablen beim Instanziieren zu erstellen? 

Meine Motivation ist, dass ich nicht extra irgendwo die Ausganswerte meiner Instanzen nochmals auf eine globale Variable übergeben will. Ich würde lieber einen Zeiger darauf übergeben und nicht die Werte nochmals in einem extra Baustein zuweisen. 
Prinzipiell geht das ja auch, aber leider nur wenn ich die absolute Adresse angebe. Ich hätte gerne, dass er die Variablenadressen automatisch verwaltet, wir das bei den globalen mit * deklarierten passiert. 

Wenn ich bei den VAR_CONFIG alle Instanzpfade einlesen lasse, dann findet er die betrefflichen Variablen, leider wird aber keine Adresse dazu erstellt.

Gruß


----------



## klausbre (3 September 2010)

Ich bin nicht ganz sicher ob es das ist, was Du willst.

Aber vielleicht ein kleines Beispiel: ich habe unter Codesys einen
instanzierbaren Baustein geschrieben, der einen unserer Servoregler bedient
(Positionieren, Referenzieren, Tippen, ...). 99% des Jobs passiert über 
CANopen mittels eines ebenfalls instanzierbaren Sende und Empfangsteil.

Nun kann ich bei n Antrieben einfach n Instanzen dieses Bausteins 
aufrufen und bin herrlich variabel. Alle individuellen Dinge (z. Bsp. die 
NodeId werden im Bootup einmalig für jede Instanz einzeln gesetzt). 

Das einzige Problem ist, jeder Antrieb benötigt eine Hardwarefreigabe
 (also einen Ausgang) und der hat natürlich eine fixe Adresse. Den 
würde ich aber auch gerne von dem Baustein bedienen.

Gelöst habe ich es folgendermaßen:

im instanzierbaren Baustein:
    (* zugehörige Ausgänge der Steuerung *)
    DAxx_Freigabe_Servo                    AT%Q* : BOOL;

in den globalen Variablen:
VAR_CONFIG
....
(* zugehörige EAs *)
     .Move_ServoAxis_AFB[1].DAxx_Freigabe_Servo                AT %QX1.0.0.0: BOOL;  (* DA1 *)
END_VAR

Dabei ist Move_ServoAxis_AFB[1] die erste Instanz meines
Bausteins.

Hilft Dir das???


----------



## IBFS (3 September 2010)

Was denn nun ihr IEC1131-Fans 

Wollt ich euch totinstanzieren, wie das immer so angepriesen wird. (von wegen Wiederverwendbarkeit a.s.o.)

oder 

wollte ich ihr alles schon Global deklarieren, aber dann ist es vorbei mit der sog. Wiederverwendbarkeit.


Es ist eben das Problem, wenn es die Funktion - Suche nach Verwendungsstelle - nicht gibt (ich rede nicht von diese komischen "Global Suchen" Funktion).


Ich habe das gleiche Problem, wie ihr und das macht das Arbeiten mit 3S in machen Teilen uneffektiv, weil man sich totsucht - vor allem in fremden Programmen.

Gruß

Frank


----------



## Simon_ (3 September 2010)

Hi Klausbre, genau so wie von dir beschrieben hab ich das bis jetzt auch gemacht. Nur hatte ich heute einen Fehler bei der Adressvergabe, also QX1.0.0.0, gemacht und jetzt frag ich mich, ob dass nicht auch automatisch gemacht werden kann. 

Gruß Simon


----------



## klausbre (3 September 2010)

Das wird wohl nicht möglich sein, da Codesys im Grunde nicht
wissen kann, an welchem Ausgang was angeschlossen ist.

Um hier keine Fehler zu machen, hole ich mir solche Adressen
immer direkt aus der Steuerungskonfiguration.


----------



## BoxHead (3 September 2010)

IBFS schrieb:


> Es ist eben das Problem, wenn es die Funktion - Suche nach Verwendungsstelle - nicht gibt (ich rede nicht von diese komischen "Global Suchen" Funktion).



Projekt -> Querverweisliste ausgeben...

Am besten vorher die Variable Markieren


----------



## Simon_ (4 September 2010)

Ich verwende TwinCat, und weise die Hardware den Variablen im Systemmanager zu. Die Adressen die ich bis jetzt verteile sind willkürlich aus dem Zahlenraum entnommen. Das funktioniert soweit auch, aber ich bin nicht wirklich glücklich damit.


----------



## witkatz (5 September 2010)

Simon_ schrieb:


> Nur hatte ich heute einen Fehler bei der Adressvergabe, also QX1.0.0.0, gemacht und jetzt frag ich mich, ob dass nicht auch automatisch gemacht werden kann.


     Hi Simon,         
bei längeren Variablendeklarationen behelfe ich mir schon mal mit excel. Ich liste die Variablen, Adressen und Datentypen in einer Tabelle auf und erzeuge mit der Verketten - Funktion die Variablendeklaration. So ist die Gefahr einfacher Fehler beim Aufzählen geringer und es ist später einfacher die Deklaration zu ändern. Wenn du später mal z.B. einen Block aus 100 Variablen im Speicher um ein paar Byte verschieben willst um etwas einzufügen, dann bist du für so einen Quasi-Programmgenerator dankbar.         

Gruß, witkatz


----------



## Simon_ (7 September 2010)

So, jetzt hab ich die Lösung für das Problem vom Support von Beckhoff bekommen. Es war jetzt so einfach  Und zwar findet die Deklaration im Funktionskopf wie gehabt mit %I* statt. Dann das Projekt übersetzen und speichern. (Beim Übersetzen werden die Deklarationen als Warnungen angezeigt.) Dann das Projekt im Systemmanager frisch einlesen. Wenn man jetzt das Projekt im PLC Control nochmals öffnet und übersetzt, sind die Warnungen verschwunden und die Deklarationen bei den automatischen Deklarationen automatisch geschrieben.

Vielen Dank an alle für die Hilfsbereitschaft.

Gruß Simon


----------



## witkatz (7 September 2010)

Hallo Simon,

die Warnungen sind verschwunden, weil TwinCAT die Variablenkonfiguration in der Variablenliste TwinCAT_Configuration im VAR_CONFIG Block angelegt hat. Diese Variablenliste ist schreibgeschützt, d.h. die automatisch vergebenen Adressen sind in dieser Liste fest. 

Es spricht grundsätzlich nichts dagegen, die automatische Variablendeklaration so zu belassen. Du kannst die Adressen aber händisch anpassen, indem du eine eigene globale Variablenliste mit VAR_CONFIG anlegst und die Deklarationen selbst anpasst. Für den Anfang kannst du sie aus der Liste TwinCAT_Configuration rauskopieren, damit schon mal die Schreibweise der Deklaration klar ist. Unabhängig davon, ob die Adressvergabe händisch oder manuell erfolgt, sollte das Projekt nach Änderungen der Konfiguration auf überlappende Speicherbereiche überprüft werden.

Das Thema Variablenkonfiguration ist im Information System ausführlich dokumentiert:
http://infosys.beckhoff.com/content/1031/tcplccontrol/html/tcplcctrl_resglobvar.htm?id=10881

Gruß,
witkatz


----------

