- Beiträge
- 5.436
- Reaktionspunkte
- 1.410
-> Hier kostenlos registrieren
Hi zusammen
ich habe einen relativ einfachen Baustein der mir einen DB nach einem Wert ungleich 0 Durchsucht und wenn gefunden diesen wert per Put an eine zielstation Schickt und zwar in denselben DB an denselben Ort. Wenn Done oder Error zurückkommt wird der Wert im Quelldb gelöscht und mit 0 überschrieben (Constante #Test).
Der Baustein funktioniert eigentlich einwandfrei.
Wenn ich jetzt aber möchte das auch 0 übertragen wird und ich die Konstante Test mit z.B INT -1 ersetze. Dann bekomme ich vom Put die Fehlermeldung.
Allerdings an den Daten kann sich ja kaum was verändern der #Anypointerstartwert bleibt ja gleich. Durch das -1 dürfte sich doch nix an den daten ansich ändern.
Allerdings wird auch der Wert im QuellDB nicht auf -1 zurückgesetzt (obwohl der Error regelmässig kommt). Also stimmt doch irgendwas am Pointer nicht. Ich sehe aber glaub ich den Wald vor lauter Bäumen nicht.
mfG René
ich habe einen relativ einfachen Baustein der mir einen DB nach einem Wert ungleich 0 Durchsucht und wenn gefunden diesen wert per Put an eine zielstation Schickt und zwar in denselben DB an denselben Ort. Wenn Done oder Error zurückkommt wird der Wert im Quelldb gelöscht und mit 0 überschrieben (Constante #Test).
Der Baustein funktioniert eigentlich einwandfrei.
Wenn ich jetzt aber möchte das auch 0 übertragen wird und ich die Konstante Test mit z.B INT -1 ersetze. Dann bekomme ich vom Put die Fehlermeldung.
Fehler in den Zeigern zur Datenablage:
- Datentypen der Parameter SD_i und ADDR_i passen nicht zueinander.
- Die Länge des Bereichs SD_i ist größer als die Länge der zu schreibenden Daten der Parameter ADDR_i.
- Auf SD_i kann nicht zugegriffen werden.
- Maximale Nutzdatengröße überschritten.
- Anzahl der Parameter SD_i und ADDR_i stimmen nicht überein.
Allerdings an den Daten kann sich ja kaum was verändern der #Anypointerstartwert bleibt ja gleich. Durch das -1 dürfte sich doch nix an den daten ansich ändern.
Code:
FUNCTION_BLOCK "Befehl_PUT"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : VoR
FAMILY : Kom
VERSION : 0.3
//Baustein sendet einen Integer Befehl zur Partnerstation. Einmalig.
//Am Eingang kann ein Datenbereich angegeben werden welcher wortweise durchsucht wird, jedes Wort wird auf ungleich 0 geprüft, bei Wahr gesendet auf 0 zurückgesetzt. Egal ob Senden erfolgreich oder nicht.
VAR_INPUT
ID : Word; // VerbindungsID zum Partner
Befehlsbereich : Any; // Pointer oder Struktur welche geprüft werden soll
pBefehlsbereich { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} AT Befehlsbereich : "ANY_POINTER";
END_VAR
VAR
PUT_Instance {OriginalPartName := 'PUT_SFB_PART'; LibVersion := '1.3'} : PUT;
Befehl : Struct
Wert : Int;
Ort : Int;
END_STRUCT;
BSEND_LEN : Word;
Anypoint : "ANY_POINTER";
send : Bool;
save_status_Put : Word;
werte_test : Word;
END_VAR
VAR_TEMP
index : Int;
SndADDR : Remote;
pSndADDR AT SndADDR : "ANY_POINTER";
SndSD : Any;
pSndSD AT SndSD : "ANY_POINTER";
Point : Struct
DB_Nummer : Int;
Ort : Int;
END_STRUCT;
END_VAR
VAR CONSTANT
"Null" : Word := 0;
Anzahl : Int := 2;
Test : Word := 0;
END_VAR
BEGIN
IF NOT #send THEN
FOR #index := 0 TO #pBefehlsbereich.Anzahl_Werte BY 2 DO
IF PEEK_WORD(area := 16#84, dbNumber := INT_TO_DINT(#pBefehlsbereich.DB_Nr), byteOffset := #index) <> #Test THEN
#Befehl.Ort := #index;
#send := true;
END_IF;
END_FOR;
END_IF;
IF #PUT_Instance.DONE OR #PUT_Instance.ERROR THEN
#send := false;
END_IF;
#Anypoint := #pBefehlsbereich;
#pSndSD := #Anypoint; // in Temp kopieren für überlagerung um Startwerte zu setzen
#pSndSD.Anzahl_Werte := 2;
#pSndSD.Startadresse := 16#8400_0000 OR SHL(IN := INT_TO_DWORD(#Befehl.Ort), N := 3);
#pSndADDR := #pSndSD;
#PUT_Instance(REQ := #send,
ID := #ID,
ADDR_1 := #SndADDR,
SD_1 := #SndSD);
IF #PUT_Instance.ERROR THEN
#save_status_Put := #PUT_Instance.STATUS;
END_IF;
IF #PUT_Instance.DONE OR #PUT_Instance.ERROR THEN
#send := false;
POKE(area := 16#84,
dbNumber := INT_TO_DINT(#pBefehlsbereich.DB_Nr),
byteOffset := #Befehl.Ort,
value := #Test);
END_IF;
END_FUNCTION_BLOCK
Allerdings wird auch der Wert im QuellDB nicht auf -1 zurückgesetzt (obwohl der Error regelmässig kommt). Also stimmt doch irgendwas am Pointer nicht. Ich sehe aber glaub ich den Wald vor lauter Bäumen nicht.
mfG René