TIA DB-Offset herausfinden

Torpedo_Tommy

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

nach kurzer Frage an Dr. Google gibt es hier meine Prämiere.

Zu meiner Fragestellung:
Ich habe eine Anlage mit vielen Ventilen. Diese Ventile sind alle in einem DB_Ventile eingetragen. Hinter jedem Ventil liegt ein Struct mit ettlichen Informationen.
Jetzt wurde ein Baustein erstellt, welcher Ventilgruppen überwachen soll. Um die zu beobachtenden Ventile parametrierbar zu machen wird an die Eingänge des FCs der DB-Offset der zugehörigen Ventile angegeben.

Gibt es eine Möglichkeit nicht immer den Offset heraus zu kramen? Ich stelle mir das so vor, dass man die erste Bool Variable des gewünschten Ventils angibt und dann im FC intern über Pointer die gewünschten Informationen bekommt.

Zum verwendeten System:
Siemens CPU313C
TIA Portal V13 SP Update8
Programmiert wird in AWL

Danke im Voraus
Thomas
 
Übergib dem FC nur eine einzelne Struct Ventil (oder auch UDT "Ventil") per IN_OUT, dann braucht man im FC gar keine Adressen/Offsets berechnen und kann schön symbolisch operieren.

Man könnte auch die Struct Ventil in ein Array of Struct Ventil packen und per IN_OUT an den FC übergeben sowie die Array-Indexnummer. Doch dann verliert man die Möglichkeit, den Array-Structs verschiedene Symbole und Symbolkommentare zu geben.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

danke für die tolle und schnell Antwort.
Deine Lösung funktioniert!

Mein Bedenken ist jetzt die Laufzeit....

Jedes Ventilstruct besteht aus 20Byte und pro Bausteinaufruf werden 10 Ventile geöffnet. Dazu kommen noch ähnliche Bausteine die für Motoren bzw. Analogwerte zuständig sind....
Je nach Anlagen sind das dann >7000Byte pro Zyklus die verarbeitet werden müssen....

Ich werde das vll mal nächste Woche versuchen und schauen, wie sich die Zykluszeit verhält.

Oder gibt es denn einen anderen Weg? Wie gesagt evtl. über Pointer? Weil pro Struct muss ich nur auf 3-4 Bool Variablen zugreifen.

Thomas
 
Wenn Du die Struktur an IN_OUT an den FC übergibst, dann wird nicht die ganze Struktur kopiert sondern nur die Adresse an den FC übergeben. Der FC muß im Hintergrund zwar mehr rechnen um auf die Strukturmember zuzugreifen (ca. 40 Byte Programmcode mehr als normal bei jedem Zugriff), doch bei Zugriff auf nur 4 Bools sollte das noch effizienter sein als die Structs zu kopieren.

Wenn Du die Übergabe extra als POINTER deklarierst, dann erreichst Du auch nichts anderes, als was bei Struct an IN_OUT passiert, verlierst aber die Typprüfung des Compilers beim FC-Aufruf und mußt im FC wieder undurchsichtige Adressberechnungen betreiben.

Harald
 
Hallo nochmal,


ich habe jetzt die vorgeschlagenen Vorgehensweisen getestet.
Mit einer CPU 315 2DP habe ich in einem Loop 500 Durchläufe des Bausteins programmiert. Sonst ist die CPU leer.


Zuerst hab ich den momentanen Baustein durchlaufen lassen und hatte eine Zykluszeit von 60ms.


Das Programm mit den Änderungen der Eingänge auf IN/OUT und als UDT übergeben, ergab eine Zykluszeit von 97ms. Programmtechnisch gab es sonst keine Änderungen.


Somit ist das für mich keine Option mehr.


Ich bedanke mich aber für die schnellen und auch wirklich hilfreichen Antworten!
Bis zur nächsten Frage^^
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Torpedo,

in Step7 Classic habe ich in diesem fall immer die Ventilnummer am Bausstein übergeben.
Du weißt ja gewiss wie lang die Daten eines Ventils sind dann kannst du dir den offset ja in deinem Baustein berechnen.

Gruß

Jens
 
Hallo Torpedo_Tommy,

wenn du auf die Signale mehrmals im Baustein zugreifst, kannst du auch mal probieren die Bits am Anfang des Bausteins in Lokale Variablen zu kopieren und mit denen zu arbeiten.
Alternativ kannst du die Struktur auch als Datentyp ANY übergeben, und innerhalb des Bausteins DB-Nummer und Startadresse von dort auslesen.

Grüße
Dominik
 
Zurück
Oben