# e!Cockpit Variablenzuordnung



## Jean-Luc (20 Juli 2019)

Hallo,

ich bin gerade dabei von TC2 auf e!Cockpit (und damit von Beckhoff auf Wago) umzusteigen, was viele Erleichterung mit sich bringt. An einer Stelle stehe ich allerding auf dem Schlauch: 

Wenn ich die "Erste-Schritte"-Anleitungen durchklicke, wird in der Gerätesicht dem Hardwareregister ein Name gegeben. Dieser Name kann dann 1:1 im Programm verwendet werden. Wenn ich beim Zuweisen ein Variable im Codeeditor aus dem Kontextmenu die Eingabehilfe auswähle und mir dort aus dem Treeview die Variable heraussuche, dann wird sie im Codeeditor als "IoConfig_Globals_Mapping.<var_name>" eingefügt.

Das klappt alles ganz prima, für komplexere Datenstrukturen (z.B. Array of Struct) ist das nicht mehr möglich/praktikabel. Wie bekomme ich da ein Mapping des Instanzpfades (z.B. PLC_PRG.<struc_name>.<var_name>) auf die Hardwarenamen, die ich in der Gerätesicht vergeben habe? Da gab es doch (in TC2 <=> Codesys2) eine Möglichkeit mit VAR_CONFIG das gesammte Mapping an einer Stelle hinzubiegen. 

Weiß von euch jemand, wie man das in e!Cockpit hinbekommt? Über eine Globale Variablen Liste? Wenn ja, wird das Mapping dann graphisch unterstützt? 

Viele Grüße und vielen Dank,
Jean-Luc


----------



## holgermaik (20 Juli 2019)

Hallo Jean



> für komplexere Datenstrukturen (z.B. Array of Struct) ist das nicht mehr möglich/praktikabel


Du möchtest auf eine inteligente Hardwareklemme zugreifen?
Dies wird über die Interface Variable gemacht. Wago bringt zu allen Karten Bibliotheken mit den entsprechenden Bausteinen mit.

Oder verstehe ich dich falsch?

Holger


----------



## Jean-Luc (20 Juli 2019)

Ist vermutlich viel einfacher als intelligente Hardwareklemmen.

Ich habe einen FB:


```
FUNCTION_BLOCK FB_Beregnung
VAR_INPUT
    IN: OSCAT_BUILDING.CLICK_MODE;
    GATE: BOOL;
END_VAR
VAR_OUTPUT
    ACTIVE: BOOL;
    FULL_ROUND: BOOL;
    LAST_ACTIVE: TIME;
END_VAR
VAR
    Relais_Power, Relais_Wasser, Relais_V1, Relais_V2, Relais_V3, Relais_V4, Relais_V5 AT %Q*: BOOL;
    Beregnung_Manuell AT %I*: BOOL;
    START: BOOL;
    PowerDelay: TP;
    V : ARRAY [1..5] OF TP;
    Trigger : ARRAY [1..5] OF F_TRIG;
    Reset : TOF;
    TimeGate : BYTE;
END_VAR
```

Der wird vom Hauptprogramm (PLC_PRG) aufgerufen:


```
PROGRAM PLC_PRG
VAR
    Beregnung : FB_Beregnung;
    C_E3L3_2_2 : OSCAT_BUILDING.CLICK_MODE;
END_VAR

C_E3L3_2_2(IN := GVL.E_E3L3_2_2); 
Beregnung(IN :=  C_E3L3_2_2, GATE := TRUE);
```

In den globalen Variablen (GVL) steht:

```
VAR_GLOBAL
    E_E3L3_2_2 AT %I*: BOOL;
END_VAR
```

Bei E/A-Abbild sieht's derzeit so aus:



Wenn ich den Code übersetzen lasse, ist alles in Ordnung. Beim Runterladen auf den 750-8102 gibt es dann für jeden I/O-Kanal das Fehlerpaar:

C0128: Kein 'VAR_CONFIG' für 'PLC_PRG.Beregnung.Relais_V1' 
Relais_V1: map to existing variable with address is not allowed! 

Irgendwo habe ich da 'was im Detail nicht verstanden, befürchte ich... 

