2016
HOME

Programme ohne Compiler: VBS-Quelltext
Plane-Hopping
VBScript für die Lösung kleiner Probleme - HFDL-Decoder mit Google-Earth verbinden

aWatch - model Sweden
Auf der Frequenz 8942/10081 kHz USB empfängt man tagsüber meist den HF-Funk zwischen Flugzeug und Bodenstation SHANNON - IRLAND. (Darstellung der Positionen in Google-Earth - offline - mit Daten aus dem freien Decoder Sorcerer)
An anderer Stelle auf dieser Seite wird gezeigt, wie Flugzeugpositionen aus Kurzwellendaten über einen Decoder mit Google-Earth dargestellt werden können.

Dabei wurde die Brücke zwischen zwei unabhängigen Programmen mit der in Windows eingebauten Scriptsprache VBS gebaut und die Informationen vom Decoder Sorcerer aus seiner Log-Datei im TXT-Format in eine KML-Datei im XLM-Format entsprechend eigener Vorstellungen geleitet. Hier der Quelltext mit einigen Erläuterungen.

Zunächst soll die Grobstruktur des Gesamtscripts - und anschließend einige kurze Scripts zum Kennen lernen gezeigt werden. Dann folgen die einzelnen Routinen mit ihren Erläuterungen und am Ende die Hauptschleife dieses Scripts, welches Google Earth steuert mittels von Flugzeugen über Kurzwelle ausgestrahlter Positionsdaten, um über den Globus zu "hoppen".


Grobstruktur
Das Script erhebt keinerlei Anspruch darauf eine Endversion irgendeiner Lösung darzustellen, vielmehr wird hier gezeigt, wie ad-hoc Schritte gegangen wurden, um die Vorstellungen zu realisieren.

Der Ablauf ist wie folgt:

  • Übergabeparameter auswerten (auskommentiert)
  • Dateisystem anlegen
  • Hauptschleife (Loop) mit
    • Log-Datei komplett einlesen (readlog)
    • Bei neuen Flugdaten (newplane)
      • XML-Datei-Kopf anlegen
      • XML-Positionen usw. einfügen
      • XML-Datei-Fuß anlegen
      • Neuen Flug auf Konsole ausgeben (Wscript.Echo)
      • Über KML-Datei Google-Earth aufrufen
    • Auf neuen Log-Eintrag warten (waitlog)
  • Endlos-Wiederholung

Programmierung in VBScript
Die Programmerstellung kann im Editor (z.B. Notepad) erfolgen. Wer bereits in VB etwas erstellt hat kennt möglicherweise folgende Syntax: MsgBox "Hallo Welt". Durch einfaches Umbenennen der Dateierweiterung führt Windows diese Zeilen entsprechend den Anweisungen aus. Ein zusätzlicher Compiler oder Interpreter (VB/VBA) zur Ausführung ist nicht erforderlich, da schon längere Zeit von vielen unbemerkt mit Windows ein Script Host von Microsoft ausgeliefert wird. Dadurch sind quasi Batch-Programme in 'VB' möglich. Der Profi sollte sich der Windows-Powershell zuwenden, für das kleine Problem reicht oft CMD.EXE, also das alte Konsolenfenster aka "command.com", was ja schon vor längerer Zeit zur EXE befördert wurde. Um die verschiedenen Ausgabemodi zu unterscheiden, nun erst ein winziger Einstieg im Telegrammstil.

Erstes Programm "Hallo Welt" ...

  • Editor starten (z.B. Desktop, rechte Maustaste, Neu, Textdatei)
  • MsgBox "Hallo Welt, 66" eingeben
  • Datei speichern und anschließend in "hallo.vbs" umbenennen (Icon wechselt).
  • Doppelklick auf "hallo.vbs" zeigt das Ergebnis

Zweites Programm "Hallo Welt" ...

  • Editor starten
  • Wscript.Echo "Hallo Welt" eingeben
  • Datei speichern und anschließend in "hallo.vbs" umbenennen (Icon wechselt).
  • Doppelklick auf "hallo.vbs" zeigt das Ergebnis

Zweites Programm ohne Message-Box-Ausgabe

  • Editor starten
  • cscript hallo.vbs eingeben
  • Datei speichern und anschließend in "hallo.bat" umbenennen (Icon wechselt).
  • Doppelklick auf "hallo.bat" zeigt das Ergebnis sehr kurz.
  • In "hallo.vbs" die Zeile Wscript.sleep 10000 anhängen

Nun kann das Ergebnis für 10 Sekunden betrachtet werden. Links ist ein Screenshot von einem Windows7-System abgebildet. Dieses Ergebnis wäre auch mit noch älteren Batch-Befehlen möglich, hier sollten jedoch die verschiedenen Ausgaben hervorgehoben werden. Bei vielen Ausgaben via WScript und der Fensterausgabe können sich Staus ergeben, da alle Boxen bestätigt werden müssen. Steht schließlich in der Datei hallo.bat wscript hallo.vbs erhält man die vierte Variante: Eine Messagebox auf dem 'DOS'-Fenster.


