UDT als FC-Parameter

Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
als Neuling in der STEP7-Welt (V5.5) suche ich momentan nach Mitteln und Wegen, wie man ein SPS-Programm möglichst sauber strukturiert aufbauen kann.
Dazu folgendes Detailproblem:

Teil 1:

Folgende Bausteine sind vorhanden:

UDT1 Usertyp
DB1 vom Usertyp
DB2 mit Element UTE vom Usertyp
FC1 mit In-Out-Parameter IOPar vom Usertyp

Funktionsaufruf:
Code:
CALL "FC1"
    IOPar := DB1 // funktioniert nicht

CALL "FC1"
    IOPar := "DB2".UTE // funktioniert
Warum ist das so und wo in der Dokumentation kann man so etwas nachlesen?

Teil 2:

Folgende Bausteine sind vorhanden:

UDT1 Usertyp_Oberelement
UDT10 Usertyp_Unterelement

DB1
mit Element UOE vom Usertyp_Oberelement
mit Element UUE vom Usertyp_Unterelement

FC1 mit In-Out-Parameter IOParUOE vom Usertyp_Oberelement
FC10 mit In-Out-Parameter IOParUUE vom Usertyp_Unterelement

Aufruf von FC10 in FC1:
Code:
CALL "FC10"
    IOParUUE := #IOParO.UUE // keine Chance

CALL "FC10"
    IOParUUE := "DB1".UOE.UUE // funktioniert ist aber ein verdeckter Zugriff auf GlobalDB
Wieder die Frage: Warum ist das so und wo in der Dokumentation kann man so etwas nachlesen?
Eigentlich wollte ich durch die Strukturierung verdeckte Zugriffe auf Globaldaten vermeiden.

Ich hoffe ich habe mein Anliegen verständlich formuliert und jemand von Euch Profis kann helfen.

Grüße
Reinhard
 
Hallo,

Struktur (UDT) anlegen. Im DB einfügen.
Die UDT öffnen. Alles markieren.

Im FC oben bei IN (oder IN/OUT usw..) einfügen.

