# UDT in SCL erstellen



## Felse (23 März 2009)

Hallo zusammen, 
habe folgende Frage: wenn ich den Datentyp UDT im SCL verwenden will kann man doch verschiedene Datentypen zu einer Variable bzw einem "Baustein" zusammenfassen, oder? Hab nun mal versucht diesen zu verwenden
	
	



```
TYPE 
MESSWERTE: STRUCT 
                Wert1 : INT := 5;
                Wert2 : INT := 10;
                Wert3 : INT := 20;
                
           END_STRUCT; 
END_TYPE
```
 
Bekomme aber immer die Fehlermeldung: "Symbolischer Bausteinname Meswerte nicht erkannt". Muss ich dazu vorher erst den UDT in einem DB aufrufen, oder vielleicht als Variable deklarieren? Quasi so: 
	
	



```
VAR_INPUT
.
.
END_VAR
```
Wenn ja, wie?


----------



## Ralle (23 März 2009)

Entweder du schreibst es absolut:


```
TYPE UDTxxx
    STRUCT
    // Typbeschreibung

    END_STRUCT

END_TYPE
```

wobei xxx die Nummer der UDT ist

oder du gibst es symbolisch vor und legst dann ein Symbol vom Typ UDTxxx an, daß Messwerte heißt und schreibst:


```
TYPE Messwerte
    STRUCT
    // Typbeschreibung

    END_STRUCT

END_TYPE
```

Wobei xxx immer die gewünschte Nummer ist.


----------



## JesperMP (23 März 2009)

Es gibt ein weitere möglicheit: In SCL gibt es der option: Create Block Numbers automatically.


----------



## Felse (23 März 2009)

Danke, das geht schonmal, wenn ich diese UDTs dann als array aufrufen will (sofern das geht) Quasi:

```
VAR_INPUT
    
    ARRAY [1..5] OF UDT;
    
END_VAR
```
1. Wie geht das?
2. Kann man dabei trotzdem die einzelnen Variablen des UDTs verarbeiten?


----------



## Felse (23 März 2009)

JesperMP schrieb:


> Es gibt ein weitere möglicheit: In SCL gibt es der option: Create Block Numbers automatically.


 
Kannst du das vielleicht mal bitte genauer beschreiben?


----------



## JesperMP (23 März 2009)

Guck mal hier:
http://www.sps-forum.de/showthread.php?t=26253


----------



## JesperMP (23 März 2009)

Felse schrieb:


> Kannst du das vielleicht mal bitte genauer beschreiben?


Mein STEP7 ist auf englisch eingestellt, so es heisst etwas anders in Deiner, aber der Meinung ist ja klar.
Du findest es unter _Options .. Customize .._ und unter den Reiter _Create Block_ (alles auf englisch).


----------



## Felse (23 März 2009)

Vielleicht stimmt da was mit meiner Installation nicht, aber Optionen kann ich im SCL Editor nirgendwo finden und den Rest auch nicht, ist aber erstmal egal, der Link hilft mir schonmal.


----------



## Ralle (23 März 2009)

Felse schrieb:


> Danke, das geht schonmal, wenn ich diese UDTs dann als array aufrufen will (sofern das geht) Quasi:
> 
> ```
> VAR_INPUT
> ...



1.

```
VAR_INPUT
    
    My_Array: ARRAY [1..5] OF UDTxxx;
    
END_VAR
```

Immer an die Nummer denken oder symbolisch, wenn das Symbol bereits angelegt ist.

2. Im SCL-Editor unter "Extras/Einstellungen/Bausteine erzeugen".
Wenn es das bei dir nicht gibt, kann es evt. sein, daß dein SCL-Editor eine ältere Version ist und das noch nicht unterstützt.


----------



## Larry Laffer (23 März 2009)

@Felse:
Das was Jesper meinte heißt in Deutsch :
Extras - Einstellungen - [Bausteine erzeugen] und hier das Feld "Bausteinnummer automatisch erzeugen" anklicken.

Die Zugriffe auf die UDT-Unter-Elemente im ARRAY erfolgen dann etwa so :
	
	



```
x := myArray[2].UDT_Variable_1 ;
```
 
Gruß
LL


----------



## Felse (24 März 2009)

Ich hoff mal das hab ich soweit verstanden, aber wie nutz ich das in einem FB? Hatte gehofft dass würde so gehen:

```
FUNCTION_BLOCK FB6 
VAR_INPUT
    
 Zeile1: ARRAY [1..5] OF UDT1;
    
