TIA Tcon req

ludwigjak

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich versuche zum ersten mal einen Verbindungsaufbau mit TCP mittels des vorgefertigten TCON Baustein zu realisieren.
Ich nutze das TIA Portal V14 und eine S7-1200.

Ich habe bereits viel in dem Foren gefunden, jedoch scheitere ich schon am Aktivieren des Bausteins.
Denn der Baustein wird nie mit meinem REQ aktiviert. Er zeigt immer den Status Code 7000 an, was bedeutet, dass er keine Flanke per REQ erhaelt.
Leider Weiss ich nicht, wie ich das anders realisieren kann.

Ich habe bereits zwei Wege versucht, ein mal mit KOP, wie im nachfolgenden Bild dargestellt:

Capture1.JPG
Ein weiteres mal habe ich versucht das Ganze mit SCL zu realisieren:
Capture3.JPG
Den Baustein TCON habe ich jedes mal als Multiinstanz eingefuegt und mit folgenden Parametern versehen:
ConfigTCON.JPG

Ich bin sehr dankbar ueber jegliche Antwort und Hinweis, welcher mir weiter helfen kann.

Viele Gruesse
Ludwig
 
Such doch mal im Siemens Support da gibt es einige beispiele für die TCON Bausteine.
Aber auch hier im Forum.
Das in deinem KOP Beispiel kann nicht funktionieren, da der M10.0 nie an deinem TCON Baustein TRUE wird.
Denn der Merker ist ja nur so lange TRUE solange dein Step 1 ist, das ist ja nur sehr kurz der Fall da du ja direkt den Step ohne Bedingung auf 2 änderst.
Der Merker ist also noch nicht mal einen SPS Zyklus lang auf TRUE.

Lies dir mal genau die Dokumentation zu dem TCON Baustein durch.

Gruß

Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke fuer die schnelle Antwort Jens.

Mir ist dann aufgefallen, dass das so nicht funktioniert wie ich das gemacht hatte. Hatte nach der Aenderung trotzdem keinen erfolgreichen Verbindungsaufbau.
Nun habe ich auf die Bausteine TRCV_C und TSEND_C zurueckgegriffen. Mit diesen war eine Kommunikation einwandfrei moeglich.

Gruesse
Ludwig
 
Ich hänge mich mal hier ran.

Ich versuche ebenfalls gerade eine unspezifizierte Verbindung mit TCON aufzubauen, es geht nicht, Status bleibt auf 7000.
1500-er zu einem PC mit Win7 Embedded.

Der TE hat ja dann TRCV_C genutzt, aber es sollte doch auch mit TCON machbar sein???
Hat das jemand am Laufen?
 
ich mach das z.B. so
Code:
#TCON_Instance.REQ := #stVerbindungsreset.q;


IF #ComCouple.ComPro.TCON.CONN_DONE THEN
    #ComCouple.ComPro.TCON.Donezähler := #ComCouple.ComPro.TCON.Donezähler + 1;
END_IF;  


IF #ComCouple.ComPro.TCON.CONN_ERROR THEN
    #ComCouple.ComPro.TCON.Errorzähler := #ComCouple.ComPro.TCON.Errorzähler + 1;
    #ComCouple.ComPro.TCON.STATUS_SAVE := #ComCouple.ComPro.TCON.CONN_STATUS;
END_IF;




#TCON_Instance(ID:=#ComCouple.TCP_Parameter.ID,
               DONE=>#ComCouple.ComPro.TCON.CONN_DONE,
               BUSY=>#ComCouple.ComPro.TCON.CONN_BUSY,
               ERROR=>#ComCouple.ComPro.TCON.CONN_ERROR,
               STATUS=>#ComCouple.ComPro.TCON.CONN_STATUS,
               CONNECT:=#ComCouple.TCP_Parameter);






#T_DIAG_Instance.REQ := NOT #T_DIAG_Instance.BUSY;


#T_DIAG_Instance(ID:=#ComCouple.TCP_Parameter.ID,
                 RESULT:=#T_DIAG_result);


#stVerbindungsreset.IN := #T_DIAG_result.State <> 16#04 AND NOT #stVerbindungsreset.q;


#TDISCON_Instance(REQ:= #st_TDISCON.REQ,
                  ID:=#ComCouple.TCP_Parameter.ID);




    #tVerbindungsreset(IN:=#stVerbindungsreset.IN,
                       PT:=t#30s,
                       Q=>#stVerbindungsreset.q);

Durch den tVerbindungsreset timer. Verzögere ich den ersten TCON versuch um 30s nach Neustart der CPU. Ausserdem wird so alle 30s versucht erneut eine Verbindung aufzubauen, sollte die Verbindungsdiagnose keine stehende Verbindung erkennen ().

