Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 2 von 2

Thema: Adressberechnung für PUT S7-1500 Hirnknopf

  1. #1
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard


    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é
    Zitieren Zitieren Adressberechnung für PUT S7-1500 Hirnknopf  

  2. #2
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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.

Ähnliche Themen

  1. TIA S7-1500 PUT/GET mittels S7-Treiber über CP-1543-1
    Von funkey im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 14.11.2017, 08:00
  2. Sonstiges S7-1500 Bilder für Webserver
    Von Arco im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 05.07.2017, 16:06
  3. Step 7 Adressberechnung in einer Multiinstanz
    Von mikraka im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 08.11.2015, 13:06
  4. TIA S7 1500 put/get?
    Von LowLevelMahn im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.05.2013, 16:12
  5. Adressberechnung +AR2
    Von Onkel Dagobert im Forum Simatic
    Antworten: 24
    Letzter Beitrag: 09.01.2008, 12:42

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •