Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: Wetterdaten in die Automatisierungswelt impotieren

  1. #1
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.885
    Danke
    80
    Erhielt 814 Danke für 551 Beiträge

    Standard


    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
    Geändert von volker (Gestern um 19:10 Uhr)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  2. #2
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.885
    Danke
    80
    Erhielt 814 Danke für 551 Beiträge

    Standard

    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.
    Angehängte Grafiken Angehängte Grafiken
    Angehängte Dateien Angehängte Dateien
    Geändert von volker (Gestern um 19:11 Uhr)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  3. #3
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.049 Danke für 1.628 Beiträge

    Standard

    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;
                }
            }
        }
    }
    Angehängte Dateien Angehängte Dateien
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]
    Zitieren Zitieren Aktuelles Wetter und Wettervorhersage an S7 senden  

  4. #4
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.049 Danke für 1.628 Beiträge

    Standard

    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
    Angehängte Dateien Angehängte Dateien
    Geändert von volker (15.06.2014 um 12:34 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]
    Zitieren Zitieren Aktuelles Wetter und Wettervorhersage an S7 senden  

  5. #5
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.885
    Danke
    80
    Erhielt 814 Danke für 551 Beiträge

    Standard

    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.
    Angehängte Dateien Angehängte Dateien
    Geändert von volker (15.06.2014 um 12:30 Uhr)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation
    Zitieren Zitieren S7 und HMI (wccf 2008 SP2) Wetter  

  6. #6
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.885
    Danke
    80
    Erhielt 814 Danke für 551 Beiträge

    Standard

    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:
    ersetze
      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
    
    durch
      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
    
    ersetze
      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
    
    durch
      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
    
    ersetze
      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
    
    durch
      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:
    ersetze
        tag1_wetter = mid(inzeile,startpos+15,endpos-startpos-15)
    
    durch
        tag1_wetter = mid(inzeile,startpos+15,endpos-startpos-15)
        tag1_wetter = replace(tag1_wetter,"ö","ö")
        tag1_wetter = replace(tag1_wetter,"ä","ä")
    
    ersetze
        tag2_wetter = mid(inzeile,startpos+15,endpos-startpos-15)
    
    durch
        tag2_wetter = mid(inzeile,startpos+15,endpos-startpos-15)
        tag2_wetter = replace(tag2_wetter,"ö","ö")
        tag2_wetter = replace(tag2_wetter,"ä","ä")
    
    ersetze
        tag2_wetter = mid(inzeile,startpos+15,endpos-startpos-15)
    
    durch
        tag3_wetter = mid(inzeile,startpos+15,endpos-startpos-15)
        tag3_wetter = replace(tag3_wetter,"ö","ö")
        tag3_wetter = replace(tag3_wetter,"ä","ä")
    Angehängte Dateien Angehängte Dateien
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  7. Folgender Benutzer sagt Danke zu volker für den nützlichen Beitrag:

    DerMatze (30.03.2015)

  8. #7
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.885
    Danke
    80
    Erhielt 814 Danke für 551 Beiträge

    Standard

    Diese Lösung hat mir 'DerMatze' per PN gesendet
    Zitat Zitat von DerMatze
    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.
    Geändert von volker (30.03.2015 um 14:10 Uhr)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  9. #8
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.885
    Danke
    80
    Erhielt 814 Danke für 551 Beiträge

    Standard

    Hallo

    Das Format der runtergeladenen Datei von weather365 hat sich geändert.
    Die zum extrahieren der Daten nötige Datei (weather15_2_txt.vbs.txt) habe ich im Post#2 aktualisiert
    Wetterdaten in die Automatisierungswelt impotieren
    Geändert von volker (28.03.2018 um 18:02 Uhr)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  10. #9
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.885
    Danke
    80
    Erhielt 814 Danke für 551 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    Es hat sich wieder was geändert. Anzahl der Tage wurde von 3 auf 4 erhöht.
    Die zum extrahieren der Daten nötige Datei (weather15_2_txt.vbs.txt) habe ich im Post#2 aktualisiert
    Wetterdaten in die Automatisierungswelt impotieren
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

Ähnliche Themen

  1. Antworten: 43
    Letzter Beitrag: 14.05.2018, 20:01
  2. Wetterdaten aus iCal-Datei auslesen
    Von Andy082 im Forum CODESYS und IEC61131
    Antworten: 15
    Letzter Beitrag: 03.08.2011, 11:03
  3. Antworten: 19
    Letzter Beitrag: 21.02.2011, 18:15
  4. Hausautomatisierung Wetterdaten
    Von PBO-WE im Forum Simatic
    Antworten: 19
    Letzter Beitrag: 23.07.2009, 18:59
  5. Antworten: 22
    Letzter Beitrag: 21.08.2008, 09:05

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •