Blockmove mit Datenformat Int und String

sailor

Level-1
Beiträge
641
Reaktionspunkte
27
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich möchte mit SFC 20 Blockmove einen Datenbereich kopieren der aus Integerwerten und einer String[30] besteht. Ich habe im Zeiger P#DB10.DBX 0.0 Byte 130 Byte stehen. Die Integerwerte werden richtig geschrieben, aber der String nicht.
Wer weiss, warum?
Gruß
Sailor
 
Hast Du daran gedacht, dass ein STRING[30] eine Länge von 32 BYTE hat?

Wenn nein, kannst Du mal folgendes probieren:

P#DB10.DBX 0.0 BYTE 132

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Datenformat STRING

Byte 1 = maximale Länge des Strings

Byte 2 = aktuelle Länge des Strings

Byte 3 = 1. Zeichen des Strings

Byte 4 = 2. Zeichen des Strings

Byte 5 = 3. Zeichen des Strings

Byte 6 = 4. Zeichen des Strings

usw.

Gruß Kai
 
Hallo Kai.

Danke.

Die String steht an 2. Stelle in einen DB. 1. Stelle ist ein INT 3. und weitere Stellen sind auch INT. Alle Integerwerte werden richtig übertragen nur die String nicht.
Der Datenbereich ist 130 Byte lang.

Verdammter Mist.

Sailor
 
Hallo Kai.

Danke.

Die String steht an 2. Stelle in einen DB. 1. Stelle ist ein INT 3. und weitere Stellen sind auch INT. Alle Integerwerte werden richtig übertragen nur die String nicht.
Der Datenbereich ist 130 Byte lang.

Verdammter Mist.

Sailor

Es macht es uns leichter, wenn du die Struct des DB uns zeigen würdest.
Denn ich verstehe nicht wie dein DB aussieht und wo welcher Wert ankommt bzw ankommen soll.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich koper einfach mal die ersten rein:
Sorry, 1. zeile ist schon die string


recipe_name STRING[30] ''
recipe_NR INT 0
min_S1 INT 0
max_S1 INT 0
alert_S1 INT 0
min_S2 INT 0
max_S2 INT 0
alert_S2 INT 0

usw.


und hier die AWL:

L B#16#10 //10h für s7
T LB 0
L B#16#5 //Typ BYTE
T LB 1
L 130 //Anzahl (Wiederholungsfaktor)
T LW 2
L 30 //Datenbaustein
T LW 4
L "DB10 recipe data".recipe_ID //Anfangsadresse
L 130
*I
SLD 3 //Pointer generieren
T LD 6
L B#16#84 //Speicherbereich (hier DB)
T LB 6

UN "recipe data general".Command_save_recipe
SPB SV
CALL "BLKMOV"
SRCBLK :=P#DB10.DBX 0.0 Byte 130
RET_VAL:=MW330
DSTBLK :=#myzeiger_S
SV: NOP 0

Wie gesagt, die Integerwerte werden geschrieben aber die String nicht, also die ersten 32 Byte.

was mach ich nur falsch?
Gruß
Sailor
 
Was mir als erstes auffällt. Du schreibst
L B#16#5 //Typ BYTE
5 ist aber INT, 2 steht für Byte.

Wie Kai auch schon angemerkt hat, weisst du das ein 30 Zeichen langer String 32 Bytes benötigt.
 
Wie gesagt, die Integerwerte werden geschrieben aber die String nicht, also die ersten 32 Byte.
Ganz sicher?
Vielleicht werden die recipe_name STRING[30] mitkopiert, aber an anderer Stelle im Programm ständig überschrieben?
Was sagt denn der RET_VAL vom BLKMOV im MW330?

Probiere mal in PLCSIM nur Deine Kopier-Anweisung im OB1 aus, sonst nichts.
Oder ändere mal den Ziel-String per VAT. Bleiben Deine Änderungen drin stehen?

Gruß
Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum einfach, wenn es auch kompliziert geht.

Fasse den zu übertragenden Block in einer STRUCT zusammen, die kannst Du symbolisch adressieren, dann hast du garantiert alles drin, was Du übertragen willst und musst dich nicht mit einem Any-Pointer herumschlagen der Rätsel aufgibt.

Gruß Rolf
 
Zurück
Oben