# DB als Speicherziel eines eigenen FB`s deklarieren



## Kiter11 (19 Februar 2009)

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


----------



## Garog (19 Februar 2009)

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:






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


----------



## vierlagig (19 Februar 2009)

ich mach mal das crosslinking: http://sps-forum.de/showthread.php?t=25666


----------



## Kiter11 (21 Februar 2009)

Garog schrieb:


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


----------



## Larry Laffer (21 Februar 2009)

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


----------



## Kiter11 (24 Februar 2009)

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?


----------



## dtsclipper (24 Februar 2009)

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


----------



## Kiter11 (24 Februar 2009)

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


----------



## dtsclipper (24 Februar 2009)

Ich schätze mal die Variable #IN1 ist als "BLOCK_DB" definiert.

In dem Fall sollte der Code dann etwa so aussehen:

```
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


----------



## Kiter11 (24 Februar 2009)

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.


----------



## Kiter11 (24 Februar 2009)

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        ??????


----------



## dtsclipper (24 Februar 2009)

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


----------



## Kiter11 (24 Februar 2009)

ICh habe Namen dafür vergaben, nur dachte ich das Ihr mit den Standart besser versteht was ich meine.


----------



## dtsclipper (24 Februar 2009)

Kiter11 schrieb:


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



Die einfache Version wäre:

```
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...


----------



## Kiter11 (24 Februar 2009)

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!?


----------



## dtsclipper (24 Februar 2009)

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


----------



## Kiter11 (24 Februar 2009)

Alles klar, dann werde ich das erst mal testen, viele Dank noch mal für Deine Hilfe.


----------



## Kiter11 (24 Februar 2009)

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.


----------



## Larry Laffer (24 Februar 2009)

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


----------



## Kiter11 (24 Februar 2009)

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.


----------

