DotNetSiemensPLCToolBoxLibrary (LibNoDave) Zugriff auf Dual-Port RAM / FB15

Zuviel Werbung?
-> Hier kostenlos registrieren
sollten wir vlt. mal an zottel schreiben das da noch ein problem besteht.

Wird das von Zottel überhaupt noch gepflegt?

Bei einer S7 wird das Problem auch nie in Erscheinung treten, da libnodave bei Verbindungsaufbau angibt, dass es nur ein Telegramm ohne Bestätigung sendet und empfangen kann. Und selbst die unwahrscheinliche 960er PDU passt dann immer in eine Ethernet MTU von z.B. 1472 Bytes.
Das fällt bei der NC eben auf, weil diese erstens 960 Bytes PDU unterstützt, und dann auch noch hier bis zu 20 Telegramme direkt hintereinander schickt ohne auf Bestätigung zu warten. Und dann wird gelegentlich eine PDU in zwei TCP Telegramme getrennt übertragen und dann von der TCP-Schicht anschließend wieder passend zusammengesetzt.
Nichtsdestotrotz ist es natürlich trotzdem nicht richtig es so zu machen.
 
Wird das von Zottel überhaupt noch gepflegt?

Bei einer S7 wird das Problem auch nie in Erscheinung treten, da libnodave bei Verbindungsaufbau angibt, dass es nur ein Telegramm ohne Bestätigung sendet und empfangen kann. Und selbst die unwahrscheinliche 960er PDU passt dann immer in eine Ethernet MTU von z.B. 1472 Bytes.
Das fällt bei der NC eben auf, weil diese erstens 960 Bytes PDU unterstützt, und dann auch noch hier bis zu 20 Telegramme direkt hintereinander schickt ohne auf Bestätigung zu warten. Und dann wird gelegentlich eine PDU in zwei TCP Telegramme getrennt übertragen und dann von der TCP-Schicht anschließend wieder passend zusammengesetzt.
Nichtsdestotrotz ist es natürlich trotzdem nicht richtig es so zu machen.

Aber auch sonstige Netzwerk Hardware kann ja Telegramme aufteilen...
https://serverfault.com/questions/534063/can-tcp-and-udp-packets-be-split-into-pieces
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab gerade versucht einen Ordner mit allen Unterordnern zu lesen. Dabei kommt es zum Crash in NoDave und das Programm ist zu. Es kann/wird auch kein Dump geschrieben.

Das lesen des Bereiches hat noch funktioniert "/_N_WKS_DIR" (Bereich Werkstücke). Anschließend soll der Ordner in diesem Bereich gelesen werden "_N_G_GQ_TEST_SWITCH_VCS_WPD" (WPD-> Ordner)

Anhang anzeigen FolderUpload.rar
 
Das heißt, der Upload hat bei den anderen Dateien funktioniert?

Was ich auf den ersten Blick sehe ist, dass die NC trotz gesetzem "Last Data Unit" flag das gleiche Telegramm nochmal sendet, aber dann sollte eigentlich nichts abstürzen.

Probier mal den debug Level zu erhöhen und dann gucken wie weit man dort noch Ausgaben eingefangen bekommt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
_daveExchange PDU number: 65537
ReadFromNck enter _daveExchangeTCP
send packet: : 
                            0:0x03,0x00,0x00,0x3A,0x02,0xF0,0x80,0x32,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,
                            10:0x21,0x00,0x01,0x12,0x04,0x11,0x7F,0x06,0x00,0xFF,0x09,0x00,0x1D,0x14,0x00,0x5F,
                            20:0x4E,0x5F,0x47,0x5F,0x47,0x51,0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,0x49,0x54,
                            30:0x43,0x48,0x5F,0x56,0x43,0x53,0x5F,0x57,0x50,0x44,
