I/O Siemens S7 nach Unterbrechung neu starten?

Hallo,

ich habe es jetzt geschafft eine CPU317 über Ethernet mit IPS zu verbinden, dann sagte mir ein bekannter das er mit einer anderen Software immer Probleme hat wenn die Netzwerkverbindung mal unterbrochen war, also mal kurz probiert und leider springt IPS da auch nicht mehr von alleine an. was kann man da machen?

Man kann von Hand die Verbindung der I/O Instanz trennen und neu verbinden, geht das vielleicht auch per Script befehl?

Dann könnte man sich ein Watchdog programmieren der die Instanz neu startet.

Schöne Grüße
Thomas

Hallo Thomas,

IPS_ApplyChanges initialisiert die Verbindung neu.
Mehr Infos findest Du hier…

Schöne Grüße
Roland

Hallo,

mit IPS_ApplyChanges wird versucht die Instanz neu zu starten, ist das Netzwerk aber noch nicht wieder verfügbar wird das Script mit dem Befehl nicht beendet, es läuft unendlich und bringt eine Fehlermeldung, gibt es eine Möglichkeit die Laufzeit zu begrenzen?

Schöne Grüße
Thomas

Hallo Thomas,

Du könntest vor IPS_ApplyChanges die Verfügbarkeit der S7 mit Sys_Ping testen.

Viele Grüße
Roland

Hallo,

ich habe jetzt meinen Watchdog, der Ping alleine reicht nicht aus. Ich habe noch die Zeit seit der letzten Aktualisierung mit rein genommen.

Der Ping alleine hat eine komische Angewohnheit, trotz abgezogenen Netzkabel meldet dieser noch mal ein „true“ und IPS_ApplyChanges läuft wieder ins leere.
ich habe jetzt diese beiden Scripte bei mir mit eingebaut.

Dieses setzt die Watchdog Variable auf Flase im Fehlerfall:


<?
$zeit = time();
$update = IPS_GetVariable(44084);
$last = $update["VariableUpdated"];
$diff = $zeit - $last;
//
$bool = sys_ping ("IP-Adresse",5000);
//
If ($bool == 0 or $diff > 60)
{
setvalue (18612 /*[sps verbinden\SPS Watchdog]*/ ,0);
}
if ($bool == 1 and $diff > 60)
{
setvalue (18612 /*[sps verbinden\SPS Watchdog]*/ ,0);
ips_sleep(5000);
setvalue (18612 /*[sps verbinden\SPS Watchdog]*/ ,1);
}
?>

Und dieses baut die Verbindung dann wenn die Variable wieder true ist:


<?
$ping = getvalue(18612 /*[sps verbinden\SPS Watchdog]*/ );
if ($ping == 1)
{
ips_sleep(5000);
IPS_ApplyChanges(59038 /*[Siemens S7]*/ );
}
?>

Schöne Grüße
Thomas

Hi Leute,

Auch ich habe ein Problem beim Verbindungsaufbau zwischen IPS und S7 nach einem Unterbruch. Ich habe das leicht modifizierte Script von ThomasD eingebaut:

<? 
ips_sleep(5000); 
IPS_ApplyChanges(59038 /*[Siemens S7]*/ ); 
?>

Es wird nach einem erfolgreichem Ping (das passiert in einem anderen Script) getriggert. Folgende Fehlermeldung wird aber nach einem Reconnect-Versuch ausgegeben:

05.11.2013 22:16:08.247 |     0 | ERROR   | ScriptEngine         | FunctionName: IPS_ApplyChanges, ThreadID: 1308, CrashReport: Access violation at address 7C920F1E in module 'ntdll.dll'. Read of address 00000000

Manchmal habe ich es geschafft indem ich den Hacken unter „I/O Instanzen → Konfiguration → Aktiv“ raus genommen, die Änderung gespeichert, anschließend den Hacken wieder rein und gespeichert habe. Nach diesem Vorgehen hat es manchmal wieder funktioniert … manchmal auch nicht. Ab und An poppt dann ein Error-Fenster mit

Access violation at address 7C920F1E in module 'ntdll.dll'. Read of address 00000000

auf. Nach einem Neustart des IPS-Dienstes funktioniert wieder alles einwandfrei.

Ist da vielleicht noch ein Bug versteckt?:confused::frowning:

Hallo sunni2002,

ich mache das so:

