Daten aus DB auslesen und speichern

buhuu

Level-1
Beiträge
20
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
hoffe jemand kann mit einen Tipp geben..

Ich muss aus einem Datenbaustein 2 Messwerte auslesen und später auswerten.
Gibt es die Möglichkeit diese beiden Werte z.B. alle 5 Sekunden abzuholen und in einem Excel-Sheet abzuspeichern?

Kann mit vielleicht jemand ein Programm empfehlen mit dem das möglich ist ?

Danke schonmal im Voraus ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich muss aus einem Datenbaustein 2 Messwerte auslesen und später auswerten.
Gibt es die Möglichkeit diese beiden Werte z.B. alle 5 Sekunden abzuholen und in einem Excel-Sheet abzuspeichern?


Ein Programm will ich zunächst nicht empfehlen, aber es gibt die SuFu hier im Forum.
Letzte Woche denke war dies schon einmal das Thema.

Viel Erfolg


bike
 
Hier kann ich nicht widerstehen:
Genau dafür wurde ACCON-S7-EasyLog entwickelt. Einfach einmal mit der Demo testen.

@JoeJo:
Das Teil von Alois Träger ist eine Kommunikationsbibliothek wie libnodave, ACCON-AGLink, ... Da es sich dabei um keine fertige Lösung handelt, kann und muss die Anwendung dann selbst erstellt werden.
 
Hallo
Danke für den Tipp..
Ich hoffe mit der Demo kann ich den vollen Umfang des Programms testen.
 
Du kannst Dir auch mal HSDBASE anschauen. Damit kann man wahlweise in CSV-Dateien (lässt sich dann mit Excel öffnen), Access- oder MySQL-Datenbanken schreiben. Eine zyklusgenaue Aufzeichnung ist ebenfalls möglich.
Mit der Demo kann der volle Funktionsumfang getestet werden.
 
Vielen Dank für eure Tipps..
Ich habe mich im ersten Schritt mal etwas mit dem Accon-Tool beschäftigt.
Im Tutorial habe ich leider nur herausgefunden wie man auf Merker zugreift wie geht es aber auf einen Datenbaustein ?
Ich habe um DB1 2 Variablen
Name Datentyp Offset
Zahl 1 int 0.0
Zahl 2 int 2.0

Es ist zum Test eine S7-1200...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einfach wie bei der S7 gewohnt DB1.DBW0 bzw. DB1.DBW2 angeben. Wichtig ist, dass das Häkchen "symbolische Adressierung" beim ANLEGEN des DBs nicht gesetzt war. Sonst funktioniert der Zugriff nicht. Ein nächträgliches Entfernen hat keine Auswirkung.
 
Code:
*
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using S7;


namespace lib
{
    class Program
    {

        public static void Main(string[] args)
        {            
            S7.PLC plc = null;   
            string gsConnectionString="Provider=SQLOLEDB.1;"+
                                    "Password=*****;"+
                                    "Persist Security Info=True;"+
                                    "User ID=app-user;"+
                                    "Initial Catalog=*****;"+
                                    "Data Source=*****\\SQLEXPRESS";
            OleDbConnection gc_DBConnection = new OleDbConnection(gsConnectionString);           
            OleDbCommand gCm_DBCommand = new OleDbCommand();
            OleDbDataAdapter gDa_DataAdapter = new OleDbDataAdapter();
            string gsSQLQuery;

            DataSet _DsCounter = new DataSet();
            gsSQLQuery = "SELECT [HOST], [FIELD], conf_Counter.[FUNCTION] FROM conf_Counter, proc_CounterReset WHERE conf_Counter.[FUNCTION] = [proc_CounterReset].[FUNCTION] AND [VALUE] = 'True'";
            gCm_DBCommand.CommandText = gsSQLQuery;
            gCm_DBCommand.Connection = gc_DBConnection;
            gDa_DataAdapter.SelectCommand = gCm_DBCommand;
            gDa_DataAdapter.Fill(_DsCounter);

            gCm_DBCommand.Connection = gc_DBConnection;
            gCm_DBCommand.Connection.Open();
            foreach (DataRow _Row in _DsCounter.Tables[0].Rows)
            {
                plc = new PLC(CPU_Type.S7300, _Row.ItemArray[0].ToString(), 0, 2);
                ErrorCode errCode = plc.Open();
                if (errCode == ErrorCode.NoError)
                {
                    plc.Write(_Row.ItemArray[1].ToString(), 1);
                    gsSQLQuery = "UPDATE proc_CounterReset SET [VALUE]='False' WHERE [FUNCTION] = '" + _Row.ItemArray[2].ToString() + "'";
                    gCm_DBCommand.CommandText = gsSQLQuery;
                    gCm_DBCommand.ExecuteNonQuery();
                }
            }
            gCm_DBCommand.Connection.Close();

            _DsCounter = new DataSet();
            gsSQLQuery = "SELECT [HOST], [FIELD], conf_Counter.[FUNCTION] FROM conf_Counter, proc_Counter WHERE conf_Counter.[FUNCTION] = [proc_Counter].[FUNCTION]";
            gCm_DBCommand.CommandText = gsSQLQuery;
            gCm_DBCommand.Connection = gc_DBConnection;
            gDa_DataAdapter.SelectCommand = gCm_DBCommand;
            gDa_DataAdapter.Fill(_DsCounter);

            gCm_DBCommand.Connection = gc_DBConnection;
            gCm_DBCommand.Connection.Open();
            foreach (DataRow _Row in _DsCounter.Tables[0].Rows)
            {
                plc = new PLC(CPU_Type.S7300, _Row.ItemArray[0].ToString(), 0, 2);
                ErrorCode errCode = plc.Open();
                if (errCode == ErrorCode.NoError)
                {
                    UInt32 b1;
                    if(_Row.ItemArray[2].ToString().IndexOf("LEV")<0)
                        b1 = (UInt32)plc.Read(_Row.ItemArray[1].ToString());
                    else
                        b1 = (UInt16)plc.Read(_Row.ItemArray[1].ToString());
                    
                    gsSQLQuery = "UPDATE proc_Counter SET [VALUE]='" + b1 + "' WHERE [FUNCTION] = '" + _Row.ItemArray[2].ToString() + "'";
                    gCm_DBCommand.CommandText = gsSQLQuery;
                    gCm_DBCommand.ExecuteNonQuery();
                }
            }
            gCm_DBCommand.Connection.Close();
        }
    }
}

mit S7.net
 
Hallo zusammen,
Danke für eure vielen Tipps..
Ich habe mich als erstes mit Accon EasyLog beschäftigt und als weitere Alternative noch ServiceLab ausprobiert.
Mal sehn was die anderen Programme noch bringen ;)
 
Zurück
Oben