hmm.. Wie sieht dann ein Befehl aus, wenn ich einen anderen DB dazwischen habe?
Code:
U DB50.DBX 5.4
U #Enable_Servo
[B] AUF DB [#TEMP_DB][/B]
UN DBX 172.3
U DBX 213.1
UN DB50.DBX 5.3
UN DB50.DBX 4.7
[B] AUF DB [#TEMP_DB][/B]
S DBX 174.7
U DB50.DBX 5.3
U DB50.DBX 4.7
[B] AUF DB [#TEMP_DB][/B]
R DBX 174.7
bzw aufgeräumter:
Code:
U DB50.DBX 5.4
UN DB50.DBX 5.3
UN DB50.DBX 4.7
U #Enable_Servo
[B] AUF DB [#TEMP_DB][/B]
UN DBX 172.3
U DBX 213.1
S DBX 174.7
U DB50.DBX 5.3
U DB50.DBX 4.7
[B] AUF DB [#TEMP_DB][/B]
R DBX 174.7
So?
Oder muss ich temporäere Variablen verwenden und darf "AUF" nur am Anfang einer Anweisung verwenden?
Code:
[B] AUF DB [#TEMP_DB][/B]
UN DBX 172.3
U DBX 213.1
U DB50.DBX 5.4
UN DB50.DBX 5.3
UN DB50.DBX 4.7
U #Enable_Servo
S [B] #temp_var[/B]
U DB50.DBX 5.3
U DB50.DBX 4.7
[B] R #temp_var[/B]
[B] AUF DB [#TEMP_DB]
U #temp_var[/B]
= DBX 174.7
Das hängt stark von deiner Datenstruktur ab wie man soetwas am besten umsetzen kann. Hängt davon ab was deine Daten im DB darstellen. Sind die in irgendwelchen Strukturen oder UDTS abgelegt sodass man eventuell eine ganze Struktur an den FB übergeben kann? Was verbirgt sich den hinter den Adressen? Welche Funktion erfüllt das gezeigte Rücksetzen?
Der entsprechende DB wird aus UDTs generiert, stimmt.
Es geht um den FB283 (SINA_FB), welcher mir einen DB mit UDT30000 (Basis) und UDT30010 (UDT_TVB+MDI_TLG110) erzeugt. Mich interessiert nur der UDT30010, welcher bei 162.0 anfängt und 90 Byte hat. (Sollte ich also mit Pointer hineinmappen, oder?)
(Am liebsten wäre es mir, wenn ich den Global-DB weglassen könnte und direkt in den Instanz-DB integriere, aber das ist ja unsauber und unleselich...)
Der erste Code-Auszug war nur ein Beispiel. Im Code-Auszug dieses Beitrags geht es darum den MDI-Modus je nach Rahmenbedingung zu aktivieren (Referenziert, Enable, kein Manuell-Betrieb, ...) oder deaktivieren (Manuell-Betrieb).
Zum Background:
Ich schreibe gerade einen FB, der mir die Ansteuerung einer Sinamics-Achse vereinfachen soll. Desweiteren soll das anfügen einer neuen Achse vereinfacht werden und die generelle Ansteuerung über mehrere Projekte (unterschiedliche Maschinentypen) vereinheitlichen.
Nachtrag:
Ich lass das jetzt mal mit dem "AUF DB" und übertrage den entsprechenden UDT mit SFC 20.
Code:
//Zuerst kopiere ich den WR_PZD und RD_PZD um, damit ich die Pointer auch lesend verwenden kann
L P##WR_PZD // WR_PZD ist IN- Variable vom Typ ANY
LAR1 //AR1 zeigt nun auf die Anfangsadr. der Eingangsvariable
L P##WR_PZD_temp // --> source = temporäre Variable vom Typ ANY
T #p_tmp1 // p_tmp1 (DWORD) ist ein Zeiger auf source
// copy in-parameter ANY to tmp ANY
L D [AR1,P#0.0]
T LD [#p_tmp1] //Byte 0 bis Byte 3 des ANY kopieren
L #p_tmp1
+ 32
T #p_tmp1 // zeiger auf temp. ANY um 4 Byte weiterstellen
L D [AR1,P#4.0]
T LD [#p_tmp1] // Byte 4 bis Byte 7 des ANY kopieren
L #p_tmp1
+ 32
T #p_tmp1 // zeiger auf temporären ANY um 4 Byte weiterstellen
L W [AR1,P#8.0]
T LW [#p_tmp1] // Byte8 bis Byte10 des ANY kopieren
[B]//Habe ich aus einer Siemens Hilfe kopiert und abgeleitet, ist das so richtig?[/B]
CALL SFC 20
SRCBLK :=#WR_PZD_temp //Pointer auf DB Adresse mit Bereich
RET_VAL:=#SFC_int1
DSTBLK :=#Achse.RD_PZD_POSBETR //UDT im Static Bereich meines FB
CALL SFC 20
SRCBLK :=#RD_PZD_temp //Pointer auf DB Adresse mit Bereich
RET_VAL:=#SFC_int2
DSTBLK :=#Achse.WR_PZD_POSBETR //UDT im Static Bereich meines FB
.
.
.
Bearbeitung
.
.
.
//Am Ende des Bausteins übertrage ich den WRITE Bereich des UDT wieder in den Global-DB
CALL SFC 20
SRCBLK :=#WR_PZD_temp //Pointer auf DB Adresse mit Bereich
RET_VAL:=#SFC_int2
DSTBLK :=#Achse.WR_PZD_POSBETR //UDT im Static Bereich meines FB