Den Disconnect verwende ich noch nicht, der ist da nur drin falls ich ihn mal brauche.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sehr mystisch.
Mit TCON, TSEND und TRCV geht gar nichts.
Nachdem ich mit TSEND_C eine Verbindung aufgebaut hatte, ging auch ein 2. TSEND, der noch im Programm stand. Allerdings nur, bis ich die SPS in Stop schaltete. Wahrscheinlich hatte er nach der Änderung auf TSEND_C die gleiche Verbindungsrecource.

Nun funktioniert TSEND_C klaglos, aber TRCV_C empfängt weiterhin keinerlei Daten, obwohl der PC die Daten abschickt (zumindest lt. Log am PC).
TRCV_C steht dauerhaft auf 7006 ([FONT=&quot]Daten werden gerade empfangen[/FONT]), aber das schon sofort nach der

Ich hab das schon 100 Mal mit 300-er SPS gemacht, warum will das hier einfach nicht?
 
Letzer Stand:

TSend_C und TRCV_C haben beide einen Connect-Eingang für die Verbindungsdaten. Ich dachte, die können beide die gleiche Verbindung nutzen, aber das scheint ein Irrtum zu sein.
Ich habe jetzt für jeden Baustein eine getrennte Verbindung eingerichtet und auch TRCV_C funktioniert nun.

Kann es sei, dass man beide Partner verschiedene Ports nutzen müssen, wenn man eine Verbindung nutzen will?
 
Moin Ralle,
Sehr mystisch.
Mit TCON, TSEND und TRCV geht gar nichts.
Nachdem ich mit TSEND_C eine Verbindung aufgebaut hatte, ging auch ein 2. TSEND, der noch im Programm stand. Allerdings nur, bis ich die SPS in Stop schaltete. Wahrscheinlich hatte er nach der Änderung auf TSEND_C die gleiche Verbindungsrecource.

Nun funktioniert TSEND_C klaglos, aber TRCV_C empfängt weiterhin keinerlei Daten, obwohl der PC die Daten abschickt (zumindest lt. Log am PC).
TRCV_C steht dauerhaft auf 7006 (Daten werden gerade empfangen), aber das schon sofort nach der
Mir ist zu dem Thema Grundsätzlich schon aufgefallen, dass die Änderungen über diesen "Werkzeugkasten" an den Verbindungsparametern und dem anschließenden Laden allein nichts bringen. Im zugehörigen, vom TIA erstellten IDB zur Verbindung, werden nur die Startwerte geändert, nicht aber die Aktualwerte. Also muss man wohl nach jedem editieren der Verbindungsparameter einmal Stop->Run machen. Vielleicht fehlte das bei deiner Test-Orgie ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Ralle,

Mir ist zu dem Thema Grundsätzlich schon aufgefallen, dass die Änderungen über diesen "Werkzeugkasten" an den Verbindungsparametern und dem anschließenden Laden allein nichts bringen. Im zugehörigen, vom TIA erstellten IDB zur Verbindung, werden nur die Startwerte geändert, nicht aber die Aktualwerte. Also muss man wohl nach jedem editieren der Verbindungsparameter einmal Stop->Run machen. Vielleicht fehlte das bei deiner Test-Orgie ;)

Da hast du Recht, am Anfang war das so, aber dann habe ich das immer gemacht, TCon funktionierte nicht.
Ich starte heute noch einen Versuch. :)
 
Letzer Stand:

TSend_C und TRCV_C haben beide einen Connect-Eingang für die Verbindungsdaten. Ich dachte, die können beide die gleiche Verbindung nutzen, aber das scheint ein Irrtum zu sein.
Ich habe jetzt für jeden Baustein eine getrennte Verbindung eingerichtet und auch TRCV_C funktioniert nun.

Kann es sei, dass man beide Partner verschiedene Ports nutzen müssen, wenn man eine Verbindung nutzen will?

Ich kenne mich mit den _C Bausteinen nicht aus. Aber beim normalen TCON gibt man ja auch nur einen Lokalen Port und einen Remote Port an. Und darüber läuft mindestens ein TRECV und ein TSEND gleichzeitig. Komisch wenn das mit den _C Bausteinen nicht ginge.
 
Hier noch mein kompletter Baustein auf Basis T_COM Der funktioniert so garantiert auf 1500er CPUs und SoftCPUs. Der Lief auf 1.8FW und läuft auch schon zuverlässig auf 2.1er Firmware neuere hab ich noch nicht ausprobiert.

