LibNodave und Multiple Read (mit nicht existierenden Elementen)

Jochen Kühner

Level-3
Beiträge
4.291
Reaktionspunkte
525
Zuviel Werbung?
-> Hier kostenlos registrieren
Der multiple Read bei LibNoDave von der PLC funktioniert bei mir. Er funktioniert auch wenn ich Elemente lese die gar nicht existieren, dann bekomme Ich bei UseResult 10 als Wert! Nur wenn ich als erstes einen Wert lese den es nicht gibt, dann klappts nicht!
Ist das ein Bug oder mach Ich was falsch.

Bin grad schon am drann wursteln, kriegs bestimmt auch irgendwie hin, aber vielleicht hat ja jemand in der Richtung schon mal was gemacht...

Mfg.
 
Habs gelöst bekommen:

Habe folgende 2 funktionen definiert:

Code:
int DECL2 _daveTestResultDataMulti(PDU * p) {	
	int res; /*=daveResCannotEvaluatePDU;*/
	if ((p->data[0]==255)&&(p->dlen>4))
	{
		res=daveResOK;
		p->udata=p->data+4;
		p->udlen=p->data[2]*0x100+p->data[3];
		if (p->data[1]==4) {
			p->udlen>>=3;	/* len is in bits, adjust */
		} else if (p->data[1]==9) {
			/* len is already in bytes, ok */
		} else if (p->data[1]==3) {
			/* len is in bits, but there is a byte per result bit, ok */
		} else {
			if (daveDebug & daveDebugPDU)
				LOG2("fixme: what to do with data type %d?\n",p->data[1]);
			res = daveResUnknownDataUnitSize;
			//res = 0;
		}	    
	}
	else if (p->data[0]==10)
	{
		//This Section returns ok, even if nothing was read,
		//because with the multiple read we get the error in (daveUseResult)
		res = daveResOK;		
	}
	else {
		res=p->data[0];
	}
	return res;    
}

int DECL2 _daveTestReadResultMulti(PDU * p) {
	if (daveDebug & daveDebugPDU)
		LOG2("dave test result: p-param[0]: %d\n",p->param[0]);
	if (p->param[0]!=daveFuncRead) return daveResUnexpectedFunc;
	return _daveTestResultDataMulti(p);
}

und dann in daveexecreadrequest die _daveTestReadResultMulti aufgerufen und nicht die _daveTestReadResult.

Es geht auch wenn man

Code:
else if (p->data[0]==10)
	{
		//This Section returns ok, even if nothing was read,
		//because with the multiple read we get the error in (daveUseResult)
		res = daveResOK;		
	}

in die normale _daveTestResultData einfügt, aber dann liefert ein einfacher read request auf eine nicht existierende plc variable nicht mehr den richtigen fehler!
 
Zurück
Oben