UDT in FB statisch aufrufen

Bitte ein Bit

Level-2
Beiträge
74
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Werte Kollegen,

da ich seit langer Zeit mit Schneider arbeite, habe ich etwas Rost angelegt...
ich stehe vor einem Problem und komme nicht weiter, Bitte um Hilfe...

Ich habe einen UDT erstellt mit verschiedenen Datentypen, im DB 90 wird dieser aufgerufen bzw. im Panel werden die Werte dann im DB 90 eingegeben.

Im FB möchte ich bei positivem Startereignis die Werte aus dem DB90 in die statischen Werte vom FB kopieren und damit Arbeiten:

Auf DB90

U #Start
FP #Flanke_Start
SPBNB _001
CALL "BLKMOV"
SRCBLK :="Rampf_FDP"
RET_VAL:=#statisch_Fehlercode
DSTBLK :=#statische_Werte
_001: NOP 0

Der statische Wert ist vom Datentyp Array [1..10] of Word
(Der Inhalt ist aber verschieden, BOOL, INT...) ist diese herangehensweise Richtig?

Wie greife ich jetzt im FB auf die einzelnen Worte?
 
Du solltest die gleiche UDT im DB als statische Variable einfügen und das Umkopieren dann in diese UDT vornehmen. Dann kannst du mit den definierten Variablen in der Stat UDT weiterarbeiten.

Code:
      CALL  "BLKMOV"
       SRCBLK :=#inudt
       RET_VAL:=#retval
       DSTBLK :=#statudt

wobei:

inudt vom Typ UDTx im var IN ist
statudt vom Typ Udtx im var STAT.

Im Weiteren geht dann folgendes:

L #statudt.PosNr_X

Der Zugriff auf die UDT-Variablen ist so möglich.
Statt inudt kannst du natürlich auch gleich den udt aus dem DB90 an SFC20 anlegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort,
die Vorgabe sollte so aussehen:
Die UDT ist nur eine Vorlage, die z.B. Start->Bool, Drehzahl->Integer usw.
IM DB90 rufe ich diese Vorlage auf, hier werden die Werte aus dem Panel vorgegeben, die sich ständig ändern können.
Im FB wollte ich nur den inhalt des DB90 ins statische kopieren, um beim Start die z.Z. aktuellen Werten zu arbeiten, beim nächsten Start können schon wieder andere Werte vorhanden seien.
Mein Problem ist, wie kopiere ich den Inhalt des DB90 in den FB und wie kann an die einzelnen Adressen ran?
 
:confused: ... das hat Ralle doch sehr schön beschrieben ...

Du legst im STAT-Bereich deines FB dieselbe UDT noch einmal an :
statudt vom Typ Udtx im var STAT.
Als Eingangs-Parameter hast du auch diese UDT :
inudt vom Typ UDTx im var IN
dann kopierst du dir die Daten, die du dem FB beim Aufruf an inUDT übergeben hast in deinen STAT-Bereich :
CALL "BLKMOV"
SRCBLK :=#inudt
RET_VAL:=#retval
DSTBLK :=#statudt
Nun kannst du auf die Inhalte der Quelle im FB (symbolisch) zugreifen :
L #statudt.PosNr_X
Alle diese Zitate stammen aus dem Beitrag von Ralle.
Das einzige, was Ralle vergessen hat ist die Übergabe an den FB. Das Machst du am Besten symbolisch :
Code:
call FB xyz , DB 1213
  inUDT : #Daten_DB.Unterdaten_Block_UDT
Die von mir verwendeten namen sind hier natürlich nur Platzhalter für die Namen, die du verwendest ...

Gruß
LL
 
sorry, habe verstanden, nur wo muß ich den Aufruf:

call FB xyz , DB 1213
inUDT : #Daten_DB.Unterdaten_Block_UDT
machen? Im OB1 ?

Beim Probieren fällt mir noch was ein...
die aktuellen Werte stehen doch im DB90, die UDT ist doch nur eine Vorlage für DB90,
warum lädt man also den UDT im FB90 auf, oder stehen die Werte auch im UDT, wenn man es in DB90 eingibt???
 
Zuletzt bearbeitet:
Vielen Dank Ralle,

hatte mein Beitrag noch geändert, hast du wohl übersehen...

Beim Probieren fällt mir noch was ein...
die aktuellen Werte stehen doch im DB90, die UDT ist doch nur eine Vorlage für DB90,
warum lädt man also den UDT im FB90 auf, oder stehen die Werte auch im UDT, wenn man es in DB90 eingibt???

Den Aufruf bekomme ich nicht hin im OB1:
call FB 90 , DB 90
inUDT : #Daten_DB.Udt_Rampf
kannst du Bitte noch erklären, was ich hier schreiben muß?

Mein UDT heißt: Udt_Rampf, im FB90 als In Var. SPS1, stat. var: SPS
 
Eine UDT ist tatsächlich erstmal nur eine definierte Datenstrucktur. Diese kann man nun einerseits im DB einsetzen um sich die mehrmalige Definition gleicher Variablenstruckturen zu sparen und um auf die Elemente dieser Strucktur einfach zugreifen zu können. Eine schöne Eigenschaft ist es, daß man einen solche UDT auch im Schnittstellenbereich eines FB/FC eintragen kann. Dann hat man die Möglichkeit diese Daten außen an den FB über den einfachen Eintrag "My_DB".MyUDT anzutragen und somit dem FB/FC zu übergeben. Im Prinzip kann man dann im FB/FC genau mit diesen Daten weiterarbeiten. Tatsächlich liegen die Daten die ganze Zeit über im DB, in welchem die UDT eingebettet ist. Willst du nun die Daten gesondert im Stat-Bereich halten und bearbeiten, kannst du auch dort die selbe UDT als Datenstrucktur nutzen, die Daten dann auch rel. einfach umkopieren und auf die dann Stat-Daten zugreifen. Die Statischen Daten liegen im Instanz-DB des FB.

Zu deinem Aufruf:

Im Daten_DB mußt du eine Variable anlegen, UDT_RAMPF, welche dann als Typ deine definierte UDT erhält. Dann solltest du auch

"Daten_DB".UDT_RAMPF

an deinen FB antragen können, allerdings nur, wenn im FB im IN-Bereich die Variable InUDT definiert ist und ebenfalls als Datentyp dieselbe UDT erhalten hat.

PS: Anführungszeichen nicht vergessen: "Daten_DB".UDT_RAMPF

Code:
call FB 90 , DB 90
inUDT : "Daten_DB".Udt_Rampf

UDT_RAMPF ist die Variable, welche du im DB benennst. Die UDT selbst hast einen anderen symbolischen Namen, z.Bsp. My_UDT !!!
Also nicht den symbolischen Namen der UDT, mit der Variable im DB, welche dann vom Typ der UDT ist, verwechseln!
 
Zuletzt bearbeitet:
Zurück
Oben