# TIA V13: Eigene IP-Adresse im Basic Panel auslesen



## stoecklepator (13 Oktober 2014)

Hallo zusammen,

ich habe ein Problem mit einem Siemens KTP700 PN-Panel (ProfiNet), das ich mit dem TIA-Portal V13 projektiere. Wie kann ich im Panel die eigene IP-Adresse auslesen? Es geht nicht um die Einstellung der IP-Adresse in der Systemsteuerung des Gerätes, sondern um das Auslesen dieser Adresse im Panel-Programm.
Grund dafür ist, dass ich in einer Anlage drei nahezu gleiche Panel verwende. Je nach Einbauort sollen unterschiedliche Funktionalitäten freigeschaltet bzw. gesperrt sein. Anhand der vergebenen IP-Adresse könnte ich recht einfach feststellen, welcher Einbauort vorliegt. Wenn ich denn die Adresse wüsste :?
Der Kunde hätte den Vorteil, dass er nur ein Ersatzpanel bräuchte. Die IP-Adresse kann er selber einstellen und das Panel hätte dann automatisch die richtige Konfiguration und wir bräuchten nur ein Panel-Projekt zu pflegen.

Sollte es eine einfache andere Variante geben, so wäre ich auch dafür dankbar. Aus meiner Sicht wäre die zweitbeste Lösung, dass man eine Auswahlmöglichkeit (z.B. ein spezielles Bedienbild mit entsprechenden Benutzerrechten) vorsieht, in dem man den Einbauort des Panels selektieren kann.

Vielen Dank im Voraus.


----------



## PN/DP (13 Oktober 2014)

*WinCE VBS GetHostname*

(Beispielskripte getestet unter WinCC flexible, sollten auch unter TIA laufen)

Ich ermittle für die Panel-Unterscheidung nicht die IP-Adresse, sondern den Hostname (den OP-"Device Name"). Den kann der Kunde ebenfalls selber in "Control Panel > Communication Properties > Device name" eingeben.
Die Panele heißen dann z.B. "MP370_Linie_1", "MP370_Linie_2" ... wobei ich meist nur die Nummer am Ende auswerte ("_1", "_2" ...)

Da es für das Lesen der IP-Adresse oder des Hostname keinen direkten Befehl gibt, muß man im CMD-Prompt ein externes Programm aufrufen, was die gewünschte Information liefert, und dessen Ausgabe in einer Textdatei auffangen. Dafür eignen sich z.B. "ipconfig" oder "ping localhost" (dauert länger).

Bei meinen (früheren) Versuchen mit WinCC flexible habe ich festgestellt, daß das von Siemens kastrierte WinCE sich stellenweise ziemlich zickig anstellt. Seitdem erzeuge ich zuerst eine Batchdatei mit den gewünschten Befehlen und starte dann die Batchdatei. Dann noch auf das Erscheinen der Ausgabedatei warten (welche vorher gelöscht wurde und nach der Ausgabe umbenannt wurde) und danach die Information aus der Ausgabedatei auslesen. Weil es keine Information gibt, wann das externe Programm ausgeführt und beendet ist, wird auf das Erscheinen der am Ende umbenannten Programmausgabe-Datei gewartet.

Außerdem schreibe ich meine Skripte für die Panele so, daß ich sie auch auf einem PC ausführen/testen kann. Dafür habe ich in der RT eine Variable "_System\!_RT-Sim_!". Je nachdem, ob ich das Runtime-Projekt auf ein Panel lade oder auf einem PC starte, setze ich den Startwert der Variable auf: 0=läuft auf dem Panel / 1=läuft auf einem PC

Noch eine unschöne Macke: WinCE-Programme kennen anscheinend kein "Minimized" -> der CMD-Aufruf ist immer kurzzeitig in Vollbild zu sehen.


