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

Ergebnis 1 bis 6 von 6

Thema: Richtiges Ergebnis? (libnodave & C#)

  1. #1
    Registriert seit
    22.09.2008
    Beiträge
    8
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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 ) 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).


    Code:
    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
    Zitieren Zitieren Richtiges Ergebnis? (libnodave & C#)  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.260
    Danke
    537
    Erhielt 2.705 Danke für 1.954 Beiträge

    Standard

    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!
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    rebbi (01.10.2008)

  4. #3
    rebbi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    22.09.2008
    Beiträge
    8
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  5. #4
    Registriert seit
    27.11.2005
    Ort
    im Osten
    Beiträge
    1.183
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Standard

    Zitat Zitat von rebbi Beitrag anzeigen
    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.
    Es ist nicht schwierig, mit noch nicht erreichten Zielen zu Leben; schwierig ist, ohne Ziele zu Leben !
    (Günther Kraftschik)

  6. Folgender Benutzer sagt Danke zu MW für den nützlichen Beitrag:

    rebbi (01.10.2008)

  7. #5
    Registriert seit
    26.12.2009
    Beiträge
    1
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von rebbi Beitrag anzeigen
    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 ...


    mfG Andi
    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!

  8. #6
    Registriert seit
    27.11.2005
    Ort
    im Osten
    Beiträge
    1.183
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von feuse8 Beitrag anzeigen
    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.

    Code:
    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.
    Es ist nicht schwierig, mit noch nicht erreichten Zielen zu Leben; schwierig ist, ohne Ziele zu Leben !
    (Günther Kraftschik)

Ähnliche Themen

  1. Ergebnis aus 2 PT1-Gliedern?
    Von Poldi007 im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 01.08.2011, 09:01
  2. Antworten: 3
    Letzter Beitrag: 13.02.2011, 22:33
  3. Antworten: 14
    Letzter Beitrag: 08.02.2011, 14:39
  4. Ergebnis CDT von SFC1 in DB ablegen
    Von rapser im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 17.02.2010, 15:02
  5. S7 erkennt richtiges MP177
    Von Günni1977 im Forum HMI
    Antworten: 1
    Letzter Beitrag: 10.06.2009, 15:55

Lesezeichen

Berechtigungen

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