DB als Speicherziel eines eigenen FB`s deklarieren

Kiter11

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

ich habe folgendes Problem.

Ich habe einen FB geschrieben der ein Eingangsignal verarbeitet und mehrere Werte als Doppelwert herausgibt.
Der FB hat natürlich seinen eigenen DB (Instanz).
Ich möchte nun aber beim Aufruf des FB´s, das der Nutzer dieses FB sich aussuchen kann in welchen DB er die Ausgangdaten ablegen kann (da ich ja im Vorfeld nicht weiß in welchem Projekt welcher DB noch frei ist.)

z.B. Der Nutzer xy, ruft den Baustein auf und muss dann als Ausgangsvariable einen DB angeben aus dem er dann später die Nutzdaten ziehen kann.


Frage ist nun wie deklariere ich diesen in meinem FB, als In, Out oder In/Out. Was für ein Format muss ich nutzen (Any ...?) und wie deklariere ich den DB dann in meinem Programm z.B mov doppelwort nach DB????.DBD???

Ich hoffe ich konnte mein Problem plausibel dalegen und hoffe auf eure Hilfe
 
hmm.. verstehe ich nicht so ganz...

also du hast einen FB geschrieben...
wenn du in diesem FB Variablen nutzt die du unter "STAT" angelegt hast, werden diese in dem Instanz DB generiert.
Wenn du den FB aufrufst kann du ja aussuchen wie der DB zum FB heißen soll.

oder meinst du das du interne "Ergebnisse", aussen zur Verfügung stellen willst?

hier mal ein Bild:
bsp.jpg


Oben bei Schnittstellen legst du deine Ein/Ausgänge fest die du im FB benutzen möchtest und beim Aufruf des FB's von aussen beschreiben kannst.
Temp sind temporäre Variablen (bei jedem Zyklus wieder 0). Unter Stat sind Werte die der FB in dem Instanz DB ablegt.

Du kannst auch anstatt M1.0, M1.1, MW1 oder MW3 unter "Schnittstelle -> IN" einen Eingang erstellen an dem du dann später irgendeinen Eingang "anschließen" kannst.
So hast du einen FB geschrieben der z.B. eine Berechnung oder einen Vergleich von XY durchführt, XY kann sich der Benutzer durch das Beschreiben der FB Schnittstelle dann selber aussuchen. Ob es nun E1.0 oder E100.0 sein soll. Als kleine Beispiel mal nur ;)
 
Zuletzt bearbeitet:
hmm.. verstehe ich nicht so ganz...

also du hast einen FB geschrieben...
wenn du in diesem FB Variablen nutzt die du unter "STAT" angelegt hast, werden diese in dem Instanz DB generiert.
Wenn du den FB aufrufst kann du ja aussuchen wie der DB zum FB heißen soll.

oder meinst du das du interne "Ergebnisse", aussen zur Verfügung stellen willst?



Hallo, schon mal Danke für die Antwort.

Ich möchte die im FB erarbeiteten Daten aussen zur Verfügung stellen.
Die Daten selber werden nicht mehr weiterverarbeitet, sie dienen nur noch zur Visualisierung.
Es sind aber 160 Doppelwörter die dieser FB kontinuierlich ausgibt.
Das Problem ist also, das der Nutzer diese Programms keine lust hat beim Aufruf des Programms alle 160 (In/outs) zu beschriften (deklarieren).
Deshalb habe ich Programm intern (also im FB) mir einmal die Mühe gemacht, alle Daten in einen seperaten DB abzuspeichern. Das war bis dahin schon viel einfacher und sauberer. Der Nutzer brauchte dann seiner Visu nur noch zu sagen, das in dem DB XX die Nutzdaten sind.

Das Blöde ist nun aber, das ich im Vorfeld nicht weiß, welcher DB noch frei ist. Beim Aufruf des FB´s kann der Nutzer wie du schon gesagt hast, den Instanz DB selber wählen.
Den "Speicher-DB" habe ich bis jetzt aber selber fest deklariert.

Nun möchte ich das der Nutzer den FB aufruft (call FB xx) dann erscheint ja der "Kasten" mit den In/out Variablen. Und dort soll er dann einen DB angeben.
In diesen soll mein Programm dann die Nutzdaten ablegen.

Die Frage ist, wie mache ich das?
 
Hallo,
so wie ich das sehe hast du 3 Möglichkeiten :

1. wenn der Kunde die ermittelten Daten deines FB's "nur noch" visualisiert, dann lass sie ihn doch direkt aus dem I-DB deines FB nehmen ...

2. Du nimmst einen IN-Parameter, der als BLOCK_DB deklariert ist, baust dir daraus einen Pointer und schiebst deine Daten in die Datenworte 0..x des besagten DB's. Der Kunde übergibt in dem Fall als Parameter den DB seiner Wahl.

3. Du nimmst einen IN-Parameter vom Typ ANY. Hier kann der Kunde dann ggf. nicht nur den DB sondern auch das Anfangs-DW festlegen, wohin die Daten deines FB's geschrieben werden. Hier musst du dann den ANY zerlegen und dann entsprechend wie bei 2. verfahren ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

vielen Dank schon mal für die Antworten.
Die Variante 3 sagt mir am meisten zu, da man, wie Du schon sagst, dann auch die Anfangsadresse aussuchen.
Fals ich nämlich mal meinen FB 2 mal aufrufen will kann ich dann ja immernoch die 160 zusätzlichen Daten in den selben DB schreiben.

Nun die "blöde" Frage, wie zerlege ich den Any und warum? und wie mache ich das mit dem Pointer?
 
Ich würde Larry's Nummer 2 nehmen, aber abgeändert:

Block_DB für den Speicher-DB
DINT für erstes Speicherwort in o.A. DB

dtsclipper
 
Ich habe das jetzt mal so versucht wie ich das verstanden habe.
Habe als IN einen Datentyp Block_DB gewählt.
Beim Aufruf des FB`s erscheint dann dieser und ich kann an dieser Stelle einen DB meiner Wahl eintragen. Bis hierher alles OK.
Nun möchte ich an z.B. meinen "MOVE-Baustein" der DWORD herausgibt ja deklarieren wo er denn in dem DB dieses DWORD hinzuschieben hat. Aber wie??
Sobald ich "#IN1" eingebe,meckert S7 mit dem Dialog, das Aktualdatentyp Block nicht zum Formalen Typ DWORD des Formalparameters passt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich schätze mal die Variable #IN1 ist als "BLOCK_DB" definiert.