Know-How Hilfe und Beispiele
Bei längeren Scripts und fundiertem Halbwissen ist es Hilfreich auf Beispiele und eine interaktive Hilfe zurück greifen zu können. Mit dem Tool VbsEdit 7.394 von Adersoft erhält der Anfänger was er sucht. Auch die unregistrierte Evaluationsversion ist gerade wegen der sehr vielen Beispiele (Samples) ausgezeichnet zum Testen geeignet. Manches Beispiel läuft nur, wenn die Umgebung als Administrator gestartet wurde. Man sollte dann jedoch wissen, was man startet ...

Diese Lösung basiert auf Beispielen aus der Abteilung Text-Files (Scripting Techniques)


Functions und Subs Übersicht

Die erste Aufgabe war heraus zu finden, ob sich die Log-Datei vom Decoder Sorcerer geändert hat und ob auf sie zugegriffen werden konnte. Nachdem die Zeit-Attribute nicht zum Ziel führten wurde die Dateilänge als Kriterium herangezogen. Der Zugriff erfolgt im ungeschützten Verzeichnis "C:\TEMP\" als Spielwiese, da andere Verzeichnisse unter Windows oft Administratorrechte erfordern. Hier die Funktion, die die Dateilänge liefert:

Function lastmod(filespec)
 Dim fso, f
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set f = fso.GetFile(filespec)
 lastmod = f.size    
End Function

Diese Routine wird benutzt, um eine Änderung zu registrieren. In waitlog wird gewartet, bis sich etwas ändert.

Sub waitlog
 Do
  WScript.Sleep(1000*interval)
 Loop Until lmod<>lastmod(filename)
 lmod=lastmod(filename)
End Sub

In der weiter oben angegeben Grobstruktur wird zu beginn die gesamte LOG-Datei eingelesen. In anfänglichen Versionen war die Reihenfolge etwas anders. Hier werden zu Beginn alle Flüge beim Start untersucht. Das Einlesen und die Speicherreservierung kommt aus dem Beispiel "Read a Text-File from the Bottom up". Hier die Anpassung:

Sub readlog
 Set f = fs.OpenTextFile(filename, 1)
 Do Until f.AtEndOfStream
  Redim Preserve arrFileLines(i)
  arrFileLines(i) = f.ReadLine
  i = i + 1
 Loop
 f.Close
End Sub

Um aus der Log-Datei, die zu Beginn des Scripts komplett in den Speicher geladen wird, die neuen Flüge zu extrahieren, wurde newplane gebaut:

Function newplane
 newplane = False
 For n = li To i-1 'Beginning = 0  last plane li
  s = arrFileLines(n)
  If InStr(s,":")=3 And InStr(s,"LAT")<>0 And _
  InStr(s,"LAT 180 0 0  N  LON 180 0 0  E")=0 Then
    newplane=True
    Exit For
  End if
 Next
End function

Von den drei globalen Variablen werden hier alle drei benutzt. Die Log-Datei-Zeilen stehen in arrFileLines, li enhält die "letzte" bzw. vorige eingelesene Zeilenanzahl und i die aktuelle Zeilenanzahl. Wenn das 3. Zeichen ein ":" ist und das Wort "LAT" vorkommt, handelt es sich wahrscheinlich um Flugpositionsdaten. Da einige Maschinen ohne Koordinaten auftauchen, werden diese ausgesondert. Ein Fund wird mit true quittiert.

Sub Google
 Set WshShell = WScript.CreateObject("WScript.Shell")
 Return = WshShell.Run(kml)
End Sub

Hier die Routine zum Start von Google Earth, deren Parameter nach eigenen Wünschen angepasst werden können (Run). Hier wird der einfachste Aufruf benutzt. Die KML-Datei muss mit Earth verknüpft sein, damit die Weitergabe funktioniert.

Als letzte Funktion nun die Buchstabenfummelei, um die Koordinaten des Fluges einigermaßen verlässlich zu lesen und zu wandeln, um sie in der Hauptschleife in die XML-Datei zu schreiben. Eine Script-Variante der C-Funktion sscanf wäre jetzt gut, aber es gibt ja Mid ...

Function latlon(lonlat,s)
 	sp0=InStr(s,lonlat)+4
 	sp1=InStr(sp0,s," ")	'LAT 50 38 27  N
 	lat1=Trim(Mid(s,sp0,sp1-sp0))	 '50
 	sp2=InStr(sp1+1,s," ")
 	lat2=Trim(Mid(s,sp1+1,sp2-sp1))'38
 	sp3=InStr(sp2+1,s," ")
 	lat3=Trim(Mid(s,sp2+1,sp3-sp2))'27
 	lat4=Trim(Mid(s,sp3+2,1))	'N
 	latf=CDbl(lat1)+CDbl(lat2)/60.0+CDbl(lat3)/3600.0 
	If lat4="S" Or lat4="W" Then latf=-latf
 	lat=FormatNumber(latf,6)
 	lat=Replace(lat,",",".")
 	latlon=lat
End Function

