Wetterdaten in die Automatisierungswelt impotieren

volker

Supermoderator
Teammitglied
Beiträge
5.805
Reaktionspunkte
1.027
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Dateien aus diesem Post werden nicht mehr gepflegt. Daher hab ich es gelöscht.
Nimm die aus Post 2
 
Zuletzt bearbeitet:
da hätte ich auch noch was in vbscript.

das script wetter_http-get holt das wetter für 3 tage bei http://www.weather365.net ab. das script musst du editieren und die id für deine stadt eintragen. welche id das ist siehst du auf der hp wenn du dort deinen ort eingibst.
die heruntergeladene datei wird gespeichert als wetter.htm

das script weather15_2_txt extrahiert aus der htm-datei die daten und schreibt diese in eine textdatei welche du z.b. mit einem hmi-gerät einlesen kannst. es wird die datei weather.txt erzeugt.

!!! Hier liegen die aktuellen Dateien. Diese können sich im laufe der Zeit ändern. Verfolge den Thread. Dort schreibe ich wann ich diesen aktualisiert habe.
 

Anhänge

  • weather15.jpg
    weather15.jpg
    11,1 KB · Aufrufe: 407
  • wetter15.htm.txt
    4 KB · Aufrufe: 234
  • wetter15.txt
    179 Bytes · Aufrufe: 222
  • weather15_2_txt.vbs.txt
    2,7 KB · Aufrufe: 256
  • weather15_http-get.vbs.txt
    2,8 KB · Aufrufe: 238
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Aktuelles Wetter und Wettervorhersage an S7 senden

Aktuelles Wetter und Wettervorhersage von Windows-PC mit Internetverbindung an S7 senden

mit angehangem Projekt kann das aktuelle Wetter und die Wettervorhersage von openweathermaps.org für einen Ort abgerufen und an eine per Ethernet verbundene S7-Steuerung übertragen werden.
der Ziel-DB liegt als Quelle vor.

In der Ausführung (z.B. als Scheduled Task) können Argumente übergeben werden, die Quelle und Ziel beschreiben.

Die Kommunikation basiert auf S7.net (durch mich mittlerweile erweitert um Real und Date_and_Time)

Hauptprogramm:

Code:
using System;
using System.Net;
using System.Xml;
using System.Globalization;
using S7;

 
namespace OpenWeatherToS7DB
{    
    class Program
    {
        //PARAMETER
        static string gsCity = "Dresden";
        static string gsPLCIP = "10.49.107.30";
        static string gsPLCType = "S7300";
        static short gbRack = 0;
        static short gbSlot = 2;
        static int giDB = 253;
        //END PARAMETER

