Step 7 AG_SEND mit Fehler 0x7000

FrankF67

Level-2
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
zwischen zwei S7-400 CPU’en (414-3) soll eine TCP-Kopplung aufgebaut werden (mit CP443-1). Dazu nutze ich das vorgegebene Siemens-Beispiel.
https://support.industry.siemens.co...ne-fc50-und-fc60-programmiert-?dti=0&lc=de-WW
Die Verbindung funktioniert zwar und es werden Daten gesendet und empfangen, aber am FC250 (umbenannt von FC50) steht immer das Error-Signal auf „1“,mit dem Fehler „0x7000“. Der Status "0x7000" signalisiert zwar keinen Fehler am Baustein, sondern zeigt „nur“ an, dass der AG_SEND-Baustein mit ACT=0 aufgerufen wurde, ohne dass vorher ein Auftrag mit ACT=TRUE angestoßen wurde. (Was für die Fehlerauswertung schwierig ist) In der Doku zum CP443-1 steht aber auch, dass der FC50 mit ACT=0 aufgerufen werden kann um den Status abzufragen.
Das Thema ist schon öfter behandelt worden, die Lösungen waren aber nie umfassend. Alle meine Versuche dieses Problem zu umgehen, führten nicht zum gewünschten fehlerfreien Betrieb. Ich wende mich nun an dieses Forum mit der Bitte sich das Thema anzuschauen und eine mögliche Lösung zu zeigen. :confused::confused::confused:

NETWORK 1 // Löschen des SEND BUSY nach Power-On-Reset

U "JD01IMP";
R "1_SND_BUSY";

NETWORK 2 // Start AG_SEND Funktion (Taktmerkerbyte 19)

UN "1_CONNECTION_BROKEN";
U( ;
U M 19.5; //Taktmerker
FP "1_EDGE_CTRL";
) ;
UN "1_SND_BUSY";
= "1_ACT_SEND";
S "1_SND_BUSY";

NETWORK 3 TITLE =Invoke AG_SEND function block ...

U "1_ACT_SEND";
= L 9.0;
BLD 103;
CALL "==AG_SEND" (
ACT := L 9.0,
ID := 4,
LADDR := W#16#1FFD,
SEND := P#DB190.DBX0.0 BYTE 118,
LEN := 50,
DONE := "1_SND_DONE",
ERROR := "1_SND ERR",
STATUS := "1_SND_STAT");

NETWORK 4 TITLE =

CLR ;
= "1_ACT_SEND";

NETWORK 5 // Busy rücksetzen

U "1_SND_DONE";
U "1_SND_BUSY";
R "1_SND_BUSY";

NETWORK 6 // Busy rücksetzen bei Fehler

U( ;
U "1_SND ERR";
SPBNB _001;
L "1_SND_STAT";
T #SND_STAT_SAVE;
SET ;
SAVE ;
CLR ;
_001: U BIE;
) ;
U( ;
L #SND_STAT_SAVE;
L 28672;
<>I ;
) ;
R "1_SND_BUSY";

NETWORK 7 // =Restart (start-up -> TRUE only once)

U "JD01IMP";
R "JD01IMP";
 
Versuche es mal so:
Code:
NETWORK 2       // Start AG_SEND Funktion (Taktmerkerbyte 19)
 
      UN    "1_CONNECTION_BROKEN";
      U(    ;
      U     M     19.5;                             //Taktmerker
      FP    "1_EDGE_CTRL";
      )     ;
      UN    "1_SND_BUSY";
      S     "1_ACT_SEND";
      U(    ;
      O     "1_SND_DONE";
      O     "1_SND ERR";
      )     ;
      R     "1_ACT_SEND";
      U     "1_ACT_SEND";
      S     "1_SND_BUSY";

Harald
 
Dann nimm das "1_SND ERR" mal testweise raus aus dem Rücksetzzweig oder setze das "1_ACT_SEND" nach dem SR. (Oder stoppe die CPU, falls das bei Deinem Prozess möglich ist.) Der AG_SEND will einfach nur mal einen Sendeauftrag mit gesetztem ACT zu Ende bringen.

Harald
 
Also, wenn der SND_ERR aus dem Rücksetzzweig raus ist, wird natürlich der ACT_SND gesetzt. (im Takt) Das ändert aber nichts an dem Fehlerausgang. Der bleibt auf "1". Nehme ich den SND_ERR wieder rein, wird nichts mehr gesendet.
 
Ach ja, bei der S7-400 haben AG_SEND und AG_LSEND die Macke, daß Baustein-Leerlauf ohne Sendeauftrag als ERROR gemeldet wird (ACT=0 --> ERROR=1 und STATUS=W#16#7000 ). Wenn man mit maximal möglicher Geschwindigkeit sendet, dann tritt der ERROR nicht auf. Wenn man langsamer sendet, dann müsste man AG_SEND nur zum Senden aufrufen (den Bausteinaufruf zwischen DONE oder ERROR und dem nächsten ACT überspringen) oder die ERROR-Macke kaschieren wie Willi Wusel empfahl. Keine Ahnung, warum Siemens das bei der S7-400-Version von AG_SEND eingebaut hat (S7-300 hat dieses Verhalten nicht) - vielleicht hatten sich zu viele Programmierer beschwert, daß die diversen mühsam selbstgestrickten AG_SEND-Aufrufvarianten nach dem nächsten CPU-Start nicht mehr funktionierten? ;)

So funktioniert maximal schnelles Senden mit Minimalbeschaltung - ohne ERROR_16#7000-Meldung weil ohne Leerlauf:
Code:
      U(
      O     "1_SND_DONE"
      O     "1_SND_ERROR"
      O     "ZYKLUS1"      //Merker nur im ersten OB1-Zyklus true (kann wegen der ERROR-Macke auch entfallen)
      )
      =     "1_SND__ACT"
      U     "1_SND__ACT"
      =     L     9.0
      BLD   103
      CALL  "AG_SEND"
       ACT   :=L9.0
       ID    :=4
       LADDR :=W#16#1FFD
       SEND  :=P#DB190.DBX0.0 BYTE 118
       LEN   :=50
       DONE  :="1_SND_DONE"
       ERROR :="1_SND_ERROR"
       STATUS:="1_SND_STAT"
      NOP   0

Harald
 
Die Änderung kann ich erst am Dienstag testen. Vielen Danke für die Antworten. Ich melde mich, wenn es was neues gibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
die Variante von PN/DP habe ich getestet. Funktioniert so wie beschrieben. Was mich daran nur stört, ist die extreme Belastung der CP. Nun benötige ich in meinem Projekt gleich 4 Verbindungen, was die Sache nicht einfacher macht. Dann lebe ich lieber mit diesem Fehler 0x7000 und werde nur das Error-Bit so wie Wille Wusel vorgeschlagen hat, verändern. Schade das Siemens an dieser Stelle so ein halbfertiges Produkt abgeliefert hat.
 
Zurück
Oben