END_VAR
    
     
TYPE 
           UDT1 STRUCT 
                Wert1 : INT := 5;
                Wert2 : INT := 10;
                Wert3 : INT := 20;
                
           END_STRUCT; 
END_TYPE
 
BEGIN
x := Zeile1[1].UDT1_Wert1 ;

END_FUNCTION_BLOCK
```
 
Aber der UDT wird ja dann als extra Baustein behandelt, kann da mal jemand ein Bsp posten wie man das richtig macht?

PS: noch eine Frage zu meinen Arrays: So wie ich das jetzt gemacht habe, habe ich 5 Arrays und jeder von denen besteht aus dem gleichen UDT also auch wie hier aus meinen 3 INT Variablen, oder?


----------



## Ralle (24 März 2009)

Warum nutzt du nicht die Einfügevorlagen von SCL (Einfügen/Bausteinvorlage/FB), dann stimmt zumindest mal dein Bausteinrumpf. BEGIN gibts nicht, das ist Pascal und Delphi. Type nicht mit in den Baustein, sondern außerhalb, am besten davor, sonst meckert SCL beim ersten Durchlauf, weil es die UDT noch nicht im Bausteinordner findet. Man kann in einer SCL-Quelle mehrere Bausteine bearbeiten, die Reihenfolge muß so sein, daß ein Baustein/Type, der in einem anderen Baustein benutzt wird zuerst übersetzt werden sollte, also weiter oben steht. Außerdem mit den Variablenbezeichnungen aufpassen. So wie du sie in Type oder im DB benennst, solltest du sie auch im Programm nutzen, sonst findet der Compiler deine Neukreationen nicht.


```
TYPE 
           UDT111 STRUCT 
                Wert1 : INT := 5;
                Wert2 : INT := 10;
                Wert3 : INT := 20;
                
           END_STRUCT; 
END_TYPE

FUNCTION_BLOCK FB6 

VAR_TEMP
    // temporäre Variablen

END_VAR

VAR_INPUT
 Zeile1: ARRAY [1..5] OF UDT111;
END_VAR
    
VAR_IN_OUT    
  x: Int;     
END_VAR
     
x := Zeile1[1].Wert1;