        struct ActData
        {
            public DateTime _dtRise;
            public DateTime _dtSet;
            public int _iTemp;
            public int _iHum;
            public int _iPres;
            public int _iSpeed;
            public int _iDir;          
            public DateTime _dtLastUpdate;
        }
        struct ForecastData
        {
            public int _iTempDay;
            public int _iTempMorn;
            public int _iTempEve;
            public int _iTempNight;
            public int _iTempMax;
            public int _iTempMin;
            public int _iHum;
            public int _iPres;
            public int _iSpeed;
            public int _iDir; 
        }
        static ForecastData[] WeekForecast = new ForecastData[7];
        static ActData ActualWeather = new ActData();
        static IFormatProvider gProvider = new CultureInfo("en-GB");

        
        // <param name="args">e.g.: Dresden 10.49.107.30 S7300 0 2 253</param>
        static void Main(string[] args)
        {
            if (args.Length == 6)
            {
                gsCity = args[0];
                gsPLCIP = args[1];
                gsPLCType = args[2];
                gbRack = short.Parse(args[3]);
                gbSlot = short.Parse(args[4]);
                giDB = short.Parse(args[5]);
            }
            try
            {
                if(getActData())
                    if(getForecast())
                        writePLC();
            }
            catch { }
        }
        static bool getActData()
        {
            try
            {
                WebClient _WClient = new WebClient();
                _WClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
                string _sUrl = "http://api.openweathermap.org/data/2.5/weather?q=" + gsCity + "&mode=xml&units=metric";
                XmlTextReader _XMLReader = new XmlTextReader(_WClient.OpenRead(_sUrl));
                while (_XMLReader.Read())
                {
                    switch (_XMLReader.NodeType)
                    {
                        case XmlNodeType.Element:
                            switch (_XMLReader.Name)
                            {
                                case "sun":
                                    for (int i = 0; i < 2; i++)
                                    {
                                        _XMLReader.MoveToNextAttribute();
                                        switch (_XMLReader.Name)
                                        {
                                            case "set": ActualWeather._dtSet = DateTime.Parse(_XMLReader.Value);
                                                break;
                                            case "rise": ActualWeather._dtRise = DateTime.Parse(_XMLReader.Value);
                                                break;
                                        }
                                    }                                    
                                    break;
                                case "temperature":
                                    _XMLReader.MoveToNextAttribute();
                                    ActualWeather._iTemp = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                    break;
                                case "humidity":
                                    _XMLReader.MoveToNextAttribute();
                                    ActualWeather._iHum = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                    break;
                                case "pressure":
                                    _XMLReader.MoveToNextAttribute();
                                    ActualWeather._iPres = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                    break;
                                case "speed":
                                    _XMLReader.MoveToNextAttribute();
                                    ActualWeather._iSpeed = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                    break;
                                case "direction":
                                    _XMLReader.MoveToNextAttribute();                                    
                                    ActualWeather._iDir = int.Parse(_XMLReader.Value);
                                    break;            
                                case "lastupdate":
                                    _XMLReader.MoveToNextAttribute();                                    
                                    ActualWeather._dtLastUpdate = DateTime.Parse(_XMLReader.Value);
                                    break;
                            }
                            break;
                    }
                }
                _XMLReader.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }
        static bool getForecast()
        {
            try
            {
                int _iDayIndex = -1;
                WebClient _WClient = new WebClient();
                _WClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
                string _sUrl = "http://api.openweathermap.org/data/2.5/forecast/daily?q=" + gsCity + "&mode=xml&units=metric";
                XmlTextReader _XMLReader = new XmlTextReader(_WClient.OpenRead(_sUrl));
                while (_XMLReader.Read())
                {
                    switch (_XMLReader.NodeType)
                    {
                        case XmlNodeType.Element:
                            switch (_XMLReader.Name)
                            {                                
                                case "time":
                                    _XMLReader.MoveToNextAttribute();                                            
                                    if (DateTime.Today <= DateTime.Parse(_XMLReader.Value))
                                    {
                                        _iDayIndex = DateTime.Parse(_XMLReader.Value).Subtract(DateTime.Now.Date).Days;
                                    }
                                    break;
                                case "temperature": 
                                    for (int i = 0; i < 6; i++)
                                    {
                                        _XMLReader.MoveToNextAttribute();
                                        switch (_XMLReader.Name)
                                        {
                                            case "day": WeekForecast[_iDayIndex]._iTempDay = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                                break;
                                            case "min": WeekForecast[_iDayIndex]._iTempMin = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                                break;
                                            case "max": WeekForecast[_iDayIndex]._iTempMax = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                                break;
                                            case "night": WeekForecast[_iDayIndex]._iTempNight = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                                break;
                                            case "eve": WeekForecast[_iDayIndex]._iTempEve = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                                break;
                                            case "morn": WeekForecast[_iDayIndex]._iTempMorn = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                                break;
                                        }                                                                                
                                    }
                                    break;
                                case "humidity":
                                    _XMLReader.MoveToNextAttribute();
                                    WeekForecast[_iDayIndex]._iHum = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                    break;
                                case "pressure":
                                    for (int i = 0; i < 2; i++)
                                    {
                                        _XMLReader.MoveToNextAttribute();
                                        switch (_XMLReader.Name)
                                        {
                                            case "value": WeekForecast[_iDayIndex]._iPres = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                                break;                                            
                                        }
                                    }     
                                    break;
                                case "windSpeed":
                                    _XMLReader.MoveToNextAttribute();                                    
                                    WeekForecast[_iDayIndex]._iSpeed = Convert.ToInt32(double.Parse(_XMLReader.Value, gProvider) * 10);
                                    break;
                                case "windDirection":
                                    _XMLReader.MoveToNextAttribute();                                   
                                    WeekForecast[_iDayIndex]._iDir = int.Parse(_XMLReader.Value);
                                    break;  
                            }
                            break;
                    }
                }
                _XMLReader.Close();
                return true;
            }
            catch 
            {
                return false;
            }
        }
        static bool writePLC()
        {
            try
            {
                CPU_Type _Ct = new CPU_Type();
                switch (gsPLCType)
                {
                    case "S7200": _Ct = CPU_Type.S7200;
                        break;
                    case "S7300": _Ct = CPU_Type.S7300;
                        break;
                    case "S7400": _Ct = CPU_Type.S7400;
                        break;
                }
                PLC _PLC = new PLC(_Ct,gsPLCIP,gbRack,gbSlot);
                _PLC.Open();
                
                _PLC.Write(("DB" + giDB + ".DBW0"), ActualWeather._iTemp);                
                _PLC.Write(("DB" + giDB + ".DBW2"), ActualWeather._iHum);
                _PLC.Write(("DB" + giDB + ".DBW4"), ActualWeather._iPres);
                _PLC.Write(("DB" + giDB + ".DBW6"), ActualWeather._iSpeed);
                _PLC.Write(("DB" + giDB + ".DBW8"), ActualWeather._iDir);
                _PLC.Write(("DB" + giDB + ".DBT10"), ActualWeather._dtRise);
                _PLC.Write(("DB" + giDB + ".DBT18"), ActualWeather._dtSet);
                _PLC.Write(("DB" + giDB + ".DBT26"), ActualWeather._dtLastUpdate);
                for (int i = 0; i < 7; i++)
                {
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i+1) + 0)), WeekForecast[i]._iTempDay);
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i + 1) + 2)), WeekForecast[i]._iTempMorn);
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i + 1) + 4)), WeekForecast[i]._iTempEve);
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i + 1) + 6)), WeekForecast[i]._iTempNight);
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i + 1) + 8)), WeekForecast[i]._iTempMax);
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i + 1) + 10)), WeekForecast[i]._iTempMin);
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i + 1) + 12)), WeekForecast[i]._iHum);
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i + 1) + 14)), WeekForecast[i]._iPres);
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i + 1) + 16)), WeekForecast[i]._iSpeed);
                    _PLC.Write(("DB" + giDB + ".DBW" + (50 * (i + 1) + 18)), WeekForecast[i]._iDir);
                    _PLC.Write(("DB" + giDB + ".DBT" + (50 * (i + 1) + 20)), DateTime.Now);
                }
                _PLC.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}
 