In dem Fall sollte der Code dann etwa so aussehen:
Code:
AUF #IN1

Damit wird nur der DB geöffnet.

Die Adresse in diesem DB muss noch definiert werden.

Nimmst Du den KOP/FUP-MOVE oder den SFC 20 ?

dtsclipper
 
Ich habe bisher alles im FUP gemacht, da ich gerade erst angefangen habe S7 zum Programmieren und nicht nur als "Online nach Fehlern in der Anlage zu suchen".

Deswegen wird es jetzt auch kompliziert auf einmal AWL hinein zu bekommen, aber wenn es sein muss.
 
Also ich habe ja die Information die ich in den DB?? schreiben möchte ja als STAT in meinem Instanz DB.

Folgenden Befehl habe ich jetzt mal ausgeführt nur Fehlt mir wie gesagt die letzte genaue deklaration.


AUF #IN1
L STAT1
T ??????
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ops, wusste ich nicht...

Dann wie im Bild, Statt meines DB21 Dein #IN1.

Ach, Kiter11, tue Dir selbst einen Gefallen: Gib Variablen immer einen hübschen Namen, Hier z.B. #Daten_DB oder so...
Das macht es auf Dauer leichter...
 

Anhänge

  • 000_SIEMENS_3.jpg
    000_SIEMENS_3.jpg
    8,1 KB · Aufrufe: 5
Also ich habe ja die Information die ich in den DB?? schreiben möchte ja als STAT in meinem Instanz DB.

Folgenden Befehl habe ich jetzt mal ausgeführt nur Fehlt mir wie gesagt die letzte genaue deklaration.


AUF #IN1
L STAT1
T ??????

Die einfache Version wäre:
Code:
AUF    #IN1 // Aufruf des Speicher-DBs
L        STAT1  // L Daten aus Instanz-DB
T        DBD0    // T Daten in Speicher-DB

L        STAT2
 T        DBD4

STAT1 war DWORD wenn ich mich recht erinnere...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke übrigens schon mal für Deine Hilfe.

So vom Quellcode her hat alles geklappt.
Ich habe erst mal nur eine Variable "programmiert" zum testen.

Wann wird denn eignetlich der DB, den ich am FB zum "abspeichern" deklariere erstellt, oder muss ich den noch selbst erstellen? (wäre auch nicht schlimm)
Ich dachte nur eigentlich das der beim aktualisieren der Multinstanzen und deklarieren des FB fragt, ob er (S7) den gewählten DB erstellen soll so wie beim Instanz DB!?
 
Den Speicher-DB mußt Du erstellen, und zwar als Global-DB, da er ausserhalb der Instanz ist.

S7 generiert leider nur die reinen Instanz-DBs...

dtsclipper
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Klappt soweit super.

Eine Sache irritiert mich allerdings. Ich möchte dem Nutzer des FB ja letztendlich so wenig arbeit wie möglich machen.

Wenn ich nun z.B. den DB222 als Global_DB nehme, dann klappt das auch alles soweit.

Nur wenn ich nun auf den DB222 selber gehe und mir Online anzeigen lassen möchte was da so alles drin steht, sehe ich da nur einen INT als vorläufigen platzhalter.
Sobald ich als TYP DWORD eingebe und übertrage, zeigt er mir zumindest diesen einen schon mal richtig an.
Gibt es einen Trick, das der DB sich da selbst seinen Bereich erstellt? Ich meine "übermitteln" tue ich ihm ja alles, er müsste sich nur selbst drauf einstellen.

Ich möchte ja schließlich nicht jedes mal wenn ich diesen FB benutze einen DB erzeugen müssen und diesem den Bereich von 160 DWORD vorgeben.
 
... doch, das wirst du müssen.
Es gibt allerdings schon die Möglichkeit, sich die Dinge zu vereinfachen.
Du gibst für deinen Datenbereich eine UDT-Struktur vor - jetzt mußt du nur die UDT in den DB packen ...
Oder du erzeugst ihn per SPS-Befehl (gefällt mir aber in diesem Zusammenhang gar nicht).

Gruß
LL
 
Habe eine relativ einfache Lösung, aber vieleicht gibt es ja eine Bessere.

Ich erstelle einfach einmal einen DB (Global) den ich mit dem FB zusammen in die "Anlagen" einbaue. Den Global DB beschrifte ich dann einfach mit der Nummer die noch frei ist und deklariere diese am FB dann für den Block_DB.

Fals es doch einen Trick gibt, das der DB, seinen Bereich und den Datentyp aufgrund der Informationen die ihm gesendet werden, selbst festlegt, dann bitte bescheid sagen.
 
Zurück
Oben