Libnodave & ReadManyBytes...

Jochen Kühner

Level-3
Beiträge
4.291
Reaktionspunkte
527
Zuviel Werbung?
-> Hier kostenlos registrieren
Wollte in meinem nodaveprotokoller read bytes durch read many bytes ersetzen, doch das funzt irgendwie so nicht!

readbytes liefert mit meinen parametern 0 zurück und die werte werden gelesen, wenn ich dann readmaybytes nehme bekomme ich einen werd != 0 zurück, obwohl ich die geleichen parameter benutze!

Habe irgendwo hier auch gelsen das ich dann die funktionen getU8from (also die mit from) benutzen muss, ist das auch so bei .net?

Muss ich mir die .net lib dann mit diesen funktion selbst übersetzen, weil in der standart sind diese ja nicht drin (soweit ich gesehen habe)

jemand ein paar tips für mich???
 
Wollte in meinem nodaveprotokoller read bytes durch read many bytes ersetzen, doch das funzt irgendwie so nicht!
Das würde ich in einer .NET-Anwendung nicht tun. Warum programmierst du dir das Lesen aufeinanderfolgender Blöcke nicht eben selbst? Du kannst den C-Code von daveReadManyBytes zum Vorbild nehmen.
Habe irgendwo hier auch gelsen das ich dann die funktionen getU8from
(also die mit from)
Die mit from lesen von einem eigenen Puffer (also aus dem Speicher der Anwendung).
Muss ich mir die .net lib dann mit diesen funktion selbst übersetzen, weil in der standart sind diese ja nicht drin (soweit ich gesehen habe)
Das kannst du gerne versuchen, aber die Funktionen sind genau deshalb nicht in der .net.dll, weil der Austausch von Zeigern zwischen C und .NET problematisch sein kann/könnte.
Das ist genau der Grund, weshalb ich dir rate, das Lesen aufeinanderfolgender Blöcke selbst zu programmieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
so...

ok... dann werd ichs so machen... für was ist dann read many bytes in der .net dll? werd mal sehen wie ich das dann mache... aber dann muss ich ja erst ein teil einlesen dann die funktionen getu8 usw verwenden und dann den nächsten teil einlesen, odr???
 
So...

Hab die funktionen nun mal so deklariert:

Code:
[DllImport("libnodave.dll"/*, PreserveSig=false */ )]
    protected static extern int daveGetS32from(Byte[] Buffer);//[MarshalAs(UnmanagedType.LPStr)]
    public int getS32from(Byte[] Buffer)
    {
        return daveGetS32from(Buffer);
    }

und read many bytes so programmiert:

Code:
public byte[] readManyBytes(int area, int DBnumber, int start, int len, byte[] buffer)
    {
        int res, readLen;
        byte[] myBuffer;
        byte[] tmp;
        //uc * pbuf;
        //pos=0;
        //if (buffer==NULL) return daveResNoBuffer;
        //pbuf=(uc*) buffer; 
        //res = daveResInvalidLength; //the only chance to return this is when len<=0
        while (len > 0)
        {
            if (len > getAnswLen() - 18) readLen = getAnswLen() - 18; else readLen = len;
            res = daveReadBytes(pointer, area, DBnumber, start, readLen, tmp);
            if (res != 0) return null;

            len -= readLen;
            start += readLen;
            //pbuf += readLen;

            myBuffer += tmp;
        }
        return myBuffer;
    }

soo, nun werd ich mal testen... wenn jemand noch tips hat, bitte ne kommentar..
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soooo...

Read Many Bytes hab ich jetzt so realisiert:
Code:
public int readManyBytes(int area, int DBnumber, int start, int len, ref byte[] buffer)
    {
        int res, readLen;
        int pos=0;

        myBufferPos = 0;
        
        while (len > 0)
        {
            if (len > getMaxPDULen() - 18) readLen = getMaxPDULen() - 18; else readLen = len;

            byte[] tmp = new byte[readLen];

            res = daveReadBytes(pointer, area, DBnumber, start+pos, readLen, tmp);
            if (res != 0) return res;

            tmp.CopyTo(buffer, pos);
            
            len -= readLen;
            pos += readLen;
        }
        return 0;
    }


Das geht auch. Habe nur mit den from Methoden noch probleme, weis nicht wie Ich die deklariere, aber die mache ich jetzt gerade selber direkt in csharp, so das ich keine c methoden brauche.

Blos ohne unions ist das alles ein bisschen kompliziert...
 
So nun gehts...

So hab mal meine geänderte .net dll vieleicht kann diese ja direkt integriert werden in libnodave...

mfg
 

Anhänge

  • libnodave.net.zip
    6,5 KB · Aufrufe: 19
Ich verstehe nicht ganz warum du dir ReadManyBytes selbst programmierst. In der .NET ist die doch drin und bei mir funktioniert die prima.

Gruß Key
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe nur mit den from Methoden noch probleme, weis nicht wie Ich die deklariere, aber die mache ich jetzt gerade selber direkt in csharp, so das ich keine c methoden brauche.

Blos ohne unions ist das alles ein bisschen kompliziert...

Ich brauche das demnächst wohl auch für C#. Würde es dir was ausmachen, deine eingenen "from"-Methoden hier einzustellen, wenn du soweit bist? Wäre wirklich sehr hilfreich für mich. :p
 
Ich verstehe nicht ganz warum du dir ReadManyBytes selbst programmierst. In der .NET ist die doch drin und bei mir funktioniert die prima.

Gruß Key
Die ist natürlich auch irgendwann erfolgreich getestet worden. Aber ich habe keine .NET-Bibel gelesen. Ich bin davon ausgegangen, daß das was funktioniert auch erlaubt ist und weiterhin funktionieren wird. Wenn dann aber Leute andere Ergebnisse erzielen, kann ich nicht alle Versionen von .NET ausprobieren. Daher den Rat, sich so etwas wie daveReadManyBytes selbst zu programieren. Sind ja nur 5-6 Zeilen.
 
So...

Ja, bei mir hatte die vorher programierte funktion nicht funktioniert, aber die selber programmierte geht... bau das gerade in meinen protokoller ein und stells dann morgen auch hier online!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So...

hier hab Ich mal meine geänderte libnodave.net.dll.

Hab noch ein paar Zusatz funktionen eingebaut (Auslesen eines DatumZeit datentypes aus der SPS, Setzen eines Bits, IsBitSet funktion.)

falls es jemand braucht...

Mfg.
 

Anhänge

  • libnodave.net.zip
    8,3 KB · Aufrufe: 23
Zurück
Oben