714 Aufrufe
Gefragt in Windows 10 von
Hallo, kurz zur Situation: Für ein Projekt sollen Stationsrechner einer Fertigungsanlage über eine SPS (Siemens S7, 1500er Serie) hoch- und runtergefahren werden können. Das Hochfahren war kein Problem, das funktionierte über WOL wie von alleine. Für das Runterfahren habe ich jetzt einen UDP-Server in C geschrieben (mit der Winsock-API), der von der SPS die IP-Adresse des herunterzufahrenden Rechners zugeschickt bekommt, um diesen dann per net use und shutdown herunterzufahren. Dieses Serverprogramm läuft momentan auf einem OPC-Server-PC (Intel NUK), muss jedoch aktiv, also im Vordergrund laufen, um die UDP-Packets zu empfangen. Für diesen Fall funktioniert das Programm auch einwandfrei. Da auf dem NUK aber immer mal wieder gearbeitet werden muss, ist diese Lösung leider nur suboptimal. Wenn das Programm bisher im Hintergrund läuft, wird der Socket erstellt und auch gebunden, aber der recvfrom empfängt einfach nichts. Ich kann mir das anders nicht erklären, als dass Windows das Programm "ignoriert" oder das, was an der Schnittstelle anliegt nicht zum Programm durchreicht, sobald der recvfrom blockiert. Die Idee war jetzt zu versuchen die Priorität des Programms höher zu setzen, sodass es auf jeden Fall die Packets empfängt und die Rechner herunterfährt, auch wenn es im Hintergrund läuft. Unter C# gibts da wohl auch noch ein paar mehr Möglichkeiten hab ich in der Windows-Doku gelesen, aber ich kann nur C und ein bisschen C++, das hilft mir also nicht...

Ich hoffe hier kann mir jemand helfen oder einfach ein paar Denkanstöße geben, am besten mit einigen Hintergrundinfos zur Funktionsweise von Windows. Ich habe den Thread übrigens hier reingestellt, weil auf dem NUK Win10 läuf. Falls es in einem anderen Themenbereich besser passt, einfach verschieben ;)

12 Antworten

0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo BrosBoss,

ich habe nutze zum Aufwecken das Tool WOL2. Bisher habe ich darauf nicht geachtet, aber das Tool bietet auch die Funktion zum Herunterfahren der Rechner. Ich weiß allerdings nicht, ob die Rechner damit in den Standby/Ruchezustand gehen, oder ob sie wirklich herunterfahren, was dann ja eine Sackgasser wäre, weil sie dann nicht wieder geweckt werden könnten.

Wenn es aber in den Ruhezustand geht, dann wäre doch dein Problem damit möglicherweise gelöst.

Gruß
computerschrat
0 Punkte
Beantwortet von
Hallo computerschrat,

danke für den Link zum Programm. WOL2 kenne ich bereits, finde es aber nicht so
schön wenn ich nicht genau weiß was im Hintergrund passiert, zumal der Server an
sich ja funktioniert. Ich werde jedenfalls mal schauen ob man das mit der SPS
entsprechend antriggern kann. Jedoch ist dein "Problem" mit dem vollständigen
Shutdown und der Sackgasse nicht so ganz richtig, denn wenn das entsprechende
Mainboard "Wake on LAN from S5" beherrscht und auch der Netzwerkadapter
richtig konfiguriert ist, kann man einen Rechner durchaus aus dem Off-Zustand
wecken. Genau das passiert auch hier an der Anlage.

Ich habe mein Problem jedenfalls weiter eingrenzen können. Zunächst einmal
funktioniert der recvfrom() und liefert mir auch den gewünschten String zurück.
Ursache des Problems scheint tatsächlich der system()-Aufruf zu sein, weil dieser
laut Windows-Doku wohl nicht für Programme funktioniert, die aus der Runtime-
Umgebung heraus gestartet werden.
https://msdn.microsoft.com/en-us/library/277bwbdz.aspx

Dort findet man dann weiter, dass es für den system()-Befehl leider auch keinen
Workaround gibt. Sprich ich muss mir hier selber etwas basteln (oder notfalls doch
auf WOL2 zurückgreifen...):
universal-windows-platform-apps">https://docs.microsoft.com/de-de/cpp/cppcx/crt-functions-not-supported-in-
universal-windows-platform-apps

Wenn es sonst noch Anregungen gibt, bin ich dankbar, aber in der momentanen
Situation ist das wohl eher ein Softwareproblem seitens meines Codes. Falls mir
diesbezüglich hier niemand helfen kann, würde ich diesen Thread mal in die C-
Ecke verlinken.


Gruß
BrosBoss
...