//*************************************************************************************************************
// Führt einen Reset der LOGO-Anbindung durch
function LogoReset($ObjektID)
	{
	S7_SetOpen($ObjektID, false);
   IPS_ApplyChanges($ObjektID);
   IPS_Sleep(500);
   S7_SetOpen($ObjektID, True);
   IPS_ApplyChanges($ObjektID);
   Return;
   }

Trigger ist die wiederkommende Verbindung per Sysping…

Joachim

Hier kann ich mich auch anschließen.
Egal ob ich das erneute Verbinden mit oder ohne vorhergehendem Deaktivieren der fehlerhaften Instanz mache, kommt bei jedem zweiten oder dritten Versuch die Fehlermeldung.

Machmal kann ich den Dienst normal beenden; manchmal muss ich diesem mit dem Task-Manager töten.

Hallo,

keiner eine Idee, wie man zumindest eine Benachrichtigung erhalten kann, wenn die Verbindung zur SPS abstürzt?
Ich sehe dann unter Meldungen immer nur gelbe Timer-Benachrichtigungen.
Wenn man diese abfragen könnte, so kann man wenigstens eine Emailbenachrichtigung verschicken

Viele Grüße

bastelfrosch

Ich mach das bei meinen LOGO’s ganz klassisch. Jede LOGO toggelt jede Minute eine Variable und auf IPS Seite frage ich die letzte Aktualisierung der entsprechenden Variablen ab. Wenn die LOGO (oder auch die Verbindung dahin) abschmiert, gibt es keine Aktualisierung mehr und Du kannst darauf entsprechend reagieren.

Hallo Heimgeist,

magst Du mal bitte posten wie das gemacht hast? (Skript, Einstellungen in der LOGO)

Joachim

Hallo Heimgeist,

vielen Dank für Deine Antwort.
Leider habe ich das Problem, dass wenn die Verbindung abschmiert, IPS irgendwelche Daten „empfängt“ und auswertet.
Soll heissen, wenn die Verbindung abgeschmiert ist, sieht es im Webfront so aus, als würde irgendjemand 20 verscihedene Lichter wahllos an- und ausschalten :slight_smile:

Ich bräuchte eigentlich nur die Info aus IPS, wenn diese gelben Treat-Events in den Meldungen stehen …

Viele Grüße

bastelfrosch

In der LOGO brauchst Du einen Impulsgeber und gibst den Ausgang an einen Marker. (Logo_Watchdog.jpg)
(Screenshot ist von einer älteren Version) Die Puls/Pausenzeiten müssen jeweils 30 Sekunden sein)

Auf IPS Seite habe ich folgendes Konstrukt mit drei Variablen und einem Script. (IPS_Watchdog.jpg)

Die S7 Instance zur LOGO ist wie folgt konfiguriert (S7Instance.jpg)

Und das Watchdog Script, welches alle 30 Sekunden ausgeführt wird, sieht so aus:


<?
$Beat_ID = 57751;
$Error_ID = 22927;
$ErrorCounter_ID = 38899;
$LOGO_Instance = 21795;

if($_IPS['SENDER'] <> "TimerEvent") {
	SetValueInteger($ErrorCounter_ID, 0);
   IPS_SetScriptTimer($_IPS['SELF'], 30);
}

if($_IPS['SENDER'] == "TimerEvent") {
	$Beat = IPS_GetVariable($Beat_ID);
	$LastBeat = (int)(time() - $Beat["VariableUpdated"]);
	if($LastBeat < 40) {
		// No Error
		//IPS_LogMessage("LOGO Solar", "Online");
		SetValueBoolean($Error_ID, false);
	} else {
	   // Error
		IPS_LogMessage("LOGO Solar", "Offline -> reset LOGO Instance");
		SetValueInteger($ErrorCounter_ID, GetValueInteger($ErrorCounter_ID) + 1);
      SetValueBoolean($Error_ID, true);
 		S7_SetOpen($LOGO_Instance, false);
		IPS_ApplyChanges($LOGO_Instance);
		IPS_Sleep(500);
		S7_SetOpen($LOGO_Instance, true);
		IPS_ApplyChanges($LOGO_Instance);
	}
}

?>

@bastelfrosch: Schau mal hier: http://www.ip-symcon.de/forum/threads/9870-Siemens-S7-Verbindungsstatus?p=81474#post81474

Hatte ich auch noch nicht auf dem Radar ist aber genau das was Du benötigst.

Hallo Heimgeist,

vielen Dank, werde bei nächster Gelegenheit es mal versuchen zu integrieren…

Joachim

Hallo Heimgeist,

der zweite Vorschlag ist ja es über den Instanz-Status und den EventHandler zu überwachen.
Ich nutze den EventHandler schon, um Skripte beim Start bzw. Ende auszuführen.

Man hat dazu noch die Möglichkeit ein WatchDog-Skript zu bestimmen und/oder(??) Skripte bei der Statusänderung bestimmter Instanzen ausführen zu lassen…

Mir ist durch diese beiden zuletzt genannten Dinge nicht ganz klar wie ich bei der Überwachung von z.B. mehreren LOGOs vorgehen sollte. Durch welches Ereignis wird das WatchDog-Skript aufgerufen? Benötige ich dieses zwingend für die beispielhaft genannte Überwachung von mehreren LOGOs?

Joachim

…nutzt keiner diese oben genannte Funktion??

Joachim

Hallo JPaeper,
ich verwirkliche im Moment eine Jalousiesteuerung in unserem Bürogebäude über 3 Stockwerke.
Im Moment laufen bereits 5 Logo’s über LAN miteinander, im Endausbau werden es dann 15 Logo’s sein.

Hier habe ich genauso das Problem bei Spannungsunterbrechung der Logo’s, dass ich manuell „reconnecten“ muss.
Manchmal hilft auch nur ein Neustart von IP-Symcon.
Das Ganze ist natürlich nicht zufriedendstellend, und ich suche ebenfalls nach einer Lösung.
Ich habe hier eine Testlogo vor mir liegen, wenn du also irgendwelche Scripte hast zum Testen, nur her damit.

mfg
caesar

Hallo caesar,

Heimgeist hatte ein paar Postings vor diesem Beitrag einen Link gepostet. Dort beschreibt Paresy, wie man die fehlerhafte Verbindung der Instanz möglicherweise sicher erkennen kann. Folgt man wiederum den Links von Paresy, dann kann man im Event Handler Skripte für defekte Instanzen starten. Meine Unsicherheit ergibt sich wie schon oben beschrieben aus der Möglichkeit ein Watchdog-Skript zu starten oder etwas für die einzelnen Instanzen zu programmieren. Hier besteht für mich noch Erklärungsbedarf…

Ich sehe darin aber den ersten wichtigen Schritt, d.h. zumindest sicher abzufangen (eben aus den IPS-Systemmeldungen) das etwas im Argen liegt (ob das so ist, ist m.E. derzeit noch offen).
Wenn ich weiß wie das mit dem EventHandler am Besten gelöst wird (wenn es den tatsächlich zwei Möglichkeiten gibt), würde ich zunächst einmal versuchen durch programmtechnische Trennung eine Wiederbelebung zu erreichen.

Im Moment fehlt mir also keine LOGO, sondern das Wissen wie man da am Besten an den ersten Schritt geht…:frowning:

Joachim

P.S.: Nur damit die Diskussion nicht einen falschen Eindruck vermittelt: Meine drei LOGOs laufen extreme stabil, dennoch gibt es manchmal Situationen bei der die Verbindung zum IPS unterbrochen wird…

Hallo zusammen,

wir lösen das aktuell so bei uns:



	//***************************************************************************
	//Verbindungsüberwachung und Neuaufbau bei Verbindungsabbruch
	//09.12.2013 Guther
	
	//nicht verwendetes Testbit wird in die Steuerung geschrieben, sollte dies 
	//nicht funktionieren, liefert die Funktion eine "0" zurück. Ist die Steuerung
	//danach wieder erreichbar (Port offen) wird die Verbindung neu initialisiert
	//***************************************************************************




$testbit=GetValueBoolean(30927 /*[Verbindungsüberwachung und Neuinitialisierung Steuerungen\Hage 12\Testbit\Value]*/);
$error =S7_WriteBit(51056 /*[Verbindungsüberwachung und Neuinitialisierung Steuerungen\Hage 12\Testbit]*/,false);
echo "
Verbindung hat keinen Fehler: Status $error";
$port = array(102); // hier zu prüfende Ports eingeben

//Port Prüfung für die oben angegebenen Ports
for($i=0; $i<count($port); $i++)
{
    $socket = fsockopen("192.168.16.25", $port[$i]); // IP Adresse anpassen

}


//Falls Schrieben des Testbits nicht erfolgreich, Verbindung neu initialisieren
if (($error ==0)&&($socket))
{
IPS_ApplyChanges(59019 /*[Siemens S7 Hage 12]*/);
echo "Fehlerschleife wurde durchlaufen";
}


Gruß C. Guther