-> Hier kostenlos registrieren
Mit welchem von den dreien kommunizierst du, wenn du eine Datei überträgst, einen PI-Service aufrufst, oder eine Variable liest?
Siemens schreibt bei seinem PI_START(/NC, P01, _N_TEST_EDI, _N_F_CLOS)
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Mit welchem von den dreien kommunizierst du, wenn du eine Datei überträgst, einen PI-Service aufrufst, oder eine Variable liest?
In der "doUploadNC" und "endUploadNC" ist pa[4]=1, bei den SPS Funktionen war dieser 0. Weiß jedoch nicht was dieser aussagt.
uc pa[]= {0x1f,0,0,0,1,0,0,1};
Hab die jetzigen Upload Funktionen soweit angepasst, dass ich nen Erfolgreichen Upload durchführen konnte.
int DECL2 doUploadNC(daveConnection * dc, int * more, uc**buffer, int * len, int uploadID){ PDU p1,p2;
int res, netLen;
p1.header=dc->msgOut+dc->PDUstartO;
_daveConstructDoUploadNC(&p1, uploadID);
res=_daveExchange(dc, &p1);
if (daveDebug & daveDebugUpload) {
LOG2("error:%d\n", res);
FLUSH;
}
*more=0;
if(res!=daveResOK) return res;
res=_daveSetupReceivedPDU(dc, &p2);
*more=p2.param[1];
if(res!=daveResOK) return res;
// netLen=p2.data[1] /* +256*p2.data[0]; */ /* for long PDUs, I guess it is so */;
netLen=p2.data[1]+256*p2.data[0]; /* some user confirmed my guess... */;
//if (*buffer) {
memcpy(buffer,p2.data+4,netLen);
*buffer+=netLen;
if (daveDebug & daveDebugUpload) {
LOG2("buffer:%p\n",*buffer);
FLUSH;
}
//}
*len=netLen;
return res;
}
int DECL2 initUploadNC(daveConnection *dc, char *filename, uc *uploadID){
PDU p1,p2;
int res;
if (daveDebug & daveDebugUpload) {
LOG1("****initUploadNC\n");
}
p1.header = dc->msgOut + dc->PDUstartO;
_daveConstructUploadNC(&p1, filename);
res = _daveExchange(dc, &p1);
if (daveDebug & daveDebugUpload) {
LOG2("error:%d\n", res);
FLUSH;
}
if (res != daveResOK) return res;
res = _daveSetupReceivedPDU(dc, &p2);
if (res != daveResOK) return res;
uploadID[0] = p2.param[4];
uploadID[1] = p2.param[5];
uploadID[2] = p2.param[6];
uploadID[3] = p2.param[7];
return 0;
}
int DECL2 doUploadNC(daveConnection *dc, int *more, uc **buffer, int *len, uc *uploadID){
PDU p1,p2;
int res, netLen;
p1.header = dc->msgOut + dc->PDUstartO;
_daveConstructDoUploadNC(&p1, uploadID);
res=_daveExchange(dc, &p1);
if (daveDebug & daveDebugUpload) {
LOG2("error:%d\n", res);
FLUSH;
}
*more = 0;
if (res != daveResOK) return res;
res = _daveSetupReceivedPDU(dc, &p2);
*more = p2.param[1];
if (res != daveResOK) return res;
netLen = p2.data[1] + 256*p2.data[0];
if (*buffer) {
memcpy(*buffer, p2.data+4, netLen);
*buffer += netLen;
if (daveDebug & daveDebugUpload) {
LOG2("buffer:%p\n",*buffer);
FLUSH;
}
}
*len+=netLen;
return res;
}
int DECL2 endUploadNC(daveConnection *dc, uc *uploadID){
PDU p1,p2;
int res;
p1.header = dc->msgOut + dc->PDUstartO;
_daveConstructEndUploadNC(&p1, uploadID);
res = _daveExchange(dc, &p1);
if (daveDebug & daveDebugUpload) {
LOG2("error:%d\n", res);
FLUSH;
}
if(res != daveResOK) return res;
res = _daveSetupReceivedPDU(dc, &p2);
return res;
}
void DECL2 _daveConstructUploadNC(PDU *p, char *filename) {
uc pa[260];
memset(pa, 0, sizeof(pa));
pa[0] = 0x1d;
pa[8] = strlen(filename);
memcpy(&pa[9], filename, strlen(filename));
_daveInitPDUheader(p, 1);
_daveAddParam(p, pa, strlen(filename) + 9);
if (daveDebug & daveDebugPDU) {
_daveDumpPDU(p);
}
}
void DECL2 _daveConstructDoUploadNC(PDU *p, uc *uploadID) {
uc pa[] = {0x1e,0,0,0,0,0,0,1};
pa[4] = uploadID[0];
pa[5] = uploadID[1];
pa[6] = uploadID[2];
pa[7] = uploadID[3];
_daveInitPDUheader(p, 1);
_daveAddParam(p, pa, sizeof(pa));
if (daveDebug & daveDebugPDU) {
_daveDumpPDU(p);
}
}
void DECL2 _daveConstructEndUploadNC(PDU * p, uc *uploadID) {
uc pa[] = {0x1f,0,0,0,0,0,0,1};
pa[4] = uploadID[0];
pa[5] = uploadID[1];
pa[6] = uploadID[2];
pa[7] = uploadID[3];
_daveInitPDUheader(p,1);
_daveAddParam(p, pa, sizeof(pa));
if (daveDebug & daveDebugPDU) {
_daveDumpPDU(p);
}
}
unsigned char uploadID[4];
/* Verbindung aufbauen usw. */
res = initUploadNC(dc, "_N_TEST_UPLOAD_MPF", uploadID);
...
Könntest du noch einen Mitschnitt von einem Download einer großen Datei machen, d.h. eine die mehrere PDUs benötigt? Und evtl. auch mal einen fehlerhaften Download erzeugen, wenn das irgendwie möglich ist.
int length = 0;
byte[] buffer = new byte[size];
res = _dc.daveGetNCProgram(filename, buffer, ref length);
protected static extern int daveGetNCProgram64(IntPtr dc, string filename, byte[] buffer, ref int length);
int DECL2 daveGetNCProgram(daveConnection *dc, const char *filename, uc *buffer, int *length) {
int res, len, more, totlen;
unsigned char uploadID[4];
uc *bb=(uc*)buffer;
len=0; totlen=0;
//if (dc->iface->protocol==daveProtoAS511) {
// return daveGetS5ProgramBlock(dc, blockType, number, buffer, length);
//}
res=initUploadNC(dc, filename, uploadID);
if (res!=0) return res;
do {
res=doUploadNC(dc, &more, &bb, &len, uploadID);
totlen+=len;
if (res!=0) return res;
} while (more);
res=endUploadNC(dc, uploadID);
*length=totlen;
return res;}
do{
System.Threading.Thread.Sleep(100);
res = _dc.doUploadNC(out more, buffer, out len, id);
if (res != 0)
{
break;
}
try
{
ret = System.Text.Encoding.Default.GetString(buffer, 0, len); //
lstRetStr.Add(System.Text.Encoding.Default.GetString(buffer, 0, len)); // Siehe Anhang
lstRet.Add(new stTest() { value = System.Text.Encoding.Default.GetString(buffer, 0, len), more = more, len = len }); //
} catch (Exception ex)
{ }
System.Threading.Thread.Sleep(100);}
while (more != 0);
int DECL2 doSingleUploadNC(daveConnection *dc, int *more, uc *buffer, int *len, uc *uploadID){
PDU p1,p2;
int res, netLen;
p1.header = dc->msgOut + dc->PDUstartO;
_daveConstructDoUploadNC(&p1, uploadID);
res=_daveExchange(dc, &p1);
if (daveDebug & daveDebugUpload) {
LOG2("error:%d\n", res);
FLUSH; }
*more = 0;
if (res != daveResOK) return res;
res = _daveSetupReceivedPDU(dc, &p2);
*more = p2.param[1];
if (res != daveResOK) return res;
netLen = p2.data[1] + 256*p2.data[0];
if (netLen > 1024) return -1;
//if (*buffer) {
memcpy(buffer, p2.data+4, netLen);
//*buffer += netLen;
if (daveDebug & daveDebugUpload) {
LOG2("buffer:%p\n",*buffer);
FLUSH; }
//}
*len=netLen;
return res;
}
Am saubersten wäre es aber, dass libnodave eine TPDU von 1024 vorschlägt, wenn er später auch eine 960er S7-PDU übertragen will.
Das ist in der _daveConnectPLCTCP() die Zeile mit:
0xC0,1,0x9,
die 0x9 wäre auf 0xa zu ändern. Du musst aber prüfen ob dann die ganzen internen Puffer auch groß genug sind. Oder du änderst die angeforderte S7-PDU Größe von 960 auf 480 Bytes, dann passt es auch zusammen, und es sollten keine TPDUs fragmentiert werden.
Welche Werte möchtest du denn vergleichen?@Thomas: Bietet Wireshark die Möglichkeit zwei Aufzeichnungen zu vergleichen?
tshark -r C:\meincaputure.pcap -x -Y s7comm > file1hexdump.txt
tshark -r C:\meincapture.pcap -Y cotp -T fields -e data.data
Wie liegt die Datei denn vor welche du downloaden möchtest? Ist das eine Textdatei auf der Festplatte? Und wenn ja, kann deren Inhalt 1:1 Byte/Zeichenweise hochgeladen werden, oder gibt es in der Datei noch eine Art Kopf?@Thomas_v2.1: Kannst du für den NC Programm Download auch noch die dave Funktion anpassen? ("davePutProgramBlock" -> "davePutNCProgram")
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen