TIA Kommunikation zwischen einer 1516-3PN/DP und einer 315 2PN/DP mit CP343-1 Lean

Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ich muss doch die Get Befehle Aufrufen und ob ich die der Übersichtshalber im FC mache oder im OB1 ist doch egal

Jap aber jeder GET und PUT braucht seine eigene Instanz. Das heisst wenn du die im OB1 oder in einem FC aufrufst musst du jedem seinen eigenen globalen Instanzdb zuweisen. deklarierst du die aber im STAT eines FBs dann landen die alle im selben instanzdb (dem des aufrufenden FB) was die zu händelnde Bausteinmenge doch arg reduziert (je nach menge der anfallenden Kommunikation). Du hast jetzt nicht womöglich irgendwo die Instanz eines PUT oder GET zweimal aufgerufen?

Ich hab dir mal einen Baustein gemacht. Versuch den mal.
Einfach als Externe Quelle einfügen und übersetzen.

Code:
FUNCTION_BLOCK "PUTGETen"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      VerbindungsID : Word;
   END_VAR


   VAR_IN_OUT 
      PUT_Addr : Remote;
      PUT_SD : Variant;
      GET_Addr : Remote;
      GET_SD : Variant;
   END_VAR


   VAR 
      PUT_Instance {OriginalPartName := 'PUT_SFB_PART'; LibVersion := '1.3'} : PUT;
      put_done : Bool;
      put_error : Bool;
      put_status : Word;
      put_err_status_sav : Word;
      put_done_status_sav : Word;
      request : Bool;
      Requestreset {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
      GET_Instance {OriginalPartName := 'GET_SFB_PART'; LibVersion := '1.3'} : GET;
      getrequest : Bool;
      get_err_status_sav : Word;
      get_done_status_sav : Word;
      get_Requestreset {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
   END_VAR




BEGIN
	#PUT_Instance(REQ:=#request,
	              ID:=#VerbindungsID,
	              ADDR_1:=#PUT_Addr,
	              SD_1:=#PUT_SD);
	
	IF #PUT_Instance.ERROR THEN
	    #put_err_status_sav := #PUT_Instance.STATUS;
	END_IF;
	
	IF #PUT_Instance.DONE THEN
	    #put_done_status_sav := #PUT_Instance.STATUS;
	END_IF;
	
	#request := true;
	IF #PUT_Instance.ERROR OR #PUT_Instance.DONE OR #Requestreset.Q THEN
	    #request := false;
	END_IF;
	
	#Requestreset(IN:=#request,
	              PT:=t#5s);
	
	#GET_Instance(REQ:=#getrequest,
	              ID:=#VerbindungsID,
	              ADDR_1:=#GET_Addr,
	              RD_1:=#GET_SD);
	
	IF #GET_Instance.ERROR THEN
	    #get_err_status_sav := #GET_Instance.STATUS;
	END_IF;
	
	IF #GET_Instance.NDR THEN
	    #get_done_status_sav := #GET_Instance.STATUS;
	END_IF;
	
	#getrequest := true;
	IF #GET_Instance.ERROR OR #GET_Instance.NDR OR #get_Requestreset.Q THEN
	    #getrequest := false;
	END_IF;
	
	#get_Requestreset(IN := #getrequest,
	              PT := t#5s);
	
	
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Den Text in eine Textdatei kopieren (z.B. eine textdatei erstellen die da heist PUTGET.scl)

Ansonsten die Quelle hier holen:
https://www.dropbox.com/sh/qywy7jmiijcaje4/AACIBBcRTbzCUod8o2JyUDWWa?dl=0

irgendwohin kopieren, dann in deinem Projekt im ordner. Externe Quellen. Das ist der zweite Ordner unter Programmbausteine einer jeder CPU die du in deinem Projekt hast.

Rechtsklick drauf und übersetzen wählen.

aufgerufen wird dann so:
Code:
"test_DB"(VerbindungsID:=16#100,
          PUT_Addr:=p#db6.dbx0.0 byte 44,
          PUT_SD:=p#db6.dbx0.0 byte 44,
          GET_Addr:=p#db7.dbx0.0 byte 44,
          GET_SD:=p#db7.dbx0.0 byte 44);

oder So:
Code:
      CALL  "PUTGETen", "PUTGETen_DB_1"
         VerbindungsID :=w#100
         PUT_Addr      :=P#DB6.DBX0.0 BYTE 44
         PUT_SD        :=P#DB6.DBX0.0 BYTE 44
         GET_Addr      :=P#DB7.DBX0.0 BYTE 44
         GET_SD        :=P#DB7.DBX0.0 BYTE 44

mfG René
 
Zuletzt bearbeitet:
Und für Fehlersuche findest du in der Instanz die *sav Worte. dort wird sowohl der letzte Fehler wie auch der letzte done Status abgelegt. Erleichtert die Fehlersuche.
 
Zurück
Oben