TIA Adressberechnung für PUT S7-1500 Hirnknopf

vollmi

Level-3
Beiträge
5.436
Reaktionspunkte
1.410
Zuviel Werbung?
-> 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.
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é
 
ich bin so ein Depp. Senden gedrückt da fällts mir wir Schuppen. Die FOR Macht ja beim finden weiter und schreibt mir dann die falsche Adresse rein wenn alle werte geändert haben.
 
Zurück
Oben