```
[COLOR="#008000"]' Sub GetHostname() - ermittelt den OP-"Device Name" (= Hostname = Computername)
' Der "Device Name" wird in "Control Panel - Communication Properties" eingegeben[/COLOR]

Const ForReading = 1, ForWriting = 2
Dim SimPC, fso, f, batfile, outfile, txtfile, txtname, cmdline, breaktime
batfile = "\TEMP\gethostname.bat" [COLOR="#008000"]'Batchdatei für WinCE[/COLOR]
outfile = "\TEMP\ipconfig.tmp"    [COLOR="#008000"]'Programmausgabe ipconfig[/COLOR]
txtfile = "\TEMP\ipconfig.txt"    [COLOR="#008000"]'Umbenannt nachdem ipconfig fertig[/COLOR]
txtname = " ipconfig.txt"         [COLOR="#008000"]'Zieldateiname Umbenennen - wegen WinCE ausgeschrieben, muß hier mit " " beginnen[/COLOR]

[COLOR="#008000"]' Kommandozeile CMD + Batchdatei für WinCE-CMD erstellen[/COLOR]
SimPC = SmartTags("_System\!_RT-Sim_!")
If SimPC Then [COLOR="#008000"]'PC-Windows[/COLOR]
  cmdline = "/c ipconfig /all >" & outfile & " & ren " & outfile & txtname
  FileDel txtfile [COLOR="#008000"]'auf das Erscheinen dieser Datei nachher warten und wegen umbenennen löschen[/COLOR]
Else [COLOR="#008000"]'WinCE[/COLOR]
  cmdline = "/c " & batfile
  Set f = CreateObject("FileCtl.File")
  f.Open batfile, ForWriting
  f.LinePrint "@del " & txtfile
  f.LinePrint "@ipconfig /all >" & outfile
  f.LinePrint "@ren " & outfile & txtname
  f.Close
End If

breaktime = Now() + #00:00:10# [COLOR="#008000"]'TimeSerial(0, 0, 10) 'max bis Jetzt()+10 Sekunden warten[/COLOR]
StartProgram "CMD.EXE", cmdline, hmiShowMinimized, hmiYes [COLOR="#008000"]'!? was bedeutet das hmiYes nun wirklich ?![/COLOR]
Do While Not FileExist(txtfile)
  If (Now() > breaktime) Then Exit Sub [COLOR="#008000"]'Notausgang bei Überschreitung Wartezeit[/COLOR]
Loop [COLOR="#008000"]'auf Programmende warten[/COLOR]

[COLOR="#008000"]' Programm beendet und txtfile erstellt! Nun Hostname auslesen:[/COLOR]
If SimPC Then [COLOR="#008000"]'PC-Windows[/COLOR]
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile(txtfile, ForReading, False)
  Do While f.AtEndOfStream = False
    If FindHostname(f.ReadLine) Then Exit Do
  Loop
  f.Close
Else [COLOR="#008000"]'WinCE[/COLOR]
[COLOR="#008000"]' Set f = CreateObject("FileCtl.File") 'schon weiter oben ausgeführt[/COLOR]
  f.Open txtfile, ForReading
  Do While f.EOF = False
    If FindHostname(f.LineInputString) Then Exit Do
  Loop
  f.Close
End If
```


```
[COLOR="#008000"]' Function FindHostname(sline)
' durchsucht eine übergebene Stringzeile, ob darin "*Host* : <Hostname>" vorkommt
' und weist der Variablen SmartTags("_System\Hostname") den Hostname zu - Rückgabe ist dann TRUE
' die Stringzeile stammt aus der Ausgabe des Befehls "ipconfig /all"
' WinXP: Zeile  4  "        Hostname. . . . . . . . . . . . . : COMPUXXX", 0D(, 0D, 0A)
' WinCE: Zeile 21  "	 Host name.........: MP370_2 "(, 0D, 0A)[/COLOR]

Dim field, hostname
FindHostname = False
If sline = "" Then Exit Function [COLOR="#008000"]'wg. Split()[/COLOR]
field = Split(sline, ":")
If UBound(field) <> 0 Then [COLOR="#008000"]' ":" war enthalten, field(0): Text vor ":", field(1): Text nach ":"[/COLOR]
  If InStr(field(0), "Host") Then
    FindHostname = True
    hostname = Replace(Trim(field(1)), Chr(&H0D), "") [COLOR="#008000"]'unter WinXP hängt noch ein &H0D dran[/COLOR]
    SmartTags("_System\Hostname") = hostname
  End If
End If
```