Anhänge

  • DB_Quelle.txt
    897 Bytes · Aufrufe: 218
  • OpenWeatherToS7DB.zip
    330,9 KB · Aufrufe: 321
Aktuelles Wetter und Wettervorhersage an S7 senden

Diese .exe gibt Statusmeldungen in der Kommandozeile zurück.

openweatherToS7DB.exe ausführen
und zwar mit argumenten: ORT ZIEL-IP CPUTYP RACK SLOT DBNR

also z.B. in der Eingabeaufforderung: openweatherToS7DB Dresden 10.49.107.30 S7300 0 2 253

schreibt aktuelles wetter und den 7 Tage forecast von dresden in den DB253 der S7-300 auf Rack 0, Slot 2, erreichbar unter 10.49.107.30
 

Anhänge

  • OpenWeatherToS7DB.exe.txt
    38,5 KB · Aufrufe: 339
Zuletzt bearbeitet von einem Moderator:
S7 und HMI (wccf 2008 SP2) Wetter

hier mal das S7-Projekt mit Visualisierung (WinCCflex 2008 SP2) zu den Scripten aus post 1 und 2

Es wird erwartet, das die Scripte unter C:\ liegen.
Wenn ihr andere Pfade haben wollt müsst ihr das Flexible-Projekt und die Skripte anpassen.
 

Anhänge

  • Wetter.zip
    2,4 MB · Aufrufe: 342
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Seit kurzem funktioniert der Abruf der Datei bei weather365 nicht mehr. Es gibt immer einen Zugriffsfehler beim Abruf.

Dies kann z.B durch das externe Programm wget behoben werden. Dies gibt es hier
Anstatt dem skript weather15_http-get.vbs ruft ihr die Batchdatei weather15_http-get.bat (StartProgram "e:\my_sps\script\weather15_2_txt.vbs", "", hmiShowMinimized, hmiYes) aus dem WCCF-Projekt auf.
wget legt die heruntergeladene Datei in dem Ordner ab der beim Aufruf aktiv ist. Die Batch müsst ihr euren Gegebenheiten anpassen.


