-> Hier kostenlos registrieren
Hallo zusammen,
ich stolpere gerade über das Kopieren von Strings....
Innerhalb meines Programms greift ein instanziierter FB auf einen während der Laufzeit festgelegten DB mit mehreren Strings zu (Array von 20 Strings zb).
Einer dieser Strings wird dann herausgelesen (Anhand der Variable #Code) und modifiziert . Das klappt soweit mit folgendem Programmausschnitt:
An diesen Puffer hänge ich noch nen Zeitstempel und paar andere Zeichen und gebe das ganze als String aus.
Nun wundere ich mich warum das ganze nicht so abgeändert werden kann, dass der so generierte String in einen anderen, ebenfalls zur Laufzeit erst ausgewählten DB geschrieben wird.
Mein Versuch bisher:
(Ziel_DB besteht aus 20 Strings, Meldungsnummer wird mit 1 initialisiert und kann 20 nicht überschreiten)
Das byte-weise Kopieren lieferte ebenfalls den Fehlercode 837F zurück:
Muss ich die Länge des erzeugten Strings herausfinden um ihn korrekt kopieren zu können?
oder greife ich auf Datenbereiche zu, die für BLKMOV nicht freigegeben sind? (Source-Block ist Ausgang eines inkludierten FBs)
Vielen Dank schon mal fürs Durchlesen,
würde mich über Hilfe/Tipps freuen
ich stolpere gerade über das Kopieren von Strings....
Innerhalb meines Programms greift ein instanziierter FB auf einen während der Laufzeit festgelegten DB mit mehreren Strings zu (Array von 20 Strings zb).
Einer dieser Strings wird dann herausgelesen (Anhand der Variable #Code) und modifiziert . Das klappt soweit mit folgendem Programmausschnitt:
Code:
// Any-Pointer auf Vorlage
#Zeiger_Bestandteile_Vorlage.ANY_ID:= b#16#10;
#Zeiger_Bestandteile_Vorlage.Datentyp:=b#16#13;
#Zeiger_Bestandteile_Vorlage.Laenge:=w#16#1;
#Zeiger_Bestandteile_Vorlage.DB_NR:=BLOCK_DB_TO_WORD(#Vorlagen_DB);
#Zeiger_Bestandteile_Vorlage.Anfangsadresse:=(DW#16#84000000 OR INT_TO_DWORD((#Code-1)*256*8));
// Kopieren in Puffer
#Zustand_BLKMOV:= BLKMOV(SRCBLK:=#Zeiger_String_Vorlage, DSTBLK=>#Textpuffer);
An diesen Puffer hänge ich noch nen Zeitstempel und paar andere Zeichen und gebe das ganze als String aus.
Nun wundere ich mich warum das ganze nicht so abgeändert werden kann, dass der so generierte String in einen anderen, ebenfalls zur Laufzeit erst ausgewählten DB geschrieben wird.
Mein Versuch bisher:
(Ziel_DB besteht aus 20 Strings, Meldungsnummer wird mit 1 initialisiert und kann 20 nicht überschreiten)
Code:
// Any-Pointer auf Zielstring in Ziel_DB initialisieren
#Zeiger_Bestandteile_Zielstring.ANY_ID:= b#16#10;
#Zeiger_Bestandteile_Zielstring.Datentyp:=b#16#13; // Alternativ 02
#Zeiger_Bestandteile_Zielstring.Laenge:=w#16#1; // Alternativ 256
#Zeiger_Bestandteile_Zielstring.DB_NR:=BLOCK_DB_TO_WORD(#Ziel_DB);
#Zeiger_Bestandteile_Zielstring.Anfangsadresse:=(DW#16#84000000 OR INT_TO_DWORD((#naechste_freie_Meldungsnummer-1)*256*8));
// Kopieren in Ziel_DB
#Zustand_BLKMOV:= BLKMOV(SRCBLK:= #Meldung_Generieren_Instance.Meldung,
DSTBLK=> #Zeiger_Zielstring);
Das byte-weise Kopieren lieferte ebenfalls den Fehlercode 837F zurück:
Falls der tatsächlich vorhandene Ziel- oder Quellbereich kleiner als ein am Parameter SRCBLK oder DSTBLK angegebener Ziel- oder Quellbereich ist, hängt das Verhalten vom CPU-Typ ab:
- Für S7-300-CPUs gilt:
Es werden keine Daten übertragen. Am Parameter RET_VAL wird der Fehlercode W#16#837F87F
ausgegeben.
Muss ich die Länge des erzeugten Strings herausfinden um ihn korrekt kopieren zu können?
oder greife ich auf Datenbereiche zu, die für BLKMOV nicht freigegeben sind? (Source-Block ist Ausgang eines inkludierten FBs)
Vielen Dank schon mal fürs Durchlesen,
würde mich über Hilfe/Tipps freuen