Datenbereich Typ Any im FB auslesen

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich hab da so ein kleines Problem, ich möchte in einer S7-315 2DP in einem DB insgesamt 144 Zähler installieren. Den DB habe ich über ARRAYs erstellt. Nun hab ich mir einen FB geschrieben, womit ich jeweils 8 Zähler addieren kann (Formaloperanden, da ich das nicht 144 mal programmieren will :D ). Jedenfalls möchte ich als Aktualoperanden später nur noch ein Byte sowie den Start der jew. 8 Wort-Blöcke im DB angeben, wenn ich den FB aufrufe.
Wenn ich als Formaldatentyp in der Deklaration ANY angebe kann ich beim FB-Aufruf das ganze mit p#DB106.dbx0.0 byte 16 beschalten. Nur wie muss ich den FB konfigurieren das er mir die 16 Byte auf 8 einzelne Worte trennt, so dass ich weiterarbeiten kann??

Gruß Jörg
 
Du musst in der FB Schnittstelle das gleiche Array definieren. Ich würde das ganze über einen UDT mit deinen acht Wörtern lösen.
Mit der UDT hast du den Vorteil, dass du sie 144 als Array im DB aufrufen kannst und einmal in deinem FB. ==> Namensgleichheit und keine Probleme bei der Symbolischen Adressierung.

UDT: hier kannst du dir auch Tipparbeit Sparen wenn du Array's nimmst. Z.B.

UDT1

Zaehlerwert vom Typ Array [1..8] of INT


DB 1

Zaehler vom Typ Array [1..144] of UDT1


FB 1 In/Out Variable

Zaehler vom Typ UDT1

Jetzt kannst du der FB symbolisch Db1.Zaehler[1] die kompletten 16 Byte zuweisen. Im Fb1 kannst du über Zaehler.Zaehlerwert[1] auf die einzelnen Wörter zugreifen.

Natürlich verwendest du auch für Db1, Udt1, und Fb1 Symbolische Namen, dann sieht's richtig elegant aus. Bei Problemen nachfragen...

Gruß, Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ach noch was...

Ich würde das ganze in SCL schreiben... Dann kannst du eine Schleife 1..144 programmieren und die Array's über den Schleifenzaehler instanzieren. Ruck Zuck ist die Schose fertig.

Gruß, Christian

PS: Für die Lösung mit nem Udt,Db und Fb hab ich dir ein kleines Beispiel Beispiel mit deinen 144 Zaehlern gemacht. Schreib mir ne PM mit deiner Mail, dann schick ich dir das Ganze.
 
Wenn du kein SCL hast oder es nicht benutzen willst, gibt es auch noch eine weitere Variante:

1. Du definierst ein UDT mit den 8 Zählerworten.
2. Du erstellst einen DB, der diese UDT enthält (Array of UDT)
3. Du übergibst im FB kein Any, sondern den Typ UDT als INOUT.

Im FB kannst du dann auf die direkte Symbolik der UDT durchgreifen, um damit zu arbeiten. An die FB-Schnittstelle schreibst du dann jeweils (am besten symbolisch) die entsprechende UDTx aus dem DB.
 
So, ich bin der Gast ganz oben, irgendwas hat wohl meinen Namen verschluckt :lol:

Schon mal Dank für die schnellen Antworten!

@xhasx
Wäre klasse wenn du mir das beispiel schicken könntest

joerg_Salzmann@gmx.de


Gruß Jörg
 
Hallo,

wäre es nicht das einfachste nur das Startbyte zu übergeben und innerhalb des Fbs mit indirekter Adressierung zu arbeiten?

Torsten
 
Zurück
Oben