UDT in SCL erstellen

Felse

Level-1
Beiträge
221
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
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
Code:
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:
Code:
VAR_INPUT
.
.
END_VAR
Wenn ja, wie?
 
Entweder du schreibst es absolut:

Code:
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:

Code:
TYPE Messwerte
    STRUCT
    // Typbeschreibung

    END_STRUCT

END_TYPE

Wobei xxx immer die gewünschte Nummer ist.
 
Danke, das geht schonmal, wenn ich diese UDTs dann als array aufrufen will (sofern das geht) Quasi:
Code:
VAR_INPUT
    
    ARRAY [1..5] OF UDT;
    
END_VAR
1. Wie geht das?
2. Kann man dabei trotzdem die einzelnen Variablen des UDTs verarbeiten?
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, das geht schonmal, wenn ich diese UDTs dann als array aufrufen will (sofern das geht) Quasi:
Code:
VAR_INPUT
    
    ARRAY [1..5] OF UDT;
    
END_VAR
1. Wie geht das?
2. Kann man dabei trotzdem die einzelnen Variablen des UDTs verarbeiten?

1.
Code:
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.
 
@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 :
Code:
x := myArray[2].UDT_Variable_1 ;

Gruß
LL
 
Ich hoff mal das hab ich soweit verstanden, aber wie nutz ich das in einem FB? Hatte gehofft dass würde so gehen:
Code:
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

Code:
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.
 

Anhänge

  • Felse_FB6.jpg
    Felse_FB6.jpg
    109,4 KB · Aufrufe: 33
Zuletzt bearbeitet:
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?
 

Anhänge

  • Unbenannt.bmp
    131 KB · Aufrufe: 22
... 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 ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... 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?
 
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
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 ?
 
Zurück
Oben