Nur "0" via BLKMOV in DB schreiben?!

Zuviel Werbung?
-> Hier kostenlos registrieren
ANY-Zeiger selber Zusammenstellen!!

z.B. ein FC, der das erledigt.
Code:
      LAR1  P##Ziel                     // Adresse Ziel-Bereich
      L     W#16#1002
      T     LW [AR1,P#0.0]              // Syntax-ID und TypKennung 
      L     #Laenge
      T     LW [AR1,P#2.0]              // Anzahl der Bytes
      L     #Ziel_DB
      T     LW [AR1,P#4.0]              // Datenbaustein-Nummer
      L     #Ziel_Daten_Byte
      SLD   3
      OD    DW#16#84000000
      T     LD [AR1,P#6.0]              // Bereichszeiger DB-Operand
#Ziel ist eine Lokale Variable vom Typ ANY
#Laenge, #Ziel_DB und #Ziel_Daten_Byte sind IN-Variablen vom Typ INT

Der Zeiger #Ziel kann dann an SFC21 angeschaltet werden


mfg
Maxl
 
Wenn du unbedingt mit der SFC20 arbeiten möchtest kannst du auch einen Datenbaustein "opfern" wo die 40 Byte den Wert 0 haben. Wenn du dass dann so lösen möchtest kannst du es so machen
[
//Quelldb bestimmen
[FONT=&quot]LAR1 P##Quelle //Lade die Anfangsadresse [/FONT][FONT=&quot]des ANY–Pointers in AR1.[/FONT]
[FONT=&quot]L B#16#10 //Lade die Syntax–ID und[/FONT]
[FONT=&quot]T LB [AR1,P#0.0] //transferiere sie in den ANY–Pointer.[/FONT]
[FONT=&quot]L B#16#2 //Lade Datentyp Byte und[/FONT]
[FONT=&quot]T LB [AR1,P#1.0] //Transferiere es in den ANY–Pointer.[/FONT]
[FONT=&quot]L 40 //Lade 40 Byte und[/FONT]
[FONT=&quot]T LW [AR1,P#2.0] //transferiere sie in den ANY–Pointer.[/FONT]
[FONT=&quot]L 99 //Quelle ist der DB99(Beispiel), DBB0[/FONT]
[FONT=&quot]T LW [AR1,P#4.0][/FONT]
[FONT=&quot]L P#DBX 0.0[/FONT]
[FONT=&quot]T LD [AR1,P#6.0][/FONT]
//Ziel Bestimmen
[FONT=&quot][/FONT]
[FONT=&quot]LAR1 P##ziel //Lade die Anfangsadresse des ANY–Pointers in AR1.[/FONT]
[FONT=&quot]L B#16#10 //Lade die Syntax–ID und[/FONT]
[FONT=&quot]T LB [AR1,P#0.0] //transferiere sie in den ANY–Pointer.[/FONT]
[FONT=&quot]L B#16#2 //Lade Datentyp Byte und[/FONT]
[FONT=&quot]T LB [AR1,P#1.0] //Transferiere es in den ANY–Pointer.[/FONT]
[FONT=&quot]L 40 //Lade 40 Byte und[/FONT]
[FONT=&quot]T LW [AR1,P#2.0] //Transferiere sie in den ANY–Pointer.[/FONT]
[FONT=&quot]L #Dbnr //Ziel ist der DB(mux), DBB0[/FONT]
[FONT=&quot]T LW [AR1,P#4.0][/FONT]
[FONT=&quot]L P#DBX 0.0[/FONT]
[FONT=&quot]T LD [AR1,P#6.0][/FONT]
]
DbNr als IN Variable
Quelle und Ziel als Temp:Any
 
also man kann sachen auch unnötig kompliziert machen. :rolleyes:

man könnte das auch über eine schleife selbst programmieren.

ich denke aber das der sfc21 das auch über eine schleife macht.
leider kann man sich die sfc's nicht ansehen. :(
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Geht auch einfach

Wenn er den DB kennt, muß er ja nicht gleich den Zeiger selber bauen.
nimm sfc20 oder 21

*****************************
Var_Temp
Fill: INT
RetValSfc: INT

L 0
t Fill

call sfc21/21
SRCBLK: Fill
RET_VAL: RetValSfc
DSTBLK: P#DBxy.DBXab byte 30

*****************************
so zum Beispiel
 
Vergessen

Noch was zum Anypointer:

bevor du dir merkst welcher hex Wert fuer den Bereich im Pointer zustaendig ist oder du immer im Handbuch nachsiehst.

Schreib nicht

L #Ziel_Daten_Byte
SLD 3
OD DW#16#84000000
T LD [Ar1,P#6.0]

sondern lade einfach nen Nullpointer aus dem Bereich


L #Ziel_Daten_Byte
SLD 3
L P#DBX0.0

oder
L P#M0.0

usw. is vieleicht einfacher ?
 
Habs jetzt ganz anders gelöst.

L 0
T MD 200 //Schmiermerker mit 0 beschreiben

CALL "FILL" //SFC21
BVAL :=MD200 //Schmiermerker
RET_VAL:=MW204 //Schmiermerker
BLK :=P#DB200.DBX0.0 BYTE 40 //Alles Null setzen der erste 40 Byte

CALL "FNK: BLK_MOV"
AnzahlDBB:=40 //Wie viele Byte's werden verschoben?
QuellDB :=200 //Woher kommen die Daten?
QuellDW :=0 //Wo beginnen die daten
ZielDB :=111 //Wohin sollen die Daten
ZielDW :=#Adress_BLKMOV_2 //Wo beginnen die daten
RET_VAL :=MW200 //Schmiermerker

Tada, und schon hat man 40 byte leer :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das ist doch doppelt gemoppelter blödsinn

warum nicht direkt in den db111?

L 0
T MW 200
CALL SFC 21
BVAL :=MW200
RET_VAL:=#retval
BLK :=P#DB111.DBX20.0 BYTE 40 //40 byte 0 ab dbb20

und falls es dir darum geht das ziel variabel zu machen kannst du dir den any-zeiger so bauen

L W#16#1002 //Typ BYTE
T LW 0
L #Blockgroesse //Anzahl Bytes
T LW 2
L #ziel_db //Ziel-DB
T LW 4
L #QAnfang_schleife //Anfang der Quelle
SLD 3
OD DW#16#84000000
T LD 6

//temp_var: #zany typ: any liegt im L0
und dann einfach zany an den parameter blk schreiben
 
Zuletzt bearbeitet:
Naja, habe mich noch nicht mit ANY-Zeigern auseinander gesetzt :D

Von daher gehe ich dann doch lieber über bissl mehere DB's und machst mit nem Normalen Zeiger ;)
 
Ja weiß ich, da wird auch so ein Pointer zusammengebastelt. Aber ich raff den net, is mir alles net so logisch daran. Aber werde ma das forum durchsuchen nach ANY-Definitionen und Beispielen.

Trotzden Danke :D
 
ANY-Pointer Definition

KalEl schrieb:
und falls es dir darum geht das ziel variabel zu machen kannst du dir den any-zeiger so bauen

L W#16#1002 //Typ BYTE
T LW 0
L #Blockgroesse //Anzahl Bytes
T LW 2
L #ziel_db //Ziel-DB
T LW 4
L #QAnfang_schleife //Anfang der Quelle
SLD 3
OD DW#16#84000000
T LD 6

Habe jetzt mal versucht diesen Code irgendwie zu übersetzen
Meine Schlussfolgerungen sind fogende:

L W#16#1002 steht laut der S7-Doku für Bytes. D.h. es wird wohl ein bezug zu irgendwelchen Bytes daargestellt.
L W#16#1002 konnte ich bis jetzt leider noch nicht zuordnen.

Was ist ein LW (Lokaldatenwort) genau? Wie groß ist es usw...

Bin bissl hilflos wie ihr sicher feststellt :(
 
Zuviel Werbung?
-> Hier kostenlos registrieren
byte 0 ist bei s7 immer 10. keine ahnung warum.
lokaldaten sind die speicherbereiche der temp_var

öffne mal aus dem s7-manager die hilfe im index nach any suchen.
wirst du einiges finden.
und dann weiterfragen falls noch unklarheiten bestehen. ;)

wie lang das ist ist abhängig davon was du deklariert hast.
der any-zeiger ist 10 byte lang
 
Zurück
Oben