Beim Aufruf des FC die UDT anlegen (Rechtsklick, Symbol einfügen, Structur im DB suchen und auswählen.

Code:
CALL "FC1"     IOPar := DB1 // funktioniert nicht  
CALL "FC1"     IOPar := "DB2".UTE // funktioniert
Erster Aufruf: übergabe IOPar kann ja kein kompletter DB sein. Die Struktur, die von "aussen angelegt wird, muss die gleiche sein, wie die im Deklarationsteil des FC. Deswegen stimmt Aufruf 2 ja auch überein.


Code:
CALL "FC10"     IOParUUE := #IOParO.UUE // keine Chance  
CALL "FC10"     IOParUUE := "DB1".UOE.UUE // funktioniert ist aber ein verdeckter Zugriff auf GlobalDB
Aufruf 1. Hast du #IOPar0.UUE im Deklarationsteil (In,Inout,Stat,Temp) des aufrufenden FC/FB? (Also in diesem Baustein?)

Aufruf 2. Dort übergibts du wieder die richtige Struktur an den FC10.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein Datenbaustein ist selber immer eine Struktur.
Also das oberste Strukturelement ist immer DB<nummer> oder eben der symbolische Name des Datenbausteins.
Dass dieses so ist, sieht daran dass man im DB-Editor immer der erste Eintrag in der grauen nicht änderbaren Zeile Typ Struct und am Ende End_Struct eingetragen wird. Der Name ist leer, da dieser eben die DB-Nummer bzw. der Name ist.

Dein Aufruf
Code:
CALL "FC10"
    IOParUUE := #IOParO.UUE // keine Chance
kann nicht funktionieren weil #IOParO.UUE hier noch keinen Speicher hat.
Du musst aus der UDT-Schablone erst eine Instanz in einem Datenbaustein anlegen.

Andere Möglichkeit:
Wenn du den Aufruf in einen FB packst und in den temporären oder statischen Daten eine Variable vom Typ "IOParO" mit Namen "IOParO" anlegst.
 
Wenn du Strukturen übergibst hat das leider grundsätzlich den Nachteil, das Zugriffe im FB/FC auf diese Struktur nicht in der Referenzliste erscheinen. Man findet sich daher u.U. in derartigen Programmen nur schwer zurecht. Das ist der Hauptgrund, warum ich das nur in Ausnahmefällen mache und lieber direkt mit den Daten aus einem oder mehreren Global-DB arbeite. Aber das ist ja nicht nur bei Strukturen so, auch bei indirekter Adressierung geht die Übersicht schnell verloren.
 
Wow, das ging aber schnell! Vielen Dank für die zahlreichen Antworten.

@Verpolt
Struktur (UDT) anlegen. Im DB einfügen.
Die UDT öffnen. Alles markieren.

Im FC oben bei IN (oder IN/OUT usw..) einfügen.

Beim Aufruf des FC die UDT anlegen (Rechtsklick, Symbol einfügen, Structur im DB suchen und auswählen.
und
Hast du #IOPar0.UUE im Deklarationsteil (In,Inout,Stat,Temp) des aufrufenden FC/FB? (Also in diesem Baustein?)
Ich denke das Anlegen der UDTs, DBs und Funktionsparameter sollte soweit funktioniert haben. Jedenfalls konnte ich in den Editoren die Strukturelemente gemäß meinen Wünschen sehen (auch im Schnittstellenbaum im Deklarationsteil der FCs)

Ich möchte kein langes Gerede über offensichtliche Irrwege machen aber:
Ich war intuitiv davon ausgegangen, dass ein von einem UDT abgeleiteter DB mit einem vom gleichen UDT abgeleiteten Parameter kompatibel ist.

@Thomas_v2.1
kann nicht funktionieren weil #IOParO.UUE hier noch keinen Speicher hat.
Du musst aus der UDT-Schablone erst eine Instanz in einem Datenbaustein anlegen.
Ich dachte die Struktur wird als Zeiger übergeben, d.h. zur Laufzeit tritt der Speicherbereich im (bereits angelegten) DB1 (also DB1.UOE) an die Stelle des Parameters. Aber da habe ich wohl zuviel vom Compiler erwartet.

@Ralle
Der Hinweis mit der Referenzliste ist wirklich ein Punkt den man bei der Konzeptfindung bedenken sollte!

Danke nochmal für Euer Interesse. Ich muss einfach noch mehr Erfahrungen sammeln, um kreativ mit STEP7 umgehen zu können.
 
Sind dies nicht zwei Gegensätze die du zusammenbringen willst?
Step7 und kreativ? :confused:
Oh, oh und das von einem erfahrenen Benutzer ... das raubt mir die letzten Illusionen. Aber mal im Ernst und zu Deiner Beruhigung: bunte Bilder malen wollte ich nicht. (Ich sollte wohl besser auf meine Wortwahl achten. :wink:)
 
Sind dies nicht zwei Gegensätze die du zusammenbringen willst?
Step7 und kreativ? :confused:


bike

ich suche gerade den daumen nach unten bottum ;)

kreativität hängt ja wohl vom programmierer ab oder nich? und ich finde mit step7 hat man ein gutes werkzeug dafür bei großen projekten wünschte ich mir noch eine ordner struktur im programm (in tia "würg" vorhanden) aber immernoch handlicher wie z.b. twincat o.ä. aber eigentlich ist ja alles irgendwie gewohnheit und erfahrung :rolleyes:
 
Programmieren ist meiner Meinung nach zuerst und hauptsächlich Handwerk.

bike

:evil:

Die Einschätzung ob Kunst oder Handwerk liegt im Auge des Betrachters.
Viele hier im Forum betreiben Programmierung mit der Leidenschaft und dem Herzblut eines Künstlers! Und in vielen hier vorgestellten oder diskutierten Lösungen steckt mehr Kreativität als in so manchem Gemälde.
Also ich persönlich teile deine Meinung nicht!

Gruß
Dieter
 
Oh, oh und das von einem erfahrenen Benutzer ... das raubt mir die letzten Illusionen. Aber mal im Ernst und zu Deiner Beruhigung: bunte Bilder malen wollte ich nicht. (Ich sollte wohl besser auf meine Wortwahl achten. :wink:)

Bleib ganz entspannt, du siehst das schon korrekt.

...Und erfahrener Benutzer ist man im Forum schon ab 100 Beiträgen. Deren Inhalt wird dabei leider nicht bemessen, du kannst also auch 100 Beiträge im Stammtisch mit Witzen füllen und bist dann erfahrener Benutzer.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
:evil:

Die Einschätzung ob Kunst oder Handwerk liegt im Auge des Betrachters.
Viele hier im Forum betreiben Programmierung mit der Leidenschaft und dem Herzblut eines Künstlers! Und in vielen hier vorgestellten oder diskutierten Lösungen steckt mehr Kreativität als in so manchem Gemälde.
Also ich persönlich teile deine Meinung nicht!

Gruß
Dieter

Diese Kreativität ist es aber am Ende oft der Schweiß der Instandhalter.

Ideen sind immer gut und wichtig und richtig.
Doch ich kann und möchte nicht abschätzen wie viel Geld durch künstlerische Eingebungen kaputt gemacht wird.
In einem Team, und in meinen Augen ist Programmieren von Projekten nur im Team sinnvoll, kann jeder seine Ideen verwirklichen, doch muss dies von den Kollegen und , was noch viel wichtiger ist, dem Kunden verstanden werden und es muss in ein Konzept passen.
Was und wem hilft es, wenn eine Lösung künstlerisch wertvoll ist, aber außer dem Künstler mit dieser Kunst keiner arbeiten kann?


bike
 
Du solltest mal dein Kunstverständnis überdenken!
Kunst kann sich auch durch eine klare reduzierte Formensprache auszeichnen.

Dieter

Werde ich tun. Nur ist mir nicht klar was das Ergebnis sein soll. :confused:

Zur Zeit habe ich mit "Kunst" zu tun und daher bin ich etwas allergisch dagegen.
Es haben bei uns junge Künstler von der UNI 2 Jahre lang gekünstelt, jetzt darf ich da weiter künstlern, doch will ich das?



bike
 
Zurück
Oben