LibNoDave + Visual Studio + S7 über TCP/IP

david.ka

Level-2
Beiträge
180
Reaktionspunkte
26
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich möchte in Visual Studio 2005 C# einen Zugriff auf meine S7 über TCP/IP mit LobNoDave realisieren.
das sollte doch möglich sein, oder?
leider habe ich kaum zeit um mich da einzuarbeiten.
gibt es vielleicht schon fertige beispielprojekte in visual Studio, in denen so ein beispiel realisiert ist, so das sich meine einarbeitungszeit etwas verkürzt :)

danke.grüße.david.
 
Bei Libnodave ist doch ein Ordner "Dot.Net" mit einem Beispiel für CS und VB dabei.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag zusammen.

Ich benutz jetzt mal diesen Thread hier, da ich ein ähnliches Problem hab und deshalb nicht unbedingt n neuen Thread erstellen will. ;)


Vorab: Danke schonmal für libnodave, Zottel! :)


Folgendes Problem:
Ich muss mittels C# Daten aus einer SPS auslesen und stoße dabei als Anfänger auf Probleme, die ich in den letzten 2 Tagen nicht lösen konnte.

Hardware:
S7-300 (312), CP 343-1, Verbindung über TCP

Anbei der Code (bin noch in der Test-/Lernphase in Sachen SPS):

Code:
static int Main(string[] args)
{
            int port = 102;
            string ipadress = "192.168.100.122";
            int result = 0;
            int prg_nr = 0;
            int prg_runtime = 0;
            int mixingratio = 0;
            int boothtemp = 0;
            int boothhumidity = 0;

            fds.rfd = libnodave.openSocket(port, ipadress);
            fds.wfd = fds.rfd;
            if (fds.rfd > 0)
            {
                di = new libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);
                di.setTimeout(1000000);
                result = di.initAdapter();
                if (result == 0)
                {
                    dc = new libnodave.daveConnection(di, 0, rack, slot);
                    if (0 == dc.connectPLC())
                    {
                        result = dc.readBytes(libnodave.daveFlags, 0, 0, 102, savebuffer);                        
                        if (result == 0)
                        {                     
                            prg_nr =  dc.getS16At(20);
                            prg_runtime = dc.getS16At(22);
                            mixingratio = dc.getS16At(24);
                            boothtemp = dc.getS16At(26);
                            boothhumidity = dc.getS16At(28);                            
                            Console.WriteLine("Programm-Nummer: " + prg_nr);
                            Console.WriteLine("prg_runtime: " + prg_runtime);
                            Console.WriteLine("mixingratio: " + mixingratio);
                            Console.WriteLine("boothtemp: " + boothtemp);
                            Console.WriteLine("boothhumidity: " + boothhumidity);                              
                        }
                        else
                            Console.WriteLine("Fehler! " + result + " " + libnodave.daveStrerror(result));
                    }
                    dc.disconnectPLC();
                    Console.ReadLine();
                }
                di.disconnectAdapter();
                libnodave.closePort(fds.rfd);
            }
            else
            {
                Console.WriteLine("Fehler! Konnte keine Verbindung zur SPS herstellen!");
                Console.ReadLine();
                return -1;
            }
            return 0;
}
Ich hab von meinem Chef ein Datenblatt bekommen, auf dem die Daten der SPS vermerkt sind.

Adresse 0-19 sind Chars, dann einige 16Bit-Integer, dann bool'sche Werte etc. Die Daten ändern sich zu Testzwecken derzeit sekündlich.


Nun will ich wie oben im Code gesehen die 5 Integer-Werte von Position 20 bis Position 28 ausgeben und in meinem WinForm (derzeit noch Console) anzeigen lassen - ich bekomme für die letzten 4 Werte aber immer 0 und für den ersten Wert entweder 0 oder eine Zahl (je nach Konvertierung 16, 64, 4096 oder 138xx). Scheint mir also eher n Bool zu sein.
Ich les also irgendwie falsch aus oder konvertiere die Werte falsch - und kann mir keinen Reim darauf machen.

Den obigen Code hab ich aus den Beispielen, die bei libnodave dabei waren, abgeguckt ...


Vielen Dank für eure Hilfe!

mfG Andi
 
Sind Datenelemente, die passen auch so.


Hab das Problem glaub ich grade gelöst - 5 Minuten nachdem ich den Post hier gemacht hab ... :rolleyes:

Ich hab aus den Flags ausgelesen anstatt aus dem Datenbaustein 50.


Danke schonmal für das reply, vierlagig!

Ich geb nachher nochmal ne Bestandsaufnahme ab, ob's wirklich geklappt hat. Muss jetzt erstmal die Daten vergleichen, ob die denn auch passen :)

mfG Andi
 
Zurück
Oben