# Richtiges Ergebnis? (libnodave & C#)



## rebbi (25 September 2008)

Guten Tag zusammen,

hab die Tage das erste mal mit ner SPS zu tun gehabt und mich mittels diesem Forum und libnodave (nochmals Danke Zottel :s12 reingearbeitet.


Ich hab hier jetzt aber Testcode, der zwar scheinbar funktioniert (bin mir nicht sicher, da ich die Werte in der SPS derzeit nicht überprüfen kann) - ich aber nicht weiß wieso 


Es wird überprüft, ob in der SPS neue Daten anliegen (das Bit wird derzeit SPS-intern ständig verändert). 



```
public static bool checkNewData()
        {
            int port = 102;
            string ipadress = ...
            libnodave.daveOSserialType fds;
            libnodave.daveInterface di;
            libnodave.daveConnection dc;
            int rack = 0;
            int slot = 2;
            int result = 0;
            int errorbyte = 0;
            bool error = false;            

            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.daveDB, 50, 48, 2, null);
                        if (result == 0)
                        {                            
                            errorbyte = dc.getS8At(0);                            
                            if (errorbyte % 2 == 0)                            
                                error = false;                            
                            else
                                error = true;
                            dc.disconnectPLC();
                            di.disconnectAdapter();
                            libnodave.closePort(fds.rfd);
                            return error;
                        }
                        else
                            Console.WriteLine("Fehler! " + result + ", weil " + libnodave.daveStrerror(result));
                    }
                    dc.disconnectPLC();
                }
                di.disconnectAdapter();
                libnodave.closePort(fds.rfd);
            }
            else
            {
                return error;
            }
            return error;
        }
```
Im Baustein an Adresse 48.0 sitzt mein Boole'scher Wert, den ich auslesen will. 
Hatte gedacht dass der Integer errorbyte einen normalen Integerwert haben sollte, aus diesem wollte ich mir dann per Modulo rausrechnen, ob das Bit 48.0 gesetzt ist.
Stattdessen krieg ich aber bei errorbyte entweder den Wert 1 oder 0 ...


Kann mir wer sagen wo mein Denkfehler ist? 


Danke für Eure Hilfe!

mfG Andi


----------



## Ralle (25 September 2008)

Verstehe ich nicht ganz, 0 oder 1 währe doch für den Integerwert richtig, 0, wenn 48.0 False, 1, wenn 48.0 True. Oder wie meinst du das?

Noch ein Hinweis, falls es nicht schon so in Planung ist: 
Du solltest die Verbindung nicht ständig auf- und abbauen, das kostet viel Zeit. Nur wenn ein Fehler auftritt abbauen, ansonsten offen lassen. Bei Programmende dann natürlich die Verbindung auch abbauen!


----------



## rebbi (25 September 2008)

Danke für deine Antwort 

Ich dachte bisher, dass bei readbyte die Bitwerte folgendermaßen eingelesen werden.

Also der Wert bei Position 48 besteht aus den Bits 48.0 bis 48.7


Also wenn in den Bits folgendes steht:
Adresse 48.0: 1
Adresse 48.1: 0
Adresse 48.2: 0
Adresse 48.3: 1
Adresse 48.4: 0
Adresse 48.5: 0
Adresse 48.6: 1
Adresse 48.7: 0
ergibt das folgende Bitsequenz: 01001001.

Und der Integerwert davon wäre ja 73 ...



Zwecks Verbindung auf-/abbauen: Danke für den Hinweis, werd das noch abändern. Hab schon wo aufgeschnappt dass ständiges öffnen und schließen schlecht ist.
Mein Programm, das die Daten aus der SPS ausliest, wird aber im Dauerbetrieb sein. Keine Ahnung ob das so gut ist, wenn die Verbindung zur SPS wochenlang/monatelang geöffnet ist? 

mfG Andi


----------



## MW (25 September 2008)

rebbi schrieb:


> Mein Programm, das die Daten aus der SPS ausliest, wird aber im Dauerbetrieb sein. Keine Ahnung ob das so gut ist, wenn die Verbindung zur SPS wochenlang/monatelang geöffnet ist?


 
Es ist jedenfalls besser wenn du sie offen lässt als dauernd zu öffnen und zu schliessen (wie Ralle es schon erwähnte). Im normalfall gibt es keine Probleme bei über längere Zeit aufgebaute Verbindungen. Und falls ein Fehler auftretten sollte, macht man halt einfach einen reconnect und gut is.


----------



## feuse8 (26 Dezember 2009)

rebbi schrieb:


> Danke für deine Antwort
> 
> Ich dachte bisher, dass bei readbyte die Bitwerte folgendermaßen eingelesen werden.
> 
> ...



Hi,

hoffe dein Programm läuft schon. Stehe vor der selben Aufgabe mit den Booleans. Kannst du mir sagen, wie du die behandelt hast? Ich habs mit ReadBytes, ReadBits versucht, dann auf S8, S16, S32, U8, ... gecastet aber jeweils nur eine Exception erhalten.

Wie kann man jetzt richtig solche Datenstrukturen auflösen (mir würde es schon reichen, 0 und 1 als Integerwert rauszubekommen - bool muss nicht unbedingt sein).

Danke für eure Hilfe!


----------



## MW (27 Dezember 2009)

feuse8 schrieb:


> hoffe dein Programm läuft schon. Stehe vor der selben Aufgabe mit den Booleans. Kannst du mir sagen, wie du die behandelt hast? Ich habs mit ReadBytes, ReadBits versucht, dann auf S8, S16, S32, U8, ... gecastet aber jeweils nur eine Exception erhalten.
> 
> Wie kann man jetzt richtig solche Datenstrukturen auflösen (mir würde es schon reichen, 0 und 1 als Integerwert rauszubekommen - bool muss nicht unbedingt sein).



Schau dir mal folgenden Beispiel Code an, der sollte dir weiterhelfen, hier wird einmal das Bit M0.0 und einmal das Bit M0.7 abgefragt.


```
res = dc.readBytes(libnodave.daveFlags, 0, 0, 16, buf)
       If buf(0) And 1 Then   ' 1 für Bit 0 = M0.0
            PictureBox_Merker.Image = My.Resources.LED_Gruen
        Else
            PictureBox_Merker.Image = My.Resources.LED_Rot
        End If
        If buf(0) And 128 Then   ' 128 für bit 7 = M0.7
            Label6.Visible = True
            Label7.Visible = False
        Else
            Label6.Visible = False
            Label7.Visible = True
        End If
```


Edit:  hier  steht auch noch was zu dem thema.


----------