Vielen Dank für Deine Hilfe!
Jean-Luc


----------



## holgermaik (20 Juli 2019)

1. Neue Globale Variablenliste erstellen
2. Var Global & Endvar löschen
3. rechte Moustaste "alle Instanzpfade hinzufügen"
jetz sollte ein Var Config generiert werden mit allen Platzhaltervariablen.
Nur noch %I* durch die HW Adresse ersetzen.

```
VAR_CONFIG
    // Instanzpfad der Variablen an der unvollständigen Adresse erzeugt
    PLC_PRG.Beregnung.RELAIS_POWER AT %Q*: BOOL;
    // Instanzpfad der Variablen an der unvollständigen Adresse erzeugt
    PLC_PRG.Beregnung.RELAIS_WASSER AT %Q*: BOOL;
    // Instanzpfad der Variablen an der unvollständigen Adresse erzeugt
    PLC_PRG.Beregnung.RELAIS_V1 AT %Q*: BOOL;
    // Instanzpfad der Variablen an der unvollständigen Adresse erzeugt
    PLC_PRG.Beregnung.RELAIS_V2 AT %Q*: BOOL;
    // Instanzpfad der Variablen an der unvollständigen Adresse erzeugt
    PLC_PRG.Beregnung.RELAIS_V3 AT %Q*: BOOL;
    // Instanzpfad der Variablen an der unvollständigen Adresse erzeugt
    PLC_PRG.Beregnung.RELAIS_V4 AT %Q*: BOOL;
    // Instanzpfad der Variablen an der unvollständigen Adresse erzeugt
    PLC_PRG.Beregnung.RELAIS_V5 AT %Q*: BOOL;
    // Instanzpfad der Variablen an der unvollständigen Adresse erzeugt
    PLC_PRG.Beregnung.BEREGNUNG_MANUELL AT %I*: BOOL;
END_VAR
```

Holger


----------



## holgermaik (20 Juli 2019)

Meine Meinung dazu ist gespalten. 
Vorteil: man hat schnell alle Variablen im Blick und kann keine vergessen.
Nachteil: Ändert sich was am Hardwareaufbau verschieben sich evtl die Adressen. Durch die absolute Zuweisung wird schnell mal der falsche Ausgang beschrieben.

Für Umsteiger neu Lerner usw. würde ich immer die symbolische Adressierung über IoConfig_Globals_Mapping.<var_name>" empfehlen.
Holger


----------



## Jean-Luc (20 Juli 2019)

Vielen Dank für deine Antwort!

Den von dir genannten Nachteil finde ich schon gravierend. Dann müsste ich den HW-Registern in der Geräteansicht gar keine Namen geben, wenn ich später sowieso eine manuelle Liste pflegen muss.

Da muss es doch eine andere Möglichkeit geben...  

Gruß,
Jean-Luc


----------



## Jean-Luc (20 Juli 2019)

Hab's:

Das Problem waren die "AT %I|Q|M*" *zusätzlich* zum Variablenmapping in der Geräteansicht. Die "ATs" weg und nur noch den Variablentyp, das zusammen mit dem graphischen Mapping der Geräteansicht, und schon läuft's.  :-D

Vielen Dank für die Anregung!
Gruß,
Jean-Luc


----------



## Jean-Luc (20 Juli 2019)

:roll: Hm, jetzt läuft's zwar, aber die Variablen sind jetzt lokal deklariert und werden über das graphische Mapping auf der Gerätansicht mit der Außenwelt verbunden. D.h. wenn ich ein Mapping vergesse, kann das Programm trotzdem auf der SPS laufen. Es hat nur keinen "Kontakt" zu Außenwelt. Auch nicht schön.

Das mit der "AT %*"-Deklaration im Code war ja schon ganz gut, weil man dann wenigstens programmatisch testen konnte (von Seiten der Plattform), ob alle erforderlichen Variablen nach außen verbunden waren. So kann ich nur die umgekehrte Richtung sehen und bekomme zum Mapping praktisch jede Variable des Programms angeboten. Kann's doch auch nicht sein. Sehr verwirrend, diese CodeSys Welt... :sad:

Variablen mit der Außenwelt zu verbinden ist doch eigentlich ein Standardproblem. Wir macht ihr das denn?