Weiterhin hat sich das Format der heruntergeladenen Datei etwas verändert beim Regenrisiko.
Folgende Anpassung am skript weather15_2_txt.vbs vornehmen

Code:
[COLOR=#ff0000]ersetze[/COLOR]
  startpos = instr(inzeile,chr(34)&"day1e"&chr(34))
  if startpos > 0 then
    endpos=instr(startpos+53,inzeile,"<")
    tag1_niederschlag = mid(inzeile,startpos+53,endpos-startpos-54)
    outdatei.writeline tag1_niederschlag
  end if

[COLOR=#ff0000]durch[/COLOR]
  startpos = instr(inzeile,chr(34)&"day1e"&chr(34))
  if startpos > 0 then
    endpos=instr(startpos+1,inzeile,"<")
    tag1_niederschlag = mid(inzeile,startpos+41,endpos-startpos-42)
    outdatei.writeline tag1_niederschlag
  end if

[COLOR=#ff0000]ersetze[/COLOR]
  startpos = instr(inzeile,chr(34)&"day2e"&chr(34))
  if startpos > 0 then
    endpos=instr(startpos+53,inzeile,"<")
    tag1_niederschlag = mid(inzeile,startpos+53,endpos-startpos-54)
    outdatei.writeline tag1_niederschlag
  end if

[COLOR=#ff0000]durch[/COLOR]
  startpos = instr(inzeile,chr(34)&"day2e"&chr(34))
  if startpos > 0 then
    endpos=instr(startpos+1,inzeile,"<")
    tag1_niederschlag = mid(inzeile,startpos+41,endpos-startpos-42)
    outdatei.writeline tag1_niederschlag
  end if

[COLOR=#ff0000]ersetze[/COLOR]
  startpos = instr(inzeile,chr(34)&"day3e"&chr(34))
  if startpos > 0 then
    endpos=instr(startpos+53,inzeile,"<")
    tag1_niederschlag = mid(inzeile,startpos+53,endpos-startpos-54)
    outdatei.writeline tag1_niederschlag
  end if

[COLOR=#ff0000]durch[/COLOR]
  startpos = instr(inzeile,chr(34)&"day3e"&chr(34))
  if startpos > 0 then
    endpos=instr(startpos+1,inzeile,"<")
    tag1_niederschlag = mid(inzeile,startpos+41,endpos-startpos-42)
    outdatei.writeline tag1_niederschlag
  end if
Sonderzeichen ersetzen
Code:
[COLOR=#ff0000]ersetze[/COLOR]
    tag1_wetter = mid(inzeile,startpos+15,endpos-startpos-15)

[COLOR=#ff0000]durch[/COLOR]
    tag1_wetter = mid(inzeile,startpos+15,endpos-startpos-15)
    tag1_wetter = replace(tag1_wetter,"ö","ö")
    tag1_wetter = replace(tag1_wetter,"ä","ä")

[COLOR=#ff0000]ersetze[/COLOR]
    tag2_wetter = mid(inzeile,startpos+15,endpos-startpos-15)

[COLOR=#ff0000]durch[/COLOR]
    tag2_wetter = mid(inzeile,startpos+15,endpos-startpos-15)
    tag2_wetter = replace(tag2_wetter,"ö","ö")
    tag2_wetter = replace(tag2_wetter,"ä","ä")

[COLOR=#ff0000]ersetze[/COLOR]
    tag2_wetter = mid(inzeile,startpos+15,endpos-startpos-15)

[COLOR=#ff0000]durch[/COLOR]
    tag3_wetter = mid(inzeile,startpos+15,endpos-startpos-15)
    tag3_wetter = replace(tag3_wetter,"ö","ö")
    tag3_wetter = replace(tag3_wetter,"ä","ä")
 

Anhänge

  • weather15_http-get.bat.txt
    269 Bytes · Aufrufe: 246
Diese Lösung hat mir 'DerMatze' per PN gesendet
DerMatze schrieb:
Ich habe seit kurzem ein Problem mit den Zugriffsrechten auf des Skript "http-get".
Sowohl unter Win7 als auch unter XP
Nach einer Suche bei Google bin ich fündig geworden und habe im Skript die Anweisung:
set xmlhttp=createobject("MSXML2.XMLHTTP.3.0")
in
set xmlhttp=createobject("MSXML2.ServerXMLHTTP.3.0")
geändert.
 
Zuletzt bearbeitet:
Zurück
Oben