TIA Tcon

c.wehn

Level-2
Beiträge
609
Reaktionspunkte
47
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...
 
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é
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Zurück
Oben