Viele Grüße,
Jean-Luc


----------



## Jean-Luc (20 Juli 2019)

... oder muss ich jetzt ein Python Skript schreiben, das das E/A Abbild exportiert und es in eine globale Variablenliste mit VAR_CONFIG konvertiert? Da gibt's doch bestimmt schon 'was besseres, oder?

Gruß,
Jean-Luc

PS: Das Skript müsste dann auch noch die Mappings alle löschen, damit es nicht zu dem "map to existing variable with address is not allowed!"-Fehler kommt, und ein zweites Skript müsste sie auch wieder anlegen können, wenn man 'was im Programm geändert hat... Nich' so doll.

exportiertes E/A Abbild:

```
Parent;OrderNumber;ModuleName;ChannelName;ParameterId;Description;Unit;DataType;IecAddress;VariableName
;;;K-BUS diagnostics;83886080;K-BUS diagnostics;;BYTE;%IB0;
;;;K-BUS error;83886080.error;K-BUS general error flag;;BOOL;%IX0.0;
Kbus;0750-0400;_2DI_24_VDC_3ms;_IN;16777216;Eingangskanäle;;BYTE;%IB1;
Kbus;0750-0400;_2DI_24_VDC_3ms;_IN;16777216.InputField.Channel1.Bit1.Component_1;Digitaleingang;;BOOL;%IX1.0;Application.GVL.E_E3L3_2_2
Kbus;0750-0400;_2DI_24_VDC_3ms;_IN;16777216.InputField.Channel1.Bit2.Component_2;Digitaleingang;;BOOL;%IX1.1;Application.PLC_PRG.Beregnung.Beregnung_Manuell
Kbus;0750-0530;_8DO_24_VDC_0_5A;_OUT;50331648;Ausgangskanäle;;BYTE;%QB1;
Kbus;0750-0530;_8DO_24_VDC_0_5A;_OUT;50331648.OutputField.Channel1.Bit1.Component_1;Digitalausgang;;BOOL;%QX1.0;Application.PLC_PRG.Beregnung.Relais_Power
Kbus;0750-0530;_8DO_24_VDC_0_5A;_OUT;50331648.OutputField.Channel1.Bit2.Component_2;Digitalausgang;;BOOL;%QX1.1;Application.PLC_PRG.Beregnung.Relais_Wasser
Kbus;0750-0530;_8DO_24_VDC_0_5A;_OUT;50331648.OutputField.Channel1.Bit3.Component_3;Digitalausgang;;BOOL;%QX1.2;Application.PLC_PRG.Beregnung.Relais_V1
Kbus;0750-0530;_8DO_24_VDC_0_5A;_OUT;50331648.OutputField.Channel1.Bit4.Component_4;Digitalausgang;;BOOL;%QX1.3;Application.PLC_PRG.Beregnung.Relais_V2
Kbus;0750-0530;_8DO_24_VDC_0_5A;_OUT;50331648.OutputField.Channel1.Bit5.Component_5;Digitalausgang;;BOOL;%QX1.4;Application.PLC_PRG.Beregnung.Relais_V3
Kbus;0750-0530;_8DO_24_VDC_0_5A;_OUT;50331648.OutputField.Channel1.Bit6.Component_6;Digitalausgang;;BOOL;%QX1.5;Application.PLC_PRG.Beregnung.Relais_V4
Kbus;0750-0530;_8DO_24_VDC_0_5A;_OUT;50331648.OutputField.Channel1.Bit7.Component_7;Digitalausgang;;BOOL;%QX1.6;Application.PLC_PRG.Beregnung.Relais_V5
Kbus;0750-0530;_8DO_24_VDC_0_5A;_OUT;50331648.OutputField.Channel1.Bit8.Component_8;Digitalausgang;;BOOL;%QX1.7;
```


----------



## uzi10 (30 Juli 2019)

holgermaik schrieb:


> 1. Neue Globale Variablenliste erstellen<br>
> 2. Var Global & Endvar löschen<br>
> 3. rechte Moustaste "alle Instanzpfade hinzufügen"<br>
> jetz sollte ein Var Config generiert werden mit allen Platzhaltervariablen.<br>
> ...


<br>
Das mit alle Instanzpfade funktioniert bei mir aber  nicht! Der macht original gar nichts!
Eine Frage als e.Cockpit  Anfänger!
Wenn ich die GVL Liste mit den Hardware Adressen (AT)  %IX2.0 verknüpfe, dann aktualisiert sich aber der Zustand der Variablen  nicht!
 Muss ich da einen Task verknüpfen(zb rechte MT  Netzwerkeinstellungen Task verknüpfen oder so?


----------



## Jean-Luc (30 Juli 2019)

uzi10 schrieb:


> <br>
> Das mit alle Instanzpfade funktioniert bei mir aber  nicht! Der macht original gar nichts!


Wenn ich das richtig sehe, dann werden dort nur Einträge gemacht, wenn irgendwo noch Prozentzeichen-Stern-Einträge nicht zugeordnet sind. Kann es sein, dass du schon alle Referenzen aufgelöst hast?



> Wenn ich die GVL Liste mit den Hardware Adressen (AT)  %IX2.0 verknüpfe, dann aktualisiert sich aber der Zustand der Variablen  nicht!
> Muss ich da einen Task verknüpfen(zb rechte MT  Netzwerkeinstellungen Task verknüpfen oder so?


Was meinst du mit Zustand? Deren Wert oder deren Adresse, falls die Klemmen umgetauscht wurden? Letzteres wird natürlich dann nicht aktualisiert. Man hat es ja schließlich manuell eingetragen.

Ich versuche die Varianten, die Holger angesprochen hat, für mich noch einmal zu beschreiben:

Aus der Netzwerk/Geräte-Sicht aus klickt man im Variablenbenennungsfeld auf die drei Punkte und wählt eine Variable aus dem Programm, mit der der Wert verknüpft werden soll. Vorteil: Automatische Aktualisierung bei Klemmentausch, Nachteil: Man weiß nicht, ob alle Verbindungen nach außen konfiguriert wurden.
Im Programmeditor klickt man rechte Maustaste auf Eingabehilfe und wähl unter IoConfig_Globals_Mapping den Ein- oder Ausgang im Gerät aus. 
Vorteil: Automatische Aktualisierung bei Klemmentausch, Nachteil: Ich habe noch keinen Weg gefunden aus einem FB heraus eine solche Zuweisung zu machen, da der FB ja mehrfach instanziiert werden kann.
Manuell über VarConfig. 
Vorteil: Kontrolle über die Zuordnungen (wird eine übersehen, gibt's einen Fehler), Nachteil: manuelle Pflege der VarConfig-Liste (, die man aber über ein kleines Skript, das dann Link zwischen Variablennamen im Programm und Variablennamen an der Klemme realisieren muss.

Da ich einige FBs habe, die einfach instanziiert werden, ohne dass ich im Hauptprogramm eine Adresszuweisung mache, kommt für mich Variante 2 nicht infrage. Die Kontrolle über die Stellen, an denen ich "nach draußen" gehe, hätte ich gerne (also eine Fehlermeldung, wenn ein Link nicht gemacht ist), sodass 1 auch ausscheidet. Läuft für mich darauf hinaus die Klemmenkonfig zu exportieren, im Kommentarfeld den Pfad der Variablen im Programm anzugeben und mit einem Skript daraus die VarConfig zu erstellen. Oder weiß jemand, wie man Variante 2 mit mehrfach instanzierten FBs verwendet?

Viele Grüße,
Jean-Luc


----------



## uzi10 (31 Juli 2019)

Jean-Luc schrieb:


> Wenn ich das richtig sehe, dann werden dort nur EintrÃ¤ge gemacht, wenn irgendwo noch Prozentzeichen-Stern-EintrÃ¤ge nicht zugeordnet sind. Kann es sein, dass du schon alle Referenzen aufgelÃ¶st hast?
> 
> 
> Was meinst du mit Zustand? Deren Wert oder deren Adresse, falls die Klemmen umgetauscht wurden? Letzteres wird natÃ¼rlich dann nicht aktualisiert. Man hat es ja schlieÃŸlich manuell eingetragen.
> ...


----------

