String-Bearbeitung

Anna

Level-1
Beiträge
16
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!!!
Ich habe ein Problem mit der String-Bearbeitung...
Ich wollte mit der FC32 die letzten L Zeichen einer String-Variable auslesen und dann mit der SFC20 in einen Datenbaustein ablegen.

In meinem Programm schreibe ich :

CALL "RIGHT"
IN :=#Kette
L :=MW110 // Anzahl von Zeichen
RET_VAL:=#Menuetext


CALL "BLKMOV"
SRCBLK :=#Menuetext
RET_VAL:=MW108
DSTBLK :=P#DB3.DBX6.0 BYTE 32

Die Variablen #Kette(String [64]) und #Menuetext (String[32])habe ich symbolisch in der Deklarationstabelle definiert.

Wenn ich LW von #Menuetext abfrage , steht nichts drin.
Was mache ich falsch???
Worin könnte mein Fehler liegen???
 
Zuletzt bearbeitet:
Was steht denn in MW108, ich vermute das Problem beim SFC20.

Die Hilfe zum SFC20 gibt noch folgenden Hinweise:

Quell- und Zielfeld dürfen sich nicht überlappen. Ist das angegebene Zielfeld größer als das Quellfeld, dann werden auch nur so viele Daten in das Zielfeld kopiert, wie im Quellfeld stehen.Ist das angegebene Zielfeld kleiner als das Quellfeld, dann werden nur so viele Daten kopiert, wie das Zielfeld aufnehmen kann.Ist der ANY-Pointer (Quelle oder Ziel) vom Typ BOOL, so muß die angegebene Länge durch 8 teilbar sein, da sonst die SFC nicht ausgeführt wird.Quell- oder Zielparameter (oder beide) dürfen auch vom Datentyp STRING sein. Ist die Quelle ein String, werden maximal nur die aktuell im String enthaltenen Zeichen kopiert. Ist das Ziel ein String, wird die aktuelle Länge auf die Anzahl der kopierten Zeichen gesetzt. Es können keine String-Felder (ARRAY OF STRING) kopiert werden, d.h. es ist nur “STRING 1“ zulässig.Falls Sie in einem DB oder im Lokaldatenbereich mit STEP 7 einen Quell- und einen Zielstring definiert haben und Sie diese Strings bei den Parametern SRCBLK und DSTBLK angeben, überträgt die SFC 20 auch die "maximale Länge" und die "tatsächliche Länge" des Quellstrings in den Zielstring. Um dies zu vermeiden, müssen Sie wie folgt vorgehen: Bauen Sie sich die ANY-Pointer, die Sie bei den Parametern SRCBLK und DSTBLK angeben, selbst auf. Verwenden Sie für den Datentyp STRING.

Wie auch immer man das genau interpretieren soll, hier lohnt es sich wohl mit der Suche anzufangen. Sicherheitshalber würde ich nach dem Baustein (Right) mal ein Paar Lokalbyte in Merker transferieren und kontrollieren, ob hier noch der String vorhanden ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Any-Zeiger...

Danke für die Antwort...
Ich habe auch mit Any- Zeiger probiert.


