# Libnodave & ReadManyBytes...



## Jochen Kühner (29 Mai 2009)

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???


----------



## Zottel (30 Mai 2009)

Jochen Kühner schrieb:


> 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.


Jochen Kühner schrieb:


> 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).


Jochen Kühner schrieb:


> 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.


----------



## Jochen Kühner (30 Mai 2009)

*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???


----------



## Jochen Kühner (27 Juli 2009)

*Mit from...*

Kann es sein das die Funktionen mit From nicht in der .net dll sind?


----------



## Jochen Kühner (27 Juli 2009)

So...

Hab die funktionen nun mal so deklariert:


```
[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:


```
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..


----------



## Jochen Kühner (27 Juli 2009)

*Soooo...*

Read Many Bytes hab ich jetzt so realisiert:

```
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...


----------



## Jochen Kühner (27 Juli 2009)

*So nun gehts...*

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

mfg


----------



## Key (27 Juli 2009)

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


----------



## Ralle (27 Juli 2009)

Jochen Kühner schrieb:


> 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.


----------



## Zottel (27 Juli 2009)

Key schrieb:


> 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.


----------



## Jochen Kühner (27 Juli 2009)

*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!


----------



## Jochen Kühner (28 Juli 2009)

*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.


----------