Code:
TYPE "ComCouple"
VERSION : 0.1
   STRUCT
      ComPro : Struct
         TCON : Struct
            CONN_DONE : Bool;
            CONN_BUSY : Bool;
            CONN_ERROR : Bool;
            CONN_SETA : Bool;
            DISCONNECT : Bool;
            CONN_STATUS : Word;
            STATUS_SAVE : Word;
            Errorzähler : DInt;
            Donezähler : DInt;
         END_STRUCT;
         TSEND : Struct
            SEND : Bool;
            DONE : Bool;
            BUSY : Bool;
            ERROR : Bool;
            REQ_P : Bool;
            REQ_I : Bool;
            STATUS : Word;
            STATUS_SAVE : Word;
            NDR : Bool;
            LEN : UDInt;
            Errorzähler : DInt;
            Donezähler : DInt;
         END_STRUCT;
         TRCV : Struct
            REQ : Bool;
            DONE : Bool;
            BUSY : Bool;
            ERROR : Bool;
            REQ_P : Bool;
            REQ_I : Bool;
            STATUS : Word;
            STATUS_SAVE : Word;
            NDR : Bool;
            LEN : UDInt;
            Errorzähler : DInt;
            Donezähler : DInt;
         END_STRUCT;
         Empfangstrigger : Bool;
      END_STRUCT;
      TCP_Parameter {InstructionName := 'TCON_IP_v4'; LibVersion := '1.0'} : TCON_IP_v4;
      sSendeVerz : Struct
         IN : Bool;
         Q : Bool;
      END_STRUCT;
      Snd : Struct
         Byte1 : Byte;
         Byte2 : Byte;
         Sendebereich : Array[0..256] of Byte;
      END_STRUCT;
      Rec : Struct
         Byte1 : Byte;
         Byte2 : Byte;
         Empfangsbereich : Array[0..256] of Byte;
      END_STRUCT;
   END_STRUCT;


END_TYPE