Übergeben wird die gesamte Log-Zeile mit Grad, Minuten und Sekunden und in lonlat, ob "LON", oder "LAT" gewandelt werden soll. Das Ergebnis ist eine vorzeichenbehaftete Dezimalzahl mit DezimalPUNKT, damit Google zufrieden ist.


Hauptschleife loop

Die Hauptschleife und die Deklarationen stehen am Anfang. Darunter sollten dann die obigen Routinen eingefügt werden, damit das Gesamtscript entsteht, welches der 6.exe im anderen Beitrag entspricht. Angenommen es wird als 6.vbs abgespeichert, dann sollte noch eine entsprechende 6.bat mit der Zeile "cscript 6.vbs" erstellt werden. Wer 6.vbs ohne Konsolenumleitung startet, erhält ziemlich viele Msg-Boxes, je nachdem wie viele Flüge schon in der Log-Datei "0.txt" von Sorcerer stehen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Const cl=Chr(13)&Chr(10)

'Set Args = WScript.Arguments
'If args.Count<>2 Then 
  filename="C:\temp\0.txt"
  kml="c:\temp\test0.kml"
  interval=15
'End if 
  
'filename=Args(0)
'kml=Args(1)
'interval=Args(2)

'-----------------------------------
Dim arrFileLines(),lmod,li

Set fs = CreateObject("Scripting.FileSystemObject")
WScript.Echo "Sorcerer to Earth converter starting ..."
WScript.Echo "input: "&filename
WScript.Echo "output:"&kml&cl

While True
 i = 0
 'waitlog	' wait for new filelength of logfile
 readlog
 If newplane Then
  'Create XML Document header
  Set fx = fs.CreateTextFile(kml,True)
  x="<?xml version=""1.0"" encoding=""UTF-8""?>"& cl & _
    "<kml xmlns=""http://earth.google.com/_
     kml/2.0"">"& cl &_
    "<Document>"& cl & _
    "<Style id=""bluepin"">"& cl & _
    "      <IconStyle>"& cl & _
    "       <Icon>"& cl & _
    "              <href>http://maps.google.com/mapfiles/kml/_
shapes/airports.png</href>"& cl & _
    "        </Icon>"& cl & _
    "      </IconStyle>"& cl & _
    "    </Style>"& cl 
  fx.WriteLine x
  'Add new placemarks in xml
  For n = li To i-1 'Beginning = 0  one plane li
   s = arrFileLines(n)
   If InStr(s,":")=3 And InStr(s,"LAT")<>0 And _
   InStr(s,"LAT 180 0 0  N  LON 180 0 0  E")=0 Then
    x="<Placemark>"&cl& _
      "<styleUrl>#bluepin</styleUrl>"&cl& _
   	  "<name>" & Trim(Mid(s,27,7)) & "</name>" &cl& _ 
	  "<description>"&cl& _
	  "TIME:  " & Left(s,13) & "<br />" &cl& _
	  "</description>"&cl& _
	  "<Point>"&cl& _
	  "<coordinates>" & latlon("LON",s) & _
   ","&latlon("LAT",s)&",10000</coordinates>"&cl& _
	  "<TimeStamp><when>2016-1-1T" & Left(s,8) & _
   " Z</when></TimeStamp></Point>"&cl& _
	  "</Placemark>"&cl
	   fx.WriteLine x
	  'WScript.Echo s
   End if
  Next
  'Write the xml footer
  x="</Document>"&cl&"</kml>"&cl    
  fx.WriteLine x
  fx.Close 'XML
  'New Planes with zero LAT LON
  For n = li To i-1 'Beginning = 0
   	s = arrFileLines(n)
	  If InStr(s,":")=3 Then	WScript.Echo s
  Next
  li=i
  Google
 End If 'NewPlane
 waitlog
Wend 

Aufgrund der XML-Strings sieht das Listing etwas zerissen aus.


Ausblick und Rückblick

Befasst man sich etwas mit VBScript, so gibt es doch einige interessante Anwendungen, auch wenn, wegen des einzig vorhandenen Variablentyps Variant, keine direkten DLL-Zugriffe mit Rückgaben möglich sind. Damit entfällt auch TCP/IP auf dieser Ebene ohne Zusatzwrapper. Mit Dateien ist viel zu erledigen, aber auch das Starten von Programmen mit entsprechenden Parametern gestattet es zum Beispiel Demoprogramme mit begrenzter Laufzeit je nach Bedarf automatisch zu starten ...

Während dieses Projektes wurden Erinnerungen an VBA wach. Mit Word für Windows 2 wurde - damals noch live via Satellit - die Programmierung in Office vorgestellt. Es gab sogar ein Wordbasic auf Deutsch (Wenn..Dann..Sonst). Ab Word6 und Excel5 hatte sich VBA etabliert und stand auch meist unbemerkt auf fast jedem PC zur Verfügung. Darum entstand das Buch "Messen Steuern Regeln mit Word und Excel". Ach noch was: VBScript soll nicht weiter entwickelt werden.

Zugehörender Beitrag: HFDL, Flugradar im Wohnzimmer


Weitere Software
.
Startseite Bücher Software Digital RTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt