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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 30

Thema: Merker lesen mit Libnodave

  1. #11
    Snoopy123123 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.08.2006
    Beiträge
    125
    Danke
    15
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja den hatte ich schon gelesen.

    Ich habe auch meine Codeschnippsel so wie afk geschrieben hat bei DB eine Null reingeschrieben, aber Libnodave mag meine MErker trotzdem nicht lesen

  2. #12
    Registriert seit
    01.03.2007
    Beiträge
    262
    Danke
    26
    Erhielt 33 Danke für 28 Beiträge

    Standard

    Code:
    procedure TForm1.NoDave1Read(Sender: TObject);
    begin
    nodave1.ReadBytes(DaveFlags,0,132,4);
    Gauge1.Value:= NoDave1.GetFloat(132);
    edit2.Text:= intToStr(noDave1.CycleTime);
    edit1.Text:= FloatToStr(NoDave1.GetFloat(132));
    end;
    
    Wenn ich "nodave1.ReadBytes(DaveFlags,0,132,4);" auskommentiere dann startet die exe und edit2 wird sauber angezeigt. Nehm ich Read Bytes wieder in den Code dann hängt sich die Anwendung beim starten auf.
    Naja, hört sich für mich ganz logisch an!
    Das OnRead-Ereignis wird bei jedem Lesen aus der SPS ausgelöst. Also es wird zirkulierend aufgerufen, deswegen hägt sich dein Programm auf!
    „Software wird schneller langsamer als Hardware schneller wird.“ - Niklaus Wirth (1995)

  3. #13
    Snoopy123123 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.08.2006
    Beiträge
    125
    Danke
    15
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Ich dachte das sei der Sinn des On Read Ereignisses. Wenn ich eine Druckanzeige habe dann will doch nicht von Hand ein ereignis triggern um den einen Wert angezeigt zu bekommen. Was mich verwirrt das das mit Area: Dave Db einwandfrei funktioniert. Auch mit eingestellten on read Trigger mit 50ms.

    Mein programm sich auf weil es aus dem On Read nicht mehr herauskommt.

    Nur weil ich etwas "zirkulierend" aufrufe hängt es sich doch nicht auf, dann würde es sich ja bei jedem Timerevent auch aufhängen, richtig ?

  4. #14
    Registriert seit
    01.03.2007
    Beiträge
    262
    Danke
    26
    Erhielt 33 Danke für 28 Beiträge

    Standard

    In der Funktion ReadBytes wird das Ereignis OnRead aufgerufen und wenn du im OnRead wieder ReadBytes ausführst wird auch wieder das Ereignis OnRead auferufen usw!
    „Software wird schneller langsamer als Hardware schneller wird.“ - Niklaus Wirth (1995)

  5. Folgender Benutzer sagt Danke zu Human für den nützlichen Beitrag:

    Snoopy123123 (13.07.2009)

  6. #15
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Was soll:
    Code:
    Gauge1.Value:= NoDave1.GetFloat(132);
    edit2.Text:= intToStr(noDave1.CycleTime);
    edit1.Text:= FloatToStr(NoDave1.GetFloat(132));
    ?
    Wenn die Delphi-Unit nicht ganz anders funktioniert als der Rest der Bibliothek, sollte es heißen:
    Code:
    Gauge1.Value:= NoDave1.GetFloat();
    edit2.Text:= intToStr(noDave1.CycleTime);
    edit1.Text:= Gauge1.Value;
    ?
    Erklärung:
    GetFloat holt 4 byte aus dem Puffer und erhöht den Zeiger.
    Es ist also keine Positionsangabe nötig. Sonst müßtest du mit GetFloatAt oder GetFloatFrom arbeiten.
    Der Puffer enthält 4 Bytes, wenn du 4 gelesen hast.
    Ein 2.Aufruf von GetFloat gibt zufällige Speicherinhalte zurück.

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

    Snoopy123123 (13.07.2009)

  8. #16
    Snoopy123123 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.08.2006
    Beiträge
    125
    Danke
    15
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Tatsache ! Jetzt funktionierts. Vielen Dank.

    Das bedeutet aber das man ganz schöne klimmzüge machen muss wenn man aus verschiedenen bereichen DaveDB oder DaveFlags oder directe PEW lesen muss, will !!

    Wie bewerkstelligt man das am besten.

    Mir fallen hier mehrere Möglichkeiten.

    Mehrere NoDave Komponenten benutzen - nachteil belegt verbindungen zur SPS und nach ein paar (kommt auf die SPS an) ist schluss.

    Ne Variable hochzählen und dave read ausführen ud dann nur die getbytes variablen ausführen die für diesen Bereich sind, aber wie stelle ich hier sicher das ich auch alle 100ms alle Datenbereiche einlese ?!?

  9. #17
    Snoopy123123 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.08.2006
    Beiträge
    125
    Danke
    15
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Hallo Zottel,

    Verstehe ich es richtig:

    "Gauge1.Value:= NoDave1.GetFloat(); " zieht 4 Byte aus dem Buffer und zählt den Zeiger hoch

    "Gauge1.Value:= NoDave1.GetFloat(132); " zieht 4 Byte aus dem Buffer beginnend ab Byte 132 und zählt den Zeiger hoch
    Wenn also Dave Read Byte ab Byte 0 durchgeführt wurde bekomme ich MD132
    und wenn Dave Read Byte ab Byte 100 durchgeführt wurde bekomme ich MD32

    Hab ich das so richtig verstanden ?!

  10. #18
    Snoopy123123 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.08.2006
    Beiträge
    125
    Danke
    15
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Habe gerade mal
    "Gauge1.Value:= NoDave1.GetFloat(); "
    eingegeben aber mein Delphi Compiler benötigt die Positionsangabe.

  11. #19
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Snoopy123123 Beitrag anzeigen
    Habe gerade mal
    "Gauge1.Value:= NoDave1.GetFloat(); "
    eingegeben aber mein Delphi Compiler benötigt die Positionsangabe.
    Möglicherweise sollte ich mich aus jeder Delphi-Diskussion raushalten...
    Sehe gerade, daß TNoDave.GetFloat() intern daveGetFloatFrom() verwendet. Es wird daher kein Zeiger hochgezählt...

    Um zu wissen, was die Adresse eigentlich bewirkt müßte ich erst die Funktion BufferAt verstehen...


    Wieso schreibst du, daß es funktioniert?
    Und dann wieder doch nicht?

  12. #20
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Snoopy123123 Beitrag anzeigen
    Das bedeutet aber das man ganz schöne klimmzüge machen muss wenn man aus verschiedenen bereichen DaveDB oder DaveFlags oder directe PEW lesen muss, will !!
    Zunächst mal ist PEWs lesen keine gute Idee. Die CPU muß dann zusätzliche Buszugriffe auf die Peripherie ausführen. Ist echt langsam.
    Zitat Zitat von Snoopy123123 Beitrag anzeigen
    Wie bewerkstelligt man das am besten.
    Lesen aus verstreuten Speicheradressen kann man bis zu einem gewissen Umfang mit:
    davePrepareReadRequest
    daveAddVarToReadRequest
    daveExecReadRequest
    in einer Abfrage zusammenfassen.
    Grenzen setzen hier PDU-Länge und eventuell die CPU.
    Diese Funktionen scheint die Komponente nicht zur Verfügung zu stellen...

    Ansonsten ist es am günstigsten, verstreute Variablen im SPS-Programm in einen Block zu kopieren und diesen "am Stück" einzulesen.

    Grundsätzlich gilt: Jeder read-request kostet Zeit, bis die CPU antwortet.

    Das ist auch bei jeder anderen Kommunikationsbibliothek und bei jedem OPC-Server so, auch wenn einige OPC-Server was anderes vermuten lassen: Obwohl man für jede einzelne Variable einige Millisekunden als Aktualisierungsintervall einstellen kann, kann das am Ende nicht einmal annähernd eingehalten werden.

Ähnliche Themen

  1. SZL lesen mit LibNoDave
    Von GvOdin im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 29.01.2014, 10:57
  2. Daten lesen aus DB mit libnodave
    Von Proxy im Forum Hochsprachen - OPC
    Antworten: 12
    Letzter Beitrag: 18.09.2013, 07:02
  3. libnodave s7-1200 DB lesen
    Von bommel im Forum Hochsprachen - OPC
    Antworten: 19
    Letzter Beitrag: 11.11.2010, 18:21
  4. RLO van timer lesen mit libnodave
    Von Ruud im Forum Hochsprachen - OPC
    Antworten: 15
    Letzter Beitrag: 20.12.2009, 10:26
  5. Merker/Datenbaustein/libnodave S7-200
    Von rampage im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 23.09.2008, 00:18

Lesezeichen

Berechtigungen

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