FC anzeigen

Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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?
 
So nun habe ich alles in eine Byte Array wie kann man dies nun zerpflücken??

Code:
[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]
 
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.
 
Zurück
Oben