@Zottel
Danke für deinen Hinweis, das sehe ich mir mal an.
Eine Frage noch zum Verständnis. Heißt das, daß je nachdem, ob ich s7 (TCP/IP, MPI, s7Online) oder s5 (AS511) einsetze wird die Funktion daveReadBytes innerhalb der libnodavedll anders abgearbeitet? Einmal kann ich einen Pointer auf den Buffer übergeben und bekomme auch Wert da hinein (s7) und bei S5 wird geht das so nicht?
Bei allen S7-Protokollen wird die gleiche Funktion abgearbeitet. Nur wenn das Protokoll AS511 ist, wird zu einer anderen Funktion verzweigt:
Der (vereinfachte*) Code:
{code]
int daveReadBytes(daveConnection * dc,int area, int DBnum, int start,int len, void * buffer){
PDU p1,p2;
int res;
if (protocol==daveProtoAS511) {
return daveReadS5Bytes(dc, area, DBnum, start, len/*, buffer*/);
}
/* Hier ist der Fehler, daß unmittelbar nach Aufruf von
daveReadS5Bytes()
ein return erfolgt. Deswegen wird der Code zum Kopieren des Puffers
nie erreicht.
*/
...
davePrepareReadRequest(dc, &p1);
daveAddVarToReadRequest(&p1, area, DBnum, start, len);
res=_daveExchange(dc, &p1);
res=_daveSetupReceivedPDU(dc, &p2);
res,daveStrerror(res));
res=_daveTestReadResult(&p2);
res,daveStrerror(res));
/*
copy to user buffer and setup internal buffer pointers:
*/
if (buffer!=NULL) memcpy(buffer,p2.udata,p2.udlen);
{/code]
* ohne Debug-Ausgabe und Fehlerbehandlung
Bei den verschiedenen (Transport)-Protokollen der S7-Kommunikation wird halt immer dieselbe PDU erzeugt und dann über den Funktionszeiger
_daveExchange auf verschiedene Weise gegen eine Antwort "eingetauscht".
Die S5-Kommunikation ist völlig anders. Sie ist halt per if-Entscheidung eingebunden, den Unterschied für den Benuzer zu "verbergen".
Richtig wäre (nicht getestet):
{code]
if (protocol==daveProtoAS511) {
res=daveReadS5Bytes(dc, area, DBnum, start, len/*, buffer*/);
if (buffer!=NULL) memcpy(buffer, dc->msgIn+5,len);
return res;
}
{/code]