readISOpacket: 165 bytes read, 165 needed
readISOpacket: packet: 
                            0:0x03,0x00,0x00,0xA5,0x02,0xF0,0x80,0x32,0x07,0x00,0x00,0x00,0x01,0x00,0x0C,0x00,
                            10:0x88,0x00,0x01,0x12,0x08,0x12,0xBF,0x06,0x63,0x01,0x00,0x00,0x00,0xFF,0x09,0x00,
                            20:0x84,0x00,0xFB,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x37,0x31,0x31,0x31,
                            30:0x35,0x31,0x30,0x32,0x37,0x35,0x36,0x20,0x20,0x20,0x20,0x3B,0x24,0x50,0x41,0x54,
                            40:0x48,0x3D,0x2F,0x5F,0x4E,0x5F,0x77,0x6B,0x73,0x5F,0x64,0x69,0x72,0x2F,0x5F,0x4E,
                            50:0x5F,0x47,0x5F,0x47,0x51,0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,0x49,0x54,0x43,
                            60:0x48,0x5F,0x56,0x43,0x53,0x5F,0x57,0x50,0x44,0x0A,0x30,0x30,0x30,0x30,0x37,0x33,
                            70:0x36,0x39,0x31,0x37,0x31,0x31,0x31,0x35,0x31,0x30,0x32,0x37,0x35,0x35,0x20,0x20,
                            80:0x20,0x20,0x20,0x37,0x37,0x37,0x37,0x37,0x20,0x5F,0x4E,0x5F,0x47,0x5F,0x47,0x51,
                            90:0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,0x49,0x54,0x43,0x48,0x5F,0x56,0x43,0x53,
                            a0:0x5F,0x4D,0x50,0x46,0x0A,
ReadFromNck _daveExchangeTCP res from read 165
result of exchange: 0
PDU header: 
                            0:0x32,0x07,0x00,0x00,0x00,0x01,0x00,0x0C,0x00,0x88,
plen: 12 dlen: 136
Parameter: 
                            0:0x00,0x01,0x12,0x08,0x12,0xBF,0x06,0x63,0x01,0x00,0x00,0x00,
Data     : 
                            0:0xFF,0x09,0x00,0x84,0x00,0xFB,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x37,
                            10:0x31,0x31,0x31,0x35,0x31,0x30,0x32,0x37,0x35,0x36,0x20,0x20,0x20,0x20,0x3B,0x24,
                            20:0x50,0x41,0x54,0x48,0x3D,0x2F,0x5F,0x4E,0x5F,0x77,0x6B,0x73,0x5F,0x64,0x69,0x72,
                            30:0x2F,0x5F,0x4E,0x5F,0x47,0x5F,0x47,0x51,0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,
                            40:0x49,0x54,0x43,0x48,0x5F,0x56,0x43,0x53,0x5F,0x57,0x50,0x44,0x0A,0x30,0x30,0x30,
                            50:0x30,0x37,0x33,0x36,0x39,0x31,0x37,0x31,0x31,0x31,0x35,0x31,0x30,0x32,0x37,0x35,
                            60:0x35,0x20,0x20,0x20,0x20,0x20,0x37,0x37,0x37,0x37,0x37,0x20,0x5F,0x4E,0x5F,0x47,
                            70:0x5F,0x47,0x51,0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,0x49,0x54,0x43,0x48,0x5F,
                            80:0x56,0x43,0x53,0x5F,0x4D,0x50,0x46,0x0A,
daveGetNCfile: Response start upload, param.errorcode=0x0000
daveGetNCfile: Verwendete Sequenznummer=99
daveGetNCfile: Response start upload, p2.udlen=132

Anhang anzeigen FolderUpload3.rar
 
Zuletzt bearbeitet:
Das heißt, der Upload hat bei den anderen Dateien funktioniert?

Der Upload des Verzeichnisses hat mit der alten sowie der nen Methode funktioniert. Der Upload von Dateien funktioniert auch.
Der Upload von Ordnern funktioniert mit der Neuen jedoch nicht mehr.

Beim Upload von Verzeichnissen oder Ordnern werden nicht die ganzen Dateien, sondern deren Name + Zeitstempel gesendet.
 
Die Ausgaben sind so wie sie auch sein müssten. Nach der letzten Ausgabe werden noch die Daten in den buffer umkopiert und dann wird die Funktion beendet, weil die eine Antwort schon die Last Data unit ist.

Kannst du in deinem eigenen Programm noch eine Ausgabe nach dem Aufruf von daveGetNCfile einbauen, mit Ausgabe des Rückgabewertes? Oder in daveGetNCfile vor dem return noch eine, z.B. den buffer dumpen.

Ich weiß nur nicht warum deine NC das gleiche Telegramm zwei mal sendet, aber das dürfte eigentlich nicht stören weil die Funktion dieses gar nicht mehr zu Gesicht bekommt.
 