FUNCTION_BLOCK "Kommunikationsaufbau"
TITLE = IKS Kommunikationsserver
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : VoR
FAMILY : Komm
VERSION : 0.3
//Baut die Verbindung zum Basler IKS auf. Umgerüstet für integrierte Profinetschnittstelle der 300er Reihe. Wird nicht mehr im Netpro projektiert!
   VAR_INPUT 
      init : Bool;
   END_VAR


   VAR_OUTPUT 
      Error : Bool;   // Verbindungsunterbuch
   END_VAR


   VAR_IN_OUT 
      ComCouple : "ComCouple";
   END_VAR


   VAR 
      TCON_Instance {InstructionName := 'TCON'; LibVersion := '4.0'} : TCON;
      TSEND_Instance {InstructionName := 'TSEND'; LibVersion := '4.0'} : TSEND;
      TRCV_Instance {InstructionName := 'TRCV'; LibVersion := '4.0'} : TRCV;
      SendREQ_TON {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
      SendeVerz {InstructionName := 'TOF_TIME'; LibVersion := '1.0'} : TOF_TIME;
      R_TRIG_TRCV_NDR {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
      T_DIAG_Instance {InstructionName := 'T_DIAG'; LibVersion := '1.2'} : T_DIAG;
      T_DIAG_result {InstructionName := 'TDiag_Status'; LibVersion := '1.0'} : TDiag_Status;
      T_RESET_Instance {InstructionName := 'T_RESET'; LibVersion := '1.2'} : T_RESET;
      tVerbindungsreset {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
      stVerbindungsreset : Struct
         IN : Bool;
         q : Bool;
      END_STRUCT;
      TDISCON_Instance {InstructionName := 'TDISCON'; LibVersion := '2.1'} : TDISCON;
      st_TDISCON : Struct
         REQ : Bool;
      END_STRUCT;
   END_VAR


   VAR_TEMP 
      Dummyval : Int;
   END_VAR


   VAR CONSTANT 
      akt_verz : Bool := 0;   // Abstand zwischen telegrammen aktivieren?
      akt_vz_Time : Time := t#100ms;
   END_VAR




BEGIN
	(*
	Versionsinfo:
	V0.1 Baustein erstellt auf Grundlage IKS Kommunikation Basel
	V0.2 Baustein angepasst nach Dokument JSDoc_Class_PLC(003)
	*)
	
	(* Verbindungsparameter, vormals in NetPro eingerichtet.
	   Muss nicht zyklisch ausgeführt werden, kann also in OB100 verlegt werden *)
	
	#TCON_Instance.REQ := #stVerbindungsreset.q;
	
	IF #ComCouple.ComPro.TCON.CONN_DONE THEN
	    #ComCouple.ComPro.TCON.Donezähler := #ComCouple.ComPro.TCON.Donezähler + 1;
	END_IF;  
	
	IF #ComCouple.ComPro.TCON.CONN_ERROR THEN
	    #ComCouple.ComPro.TCON.Errorzähler := #ComCouple.ComPro.TCON.Errorzähler + 1;
	    #ComCouple.ComPro.TCON.STATUS_SAVE := #ComCouple.ComPro.TCON.CONN_STATUS;
	END_IF;
	
	
	#TCON_Instance(ID:=#ComCouple.TCP_Parameter.ID,
	               DONE=>#ComCouple.ComPro.TCON.CONN_DONE,
	               BUSY=>#ComCouple.ComPro.TCON.CONN_BUSY,
	               ERROR=>#ComCouple.ComPro.TCON.CONN_ERROR,
	               STATUS=>#ComCouple.ComPro.TCON.CONN_STATUS,
	               CONNECT:=#ComCouple.TCP_Parameter);
	
	
	
	#T_DIAG_Instance.REQ := NOT #T_DIAG_Instance.BUSY;
	
	#T_DIAG_Instance(ID:=#ComCouple.TCP_Parameter.ID,
	                 RESULT:=#T_DIAG_result);
	
	#stVerbindungsreset.IN := #T_DIAG_result.State <> 16#04 AND NOT #stVerbindungsreset.q;
	
	#TDISCON_Instance(REQ:= #st_TDISCON.REQ,
	                  ID:=#ComCouple.TCP_Parameter.ID);
	
	
	    #tVerbindungsreset(IN:=#stVerbindungsreset.IN,
	                       PT:=t#30s,
	                       Q=>#stVerbindungsreset.q);
	//    #T_RESET_Instance(REQ:=#stVerbindungsreset.q,
	//                      ID:=#ComCouple.TCP_Parameter.ID);
	    
	REGION Sendeempfangsteil
	    
	    IF #ComCouple.ComPro.TSEND.DONE THEN
	        #ComCouple.ComPro.TSEND.Donezähler := #ComCouple.ComPro.TSEND.Donezähler + 1;
	        #ComCouple.ComPro.TSEND.SEND := false;
	    END_IF;
	    
	    IF #ComCouple.ComPro.TSEND.ERROR THEN
	        #ComCouple.ComPro.TSEND.Errorzähler := #ComCouple.ComPro.TSEND.Errorzähler + 1;
	        #ComCouple.ComPro.TSEND.STATUS_SAVE := #ComCouple.ComPro.TSEND.STATUS;
	        #ComCouple.ComPro.TSEND.SEND := false;
	    END_IF;
	    
	    #TSEND_Instance(REQ := #ComCouple.ComPro.TSEND.SEND,
	                    ID := #ComCouple.TCP_Parameter.ID,
	                    LEN := #ComCouple.ComPro.TSEND.LEN,
	                    DONE => #ComCouple.ComPro.TSEND.DONE,
	                    BUSY => #ComCouple.ComPro.TSEND.BUSY,
	                    ERROR => #ComCouple.ComPro.TSEND.ERROR,
	                    STATUS => #ComCouple.ComPro.TSEND.STATUS,
	                    DATA := #ComCouple.Snd.Sendebereich);
	    
	
	    
	    
	    
	    #TRCV_Instance(EN_R := true,
	                   ID := #ComCouple.TCP_Parameter.ID,
	                   LEN := 0,
	                   ADHOC := TRUE,
	                   NDR => #ComCouple.ComPro.TRCV.NDR,
	                   BUSY => #ComCouple.ComPro.TRCV.BUSY,
	                   ERROR => #ComCouple.ComPro.TRCV.ERROR,
	                   STATUS => #ComCouple.ComPro.TRCV.STATUS,
	                   RCVD_LEN => #ComCouple.ComPro.TRCV.LEN,
	                   DATA := #ComCouple.Rec.Empfangsbereich);
	    
	    #R_TRIG_TRCV_NDR(CLK:=#ComCouple.ComPro.TRCV.NDR,
	                     Q=>#ComCouple.ComPro.Empfangstrigger);
	    
	    
	    
	    IF #ComCouple.ComPro.TRCV.NDR THEN
	        #ComCouple.ComPro.TRCV.Donezähler := #ComCouple.ComPro.TRCV.Donezähler + 1;
	    END_IF;
	    
	    IF #ComCouple.ComPro.TRCV.ERROR THEN
	        #ComCouple.ComPro.TRCV.Errorzähler := #ComCouple.ComPro.TRCV.Errorzähler + 1;
	        #ComCouple.ComPro.TRCV.STATUS_SAVE := #ComCouple.ComPro.TRCV.STATUS;
	    END_IF;
	    
	    #SendREQ_TON(IN := #ComCouple.ComPro.TSEND.SEND,
	                 PT := t#3s);
	    
	    IF #SendREQ_TON.Q THEN
	        #ComCouple.ComPro.TSEND.SEND := false;
	    END_IF;
	    
	    #SendeVerz(IN := #ComCouple.ComPro.TSEND.SEND, // diese Zeit ist wichtig um das Telegramm komplett in den Sendebuffer zu übertragen.
	               PT := #akt_vz_Time,
	               Q=>#ComCouple.sSendeVerz.Q);
	    
	    IF NOT #akt_verz THEN
	        #ComCouple.sSendeVerz.Q := false;
	    END_IF;
	    
	#Error := #ComCouple.ComPro.TCON.CONN_ERROR OR #ComCouple.ComPro.TRCV.ERROR OR #ComCouple.ComPro.TSEND.ERROR;
	    
	END_REGION
	
END_FUNCTION_BLOCK

Code:
DATA_BLOCK "KoppelDB_Com"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
NON_RETAIN
   STRUCT 
      Futurit_Master : "ComCouple";
      Futurit_Slave : "ComCouple";
   END_STRUCT;




BEGIN
   Futurit_Master.TCP_Parameter.InterfaceId := 59;
   Futurit_Master.TCP_Parameter.ID := 1;
   Futurit_Master.TCP_Parameter.ConnectionType := 11;
   Futurit_Master.TCP_Parameter.ActiveEstablished := true;
   Futurit_Master.TCP_Parameter.RemoteAddress.ADDR[1] := 192;
   Futurit_Master.TCP_Parameter.RemoteAddress.ADDR[2] := 168;
   Futurit_Master.TCP_Parameter.RemoteAddress.ADDR[3] := 1;
   Futurit_Master.TCP_Parameter.RemoteAddress.ADDR[4] := 110;
   Futurit_Master.TCP_Parameter.RemotePort := 12345;
   Futurit_Master.TCP_Parameter.LocalPort := 12335;
   Futurit_Slave.TCP_Parameter.InterfaceId := 59;
   Futurit_Slave.TCP_Parameter.ID := 2;
   Futurit_Slave.TCP_Parameter.ConnectionType := 11;
   Futurit_Slave.TCP_Parameter.ActiveEstablished := true;
   Futurit_Slave.TCP_Parameter.RemoteAddress.ADDR[1] := 192;
   Futurit_Slave.TCP_Parameter.RemoteAddress.ADDR[2] := 168;
   Futurit_Slave.TCP_Parameter.RemoteAddress.ADDR[3] := 1;
   Futurit_Slave.TCP_Parameter.RemoteAddress.ADDR[4] := 110;
   Futurit_Slave.TCP_Parameter.RemotePort := 12346;
   Futurit_Slave.TCP_Parameter.LocalPort := 12336;


END_DATA_BLOCK
 
Ich hab den Baustein, der vom LASER-Lieferenten kam nun komplett weggeworfen (FC, mit Temp-Flanken und anderen Dingen ;-) ) und einen eigenen geschrieben, bzw. einen aus unserem Fundus umgeschrieben.
Da geht nun auch das TCON.
Da TCON ja den Status nur kurz (Während dem Verbindungsaufbau) ausgibt,ist das in einem FC eher ungünstig :) Ich vermute mal, Send und REC können nicht gleichzeitig Senden und Empfangen?
Das war in diesem Baustein so, denn der REQ vom REC-Baustein war nach Start ständig auf True geschalten. Getrennt geht es, also erst senden, dann auf Empfang gehen und auf das Eintrudeln der Daten warten.
 
Da TCON ja den Status nur kurz (Während dem Verbindungsaufbau) ausgibt,ist das in einem FC eher ungünstig :) Ich vermute mal, Send und REC können nicht gleichzeitig Senden und Empfangen?
Das war in diesem Baustein so, denn der REQ vom REC-Baustein war nach Start ständig auf True geschalten. Getrennt geht es, also erst senden, dann auf Empfang gehen und auf das Eintrudeln der Daten warten.

Ich habe bei mir den RECV Baustein auch immer auf Empfang. Ich hätte jetzt nie was erkennen können, dass dies zu einem Problem führt. Senden kann ich trotzdem immer ohne Probleme.
Ich empfange allerdings nur sehr kurze Telegramme (10 Datenbytes).
 
Zurück
Oben