Datenwort durch Variable zuweisen?

Tigerkroete

Level-1
Beiträge
245
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mir eine Variable "m" vom Typ INT deklariert und hatte gehofft, in einer For-Schleife eine Masse von Datenwörtern transferieren zu können.

Z.B.:
Code:
L DB1.DBW[m]

doch es wird rot angezeigt. Vielleicht ist es ja nur ein Syntaxfehler.
Oder geht sowas garnicht?

Vielen Dank,
Tigerkroete
 
Um viele Datenwörter auf einmal zu transferieren, kannst du entweder einen Pointer basteln oder die Daten bequemer mit dem SFC20 "BLKMOV" verschieben.

Über einen Pointer kann mehr oder weniger eine for - Schleife umgesetzt werden, mit dem SFC20 werden ganze Byteblöcke (z.B. 20 Byte auf einmal) transferiert.

Welche Methode du einsetzt hängt vom Anwendungsfall ab und ist auch eine kleine Philosophiefrage.
 
SFC20???
Wie nutze ich sowas? Ist diser Baustein schon drin? Muss ich ihn laden?

Bin halt recht neu und kannte bis vor wenigen Wochen nur Ein-und Ausgänge, Merker und Zähler und Timer.

Ich möchte halt für eine Maschine fünf Rezepte anlegen. Pro Rezept sind das 14 Datenwörter, die spezifische Maschineneinstellungen enthalten.
Wenn der Bediener z.B. Rezeptbutton 2 drückt, wird im Programm in die Case-Anweisung 2 gesprungen, wo in einer For-Schleife die Datenwörter aus Rezept 5 in die Ausgabedatenwörter geschrieben werden.

Ob das nun besonders sinnvoll ist wie ich das mache, weiß ich nicht, da das alles sehr neu ist.

