# FC anzeigen



## The-Cook (2 Juni 2009)

Hallo zusammen,

ich versuche mich gerade mit LibNoDave für .NET und möchte einen FC anzeigen.


----------



## Human (2 Juni 2009)

Hi,

was meinst du mit FC anzeigen? Den AWL-Code, das aktuelle VKE, AKKU, was?


----------



## The-Cook (2 Juni 2009)

siehe anhang rote kasten


----------



## Human (2 Juni 2009)

Ich finde keinen Anhang...


----------



## Ralle (2 Juni 2009)

The-Cook schrieb:


> siehe anhang rote kasten



Aha...
Wo ist der Anhang ???


----------



## The-Cook (2 Juni 2009)

das bild war 3 px zu groß


----------



## Human (2 Juni 2009)

Du willst also AWL-Code auslesen können aus dem FC2?


----------



## The-Cook (2 Juni 2009)

das ist korrekt


----------



## Human (2 Juni 2009)

Sodele...

Das Programm, das du da so eindrucksvoll gescreenshottet hast hab ich geschrieben.
Das Problem an dem ganzen ist, dass das SPS-Programm auf der CPU nicht als AWL-Code sondern als soganannter MC7-Code darauf liegt sprich: Die Excel-Dateien in denen die gnazen Befehle drinstehen. Das hab ich in mühevoller Kleinarbeit in ungefähr 3000 Zeilen Code gepackt.

Ich kenn die libnodave.net.dll leider nicht, weshalb ich dir darüber auch nicht wirklich was sagen kann, aber in der "normalen" libnodave.dll gibt es die Funktionen initUpload, doUpload, endUpload, mit denen du einen bestimmten Baustein im MC7-Code aus der CPU lesen kannst (ob es diese Funktionen in der .NET-Version gibt weiß ich leider nicht).

Und um die Bausteine, die sich auf der CPU befinden gibt es die Funktion "daveListBlocksOfType", wie immer kenn ich das auch nur von der "normalen" .DLL.

Ich bin leider mit dem Programm noch nicht fertig, da ich leider gerade nicht wirklich dazukomme und weil es noch nicht fertig ist will ich den Quellcode zum jetzigen Zeitpunkt noch nicht herausgeben.


----------



## The-Cook (2 Juni 2009)

ListBlocksOfType ist umgesetzt.

die anderen gibt es nicht, kann sie nur über einen dll import nutzen. kann leider nichts anfangen mit "int * uploadID" oder "int * more".

vieleicht kannst du mir hier weiterhelfen und eventl. mir den abschnitt geben mit dem zerpflücken.


----------



## Human (2 Juni 2009)

initUpload(dc, blockType, blockNumber, uploadID)
dc = daveConnection
blockType = gleich wie bei daveListBlocksOfType
blockNumber = die Nummer des Bausteins
uploadID = Pointer zu einem Integer

doUpload(dc,more,bb,len,uploadID)
dc = daveConnection
more = 1=es kommt noch was 0=fertig
bb = Pointer zu Pointer wo der BausteinCode abgelegt werden soll (Array of Bytes oder sowas) (hat mich eine Stunde gekostet, bis ich das mal gerafft habe was da soll)
uploadID = die ID, die du in initUpload bekommen hat

endUpload(dc,uploadID)
dc = daveConnection
uploadID = die ID, die du in initUpload bekommen hat

In der testISO_TCP.c in der Zip-Datei von libnodave ab Zeile 188 kannst du sehen wie man das dann in "freier Wildbahn" einsetzen kann.


----------



## The-Cook (2 Juni 2009)

protected static extern int doUpload(IntPtr daveConnection,ref int more, Byte[] buffer, ref int len,int uploadID);
private int DoUpload(int uploadID)
{
int ret = int.MinValue;
int len = int.MinValue;
Byte[] buffer = new Byte[16635];
int more = int.MinValue;//0 -> fertig | 1 -> es kommt noch was
do
{
ret = doUpload(this.daveConnection.pointer, ref more, buffer, ref len, uploadID);
}
while (more == 1);
return ret;
}
 
was könnte es sein das nie in den buffer etwas geschrieben wird?


----------



## Human (2 Juni 2009)

Das ist das was mich auch eine Stunde gekostet hat:

Du musst eine Varable anlegen, die ein Pointer ist, und das muss die Adresse von deinem Buffer drinstehen. Und an die Funktion musst du dann den Pointer von der Variable in der der Pointer zum Buffer steht übergeben!

Aber was willst du eigentlich mit dem ausgelesenen Baustein anfangen, das ist dann nur ein Ge-HEX-el von Zahlen, die ohne Übersetzung keinerlei Sinn ergibt?


----------



## The-Cook (3 Juni 2009)

So nun habe ich alles in eine Byte Array wie kann man dies nun zerpflücken??


```
[SIZE=2][[/SIZE][SIZE=2][COLOR=#2b91af]DllImport[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#a31515]"libnodave.dll"[/COLOR][/SIZE][SIZE=2])][/SIZE]
[SIZE=2][COLOR=#0000ff]protected[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]static[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]extern[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] doUpload([/SIZE][SIZE=2][COLOR=#2b91af]IntPtr[/COLOR][/SIZE][SIZE=2] daveConnection, [/SIZE][SIZE=2][COLOR=#0000ff]ref[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] more, [/SIZE][SIZE=2][COLOR=#2b91af]IntPtr[/COLOR][/SIZE][SIZE=2] ptrBuffer, [/SIZE][SIZE=2][COLOR=#0000ff]ref[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] len, [/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] uploadID);[/SIZE]
[SIZE=2][COLOR=#0000ff]private[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] DoUpload([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] uploadID)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] ret = 0;[/SIZE]
[SIZE=2][COLOR=#2b91af]IntPtr[/COLOR][/SIZE][SIZE=2] ptr = [/SIZE][SIZE=2][COLOR=#2b91af]Marshal[/COLOR][/SIZE][SIZE=2].AllocHGlobal(16635);[/SIZE]
[SIZE=2][COLOR=#2b91af]IntPtr[/COLOR][/SIZE][SIZE=2] ptrptr = [/SIZE][SIZE=2][COLOR=#2b91af]Marshal[/COLOR][/SIZE][SIZE=2].AllocHGlobal(ptr);[/SIZE]
[SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] more = [/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2].MinValue;[/SIZE][SIZE=2][COLOR=#008000]//0 -> fertig | 1 -> es kommt noch was[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]try[/COLOR][/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]do[/COLOR][/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]try[/COLOR][/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]doUpload([/SIZE][SIZE=2][COLOR=#0000ff]this[/COLOR][/SIZE][SIZE=2].daveConnection.pointer, [/SIZE][SIZE=2][COLOR=#0000ff]ref[/COLOR][/SIZE][SIZE=2] more, ptrptr, [/SIZE][SIZE=2][COLOR=#0000ff]ref[/COLOR][/SIZE][SIZE=2] ret, uploadID);[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]catch[/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#2b91af]Exception[/COLOR][/SIZE][SIZE=2] e)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]ret = [/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2].MinValue;[/SIZE]
[SIZE=2][COLOR=#0000ff]break[/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]while[/COLOR][/SIZE][SIZE=2] (more == 1);[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]catch[/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#2b91af]Exception[/COLOR][/SIZE][SIZE=2] ex)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]ret = [/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2].MinValue;[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#2b91af]Byte[/COLOR][/SIZE][SIZE=2][] buffer = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2][COLOR=#2b91af]Byte[/COLOR][/SIZE][SIZE=2][ret];[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i = 0; i < ret; i++)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]buffer[i] = [/SIZE][SIZE=2][COLOR=#2b91af]Marshal[/COLOR][/SIZE][SIZE=2].ReadByte(ptr, i);[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] ret;[/SIZE]
[SIZE=2]}[/SIZE]
```


----------



## The-Cook (3 Juni 2009)

Human schrieb:


> Aber was willst du eigentlich mit dem ausgelesenen Baustein anfangen, das ist dann nur ein Ge-HEX-el von Zahlen, die ohne Übersetzung keinerlei Sinn ergibt?


 
Ich wollte wie du den AWL-Code anzeigen


----------



## The-Cook (3 Juni 2009)

Mit dv.getProgramBlock(libnodave.daveBlockType_FC, fc, buffer, ref(len));
kann man einen FC bekommen. 
Manchmal geht es leichter wie erwartet.

Vielen Dank für eure Hilfe.


----------

