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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: libnodave - Float auf SPS schreiben

  1. #1
    Registriert seit
    25.07.2005
    Ort
    Vogelsbergkreis
    Beiträge
    1.717
    Danke
    48
    Erhielt 68 Danke für 60 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zottel,
    Hallo Forum Mitbenutzer,
    folgende Frag: Gibt es auch eine Funktion um einen Floatwert wieder zurück zu wandel? Ähnlich daveGetFloat? Also sowas wie daveGetBytes(Floatwert)?

    Gruß Sebastian
    Zitieren Zitieren libnodave - Float auf SPS schreiben  

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

    Standard

    Zitat Zitat von seeba
    Hallo Zottel,
    Hallo Forum Mitbenutzer,
    folgende Frag: Gibt es auch eine Funktion um einen Floatwert wieder zurück zu wandel? Ähnlich daveGetFloat? Also sowas wie daveGetBytes(Floatwert)?

    Gruß Sebastian
    daveToPLCFloat(float f) liefert ein formal ein Integer. Die 4 Bytes enthalten eine Gleikommazahl im Format der SPS. Daß der Rückgabetyp int ist, liegt daran, daß verhindert werden soll, daß die Laufzeitumgebung bei der Zuweisung an eine PC-Variable auf Gültigkeit prüft.
    Das Ergebnis kann als "puffer" an daveWriteBytes übergeben werden. Siehe Beispiel in testMPI.cs.
    In C gibt es darüber hinaus die Funktionen davePutFloat und davePutFloatAt, die eine Gleitkommazahl in das Format der SPS wandeln und die Byte-Sequenz als nächstes. bz.w an der angegebenen Stelle in einen Puffer kopieren. Diese Funktionen können genutzt werden um, mehrere aufeinander folgende Werte in einen Schreibpuffer zu packen.
    In Dot.Net sind sie nicht implementiert, da ich nicht finden konnte, ob Berechnungen mit Zeigern auf von Dot.NET erzeugte Puffer IMMER funktionieren müssen. Statt dessen können mit Dot.NET-spezifischen Funktionen 4 Bytes des Ergebnisses von daveToPLCFloat(float f) in einen Puffer vom Type Byte[] kopiert werden.
    Zitieren Zitieren Re: libnodave - Float auf SPS schreiben  

  3. #3
    Registriert seit
    25.07.2005
    Ort
    Vogelsbergkreis
    Beiträge
    1.717
    Danke
    48
    Erhielt 68 Danke für 60 Beiträge

    Standard

    Ich will mal meinen Wunsch äußern, wenn ich darf: Ich würd mir Funktionen wünschen der man den Buffer vorgeben kann.

    z.B: daveGetU8(buffer, position)

    und auch umgekehrt!

    z.B.: daveGetBytesFromU16(buffer, position)

    Das würde die Arbeit mit libnodave noch um einiges vereinfachen.

    Wäre schön, wenn du sowas integrierst, aber kann auch sein das ich mal wieder blind bin.

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

    Standard

    Zitat Zitat von seeba
    Ich will mal meinen Wunsch äußern, wenn ich darf: Ich würd mir Funktionen wünschen der man den Buffer vorgeben kann.

    z.B: daveGetU8(buffer, position)

    und auch umgekehrt!

    z.B.: daveGetBytesFromU16(buffer, position)

    Das würde die Arbeit mit libnodave noch um einiges vereinfachen.

    Wäre schön, wenn du sowas integrierst, aber kann auch sein das ich mal wieder blind bin.
    In C gibt es das, aber ich habe nur einen Teil davon in die C#-Schnittstelle integriert. Der Grund ist, daß man Funktionen der Dot.NET CLR benutzen sollte, damit die CLR Gültigkeit von Referenzen und Grenzen von Arrays prüfen kann (was in C nicht getan wird).

  5. #5
    Registriert seit
    25.07.2005
    Ort
    Vogelsbergkreis
    Beiträge
    1.717
    Danke
    48
    Erhielt 68 Danke für 60 Beiträge

    Standard

    Zitat Zitat von Zottel
    Zitat Zitat von seeba
    Ich will mal meinen Wunsch äußern, wenn ich darf: Ich würd mir Funktionen wünschen der man den Buffer vorgeben kann.

    z.B: daveGetU8(buffer, position)

    und auch umgekehrt!

    z.B.: daveGetBytesFromU16(buffer, position)

    Das würde die Arbeit mit libnodave noch um einiges vereinfachen.

    Wäre schön, wenn du sowas integrierst, aber kann auch sein das ich mal wieder blind bin.
    In C gibt es das, aber ich habe nur einen Teil davon in die C#-Schnittstelle integriert. Der Grund ist, daß man Funktionen der Dot.NET CLR benutzen sollte, damit die CLR Gültigkeit von Referenzen und Grenzen von Arrays prüfen kann (was in C nicht getan wird).
    Also ich benutze jetzt den BitConverter von .NET... Funtioniert auch gut soweit. Allerdings bekomm ich mit dem keinen Float aus 4 Bytes gewandet... Hast du eine Funktion der ich die 4 Bytes übergebe und die mir dann einen Float rausschmeißt?

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

    Standard

    Zitat Zitat von seeba
    Also ich benutze jetzt den BitConverter von .NET... Funtioniert auch gut soweit. Allerdings bekomm ich mit dem keinen Float aus 4 Bytes gewandet... Hast du eine Funktion der ich die 4 Bytes übergebe und die mir dann einen Float rausschmeißt?
    Wir reden hier irgendwie aneinader vorbei? Wo willst du die 4 Bytes hernehmen? Wenn du in einem Programm in .NET eine float-Variable f hast, kannst du sie mit:
    d=libnodave.toPLCFloat(f)
    oder
    i=libnodave.daveToPLCFloat(f)
    in eine float oder int-Variable konvertieren.
    Die Ergebnis-Variable enthält das Bit-Muster so wie es auch in der SPS stehen würde. Für .NET oder einen i386-Prozessor ist dieses Bitmuster sinnlos.
    Es kann aber mittels BitConverter die 32 Bit als eine Folge von 4 bytes an daveWriteBytes als Puffer übergeben werden. Das ist in testMPI.cs beispielhaft interpretiert und bewirkt, daß der Wert, der vorher aus dem MD12 gelesesen, ins PC-Format konvertiert und dann um 1.1 erhöht wurde, wieder so in die SPS ggeschrieben wird, daß in MD12 der erhöhte Wert steht.
    Hast du dir das angesehen? Es ausprobiert?

    testMPI -w COM1

    Weitergehende Operationen mit Puffern sind sinnvoll, wenn mehrere aufeinaderfolgende Werte "in einem Rutsch" in den Merkerbereich oder einen DB geschrieben werden sollen.
    Beispiel:
    MD 0 INT
    MD 4 REAL
    MD 8 REAL
    MD 12 INT
    Sollen auf die Werte 42, 5.5, 6.123, 17 gesetzt werden:
    byte[] buffer = new buffer[16];
    int i,j=42;
    i=libnodave.daveSwapIed_32(j);
    Array.Copy(buffer,0,BitConverter(i),GetBytes,0,4);
    i=libnodave.daveToPLCFloat(5.5);
    Array.Copy(buffer,4,BitConverter(i),GetBytes,0,4);
    i=libnodave.daveToPLCFloat(6.123);
    Array.Copy(buffer,8,BitConverter(i),GetBytes,0,4);
    i=libnodave.daveSwapIed_32(17);
    Array.Copy(buffer,12,BitConverter(i),GetBytes,0,4);
    dc.WriteBytes(...0,16,buffer);

    Das ist kein getesteter Code, aber so oder so ähnlich geht es.

  7. #7
    Registriert seit
    31.10.2005
    Beiträge
    26
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard

    hmmm,
    er meint vielleicht sowas :

    Code:
     (c#)  (float)BitConverter.ToUInt32(buffer,index))
    HTH
    Bewareofthis

  8. #8
    Registriert seit
    25.07.2005
    Ort
    Vogelsbergkreis
    Beiträge
    1.717
    Danke
    48
    Erhielt 68 Danke für 60 Beiträge

    Standard

    Zitat Zitat von Zottel
    Zitat Zitat von seeba
    Also ich benutze jetzt den BitConverter von .NET... Funtioniert auch gut soweit. Allerdings bekomm ich mit dem keinen Float aus 4 Bytes gewandet... Hast du eine Funktion der ich die 4 Bytes übergebe und die mir dann einen Float rausschmeißt?
    Wir reden hier irgendwie aneinader vorbei? Wo willst du die 4 Bytes hernehmen? Wenn du in einem Programm in .NET eine float-Variable f hast, kannst du sie mit:
    d=libnodave.toPLCFloat(f)
    oder
    i=libnodave.daveToPLCFloat(f)
    in eine float oder int-Variable konvertieren.
    Die Ergebnis-Variable enthält das Bit-Muster so wie es auch in der SPS stehen würde. Für .NET oder einen i386-Prozessor ist dieses Bitmuster sinnlos.
    Es kann aber mittels BitConverter die 32 Bit als eine Folge von 4 bytes an daveWriteBytes als Puffer übergeben werden. Das ist in testMPI.cs beispielhaft interpretiert und bewirkt, daß der Wert, der vorher aus dem MD12 gelesesen, ins PC-Format konvertiert und dann um 1.1 erhöht wurde, wieder so in die SPS ggeschrieben wird, daß in MD12 der erhöhte Wert steht.
    Hast du dir das angesehen? Es ausprobiert?

    testMPI -w COM1

    Weitergehende Operationen mit Puffern sind sinnvoll, wenn mehrere aufeinaderfolgende Werte "in einem Rutsch" in den Merkerbereich oder einen DB geschrieben werden sollen.
    Beispiel:
    MD 0 INT
    MD 4 REAL
    MD 8 REAL
    MD 12 INT
    Sollen auf die Werte 42, 5.5, 6.123, 17 gesetzt werden:
    byte[] buffer = new buffer[16];
    int i,j=42;
    i=libnodave.daveSwapIed_32(j);
    Array.Copy(buffer,0,BitConverter(i),GetBytes,0,4);
    i=libnodave.daveToPLCFloat(5.5);
    Array.Copy(buffer,4,BitConverter(i),GetBytes,0,4);
    i=libnodave.daveToPLCFloat(6.123);
    Array.Copy(buffer,8,BitConverter(i),GetBytes,0,4);
    i=libnodave.daveSwapIed_32(17);
    Array.Copy(buffer,12,BitConverter(i),GetBytes,0,4);
    dc.WriteBytes(...0,16,buffer);

    Das ist kein getesteter Code, aber so oder so ähnlich geht es.
    Ich will die 4 Bytes aus meinem Buffer zum Float umwandeln. Und du bietest ja keine Funktion zum lesen aus einem bestimmten Buffer an einer bestimmten Stelle.

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

    Standard

    Zitat Zitat von Zottel
    Array.Copy(buffer,12,BitConverter(i),GetBytes,0,4);
    usw. muß natürlich richtiger heißen:
    Array.Copy(BitConverter(i).GetBytes(),0,buffer,12,4);
    entsprechend der Definition:
    Array.Copy(src, srcStart, dest, destStart, length);
    Bin mit .NET nicht so vertraut.

  10. #10
    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 seeba
    Ich will die 4 Bytes aus meinem Buffer zum Float umwandeln. Und du bietest ja keine Funktion zum lesen aus einem bestimmten Buffer an einer bestimmten Stelle.
    Das heißt, der Puffer ist mittels einer der Lesefunktionen, z.B. readBytes, mit Bytes aus der SPS gefüllt?
    Dann bräuchtest du ja dieselbe Funktion wie daveGetFloat, aber von einem eigenen Puffer?
    Zitat Zitat von seeba
    folgende Frag: Gibt es auch eine Funktion um einen Floatwert wieder zurück zu wandel? Ähnlich daveGetFloat? Also sowas wie daveGetBytes(Floatwert)?
    Dann habe ich in dieser Frage das Wort "zurück" mißverstanden? Oder sprechen wir inzwischen über eine neue Frage?

Ähnliche Themen

  1. Libnodave PAW schreiben
    Von FeigeKalle im Forum Hochsprachen - OPC
    Antworten: 9
    Letzter Beitrag: 04.02.2011, 14:45
  2. [Libnodave] String ind SPS schreiben...
    Von paddy_cmd im Forum Hochsprachen - OPC
    Antworten: 9
    Letzter Beitrag: 08.07.2009, 17:43
  3. mit libnodave in db schreiben
    Von mike97714 im Forum Hochsprachen - OPC
    Antworten: 3
    Letzter Beitrag: 30.06.2009, 08:33
  4. 2 Bits schreiben mit LibNoDave
    Von Earny im Forum Hochsprachen - OPC
    Antworten: 7
    Letzter Beitrag: 23.11.2008, 18:00
  5. Libnodave Daten lesen/schreiben
    Von Acidic im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 02.06.2008, 08:32

Lesezeichen

Berechtigungen

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