Gruß,
Tigerkroete
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Volker. Ich habe aus m ein DINT gemacht und zuerst den DB1 auf geschlagen und dann versucht mit "L DBW[m]" zu laden, aber es erneut rot markiert :-(.
Vielleicht noch ein Tipp?
In jedem Fall danke!
 
Den SFC20 kannst du aus der Bibliothek ziehen.

Er ist in der Kategorie System Function Blocks zu finden.


Beim SFC20 gibst du einen Quellbereich und dessen Länge an, das Statuswort und den Zielbereich in den die Daten geschrieben werden sollen.

Z.B. sollen die Daten des DB100.DBB0 bis zum DB100.DBB27 in den DB120 in die DBBs 20-47 geschrieben werden.

Der Befehl sieht dann folgendermaßen aus:

CALL SFC20
SRCBLK: P#DB100.DBX0.0 Byte 28
RET_VAL: MW1
DSTBLK: P#DB120.DBX20.0 BYTE 28

Dem SFC20 ist der Variablentyp egal, er verschiebt einfach alle Einträge aus den unter SRCBLK angegebenen Bereich in den Zielbereich von DSTBLK.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tigerkroete schrieb:
Hallo Volker. Ich habe aus m ein DINT gemacht und zuerst den DB1 auf geschlagen und dann versucht mit "L DBW[m]" zu laden, aber es erneut rot markiert :-(.
Vielleicht noch ein Tipp?
In jedem Fall danke!

Um einmal Klarheit zu bekommen probier bitte mal folgendes:
Code:
AUF DBxy
L     DBW [MD 0]

pt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dazu kann ich nur Hilfe sagen und indirekte Adressierung eingeben...

Zu AWL Zeiten habe ich das auch so gemacht...
L zz
T MDxxx
AUF DByy
L DBW[xxx]

Beispiel für einen Pointer im Wortformat:
L 5 //Lade den Wert des Pointers in AKKU 1.
T MW2 //Transferiere den Pointer nach MW2.
L T [MW2] //Lade den aktuellen Wert der Zeit T5 in AKKU 1.

Beispiel für einen Pointer im Doppelwortformat:
L P#8.7 //Lade den Wert des Pointers in AKKU 1.
T MD2 //Transferiere den Pointer nach MD2.
U E [MD2] //Frage den Signalzustand an Eingang E 8.7 ab
= A [MD2] //und weise den Signalzustand Ausgang A 8.7 zu.
Beispiele für speicherindirekte Adressierung Beschreibung
U E [MD 2] Führe eine UND-Verknüpfung mit dem Eingangsbit aus. Die Adresse befindet sich in Merkerdoppelwort MD2.
= DIX [DBD 2] Weise den Signalzustand des VKE-Bits dem Instanz-Datenbit zu. Die Adresse befindet sich im Datendoppelwort DBD2.
L EB [DID 4] Lade das Eingangsbyte in AKKU 1. Die Adresse befindet sich im Instanzdoppelwort DID4.
AUF DB [LW 2] Öffne den Datenbaustein. Die Nummer des Datenbausteins befindet sich im Lokaldatenwort LW2.
 
Hallo Tippser. Ja, das funktioniert.
Mit dem "m" funktioniert es nun auch. Habe folgendes geändert:
Die Variable "m" war zuvor oben im Interface meiner Funktion unter Temp deklariert. Nun habe ich sie in meiner Symboltabelle deklariert und schwupps geht es.
Wo deklariert man denn für welchen Fall am besten seine Variablen?
Und warum muss "m" ein DINT sein?

Vielen Dank,
Tigerkroete

Hinzugefügt:

Mit #m geht es auch nicht, hatte ich schon versucht.
 
In der Symboltabelle ist das m global, unter Temp ist es Lokal. Nimm mal einen längeren Namen Bsp. Idx := DINT.

Dint, weil 32 Bit Adresse. Die letzten 3 Bits geben die Bitadresse an.

Gruß, pt
 
ist halt so.:rolleyes:

das was du schreibst wird aber nicht funktionieren, auch wenn die syntax nun stimmt.

um auf ein bestimmtes dw zugreifen zu können, benötigst du einen pointer.

Code:
L #wert //dieses dw willst du laden
SLD 3 //pointer erzeugen
LAR1
AUF   DB   10
L     DBW [AR1,P#0.0]
 
Uijuijui, Pointer?
O.K. dann muss ich mich da mal schlau machen. Kenne Pointer nur aus C und C++, wusste gar nicht, dass es die auch bei S7 gibt. Immer wenn ich eine Sache verstanden habe, kommen drei neue Probleme dazu :confused:.

Ich bin wirklich froh, dass es dieses Forum gibt, denn da mir mein Betreuer der Diplomarbeit in Bezug auf SPS nicht helfen kann, wäre ich ansonsten teilweise verloren.

Aber wieso brauche ich nun einen Pointer?

Wenn ich den Wert von DBW20 in den DBW22 laden will, schreibe ich das ja so:
Code:
AUF   DB10
L   DBW20
T   DBW22

Ich sehe da nicht den Unterschied, wenn meine DINT-Variable "xyz" den Wert 20 enthält und meine DINT-Variable "lmn" den Wert 22 und es so schreibe:
Code:
AUF   DB10
L   DBW[xyz]
T   DBW[lmn]

Sorry, dass ich da echt ´nen Hänger habe.

Aber vielen Dank schonmal.
 
tja wäre schön. ist es aber leider nicht. warum weiss ich nicht wirklich. s7 erwartet dort nun mal einen zeiger in der form byteadresse.bitadresse
wobei die bitadresse durch 3 bit gebildet wird

also z.b. so
L P#30.0
T MD10
L MW[MD10]
läd das mw30

so hast du aber keine möglichkeit in einer schleife zu arbeiten. also must du das registerindirekt machen.

L 30
SLD 3
LAR1
ergibt einen pointer von P#30.0 in adressregister1
L MW[ar1,p#0.0]
läd das mw30

nun gibt es noch den versatz (p#0.0)
L MW[ar1,p#2.0]
läd das mw32 (30 + 2.0)

U M[ar1,p#4.4]
fragt M 34.4 ab

Grob verstanden ? :ROFLMAO:
 
Ja so zu 85%.
Das war heute ziemlich viel Neues. Mir qualmt der Kopf. Ich glaube ich mach für heute Schluss und lass das erstmal Sacken. Gleich ist ja auch Fußball ;-).
Ich muss mich echt bei Euch bedanken.

Viele Grüße,
Tigerkroete
 
Zurück
Oben