L P##Any_Quelle
L B#16#10
T LW [AR1,P#0.0]
L B#16#2
T LB [AR1,P#1.0]
L 32 // Laenge
T LW [AR1,P#2.0]
L 10 // DB- Nummer
T LW [AR1,P#4.0]
L P#DBX 0.0
L MW 110 //Byte des ersten Datenwortes...
ITD
SLD 3
+D
T LD [AR1,P#6.0]

CALL "BLKMOV"
SRCBLK :=#Any_Quelle
RET_VAL:=MW108
DSTBLK :=P#DB3.DBX6.0 BYTE 32

Es funktioniert auch nicht..Im MW108 steht: 817F.

Das bedeutet Interner Fehler
Erläuterung: Dieser Fehler wurde nicht vom Anwender verursacht und kann von ihm nicht behoben werden.
Was kann man damit machen????
 
Zuletzt bearbeitet:
Hallo,
evtl. mal einzeln über einen Test-DB probieren ?

Oder mal so angeben?

CALL "BLKMOV"
SRCBLK :=P#DB10.DBX6.0 BYTE 32
RET_VAL:=MW108
DSTBLK :=P#DB3.DBX6.0 BYTE 32
 
JA..Ohne Any- Zeiger funktioniert alles ganz prima!!!

Wenn ich schreibe
CALL "BLKMOV"
SRCBLK :=P#DB10.DBX9.0 BYTE 32
RET_VAL:=MW108
DSTBLK :=P#DB3.DBX6.0 BYTE 32
Dann geht es....
Aber bei mir muss DBX im DB10 variabel sein.
Deswegen soll man eigentlich Any Pointer definieren...
Mit Any sieht es bei mir so aus:
#Any_Quelle ist deklariert mit Lokaladresse. 0.0
Lokaladresse des #Any_Ziel ist 10.0...

L P##Any_Quelle
L B#16#10
T LW [AR1,P#0.0]
L B#16#2
T LB [AR1,P#1.0]
L 32
T LW [AR1,P#2.0]
L 10
T LW [AR1,P#4.0]
L P#DBX 0.0
L MW 110
ITD
SLD 3
+D
T LD [AR1,P#6.0]

L P##Any_Ziel
L B#16#10
T LW [AR1,P#10.0]
L B#16#2
T LB [AR1,P#11.0]
L 32
T LW [AR1,P#12.0]
L 3
T LW [AR1,P#14.0]
L P#DBX 0.0
L 6
ITD
SLD 3
+D
T LD [AR1,P#16.0]

CALL "BLKMOV"
SRCBLK :=#Any_Quelle
RET_VAL:=MW108
DSTBLK :=#Any_Ziel

Was mache ich falsch???
 
Zuletzt bearbeitet:
Ralle, ich weiß...

Ich weiß, Ralle , was dazu in Siemens steht....

Meine Frage , wie kann es behoben werden????
 
Hast du ja drunterstehen, hatte ich überlesen :confused: .

Code:
LAR1 P##Quelle //Anfangsadresse des ANY-Pointers in AR1 laden
L B#(16, 2) //Syntax-ID und Typ: Byte laden
T LW [AR1,P#0.0]
L #AnzahlDBB //Transferlaenge
T LW [AR1,P#2.0]
L #QuellDB //Quelle-DB 
T LW [AR1,P#4.0]
L P#DBX 0.0 //Anfangs-DW im Quell-DB
L #QuellDW
ITD 
SLD 3
+D 
T LD [AR1,P#6.0]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Fehler code 837F

Nea, kann ich es nicht zum Laufen kriegen....
es bleibt immer Fehler in RET_Val mit dem Fehlercode: 837F...
Was kann es sein???
 
Zuletzt bearbeitet:
Anna schrieb:
Wenn ich LW von #Menuetext abfrage , steht nichts drin.
Was mache ich falsch???
Worin könnte mein Fehler liegen???

zur stringbearbeitung muss das verwaltungsbyte initialisiert werden.

temp: strg String[7] 0.0

L 7 //dem verwaltungsbyte die länge des strings übergeben
T LB 0
CALL FC 5 //DI_STRING
I :=L#-678901
RET_VAL:=#strg
NOP 0

CALL SFC 20
SRCBLK :=P#L 0.0 BYTE 9 //muss 2 länger sein als der string
RET_VAL:=MW10
DSTBLK :=P#DB10.DBX0.0 BYTE 9
NOP 0

--------------------------------------------------------
hier mal der aufbau des any-zeigers
temp: QANY 0.0

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

CALL SFC 20
SRCBLK :=#QANY
RET_VAL:=#RET_VAL
DSTBLK :=#ZANY
 
Zuletzt bearbeitet:
Hallo, Volker!!!
Ich mache auch so...Aber tut es nicht...
Die Daten aus DB10 ab DBX9.0 müssen in DB3 ab DBX6.0 Kopiert werden...

L P##Any_Quelle
L B#16#10
T LW [AR1,P#0.0]
L B#16#2
T LB [AR1,P#1.0]
L 32
T LW [AR1,P#2.0]
L 10
T LW [AR1,P#4.0]
L P#DBX 0.0
L MW 110
ITD
SLD 3
+D
T LD [AR1,P#6.0]


L P##Any_Ziel
L B#16#10
T LW [AR1,P#10.0]
L B#16#2
T LB [AR1,P#11.0]
L 32
T LW [AR1,P#12.0]
L 3
T LW [AR1,P#14.0]
L P#DBX 0.0
L 6
ITD
SLD 3
+D
T LD [AR1,P#16.0]

CALL "BLKMOV"
SRCBLK :=#Any_Quelle
RET_VAL:=MW108
DSTBLK :=#Any_Ziel

Was ist hier falsch???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube das hier:

L B#16#10
T LW [AR1,P#0.0]
L B#16#2
T LB [AR1,P#1.0]

ist so nicht richtig, oder?

schreib doch mal

L B#(16, 2)
T LW [AR1,P#0.0]

oder

L W#16#1002 //Typ BYTE
T LW [AR1,P#0.0]
 
Fehlercode 837F

Ralle,
Ja..Ich habe mich verschrieben .
Aber der Fehler bleibt immer wieder...
 
Hallo,
unter den Beitrags-IDs 10429883, 11018710 und 5669592 beim siemens Support sind einige Infos zum Any Pointer und zur Stringverarbeitung bzw. kopieren mit SFC 20 zu finden
Vielleicht hilft dir das weiter.

Und hier noch ein Beispiel aus der Siemens Hilfe für einen Any Pointer
unter "Hilfe > Hilfethemen > Index > ANY, Parameter:Beschreibung und Verwendung"

Code:
FUNCTION FC 10:VOID 
VAR_TEMP 
Quelle : ANY; 
Ziel : ANY; 
END_VAR 
BEGIN 
LAR1 P#Quelle; 
  
L  B#16#10; 
T LB[AR1,P#0.0]; 
  
L B#16#02; 
T LB[AR1,P#1.0]; 
  
L 10; 
T LW[AR1,P#2.0]; 
  
L 22; 
T LW[AR1,P#4.0]; 
L P#DBX11.0; 
T LD[AR1,P#6.0]; 
  
LAR1 P#Ziel; 
  
L  B#16#10; 
T LB[AR1,P#0.0]; 
  
L B#16#02; 
T LB[AR1,P#1.0]; 
  
L 10; 
T LW[AR1,P#2.0]; 
  
L 33; 
T LW[AR1,P#4.0]; 
L P#DBX202.0; 
T LD[AR1,P#6.0]; 
  
CALL SFC 20 ( 
SRCBLK := Quelle, 
RET_VAL := MW 12, 
DSTBLK := Ziel 
); 
END_FUNCTION
 
Zuletzt bearbeitet:
dein any-aufbau ist vom prinzip gleich wie meiner.
habe deinen getestet mit mw110 = 0. klappt ohne fehler

ich denke der fehler ist hier zu suchen.

L P#DBX 0.0
L MW 110 <--- was steht da drin
ITD
SLD 3
+D
T LD [AR1,P#6.0]


edit:
wenn ich dich richtig verstanden habe steht im mw110 die länge des strings. soll das wirklich der datenanfang sein?
imho wäre die länge (+2) im lw2 besser aufgehoben.
 
Zuletzt bearbeitet:
Danke, Volker...Nochmal zur Aufgabe...

Ich möchte solche Datenkopierung realisieren.

CALL "BLKMOV"
SRCBLK :=P#DB10.DBX9.0 BYTE 32
RET_VAL:=MW108
DSTBLK :=P#DB3.DBX6.0 BYTE 32

Ein Datenbausteinbyte im DB10 muss bei mir variabel sein...
Bei einem SFC20-Aufruf muss ich Daten aus DB10 ab Byte 9.0 kopieren....
Bei nächstem Aufruf zum Beispiel sollen die Daten nicht ab DBX9.0 sondern ab DBX 75.0 kopiert werden. Dazu habe ich MW110 verwendet....
Also in MW110 steht "9" als Beispiel.....
Oder verstehe ich falsch???
Datenbausteine db 3 und db10 enthalten Array von String Variablen....
Aber ich wollte trotzdem Byteweise kopieren.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ich wollte mich nur vergewissern, das du den datenanfang ändern willst.

ich habe das getestet und bei mir in plcsim und einer 313c2dp getestet. klappt ohne fehler.

am code kann ich auch keinen fehler entdecken.
 

Anhänge

  • Zwischenablage03.gif
    Zwischenablage03.gif
    52,8 KB · Aufrufe: 23
Ja Volker,
Vielen Dank für Ihre Bemühungen...

Ich weiß nicht warum, aber bei mir bleibt der Fehler...

Anhang anzeigen Bild.doc

Kann es in der HW liegen???
Ich teste mit der cpu314...
Aber ich denke , es ist nicht der Grund für solchen Fehler...
Ich versuche mal dies mit einer anderen CPU zu testen...

Trotzdem , Danke
 
Zuletzt bearbeitet:
ich habe das mit einem db getestet der 4 strings enthält. kein array.
obs daran liegt?????

poste mal den db10. den aus der cpu wenn aktualwerte drin stehen.

hast du das mal mit plcsim getestet?
 
Zurück
Oben