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

Ergebnis 1 bis 7 von 7

Thema: Tcon

  1. #1
    Registriert seit
    06.10.2009
    Ort
    Hessen
    Beiträge
    560
    Danke
    24
    Erhielt 43 Danke für 40 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo, ich habe ein Problem mit dem Verbinden zu einer Pilz Steuerung.
    Es funktioniert, allerdings nicht immer.

    Ich habe an einer S7 314C PN/DP angeschlossen: 2x Sinamics S120, PNOZMULTI mc1p ETH und ein Comfort Panel.


    Die Verbindung starte ich mit einem OB1 Scan Anlaufmerker und setze erst wieder zurück mit TCON Done.

    Das macht er auch meistens.

    Im TRCV Allerdings habe ich nach der Verbindung manchmal den Status #7002 anstehen und empfange keine Daten.



    Im Normalbetrieb wechselt er immer zwischen #7000/7002 wenn ich das richtig beobachtet habe.


    Bin gegen 8h wieder an der Anlage!

    Vielen Dank für jeden Tipp...
    Das, was man weiß, hat doppelten Wert, wenn man zugleich das, was man nicht weiß, nicht zu wissen eingesteht.
    Zitieren Zitieren Tcon  

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

    Standard

    Ich nehme an Recv hast du immer ein True am Enable.

    Was steht den beim Tcon.

    Ich kenne jetzt die PNOZ nicht. Aber ich nehme an du brauchst für jedes dieser Teile ein Tcon?

    mfG René

  3. #3
    Avatar von c.wehn
    c.wehn ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.10.2009
    Ort
    Hessen
    Beiträge
    560
    Danke
    24
    Erhielt 43 Danke für 40 Beiträge

    Standard

    Ja habe ein always True dran.

    Ich habe ja nur eine PNOZ, die Sinamics sind Profinet IO Teilnehmer.
    Das, was man weiß, hat doppelten Wert, wenn man zugleich das, was man nicht weiß, nicht zu wissen eingesteht.

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Kannst du mal deinen Code dazu posten ? Für mich hört sich dein Vorgehen etwas suspekt an ...

    Gruß
    Larry

  5. #5
    Avatar von c.wehn
    c.wehn ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.10.2009
    Ort
    Hessen
    Beiträge
    560
    Danke
    24
    Erhielt 43 Danke für 40 Beiträge

    Standard

    FUNCTION_BLOCK "FB1_Kommunikation"
    { S7_Optimized_Access := 'FALSE' }
    VERSION : 0.1
    VAR
    "TCON_STATUS" : Word;
    "TCON_FP_ERROR" : Bool;
    "TCON_ERROR" : Bool;
    "TCON_CONN_REQ" : Bool;
    "TCON_DONE" : Bool;
    "TCON_BUSY" : Bool;
    "TCON_STATUS_SAV" : Word;
    "TCON_CONNECTED" : Bool;
    "TRCV_NDR" : Bool;
    "TRCV_BUSY" : Bool;
    "TRCV_STATUS" : Word;
    "TRCV_RCVD_LEN" : Int;
    "TRCV_STATUS_SAV" : Word;
    "SEND_REQ_I" : Bool;
    "SEND_REQ" : Bool;
    "SEND_REQ_P" : Bool;
    "SEND_DONE" : Bool;
    "SEND_BUSY" : Bool;
    "SEND_ERROR" : Bool;
    "SEND_STATUS_SAV" : Word;
    "SEND_STATUS" : Word;
    "DISCONNECT" : Bool;
    "TRCV_ERROR" : Bool;
    "TRCV_RCVD_LEN_SAV" : Int;
    END_VAR

    BEGIN
    NETWORK
    TITLE = Störung Kommunikation zur Sicherheitssteuerung nicht aufgebaut
    AN "DB6_PNOZ_multi_ETH".VInp_23;
    A "Logisch 0";
    L S5T#20S;
    SE "EVERZ Kommunikation zur Sicherheitssteuerung nicht aufgebaut";
    NETWORK
    TITLE = Verbindungsanfrage bei Erfolg quittieren
    A(;
    A "Logisch 1";
    S #TCON_CONN_REQ;
    A #TCON_DONE;
    R #TCON_CONN_REQ;
    A #TCON_CONN_REQ;
    );
    NOT;
    = #TCON_CONNECTED;
    NETWORK
    TITLE = Kommunikation beim Anlauf zurücksetzen
    O "Anlaufmerker";
    O "EVERZ Kommunikation zur Sicherheitssteuerung nicht aufgebaut";
    R #TCON_CONN_REQ;
    R #TCON_DONE;
    R #DISCONNECT;
    R #SEND_REQ;
    R #TCON_CONNECTED;
    NETWORK
    TITLE = Verbindung aufbauen
    // - Wird einmalig aufgebaut
    A #TCON_CONN_REQ;
    = %L0.0;
    BLD 103;
    AN #TCON_CONNECTED;
    JNB Label_0;
    CALL TCON, "TCON_DB"
    {con_type := 'Any', id_type := 'Word'}
    ( REQ := %L0.0 ,
    ID := W#16#0004 ,
    DONE := #TCON_DONE ,
    BUSY := #TCON_BUSY ,
    ERROR := #TCON_ERROR ,
    STATUS := #TCON_STATUS ,
    CONNECT := P#DB20.DBX0.0 BYTE 64 );
    Label_0: NOP 0;
    NETWORK
    TITLE = Verbindungsstatus retten
    A #TCON_ERROR;
    JNB Label_1;
    L #TCON_STATUS;
    T #TCON_STATUS_SAV;
    Label_1: NOP 0;
    NETWORK
    TITLE = Daten senden
    A #SEND_REQ;
    = %L0.0;
    BLD 103;
    A #TCON_CONNECTED;
    JNB Label_2;
    CALL TSEND, "TSEND_DB"
    {ptr_type := 'Any', value_type := 'Int', id_type := 'Word'}
    ( REQ := %L0.0 ,
    ID := W#16#0004 ,
    LEN := 30 ,
    DONE := #SEND_DONE ,
    BUSY := #SEND_BUSY ,
    ERROR := #SEND_ERROR ,
    STATUS := #SEND_STATUS ,
    DATA := P#DB6.DBX30.0 BYTE 30 );
    Label_2: NOP 0;
    NETWORK
    TITLE = Daten senden - Auftragsanstoß
    A "Taktmerker";
    AN #SEND_BUSY;
    S #SEND_REQ_I;
    A(;
    O #SEND_DONE;
    O #SEND_ERROR;
    );
    R #SEND_REQ_I;
    A #SEND_REQ_I;
    = #SEND_REQ;
    NETWORK
    TITLE = Daten senden - Status retten
    A #SEND_ERROR;
    JNB Label_3;
    L #SEND_STATUS;
    T #SEND_STATUS_SAV;
    Label_3: NOP 0;
    NETWORK
    TITLE = Verbindung trennen bei Sendefehler
    //Nicht verwendet!
    L #SEND_STATUS_SAV;
    L W#16#80C4;
    ==I;
    = #DISCONNECT;
    NETWORK
    TITLE = Sendefehler - Status zurücksetzen
    A(;
    L #SEND_STATUS_SAV;
    L W#16#80C4;
    ==I;
    );
    JNB Label_4;
    L W#16#0000;
    T #SEND_STATUS_SAV;
    Label_4: NOP 0;
    NETWORK
    TITLE = Daten empfangen
    A #TCON_CONNECTED;
    = %L0.0;
    BLD 103;
    A #TCON_CONNECTED;
    JNB Label_5;
    CALL TRCV, "TRCV_DB"
    {ptr_type := 'Any', value_type := 'Int', id_type := 'Word'}
    ( EN_R := %L0.0 ,
    ID := W#16#0004 ,
    NDR := #TRCV_NDR ,
    BUSY := #TRCV_BUSY ,
    ERROR := #TRCV_ERROR ,
    STATUS := #TRCV_STATUS ,
    RCVD_LEN := #TRCV_RCVD_LEN ,
    DATA := P#DB6.DBX0.0 BYTE 30 );
    Label_5: NOP 0;
    NETWORK
    TITLE = Länge des empfangenen Telegramms retten
    A #TRCV_NDR;
    JNB Label_6;
    L #TRCV_RCVD_LEN;
    T #TRCV_RCVD_LEN_SAV;
    Label_6: NOP 0;
    NETWORK
    TITLE = Daten empfangen - Status retten
    A #TRCV_ERROR;
    JNB Label_7;
    L #TRCV_STATUS;
    T #TRCV_STATUS_SAV;
    Label_7: NOP 0;
    NETWORK
    TITLE = Header setzen
    L B#16#05;
    T "DB6_PNOZ_multi_ETH".Header_OByte0;
    L B#16#15;
    T "DB6_PNOZ_multi_ETH".Header_OByte1;
    L B#16#00;
    T "DB6_PNOZ_multi_ETH".Header_OByte2;
    L B#16#19;
    T "DB6_PNOZ_multi_ETH".Header_OByte3;
    L B#16#53;
    T "DB6_PNOZ_multi_ETH".Header_OByte4;
    L B#16#00;
    T "DB6_PNOZ_multi_ETH".Header_OByte5;
    L B#16#00;
    T "DB6_PNOZ_multi_ETH".Header_OByte6;
    L B#16#00;
    T "DB6_PNOZ_multi_ETH".Header_OByte7;
    L B#16#10;
    T "DB6_PNOZ_multi_ETH".E_Checksum_21;

    NETWORK
    TITLE = Checksumme vergleichen
    L "DB6_PNOZ_multi_ETH".Header_OByte4;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Header_OByte5;
    +I;
    T "Checksumme PNOZ Multi";

    L "DB6_PNOZ_multi_ETH".Header_OByte6;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Header_OByte7;
    +I;
    T "Checksumme PNOZ Multi";
    L %DB6.DBB38;
    +I;
    T "Checksumme PNOZ Multi";
    L %DB6.DBB39;
    +I;
    T "Checksumme PNOZ Multi";

    L %DB6.DBB40;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".LED;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Request_Table_Nr;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Request_Segment_Nr;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte0;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte1;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte2;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte3;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte4;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte5;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte6;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte7;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte8;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte9;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte10;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte11;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".Segment_Byte12;
    +I;
    T "Checksumme PNOZ Multi";
    L "DB6_PNOZ_multi_ETH".reserviert;
    +I;
    T "Checksumme PNOZ Multi";

    L B#16#00;
    L "Checksumme PNOZ Multi";
    -I;
    T "Checksumme PNOZ Multi";
    T "DB6_PNOZ_multi_ETH".A_Checksum_1;

    NETWORK
    TITLE =
    A "Logisch 1";
    = "DB6_PNOZ_multi_ETH".VOutp_00;
    END_FUNCTION_BLOCK
    Das, was man weiß, hat doppelten Wert, wenn man zugleich das, was man nicht weiß, nicht zu wissen eingesteht.

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    ich muss dir gestehen, dass mir dein Code ein bißchen kompliziert ist - ich glaube aber, eine Bestätigung für meinen Verdacht gesehen zuhaben ...
    Du solltest es so umsetzen :
    1. wenn nicht connected dann Verbindung mit TCon aufbauen.
    2. Wenn connected dann Lesen vom Partner
    3. Wenn Daten vom Partner gelesen dann ggf. etwas dahin schreiben
    4. wenn Daten geschrieben dann wieder nach 2.
    1b, 2b, 3b, 4b. wenn die Verbindung nicht mehr benötigt wird (z.B. beim Stillsetzen der Maschine oder wenn sie aus irgendeinem Grund unterbrochen wurde) dann disconnecten.

    Wie du siehst ergibt das eine Schrittkette, die du ggf. auch mit Timeout-Zeiten "würzen" solltest (also nicht nach Read_OK und Daten_erhalten gleich wieder schreiben). Das sehe ich in deinem Code nicht so - ich denke eher, dass du im Gegenteil das alles versuchst ohne eine wirkliche Reihenfolge "abzufrühstücken".
    Vielleicht denkst du darüber noch einmal nach ...

    Gruß
    Larry

  7. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    c.wehn (29.10.2013)

  8. #7
    Registriert seit
    29.04.2012
    Beiträge
    195
    Danke
    13
    Erhielt 42 Danke für 37 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    So auf den ersten Blick, bringt ein einziger Fehler am TCON dein Programm komplett zum erliegen oder? Darauf wird nicht reagiert.
    Beim Send so speziell auf einen einzigen Status abzufragen ist auch zu wenig, was passiert denn bei den 387 anderen möglichen Errorcodes?

    Ansonsten das was Larry sagt.

    Last but not least:
    Du überspringst die ganzen Aufrufe der T Bausteine, davon würde ich abraten. Du kannst den REQ und EN_R damit verriegeln, den kompletten Call abzustellen ist aber erfahrungsgemäß (und bei keinem azyklischen Kommunkationsbaustein) eine gute Idee.

Ähnliche Themen

  1. Passiver Verbindungsaufbau mit TCON
    Von Woto im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 21.10.2011, 07:48
  2. Antworten: 0
    Letzter Beitrag: 17.01.2011, 17:54
  3. TCP-Verbindung mit TCON usw (FB65,64,63)
    Von Zizou im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 15.06.2010, 16:42
  4. TCON erkennen ob Verbindung besteht
    Von Alpini im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 18.05.2009, 07:48
  5. TCP/IP Verbindung mit FB65 TCON
    Von Merkerbite im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 16.05.2009, 22:36

Lesezeichen

Berechtigungen

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