Ich weiß nur nicht warum deine NC das gleiche Telegramm zwei mal sendet, aber das dürfte eigentlich nicht stören weil die Funktion dieses gar nicht mehr zu Gesicht bekommt.

Was meinst du mit zwei mal das gleiche Telegramm?
FolderUpload3.jpg


Rückgabewert scheint noch zu passen.

Wenn ich im Debugger das ganze bis zum Absturz verfolge komme ich direkt beim Rückgabewert der NoDave Methode an. Da hilft auch kein Try Catch

Code:
public int daveGetNcFile(string filename, byte[] buffer, ref int length)
{
    if (IntPtr.Size == 8)
        return daveGetNcFile64(pointer, filename, buffer, ref length);
    else
        return daveGetNcFile32(pointer, filename, buffer, ref length);
}


protected static extern int daveGetNcFile64(IntPtr dc, string filename, byte[] buffer, ref int length);


Code:
_daveExchange PDU number: 65537
ReadFromNck enter _daveExchangeTCP
send packet: : 
                            0:0x03,0x00,0x00,0x3A,0x02,0xF0,0x80,0x32,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,
                            10:0x21,0x00,0x01,0x12,0x04,0x11,0x7F,0x06,0x00,0xFF,0x09,0x00,0x1D,0x14,0x00,0x5F,
                            20:0x4E,0x5F,0x47,0x5F,0x47,0x51,0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,0x49,0x54,
                            30:0x43,0x48,0x5F,0x56,0x43,0x53,0x5F,0x57,0x50,0x44,
readISOpacket: 165 bytes read, 165 needed
readISOpacket: packet: 
                            0:0x03,0x00,0x00,0xA5,0x02,0xF0,0x80,0x32,0x07,0x00,0x00,0x00,0x01,0x00,0x0C,0x00,
                            10:0x88,0x00,0x01,0x12,0x08,0x12,0xBF,0x06,0xBE,0x01,0x00,0x00,0x00,0xFF,0x09,0x00,
                            20:0x84,0x00,0xFB,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x37,0x31,0x31,0x31,
                            30:0x35,0x31,0x30,0x32,0x37,0x35,0x36,0x20,0x20,0x20,0x20,0x3B,0x24,0x50,0x41,0x54,
                            40:0x48,0x3D,0x2F,0x5F,0x4E,0x5F,0x77,0x6B,0x73,0x5F,0x64,0x69,0x72,0x2F,0x5F,0x4E,
                            50:0x5F,0x47,0x5F,0x47,0x51,0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,0x49,0x54,0x43,
                            60:0x48,0x5F,0x56,0x43,0x53,0x5F,0x57,0x50,0x44,0x0A,0x30,0x30,0x30,0x30,0x37,0x33,
                            70:0x36,0x39,0x31,0x37,0x31,0x31,0x31,0x35,0x31,0x30,0x32,0x37,0x35,0x35,0x20,0x20,
                            80:0x20,0x20,0x20,0x37,0x37,0x37,0x37,0x37,0x20,0x5F,0x4E,0x5F,0x47,0x5F,0x47,0x51,
                            90:0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,0x49,0x54,0x43,0x48,0x5F,0x56,0x43,0x53,
                            a0:0x5F,0x4D,0x50,0x46,0x0A,
ReadFromNck _daveExchangeTCP res from read 165
result of exchange: 0
PDU header: 
                            0:0x32,0x07,0x00,0x00,0x00,0x01,0x00,0x0C,0x00,0x88,
plen: 12 dlen: 136
Parameter: 
                            0:0x00,0x01,0x12,0x08,0x12,0xBF,0x06,0xBE,0x01,0x00,0x00,0x00,
Data     : 
                            0:0xFF,0x09,0x00,0x84,0x00,0xFB,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x37,
                            10:0x31,0x31,0x31,0x35,0x31,0x30,0x32,0x37,0x35,0x36,0x20,0x20,0x20,0x20,0x3B,0x24,
                            20:0x50,0x41,0x54,0x48,0x3D,0x2F,0x5F,0x4E,0x5F,0x77,0x6B,0x73,0x5F,0x64,0x69,0x72,
                            30:0x2F,0x5F,0x4E,0x5F,0x47,0x5F,0x47,0x51,0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,
                            40:0x49,0x54,0x43,0x48,0x5F,0x56,0x43,0x53,0x5F,0x57,0x50,0x44,0x0A,0x30,0x30,0x30,
                            50:0x30,0x37,0x33,0x36,0x39,0x31,0x37,0x31,0x31,0x31,0x35,0x31,0x30,0x32,0x37,0x35,
                            60:0x35,0x20,0x20,0x20,0x20,0x20,0x37,0x37,0x37,0x37,0x37,0x20,0x5F,0x4E,0x5F,0x47,
                            70:0x5F,0x47,0x51,0x5F,0x54,0x45,0x53,0x54,0x5F,0x53,0x57,0x49,0x54,0x43,0x48,0x5F,
                            80:0x56,0x43,0x53,0x5F,0x4D,0x50,0x46,0x0A,
