libnodave, read multiple items C#

TobiasW

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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());
 
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.
 
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 :D

Vielleicht fällt euch ja noch was ein :)

@Jochen
Ich werde mir deine ToolBox mal anschauen.


Grüße
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das ist mir bewusst, etwas blödes Beispiel von mir... Wobei zwischen mein REAL und TIME habe ich n' Lücke gelassen :D

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.
 
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!
 
Zurück
Oben