Step 7 Block_DB für FB Parameter verwenden

MC_DARKSTONE

Level-1
Beiträge
25
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
ich möchte in einem FC ein SFB aufrufen und ein Block_DB übergeben bzw. die Parameter des SFB sollen auf diesen Block_DB zugriefen

OB1:
Call FC1
BlockDBSFB:= DB12 // DB für SFB12
BlockDBSpeicher:=DB250 // dient als Speicher bereich

FC1:
Call SFB12, #BlockDB12
REQ :="DatenDB".SendReq //DB250.DBX1316.0
R :="DatenDB".SendReset //....
ID :=W#16#1000
R_ID :=DW#16#0 //for ASCII and 3964(R) always zero
DONE :="DatenDB".SendDone
ERROR :="DatenDB".SendError
STATUS:="DatenDB".SendStatus
SD_1 :=P#DB250.DBX 23.0 WORD 20 // Anypointer soll auch auf BlockDBSpeicher zugreifen
LEN :="DatenDB".LEN

Anstelle von "DatenDB" (DB250) soll der verweis auf das BlockDBSpeicher gemacht werden.
REQ:= BlockDBSpeicher.DBX1316.0
SD_1:= P#BlockDBSpeicher.DBX23.0 Word 20

Dies hat den hintergrund das der FC1 geschütz werden soll aber durch die Weitergabe der DBnummer mit jeder beliebigen DBnummer gearbeitet werden kann.

Vor dem CALL SFB arbeite ich mit AUF DB[#vari] somit kann ich auf ein Variablen DB zugreifen aber wie geht das bei dem CALL SFB aufruf.
Um konflikte zu vermeiden Lade / Trans ich vor jedem CALL SFB & AUF DB... , das Adressregister1&2 in eine Tempvari.
Ich möchte die DBs Variabel halten!

Gruß Erick
 
Zuletzt bearbeitet:
Hallo,
der Datentyp Block_DB lässt keine Rückschlüsse auf den wirklich übergebenen DB bzw. dessen Aufbau zu.
Somit kannst du den so, wie von dir gewünscht, nicht einsetzen (Daten_DB).
Beim SFB12 funktioniert das deswegen, da der Aufruf die Brauchbarkeit des übergebenen DB's zur Entwicklungszeit nicht gegencheckt. Das macht dann erst die CPU und wenn es da dann nicht passt dann geht halt die in Stop.

Das, was du vorhast, ist m.E. nur machbar, wenn du auf der Schnittstelle den Datentyp als DB250 bzw. seinen symbolischen Namen angeben würdest ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich das richtig verstehe kann ich für den IDB von SFB12 nicht den Block_DB verwenden "CALL SFB12, #BlockDBSFB"

Für die Parameter des SFB12 bekomme ich nur ein variablen DB wenn ich diesen mit einem festen Symbolischen namen deklariere. "DatenDB"

Was mache ich mit dem AnyPointer?
Wenn ich diesen wie hier http://www.sps-forum.de/faq/12923-any-zeiger-fuer-datentypen.html beschrieben erstelle, wie kann ich diesen dann übergeben?
// ------------------------
// AnyPointer erstellen P#DB250.DBX.23.0 WORD 20
// ------------------------

L B#16#10 //10h für s7
T "DatenDB".DBB1400
L B#16#4 //Typ BYTE
T "DatenDB".DBB1401
L 20 //Anzahl (Wiederholungsfaktor)
T "DatenDB".DBW1402
L 250 // Datenbaustein 250
T "DatenDB".DBW1404 //
L 23 //Anfangsadresse
SLD 3 //Pointer bauen
T "DatenDB".DBD1406
L B#16#84 //Speicherbereich (hier DB)
T "DatenDB".DBB1406

So sollte ab "DatenDB".DBB1400 ein Anyointer stehen aber wie übergebe ich diesen an den SFB12
Gruß Erick
 
Wie gesagt, ich möchte Direkteadressierung vermeiden da der Benutzer selbst entscheiden soll welcher DB er verwenden möchte bzw. welcher DB noch frei ist.

Ich könnte über den Operandenvorrang auf die Symbolische stellen somit kann ich den DB250 umbenen in DB290 und die zuweisung bleibt gleich.
Aber dies geht nur zum test denn später soll nur ein DB mit einem Array deklariert werden ohne infos/symbole.

Am besten wäre eine Lösung in der ich DatenDB.DBX1316.0 schreiben könnte oder wenn ich mit Pointer arbeiten könnte was mir aber ROT makiert wird :cry:

AUF DB [#nummer]
...
CALL SFB12, ????
REQ:= DatenDB.DBX1316.0 // fehler
REQ:= DBX [AR1, P#0.0] // fehler

Hinzu kommt das der DB vom Anypointer variable bleibt sowie der IDB vom SFB12
Ich könnte den AnyPointer zwar selbst konstruieren und in den DatenDB speichern aber wie gebe ich diesen dann im CALL SFB12 an
 
Zuletzt bearbeitet:
Hi Larry,
ich habe es nun so gemacht das ich nicht mehr dem "datenDB" arbeite sindern mit temp.
Nun habe ich aber das Problem das ich den Anypointer nicht zuweisen kann.
Ich möchte über den FC aufruf ein Anypointer "AnyX" übergeben und diesen dann an den SFB weiter geben.
CALL FC
AnyX:=P#DB....

// innerhalb des FC
CALL SFB 12 DB12
.....
SD_1:=#AnyX // fehler

"Deklarationsberecih der Aktualseite VAR_INPUT passt nicht zum formalen Deklarationsbereich VAR_IN_OUT des Formalparameters SD_1"
Wenn ich AnyX als IN_OUT angebe geht es auch nicht, nur wenn AnyX als Temp deklariert ist.

Kann ich die VAR_INPUT "AnyX" auf ein TEMP "AnyXX" transferieren?
Ich habe es hiermit versucht:
L P#AnyX
T P#AnyXX //fehler

Gruß
Erick
 
Zuviel Werbung?
-> Hier kostenlos registrieren
FC: ANY von IN nach TEMP kopieren

Du mußt den ANY von IN nach TEMP kopieren, dann kannst Du den Temp-ANY an Bausteinaufrufe weitergeben.
Code:
      L     P##IN_ANY
      LAR1
      L     P##TEMP_ANY
      LAR2

      L     D [AR1,P#0.0]
      T     D [AR2,P#0.0]
      L     W [AR1,P#4.0]
      T     W [AR2,P#4.0]
      L     D [AR1,P#6.0]
      T     D [AR2,P#6.0]

Harald
 
Dies hat den hintergrund das der FC1 geschütz werden soll aber durch die Weitergabe der DBnummer mit jeder beliebigen DBnummer gearbeitet werden kann.
Du könntest Deinen Baustein einfach als (multiinstanzfähigen) FB erstellen, da brauchst Du keinen Schmier-DB übergeben.

Das könnte dann vermutlich sogar so professionell aussehen, daß Du den Programmcode nicht hinter einem Bausteinschutz verstecken musst... ;)

Harald
 
Ich sehe das so wie Harald.
Was spricht dagegen, dass was zusammen gehört, auch zusammengehörig zu erstellen ?
In einen FB kannst du ja sogar weitere FB's in die Instanz integrieren und brauchst so keine zusätzlichen "externen" DB's mehr (die ja auch von deinem Kunden korrekt erstellt werden wollen).

Gruß
Larry
 
Zurück
Oben