END_FUNCTION_BLOCK
```

Dann mußt du noch einen DB erzeugen ,den FB aufrufen und mit parametern versorgen. Siehe dazu das Bild im Angang.


----------



## Felse (24 März 2009)

Das geht ja schonmal, aber ich glaub so komm ich nicht weiter... Ich fang mal ganz vorne an. Ich hab ein Bild in wincc flex das besteht aus 10 Zeilen (siehe Bild), nun hab ich das Problem, das meine Eingaben nach dem erneuten Laden in die SPS quasi gelöscht sind, daher wollte ich diese Eingaben in einen DB schreiben speichern und beim nächsten mal die Daten aus diesem DB wieder laden, aber wie geht das? Ich wollte eine Zeile als UDT definieren und die verschiedenen Zeilen dann (für spätere Bearbeitung) über Array abfragen, hab aber das Problem, das ich das noch nie gemacht habe und gar nicht weiß ob das die beste Lösung dafür ist. Was wäre für solche Anwendungen geeignet?


----------



## Larry Laffer (24 März 2009)

... wie du an dem Beitrag von Ralle schön sehen kannst, erfolgt die Deklaration des UDT *VOR* dem Code des Bausteins. Das muß auch so sein - für SCL muß der UDT erst da sein, damit du ihn benutzen kannst. Vielleicht deklarierst du den sogar außerhalb des Scriptes - das funktioniert auch ...


----------



## Felse (24 März 2009)

Larry Laffer schrieb:


> ... wie du an dem Beitrag von Ralle schön sehen kannst, erfolgt die Deklaration des UDT *VOR* dem Code des Bausteins. Das muß auch so sein - für SCL muß der UDT erst da sein, damit du ihn benutzen kannst. Vielleicht deklarierst du den sogar außerhalb des Scriptes - das funktioniert auch ...


 
Ja hab ich verstanden und auch bei mir so gemacht, aber was hat das jetzt damit zu tun?


----------



## Ralle (24 März 2009)

Ich habs nicht ganz verstanden, aber mal Folgendes:

Wenn du DB Offline in der Struktur änderst und neu lädst, sind die Daten immer weg, es sei denn, du hast die DB vorher aus dem AG gesichert, daraus eine Quelle erzeugt und deine Strukturänderungen an der Quelle vorgenommen. Diese dann zuückübersetzen, ins AG fertig.

Hast du die Elemente in deinem WinCCFlex-Bild als E/A-Feld auch für Ein- und Ausgebe definiert? Schau dir das mal an, wenn dur nur Eingabe hast, dann ist das Verhalten auch nachvollziehbar. 

Ansonsten nutze ich den SFC20 um mit in der SPS eine Art Datenbank aufzubauen und dort Rezeptdaten zu speichern. WinCCFlex hat zwar eine Rezepturverwaltung, aber ebend nicht alle Displays und nicht immer wied WinCCFlex eingesetzt. In der SPS funzt das praktisch immer.


----------



## JesperMP (24 März 2009)

Felse schrieb:


> Das geht ja schonmal, aber ich glaub so komm ich nicht weiter... Ich fang mal ganz vorne an. Ich hab ein Bild in wincc flex das besteht aus 10 Zeilen (siehe Bild), nun hab ich das Problem, das meine Eingaben nach dem erneuten Laden in die SPS quasi gelöscht sind, daher wollte ich diese Eingaben in einen DB schreiben speichern und beim nächsten mal die Daten aus diesem DB wieder laden, aber wie geht das? Ich wollte eine Zeile als UDT definieren und die verschiedenen Zeilen dann (für spätere Bearbeitung) über Array abfragen, hab aber das Problem, das ich das noch nie gemacht habe und gar nicht weiß ob das die beste Lösung dafür ist. Was wäre für solche Anwendungen geeignet?


Es ist ein Mängel bei STEP7, und zwar ein sehr grosse Mängel. Es ist praktisch nicht möglich die Aktualwerten zu sichern in STEP7 projekt (theoretisch geht es, in der praxis nicht).
Die einfachste 'Lösung' ist zuerst die Datenstrukturen zu definieren, und danach nicht ändern ! Danach darf man nur die geänderte Code-Bausteine in SPS laden.
Das mit WinCC Flex als ein "Datensicherungstool" zu verwenden habe ich auch gebastelt. Aber ich habe ein nur teilweise zufriedenstellender Lösung.


----------



## Felse (24 März 2009)

Ja das sind E/A Felder, wie gesagt hab eigentlich noch nicht soviel mit  SPS gearbeitet, hab einfach einen DB genommen, die Variablen für das Bild da rein geschrieben und fertig. Wenn ich dann was neues geschrieben habe, und neu lade sind die Werte weg, ist doch auch logisch denk ich, weil die Variablen doch dabei auf Ihren Anfangswert gesetzt werden, oder nicht? Die Anzeige z. B. bei den Stringfeldern ist ja noch zu sehen aber: die müssen trotzdem nochmal neu bestätigt werden (Bildschirmtastatur) damit sie weiterverarbeitet werden können.


----------



## Felse (24 März 2009)

JesperMP schrieb:


> Es ist ein Mängel bei STEP7, und zwar ein sehr grosse Mängel. Es ist praktisch nicht möglich die Aktualwerten zu sichern in STEP7 projekt (theoretisch geht es, in der praxis nicht).
> Die einfachste 'Lösung' ist zuerst die Datenstrukturen zu definieren, und danach nicht ändern ! Danach darf man nur die geänderte Code-Bausteine in SPS laden.


Die Strukturen müssen beibehalten werden, und ich dachte man könne diese dann als Eingangs bzw. Ausgangsparameter umherschieben.


----------



## JesperMP (24 März 2009)

Felse schrieb:
			
		

> nun hab ich das Problem, das meine Eingaben nach dem erneuten Laden in die SPS quasi gelöscht sind


Habe ich es richtig verstanden das ganze handelt darum das beim Laden von das Program auf den SPS werden die Aktualwerten initialisiert ? Oder verstehe ich das falsch ?


----------



## Felse (24 März 2009)

Ja, richtig, die Aktualwerte werden quasi gelöscht, eigentlich möchte ich diese aber irgendwo abspeichern (zur Datensicherung) und außerdem auch das diese beibehalten werden um mit den gleichen Parametern weiterzuarbeiten.


----------



## Ralle (24 März 2009)

Felse schrieb:


> Ja das sind E/A Felder, wie gesagt hab eigentlich noch nicht soviel mit  SPS gearbeitet, hab einfach einen DB genommen, die Variablen für das Bild da rein geschrieben und fertig. Wenn ich dann was neues geschrieben habe, und neu lade sind die Werte weg, ist doch auch logisch denk ich, weil die Variablen doch dabei auf Ihren Anfangswert gesetzt werden, oder nicht? Die Anzeige z. B. bei den Stringfeldern ist ja noch zu sehen aber: die müssen trotzdem nochmal neu bestätigt werden (Bildschirmtastatur) damit sie weiterverarbeitet werden können.




E/A-Felder ist klar, aber sind die auch auf Ein-/Ausgabe gestellt?


----------



## Felse (24 März 2009)

Ralle schrieb:


> E/A-Felder ist klar, aber sind die auch auf Ein-/Ausgabe gestellt?


 Ja, das meinte ich auch damit.


----------



## Felse (24 März 2009)

Kann man für die Datensicherung aus dem DB nicht die Bausteine SFC 83 und SFC84 verwenden? Wenn ja, wie?


----------



## mh-werner (6 September 2009)

JesperMP schrieb:


> Es gibt ein weitere möglicheit: In SCL gibt es der option: Create Block Numbers automatically.



Auch wenn es nicht HIERher gehört, danke für den Tipp. Ich war seit Wochen auf der Suche, warum SCL meine Werke auf dem neuen Rechner nicht mehr mag und hab auch schon den Siemens-Support wuschig gemacht, die sind auch nicht drauf gekommen. Dabei wars doch nur son klitzekleiner Haken!
:sm19:


----------



## Panzerknacker (7 September 2009)

Ralle schrieb:


> Ich habs nicht ganz verstanden, aber mal Folgendes:
> 
> Wenn du DB Offline in der Struktur änderst und neu lädst, sind die Daten immer weg, es sei denn, du hast die DB vorher aus dem AG gesichert, daraus eine Quelle erzeugt und deine Strukturänderungen an der Quelle vorgenommen. Diese dann zuückübersetzen, ins AG fertig.



Ich habe zwar schon sehr, sehr viele korrekte und Klasse Beiträge von dir gelesen Ralle, aber es gibt da schon eine relativ einfache Möglichkeit um einen DB zu erweitern ohne das die Aktualwerte verloren gehen.

1. DB ganz normal offline öffnen
2. Auf Online-Ansicht umschalten - NICHT die Brille (Status anzeigen)
3. Struktur ändern, hinzufügen, löschen, was auch immer....
4. Speichern
5. Laden
6. Offline gehen und nochmals kontrollieren ob man den Status angezeigt bekommt
7. Glücklich sein


----------



## Ralle (7 September 2009)

Panzerknacker schrieb:


> Ich habe zwar schon sehr, sehr viele korrekte und Klasse Beiträge von dir gelesen Ralle, aber es gibt da schon eine relativ einfache Möglichkeit um einen DB zu erweitern ohne das die Aktualwerte verloren gehen.
> 
> 1. DB ganz normal offline öffnen
> 2. Auf Online-Ansicht umschalten - NICHT die Brille (Status anzeigen)
> ...



Tja, man kann halt nicht alles wissen! 
Aber im Ernst, das muß ich mal durchspielen.


----------



## Panzerknacker (7 September 2009)

Ralle schrieb:


> Tja, man kann halt nicht alles wissen!
> Aber im Ernst, das muß ich mal durchspielen.



So sieht das  aus... Hauptsache man weiß wo alles zu finden ist 
Dann berichte mal wenn du es probiert hast... Wäre vielleicht noch was für die FAQ!?


----------



## Ralle (7 September 2009)

Panzerknacker schrieb:


> So sieht das  aus... Hauptsache man weiß wo alles zu finden ist
> Dann berichte mal wenn du es probiert hast... Wäre vielleicht noch was für die FAQ!?



Ich laß mich ja gerne belehren, mit normalen Variablen und mit im DB eingetragenen Struct geht das, stimmt, aber nicht mit UDT und um die ging es ursprünglich mal! Da muß nach Änderung an der UDT der Aufruf der UDT im DB aktualisiert werden und danach hat der DB in den UDT wieder deren Anfangswerte. Alle anderen Daten werden allerdings entsprechend den Änderungen in der UDT verschoben und behalten ihren aktuellen Wert. Oder mach ich was falsch?


----------



## Thomas_v2.1 (7 September 2009)

Panzerknacker schrieb:


> Dann berichte mal wenn du es probiert hast... Wäre vielleicht noch was für die FAQ!?


Danke! Bei nicht verschachtelten DBs funktioniert das auf jeden Fall. Das wäre wirklich was für die FAQ.
Endlich mal eine komfortable Möglichkeit für solche Änderungen.


----------



## Panzerknacker (7 September 2009)

@Ralle:
Man kann scheinbar mal wieder nicht alles haben - ich habs noch nicht getestet, aber was du sagst klingt einleuchtend. Okay, es ging ursprünglich um UDTs in SCL, aber die Diskussion ist wohl auch schon vorher oT gewesen. Hoffe es hilft trotzdem.

@Thomas:
Ich schau mal das ich ein wenig was mit Screenshots zusammengebastelt bekomme. An wen muss ich mich wenden um das bei den FAQ einzustellen?


----------



## Ralle (7 September 2009)

Panzerknacker schrieb:


> @Ralle:
> Man kann scheinbar mal wieder nicht alles haben - ich habs noch nicht getestet, aber was du sagst klingt einleuchtend. Okay, es ging ursprünglich um UDTs in SCL, aber die Diskussion ist wohl auch schon vorher oT gewesen. Hoffe es hilft trotzdem.
> 
> @Thomas:
> Ich schau mal das ich ein wenig was mit Screenshots zusammengebastelt bekomme. An wen muss ich mich wenden um das bei den FAQ einzustellen?



@Panzerknacker

Ja, das kenne ich !

Häng es hier hinten dran, ich verschiebe das dann in die FAQ.


----------



## Panzerknacker (7 September 2009)

Okay, werde ich morgen oder übermorgen machen sobald ich Zeit dazu habe.


----------



## Flinn (11 September 2009)

Thomas_v2.1 schrieb:


> Danke! Bei nicht verschachtelten DBs funktioniert das auf jeden Fall. Das wäre wirklich was für die FAQ.
> Endlich mal eine komfortable Möglichkeit für solche Änderungen.



Ist wirklich am einfachsten, mache ich auch immer so, guckst du hier:

http://www.sps-forum.de/showpost.php?p=71428&postcount=10

Gruß
Flinn


----------