daveGetNcFile: Response start upload, param.errorcode=0x0000
daveGetNcFile: Verwendete Sequenznummer=190
daveGetNcFile: Response start upload, p2.udlen=132
daveGetNcFile: tot_len=130
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast du eine Möglichkeit die Aufrufe direkt aus einem C-Programm heraus zu testen?

Muss ich schauen ob ich das zum laufen bekomme.

Mit dem C#-Wrapper kenne ich mich nicht aus. Woher stammen z.B. daveGetNcFile32 und daveGetNcFile64?

Code:
[DllImport("libnodave_jfkmod.dll", EntryPoint = "daveGetNcFile")]
protected static extern int daveGetNcFile32(IntPtr dc, string filename, byte[] buffer, ref int length);

[DllImport("libnodave_jfkmod64.dll", EntryPoint = "daveGetNcFile")]
protected static extern int daveGetNcFile64(IntPtr dc, string filename, byte[] buffer, ref int length);

Die NoDave ist als 32 und als 64 Bit Version compiliert. Mit den beiden Methoden daveGetNcFile32 und daveGetNcFile64 wird die Methode in der richtigen dll aufgerufen.
 
param ist bei dir ein Array für 3 unsigned char Werte. Das muss aber ein Array für (mindestens) 2 Zeiger auf ein char array sein.
also anstatt:

uc param[3];

dann:
uc* param[3];

Oder so:
Code:
const char *pistart_parameter[] = {
    "P01",
    "/_N_wks_dir/_N_G_GQ_TEST_SWITCH_VCS_WPD",
    ""
};
 
Ich hab auch nochmal den Test gemacht, wenn ich zunächst das Verzeichnis und anschließend den Ordner lade.

Laden des Verzeichnisses führt zu keinem Crash, jedoch das laden des Ordners. (Wegen fehlgeschlagenem PI-Dienst schickt die NC keine Daten für den Upload)

Code:
            uc* param[10];
            int length;
            printf("daveSetDebug: 0x1ffff\n");
            daveSetDebug(0x1ffff);


            //############# Upload DIR #########
            printf("Init PI-Service...\n");            
            param[0]= "P01";
            param[1]= "/_N_wks_dir";
            printf("Start PI-Service \"DIR\"...\n");
			res = davePIstart_nc(dc, "_N_F_XFER", &param, 2);
            printf("davePIstart_nc res=%d\n", res);


            //Upload DIR von NC
            printf("Starte daveGetNcFile...\n");
            res = daveGetNcFile(dc, "_N_wks_dir", buffer, &length);
            //######################

            //############ Upload Folder ##########
            //PI-Service
            printf("Init PI-Service...\n");
            
            param[0]= "P01";
            param[1]= "/_N_wks_dir/_N_G_GQ_TEST_SWITCH_VCS_WPD";
            printf("Start PI-Service...\n");


            res = davePIstart_nc(dc, "_N_F_XFER", &param, 2);
            printf("davePIstart_nc res=%d\n", res);
            


            //Upload von NC
            printf("Starte daveGetNcFile...\n");
            res = daveGetNcFile(dc, "_N_G_GQ_TEST_SWITCH_VCS_WPD", buffer, &length);
            printf("daveGetNcFile res=%d\n", res);
            //######################

Anhang anzeigen FolderUpload5.rar
 
Du verwendest eine andere Slot-Nummer als in den anderen Aufzeichnungen, vermutlich ist das die SPS und nicht NC.

Übergibst du in daveGetNCfile für length auch die Adresse einer int Variable?
Ich kann es mir nicht erklären, vor allem wenn du sagst dass die Funktion beim Upload von Dateien funktioniert. Ich sehe in den Aufzeichnungen überhaupt keinen Unterschied, bis auf die doppelten Antworten.
 
Zurück
Oben