Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Libnodave 0.8.5

  1. #1
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe soeben eine neue Version von Libnodave veröffentlicht. Die wesentlichen Neuerungen sind:
    - Routing möglich.
    - Auswahl der Kommunikation (PG-, OP-, S7-Basis-Kommunikation) möglich.
    - Große PDUs können nun über mehrere ISO- oder IBH-Pakete verteilt und wieder zusammengesetzt werden.
    - Hoffentlich ein paar Bugs weniger.
    Zitieren Zitieren Libnodave 0.8.5  

  2. Folgende 14 Benutzer sagen Danke zu Zottel für den nützlichen Beitrag:

    eYe (24.10.2013),JanB1 (25.09.2014),Jochen Kühner (20.10.2013),Joe (24.10.2013),LargoD (19.10.2013),Matze001 (19.10.2013),PN/DP (19.10.2013),Ralle (21.11.2013),Roos (22.11.2013),rostiger Nagel (19.10.2013),StefanK (22.10.2013),viahack (16.11.2013),voni_1 (07.11.2013),Znarf (19.10.2013)

  3. #2
    Registriert seit
    11.12.2009
    Beiträge
    2.113
    Danke
    388
    Erhielt 390 Danke für 271 Beiträge

    Standard

    Das klingt super!

    Ich dachte an Libnodave wird nicht mehr gearbeitet, freut mich zu hören das es doch nicht stimmt.

    Grüße

    Marcel

  4. #3
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Es sind noch ein paar kleine Bugfixes welche in meiner Version schon behoben sind welche noch rein gehören:

    Funktion doUpload, letzte zeile von *len+=netLen; in *len=netLen; ändern

    Kannst schaun, in meiner Version gibts auch noch ein "davePutProgramBlock" vielleicht willst du das ja auch noch einbauen...

    Muss Ich mal schaun wie Ich den stand jetzt wieder mit meinem gleichziehe, da das routing ja anderst gelöst wurde als bei mir (mir gefällt deine Lösung aber besser)...

    falls ich noch fixes finde welche Ich eingebaut hatte, werde Ich sie hier posten...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  5. #4
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Ich hab noch gesehen, Ich hatte die Funktion davTestresultdataMulti umgebaut, die gibts aber jetzt nicht mehr

    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 || p->data[0]==5)
    	{
    		//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;    
    }
    die hatte glaub sonst wenn ein item nicht gefunden wurde ein fehler ausgegeben. Ich hatte es so umgebaut das trotzdem Ok zurück kam, und bei daveUseResult dann der Fehler kam. (es kann ja sein, man liest mehrere Items, und ein paar davon funktionieren und ein paar nicht!) Geht das bei der neuen Version dann auch so?
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  6. #5
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Achso, nochwas. Falls du irgendeine meiner Änderungen noch übernehmen willst, hier sind Sie aufgelistet: https://github.com/jogibear9988/DotN...nodave_patches
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  7. #6
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Es sind noch ein paar kleine Bugfixes welche in meiner Version schon behoben sind welche noch rein gehören:

    Funktion doUpload, letzte zeile von *len+=netLen; in *len=netLen; ändern
    Wenn ich mich noch richtig erinnere ist die Funktion wie folgt:
    Beim Laden eines Blocks, der länger als eine PDU ist, wird die Funktion doUpload mehrfach aufgrufen.
    Ihr wird als Parameter len ein Zeiger auf einen int übergeban, der vor dem 1. Aufruf 0 sein sollte.
    Bei jedem Aufruf addiert nun doUpload die empfangene Teillänge.
    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Kannst schaun, in meiner Version gibts auch noch ein "davePutProgramBlock" vielleicht willst du das ja auch noch einbauen...
    Die Funktionalität gibt es seit jeher in den Testprogrammen testISO_TCPload.c etc. Sie unterscheidet sich jedoch irgenwie zwischen rotokollarten, so daß sie sich nicht auf einfache Weise in eine Bibliotheksfunktion für alle Protokollarten gießen ließe (wenn ich mich richtig erinnere).


    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    falls ich noch fixes finde welche Ich eingebaut hatte, werde Ich sie hier posten...
    Ich würde mich freuen, wenn du als Dot.NET-Experte dir mal die libnodave.net.cs anschauen würdest. Es gab da mal eine Diskussion von Anwendern, die Abstürze beklagten und angebliche memory leaks gefunden und gefixt hatten. Konnte ich aber nicht nachvollziehen. Deren Änderungen sollten aus den Dateien change.cs oder ch.cs im Ordner Dot.NET ersichtlich sein.

  8. #7
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von Zottel Beitrag anzeigen
    Wenn ich mich noch richtig erinnere ist die Funktion wie folgt:
    Beim Laden eines Blocks, der länger als eine PDU ist, wird die Funktion doUpload mehrfach aufgrufen.
    Ihr wird als Parameter len ein Zeiger auf einen int übergeban, der vor dem 1. Aufruf 0 sein sollte.
    Bei jedem Aufruf addiert nun doUpload die empfangene Teillänge.
    Ja, aber das zusammenzählen machst du ausserhalb von doUpload nochmal: totlen+=len; Deshalb darf doupload nur die aktuelle länge zurückgeben!


    Zitat Zitat von Zottel Beitrag anzeigen
    Die Funktionalität gibt es seit jeher in den Testprogrammen testISO_TCPload.c etc. Sie unterscheidet sich jedoch irgenwie zwischen rotokollarten, so daß sie sich nicht auf einfache Weise in eine Bibliotheksfunktion für alle Protokollarten gießen ließe (wenn ich mich richtig erinnere).
    Zwischen was für Protkollen gibts den da unterschiede?

    Ich hab auf jeden Fall eine bei mir eingebaut die bei mir funzt (musste glaub auch noch ein paar kleinigkeiten fixen welche in TestIsoTcpLoad falsch waren).

    Code.
    Code:
    int DECL2 davePutProgramBlock(daveConnection * dc, int blockType, int blknumber, char* buffer, int * length) {
    #define maxPBlockLen 0xDe	// real maximum 222 bytes
    
    	int res=0;
    	int cnt=0;
    	int size=0;
    	int blockNumber,rawLen,netLen,blockCont;
    	int number=0;
    
    	uc pup[]= {			// Load request
    		0x1A,0,1,0,0,0,0,0,9,
    		0x5F,0x30,0x42,0x30,0x30,0x30,0x30,0x34,0x50, // block type code and number
    		//     _    0    B   0     0    0    0    4    P
    		//		SDB		
    		0x0D,
    		0x31,0x30,0x30,0x30,0x32,0x30,0x38,0x30,0x30,0x30,0x31,0x31,0x30,0	// file length and netto length
    		//     1   0     0    0    2    0    8    0    0    0    1    1    0
    	};
    
    	PDU p,p2;
    
    	uc pablock[]= {	// parameters for parts of a block
    		0x1B,0
    	};
    	
    	uc progBlock[maxPBlockLen + 4]= {
    		0,maxPBlockLen,0,0xFB,	// This seems to be a fix prefix for program blocks
    	};
    
    	pup[11] = blockType;
    	paInsert[13] = blockType;
    	/*pup[12] = number / (10*10*10*10);
    	pup[13] = (number - (pup[12] * 10*10*10*10 )) / (10*10*10);
    	pup[14] = (number - (pup[13] * 10*10*10)) / (10*10);
    	pup[15] = (number - (pup[14] * 10*10)) / (10);
    	pup[16] = (number - (pup[15] * 10));
    	
    	pup[12] = pup[12] + 0x30;
    	pup[13] = pup[13] + 0x30;
    	pup[14] = pup[14] + 0x30;
    	pup[15] = pup[15] + 0x30;
    	pup[16] = pup[16] + 0x30;*/
    	
    	memcpy(progBlock+4,buffer,maxPBlockLen);
    
    	progBlock[9] = (blockType + 0x0A - 'A'); //Convert 'A' to 0x0A
    	if (blockType == '8') progBlock[9] = 0x08;
    	
    	progBlock[10] = blknumber / 0x100;
    	progBlock[11] = blknumber - (progBlock[10] * 0x100);
    		
    		
    	rawLen=daveGetU16from(progBlock+14);
    	netLen=daveGetU16from(progBlock+38);
    
    	sprintf((char*)pup+19,"1%06d%06d",rawLen,netLen);
    
    	sprintf((char*)pup+12,"%05d",blknumber);
    	sprintf((char*)paInsert+14,"%05d",blknumber);
    	
    	pup[17]='P';
    	paInsert[19]='P';
    	
    	p.header=dc->msgOut+dc->PDUstartO;
    	_daveInitPDUheader(&p, 1);
    	_daveAddParam(&p, pup, sizeof(pup)-1);
    
    	res=_daveExchange(dc, &p);
    	if (res==daveResOK) {
    		res=_daveSetupReceivedPDU(dc, &p2);
    		if (daveGetDebug() & daveDebugPDU) {
    			_daveDumpPDU(&p2);
    		}
    		res=daveGetPDUerror(&p2);
    
    		if (res==0) {
    			blockCont=1;
    			res=daveGetResponse(dc);
    			res=_daveSetupReceivedPDU(dc, &p2);
    
    			cnt = 0;
    
    			do {
    				res=0;
    				res=_daveSetupReceivedPDU(dc, &p2);
    
    				number=((PDUHeader*)p2.header)->number;
    				if (p2.param[0]==0x1B) {
    					//READFILE
    					memcpy(progBlock+4,buffer+(cnt*maxPBlockLen),maxPBlockLen);
    					
    					if (cnt == 0)
    					{
    						progBlock[9] = (blockType + 0x0A - 'A'); //Convert 'A' to 0x0A
    						if (blockType == '8') progBlock[9] = 0x08;
    	
    						progBlock[10] = blknumber / 0x100;
    						progBlock[11] = blknumber - (progBlock[10] * 0x100);						
    					}
    
    					p.header=dc->msgOut+dc->PDUstartO;
    					_daveInitPDUheader(&p, 3);
    					size = maxPBlockLen;
    
    					if (*length > ((cnt+1) * maxPBlockLen))  
    						pablock[1]=1;
    					else
    					{
    						size = *length - (cnt * maxPBlockLen);
    						pablock[1]=0;	//last block
    						blockCont=0;
    					}
    					   
    					progBlock[1]=size;
    					_daveAddParam(&p, pablock, sizeof(pablock));
    					_daveAddData(&p, progBlock, size + 4 /* size of block) */);
    					((PDUHeader*)p.header)->number=number;
    					if (daveGetDebug() & daveDebugPDU) {
    						_daveDumpPDU(&p);
    					}
    					_daveExchange(dc,&p);
    				}
    				cnt++;
    			} while (blockCont);  
    
    			res=_daveSetupReceivedPDU(dc, &p2);
    			if (daveGetDebug() & daveDebugPDU) {
    				_daveDumpPDU(&p2);
    			}
    			number=((PDUHeader*)p2.header)->number;
    			if (p2.param[0]==0x1C) {
    				p.header=dc->msgOut+dc->PDUstartO;
    
    				_daveInitPDUheader(&p, 3);
    				_daveAddParam(&p, p2.param,1);
    				((PDUHeader*)p.header)->number=number;
    				_daveExchange(dc,&p);
    
    				p.header=dc->msgOut+dc->PDUstartO;
    				_daveInitPDUheader(&p, 1);
    				_daveAddParam(&p, paInsert, sizeof(paInsert));
    				res=_daveExchange(dc, &p);
    				res=_daveSetupReceivedPDU(dc, &p2);
    				res=daveGetPDUerror(&p2);
    			}
    		} else {
    			printf("CPU doesn't accept load request:%04X\n",res);
    		}	
    		return res;
    	}
    	return res;
    }
    Zitat Zitat von Zottel Beitrag anzeigen
    Ich würde mich freuen, wenn du als Dot.NET-Experte dir mal die libnodave.net.cs anschauen würdest. Es gab da mal eine Diskussion von Anwendern, die Abstürze beklagten und angebliche memory leaks gefunden und gefixt hatten. Konnte ich aber nicht nachvollziehen. Deren Änderungen sollten aus den Dateien change.cs oder ch.cs im Ordner Dot.NET ersichtlich sein.
    Ich wüsste jetzt nicht das es da Probleme mit memleaks gab/gibt... Aber die sieht bei mir ja ganz anderst aus, da Ich da 32/64 Bit verzweigungen und auch mappings für monotouch eingebaut habe...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  9. #8
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Was in CSharp noch falsch sein könnte ist die Freigabe von den unmanged Resourcen im Destruktor. Ich denke da sollte eher IDisposable implementiert werden... Und das Dispose dann von der Finalize Methode aufgerufen werden...

    http://msdn.microsoft.com/de-de/libr...v=vs.100).aspx
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  10. #9
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Ja, aber das zusammenzählen machst du ausserhalb von doUpload nochmal: totlen+=len; Deshalb darf doupload nur die aktuelle länge zurückgeben!


    Wo? Ich habe jetzt mal in testMPI.C und testISO_TCP.c geschaut und dort steht:

    if (0==initUpload(dc, blockType, dbe[i].number, &uploadID)) {
    do {
    doUpload(dc,&more,&bb,&len,uploadID);
    } while (more);

  11. #10
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    nodave.c

    Code:
    int DECL2 daveGetProgramBlock(daveConnection * dc, int blockType, int number, char* buffer, int * length) {
        int res, uploadID, len, more, totlen;
        uc *bb=(uc*)buffer;	//cs: is this right?
        len=0;
        totlen=0;
        if (dc->iface->protocol==daveProtoAS511) {	    
    	return daveGetS5ProgramBlock(dc, blockType, number, buffer, length);
        }
        
        res=initUpload(dc, blockType, number, &uploadID); 
        if (res!=0) return res;
        do {
    	res=doUpload(dc,&more,&bb,&len,uploadID);
    	totlen+=len;
    	if (res!=0) return res;
        } while (more);
        res=endUpload(dc,uploadID);
        *length=totlen;
        return res;
    }
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 09.09.2010, 00:27
  2. ÄÖnderungen am libnodave.net.cs File von libnodave
    Von Jochen Kühner im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 12.05.2010, 16:56
  3. LibNoDave unter VB.Net ohne libnodave.net.dll
    Von Earny im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 09.03.2010, 18:57
  4. libnodave: Woher kommt die "libnodave.net.dll"?
    Von Thomas_v2.1 im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 10.11.2008, 12:07
  5. Libnodave S5
    Von Praseodym im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.02.2007, 09:57

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •