# libnodave, read multiple items C#



## TobiasW (26 Dezember 2015)

Hallo Leute,

spiele zur Zeit etwas mit libnodave rum. Benutze als SPS eine 315 pn/dp und entwickele mit C#.
Komme soweit ganz gut klar, habe aber eine Frage zum Auslesen von mehreren unabhängigen Blocks mit nur einer Anfrage.

Aktuell greife ich dann auf die ausgelesenen Daten per "dc.useResult(result, n)" und folglich mit "dc.getS32()" zu.
Gibt es auch die Möglichkeit, mir den ganzen ausgelesenen Block auszugeben? Weil ich scheitere grade an den Datentypen String und Char... weil dafür gibt es ja keine dc.get Funktionen.

Am liebsten hätte ich einfach den ganzen gelesenen Block als byte Array. Denn dann stehen eine alle Möglichkeiten offen.

Dankeschön und noch schöne Weihnachten 


Mein Code sieht aktuell wie folgt aus:

//----------- TEST ALLE TYPEN (MULTIPLE ITEMS READ) -----------


                    libnodave.PDU dado = new libnodave.PDU();
                    dado = dc.prepareReadRequest();
                    dado.addBitVarToReadRequest(libnodave.daveDB, 10, 10 * 8 + 2, 1);   // BOOL DB10.DBX10.2
                    dado.addVarToReadRequest(libnodave.daveDB, 10, 11, 1);              // BYTE DB10.DBB11
                    dado.addVarToReadRequest(libnodave.daveDB, 10, 12, 2);              // WORD 
                    dado.addVarToReadRequest(libnodave.daveDB, 10, 14, 4);              // DWORD 
                    dado.addVarToReadRequest(libnodave.daveDB, 10, 18, 2);              // INT 
                    dado.addVarToReadRequest(libnodave.daveDB, 10, 20, 4);              // DINT 
                    dado.addVarToReadRequest(libnodave.daveDB, 10, 24, 4);              // REAL 
                    dado.addVarToReadRequest(libnodave.daveDB, 10, 30, 4);              // TIME 
                    dado.addVarToReadRequest(libnodave.daveDB, 10, 40, 2);              // CHAR 
                    dado.addVarToReadRequest(libnodave.daveDB, 10, 42, byt.Length);     // STRING 


                    libnodave.resultSet result = new libnodave.resultSet();
                    res = dc.execReadRequest(dado, result);


                    res = dc.useResult(result, 0);
                    MessageBox.Show(dc.getU8().ToString());


                    res = dc.useResult(result, 1);
                    MessageBox.Show(dc.getU8().ToString());


                    res = dc.useResult(result, 2);
                    MessageBox.Show(dc.getU16().ToString());


                    res = dc.useResult(result, 3);
                    MessageBox.Show(dc.getU32().ToString());


                    res = dc.useResult(result, 4);
                    MessageBox.Show(dc.getS16().ToString());


                    res = dc.useResult(result, 5);
                    MessageBox.Show(dc.getS32().ToString());


                    res = dc.useResult(result, 6);
                    MessageBox.Show(dc.getFloat().ToString());


                    res = dc.useResult(result, 7);
                    MessageBox.Show(dc.getS32().ToString());


                    // DID NOT WORK NOW..... 
                    //res = dc.useResult(result, 8);
                    //byte[] asssd = new byte[2];
                    //asssd = BitConverter.GetBytes(dc.getS8());
                    //MessageBox.Show(BitConverter.ToChar(asssd, 0).ToString());


                    //res = dc.useResult(result, 9);
                    //MessageBox.Show(dc.getAnswLen().ToString());


----------



## Thomas_v2.1 (26 Dezember 2015)

An die internen Daten kommst du über die .Net Schnittstelle nicht heran, zumindest nicht ohne da tiefgreifende Erweiterungen zu machen.

Wenn du die Daten als Byte-Array haben möchtest, dann schreib dir doch eine Funktion welche über dc.getU8() die Daten in ein .Net byte-Array kopiert.


----------



## Jochen Kühner (27 Dezember 2015)

schau mal in meiner toolbox, ich mach das glaub iwie! (ist schon lange her!) ich nutze aber auch eine modifizierte libnodave!


----------



## TobiasW (27 Dezember 2015)

Hallo Thomas,

das ist mir auch schon in den Sinn gekommen. Nur ist das leider nicht so einfach, da man wohl zuerst die Daten per "dc.useResult(result, n)" in einen Buffer von dc kopieren muss, um diese dann per dc.get auszulesen.
Somit braucht man ab und zu dc.getU8, mal dc.getU32, .... und man muss halt entsprechend vorher dc.useResult aufrufen. Das wäre ein sehr komplizierter Algorithmus 

Vielleicht fällt euch ja noch was ein 

@Jochen
Ich werde mir deine ToolBox mal anschauen.


Grüße


----------



## Thomas_v2.1 (27 Dezember 2015)

Wenn so wie in deinem Beispiel die Daten hintereinander in einen einzelnen Datenbaustein liegen, bietet es sich eh an den ganzen Block zu lesen. Z.B. 200 Bytes im DB 10 mit:

res = dc.readBytes(libnodave.daveDB, 10, 0, 200, null);
die du dann direkt in einer Schleife in ein byte-Array kopieren kannst.

Nur musst du dann bei der Interpretation der Daten das gleiche machen wie die Funktionen aus der libnodave Bibliothek, d.h. Endianess anpassen usw.


----------



## TobiasW (27 Dezember 2015)

Ja das ist mir bewusst, etwas blödes Beispiel von mir... Wobei zwischen mein REAL und TIME habe ich n' Lücke gelassen 

Ich hab jetzt erstmal in C# probiert was so möglich ist und mich etwas eingearbeitet. Nun will ich das selbe mal auf Android implementieren.


----------



## Jochen Kühner (27 Dezember 2015)

also meine bib läuft mit libnodave auch unter ios in verbindung mit mono! hab das vor 1-2 jahren mal am laufen gehabt! string und chararray hab ich als datentxpen auch drin!


----------

