TIA S7 1200 Put und Get als Multiinstanz möglich?

mariob

Level-3
Beiträge
2.052
Reaktionspunkte
276
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
die Überschrift sagt das alles schon aus, geht das mit der 1200? Ich hatte da mal ein Derivat der 300, da ging eine Multiinstanz mit diesen Befehlen gar nicht.

Gruß
Mario
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke vollmi,
nochwas, wie ist der Auftragsstatus von Put oder Get bei Fehler, wird der Auftrag dann beendet oder oder läuft der ewig weiter? Wenn letzterer Fall, wie kann ich den abwürgen? Ich muß den Kram hier mangels HW trocken schreiben und in den Handbüchern steht nix dazu.....

Gruß
Mario
 
Hallo Mario,

wenn es bei Dir um deine 1200er geht guckt dir I-Device an :)

Hardwareconfig -> Profinet -> Betriebsart -> I-Device ... und dann ist es fast selbsterklärend.

Grüße

Marcel
 
Hallo,
und danke Matze, nee das hier ist viel schlimmer:ROFLMAO:, noch schlimmer:ROFLMAO::ROFLMAO:. Das wird nur mit dieser oder von mir aus den Bsend oder so beherrschbar wenn überhaupt. Ansonsten wäre das Ei Deweise ne feine Sache :). Wie schon gefragt, beenden sich die Aufträge mit dem Fehlerstatus oder muß man die abwürgen, wenn ja dann wie?

Gruß
Mario
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich meine sie beenden sich selbst.
Du musst "nur" im Fehlerfall das ganze nochmal anschubsen... also neu Triggern o.ä.
Aber ich hab es lang nicht mehr gemacht, muss ich ja gestehen.

Grüße

Marcel
 
Hi,
ich dachte das auch so, da die Dinger ja nur durch eine Flanke angestoßen werden, eigentlich hatte ich noch eine Zeitüberwachung mitgeschleppt, diese ist aber sinnlos wenn sich der Auftrag eh nicht beenden läßt, der Fehlerstatus ist dann ja sowieso da und beenden kann man eben nicht. Ich programmiere das mal so und lasse das mit der Zeit sein. Danke nochmal. Man liest sich im Chat, da können wir das bei gelegenheit nochmal aufwärmen.

Gruß
Mario
 
Danke vollmi,
nochwas, wie ist der Auftragsstatus von Put oder Get bei Fehler, wird der Auftrag dann beendet oder oder läuft der ewig weiter? Wenn letzterer Fall, wie kann ich den abwürgen? Ich muß den Kram hier mangels HW trocken schreiben und in den Handbüchern steht nix dazu.....

Dann kommt ein Error zurück mit entsprechendem Status. Der Req muss neu angestossen werden zum senden.

Funktioniert also eigentlich wie bei der 300er 400er.
Einzig das Ziel muss nun PUT/GET zulassen (S7-1200/1500).

Du könntest das eigentlich als vorlage nehmen. funktioniert mit Get genauso hier musst du dir halt überlegen wann was geholt werden soll und entsprechend den Req anstossen.
Code:
FUNCTION_BLOCK "Befehl_PUT_INT"{ S7_Optimized_Access := 'FALSE' }
AUTHOR : VoR
FAMILY : Kom
VERSION : 0.3
//Baustein sendet einen Integer Befehl zur Partnerstation. Einmalig.
   VAR_INPUT 
      ID : Word;   // VerbindungsID zum Partner
   END_VAR


   VAR_IN_OUT 
      Befehl : Int;
      Adresse : Int;
      Datenbaustein : Int;
   END_VAR


   VAR 
      PUT_Instance {OriginalPartName := 'PUT_SFB_PART'; LibVersion := '1.3'} : PUT;
      BSEND_LEN : Word;
      Anypoint : "ANY_POINTER";
      send : Bool;
      save_status_Put : Word;
      Angsttimer {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
   END_VAR


   VAR_TEMP 
      index : Int;
      SndADDR : Remote;
      pSndADDR AT SndADDR : "ANY_POINTER";
   END_VAR


   VAR CONSTANT 
      "Null" : Word := 16#0000;
      Anzahl : Int := 2;
   END_VAR




BEGIN
	IF (#Befehl <> 0) AND (#Datenbaustein <> 0) THEN
	  #send := true;
	END_IF;
	
	
	#pSndADDR := #Anypoint; // in Temp kopieren für überlagerung um Startwerte zu setzen
	#pSndADDR.Anzahl_Werte := 1;
	#pSndADDR.Startadresse := 16#8400_0000 OR SHL(IN := INT_TO_DWORD(#Adresse), N := 3);
	#pSndADDR.DB_Nr := #Datenbaustein;
	
	#PUT_Instance(REQ := #send,
	              ID := #ID,
	              ADDR_1 := #SndADDR,
	              SD_1 := #Befehl);
	
	IF #PUT_Instance.ERROR THEN
	  #save_status_Put := #PUT_Instance.STATUS;
	END_IF;
	
	IF #PUT_Instance.DONE OR #PUT_Instance.ERROR OR #Angsttimer.Q THEN
	  #send := false;
	  #Befehl := 0;
	END_IF;
	
	#Angsttimer(IN := #send,
	            PT := t#1s);
	
	
END_FUNCTION_BLOCK

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
danke für den Code Vollmi, das ist hier ein wenig komplexer, das sind mehrere Verbindungen die der Reihe nach abgeklappert werden, ich erschlage das zur Zeit in einer Schrittkette, ein ständiges Herumklopfen dann auf einer nicht funktionierenden Verbindung wäre dann kontraproduktiv, die muß dann warten bis sie wieder dran ist. Ich will daher sicherstellen das da nicht mehrere gleichzeitig laufen, das endet dann eventuell böse.

Gruß
Mario
 
Hi,
danke für den Code Vollmi, das ist hier ein wenig komplexer, das sind mehrere Verbindungen die der Reihe nach abgeklappert werden, ich erschlage das zur Zeit in einer Schrittkette, ein ständiges Herumklopfen dann auf einer nicht funktionierenden Verbindung wäre dann kontraproduktiv, die muß dann warten bis sie wieder dran ist. Ich will daher sicherstellen das da nicht mehrere gleichzeitig laufen, das endet dann eventuell böse.

Geht ja nur darum wie man ihn wieder anstossen könnte. Im beispiel sieht man einfach besser, dass der Req kurz weggenommen werden muss um den Auftrag neu anzustossen.
übrigens ich habe auch bei zyklischem Anstossen einer nicht funktionierenden Verbindungen bisher keinerlei Verzögerungen der übrigen Verbindungen bemerkt. Ob da wirklich durch anstossen gestörter Verbindungen nachteile bei den laufenden Verbindungen entstehen können dir sicher die Experten hier verraten. Würde mich auch interessieren.

mfG René
 
Zurück
Oben