```
[COLOR="#008000"]' Function FileExist(Path) prüft, ob die angegebene Datei vorhanden ist
' Rückgabewert muß True/False sein!
' Skript kann unter OP-WinCE und PC-Windows laufen
' Path darf unter WinCE wildcards *? enthalten[/COLOR]

Dim fso
FileExist = False
If SmartTags("_System\!_RT-Sim_!") Then [COLOR="#008000"]'PC-Windows[/COLOR]
  Set fso = CreateObject("Scripting.FileSystemObject")
  If fso.FileExists(Path) Then FileExist = True
Else [COLOR="#008000"]'WinCE[/COLOR]
  Set fso = CreateObject("FileCtl.FileSystem")
  If fso.Dir(Path) <> "" Then FileExist = True
End If
```


```
[COLOR="#008000"]' Sub FileDel(Path) löscht eine Datei
' Skript kann unter OP-WinCE und PC-Windows laufen[/COLOR]

Dim fso
If SmartTags("_System\!_RT-Sim_!") Then [COLOR="#008000"]'PC-Windows[/COLOR]
  Set fso = CreateObject("Scripting.FileSystemObject")
  If fso.FileExists(Path) Then fso.DeleteFile Path
Else [COLOR="#008000"]'WinCE[/COLOR]
  Set fso = CreateObject("FileCtl.FileSystem")
  If fso.Dir(Path) <> "" Then fso.Kill Path
End If
```

Harald


----------



## PN/DP (14 Oktober 2014)

Ich sehe gerade, daß auch beim Ablauf unter WinCE das Löschen der Ausgabedatei vor dem CMD-Aufruf passieren müßte, doch das Skript GetHostname() funktioniert in meinen Panels (anscheinend) auch so wie oben gezeigt. Vermutlich wird ab dem zweiten Aufruf die Ausgabedatei vom Aufruf davor ausgewertet (falls sie noch vorhanden ist), was nicht weiter auffällt, wenn man den Hostname zwischendurch nicht ändert. Normalerweise wird bei mir das Skript nur beim Runtimestart nach Einschalten des Panels aufgerufen und da existiert die Ausgabedatei nicht bzw. nicht mehr, weil in \TEMP\

(Oder ist die gestartete Batchdatei schneller fertig mit Löschen als die Fortsetzung des Skriptes??)

Hier eine verbesserte (aber noch nicht getestete) Version:

```
[COLOR="#008000"]' Sub GetHostname() - ermittelt den OP-"Device Name" (= Hostname = Computername)
' Der "Device Name" wird in "Control Panel - Communication Properties" eingegeben[/COLOR]

Const ForReading = 1, ForWriting = 2
Dim SimPC, fso, f, batfile, outfile, txtfile, txtname, cmdline, breaktime

batfile = "\TEMP\gethostname.bat" [COLOR="#008000"]'Batchdatei für WinCE[/COLOR]
outfile = "\TEMP\ipconfig.tmp"    [COLOR="#008000"]'Programmausgabe ipconfig[/COLOR]
txtfile = "\TEMP\ipconfig.txt"    [COLOR="#008000"]'Umbenannt nachdem ipconfig fertig[/COLOR]
txtname = " ipconfig.txt"         [COLOR="#008000"]'Zieldateiname Umbenennen - wegen WinCE ausgeschrieben, muß hier mit " " beginnen[/COLOR]

[COLOR="#008000"]' Ausgabedatei löschen falls sie schon existiert[/COLOR]
FileDel txtfile [COLOR="#008000"]'auf das Erscheinen dieser Datei nachher warten und wegen umbenennen löschen[/COLOR]

[COLOR="#008000"]' Kommandozeile CMD + Batchdatei für WinCE-CMD erstellen[/COLOR]
SimPC = SmartTags("_System\!_RT-Sim_!")
If SimPC Then [COLOR="#008000"]'PC-Windows[/COLOR]
  cmdline = "/c ipconfig /all >" & outfile & " & ren " & outfile & txtname
Else [COLOR="#008000"]'WinCE[/COLOR]
  cmdline = "/c " & batfile
  Set f = CreateObject("FileCtl.File")
  f.Open batfile, ForWriting
  f.LinePrint "@ipconfig /all >" & outfile
  f.LinePrint "@ren " & outfile & txtname
  f.Close
End If

[COLOR="#008000"]' ipconfig ausführen und Ausgabe auffangen[/COLOR]
breaktime = Now() + #00:00:10# [COLOR="#008000"]'TimeSerial(0, 0, 10) 'max bis Jetzt()+10 Sekunden warten[/COLOR]
StartProgram "CMD.EXE", cmdline, hmiShowMinimized, hmiYes [COLOR="#008000"]'!? was bedeutet das hmiYes nun wirklich ?![/COLOR]
Do While Not FileExist(txtfile)
  If (Now() > breaktime) Then Exit Sub [COLOR="#008000"]'Notausgang bei Überschreitung Wartezeit[/COLOR]
Loop [COLOR="#008000"]'auf Programmende warten[/COLOR]

[COLOR="#008000"]' Programm beendet und txtfile erstellt! Nun Hostname auslesen:[/COLOR]
If SimPC Then [COLOR="#008000"]'PC-Windows[/COLOR]
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile(txtfile, ForReading, False)
  Do While f.AtEndOfStream = False
    If FindHostname(f.ReadLine) Then Exit Do
  Loop
  f.Close
Else [COLOR="#008000"]'WinCE[/COLOR]
[COLOR="#008000"]' Set f = CreateObject("FileCtl.File") 'schon weiter oben ausgeführt[/COLOR]
  f.Open txtfile, ForReading
  Do While f.EOF = False
    If FindHostname(f.LineInputString) Then Exit Do
  Loop
  f.Close
End If
```

Harald


----------



## stoecklepator (14 Oktober 2014)

Vielen Dank! 
Das mit dem Devicename klingt praktisch. Den braucht das Gerät sowieso, da es über Profinet angeschlossen ist.
Jetzt muss ich nur noch nachschauen, wie der Devicename im Panel ausgelesen werden kann. Hoffentlich ist wenigstens das möglich. Die Möglichkeiten im TIA Portal sind genau so beschränkt wie bei WinCC flexible. Der gleiche Mist in neuer Verpackung.


----------



## JesperMP (14 Oktober 2014)

stoecklepator schrieb:


> *TIA V13: Eigene IP-Adresse im Basic Panel auslesen*
> 
> ich habe ein Problem mit einem Siemens KTP700 PN-Panel (ProfiNet),


Ein KTP700 Basic Panel, kann wohl keine Skripte, oder ... ?

Aus die Technische Daten:


> Functionality under WinCC (TIA Portal)Number of Visual Basic Scripts *No*



Die Aufgabe, ein TIA Projekt für mehrere Panele, und das HMI Program ist "selbstkonfiguriend" abhängig von welche Lokation ("wer bin ich") ist mit diesen panel zwierig.


----------



## RONIN (11 Februar 2016)

Kann bestätigen dass das auch auf einem TP1200 läuft.

TOP! Großes Lob an Harald. :TOOL:


----------

