NoDave Infos...

Jochen Kühner

Level-3
Beiträge
4.291
Reaktionspunkte
525
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte mit LibNoDave eine Anlage visualisieren, nun wollte Ich wissen wieviele Bytes von der SPS in einem Request übertragen werden! Und auch wie Ich 2 o. 3 Anfragen wenn sie nur ein paar bytes brauchen in einer Zusammenfassen kann! Gibts da Infos?
 
Ich möchte mit LibNoDave eine Anlage visualisieren, nun wollte Ich wissen wieviele Bytes von der SPS in einem Request übertragen werden! Und auch wie Ich 2 o. 3 Anfragen wenn sie nur ein paar bytes brauchen in einer Zusammenfassen kann! Gibts da Infos?
doc/daveReadBytes.html schrieb:
A typical PDU size is 240 bytes, limiting read calls to 222 bytes result length.
Die tatsächliche PDU-Länge hängt von der CPU und dem Übertragungsweg (MPI-Adapter, Ethernet-CP...)ab.
ein Beispiel, wie sich mehrere Variablen mit einer Anfrage lesen lassen, findest du in testMPI.c:
Code:
if(doMultiple) {
        printf("Now testing read multiple variables.\n"
        "This will read 1 Byte from inputs,\n"
        "4 bytes from flags, 2 bytes from DB6\n"
        " and other 2 bytes from flags\n");
        wait();
        davePrepareReadRequest(dc, &p);
        daveAddVarToReadRequest(&p,daveInputs,0,0,1);
        daveAddVarToReadRequest(&p,daveFlags,0,0,4);
        daveAddVarToReadRequest(&p,daveDB,6,20,2);
        daveAddVarToReadRequest(&p,daveFlags,0,12,2);
        daveAddBitVarToReadRequest(&p, daveFlags, 0, 25 /* 25 is 3.1*/, 1);
        res=daveExecReadRequest(dc, &p, &rs);
        
        printf("Input Byte 0 ");
        res=daveUseResult(dc, &rs, 0); // first result
        if (res==0) {
            a=daveGetU8(dc);
            printf("%d\n",a);
        } else 
        printf("*** Error: %s\n",daveStrerror(res));
        
        printf("Flag DWord 0 ");    
        res=daveUseResult(dc, &rs, 1); // 2nd result
        if (res==0) {
        a=daveGetS16(dc);
            printf("%d\n",a);
        } else 
        printf("*** Error: %s\n",daveStrerror(res));
        
        printf("DB 6 Word 20: ");    
        res=daveUseResult(dc, &rs, 2); // 3rd result
        if (res==0) {
        a=daveGetS16(dc);
            printf("%d\n",a);
        } else 
        printf("*** Error: %s\n",daveStrerror(res));
        
        printf("Flag Word 12: ");        
        res=daveUseResult(dc, &rs, 3); // 4th result
        if (res==0) {
        a=daveGetU16(dc);
            printf("%d\n",a);
        } else 
        printf("*** Error: %s\n",daveStrerror(res));    
        
        printf("Flag F3.1: ");        
        res=daveUseResult(dc, &rs, 4); // 4th result
        if (res==0) {
        a=daveGetU8(dc);
            printf("%d\n",a);
        } else 
        printf("*** Error: %s\n",daveStrerror(res));        
        
        printf("non existing result (we read 5 items, but try to use a 6th one): ");
        res=daveUseResult(dc, &rs, 5); // 5th result
        if (res==0) {
        a=daveGetU16(dc);
            printf("%d\n",a);
        } else 
        printf("*** Error: %s\n",daveStrerror(res));        
        
        daveFreeResults(&rs);  
}
Wie es beim Schreiben geht, folgt gleich dahinter.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Otimierung???

Optimiert LibNoDave einen solchen multiplen read request? wenn ich verschiedene bereiche aus einem db lese, das es automatisch einen großen bereich draus macht?
Und wenn die anfrage zu groß wird, wird sie dan automtisch auf mehrere gesplittet?
Oder muss Ich das selbst realisieren?
 
Versuch macht schlau:
Ich würde einfach mal versuchen, den kompletten DB am Stück einzulesen.

Die Welt ist doch digital: es geht oder es geht nicht!
 
Optimiert LibNoDave einen solchen multiplen read request? wenn ich verschiedene bereiche aus einem db lese, das es automatisch einen großen bereich draus macht?
Und wenn die anfrage zu groß wird, wird sie dan automtisch auf mehrere gesplittet?
Oder muss Ich das selbst realisieren?
Libnodave enthält keine Funktion, um die Größe der wahrscheinlichen (im Fehlerfall ist sie kleiner) Antwort-PDU auf einen multiple read request zu berechnen. Das schien mir einfach nicht nötig. Ferner kannst du auch beliebig weitere Variablen an die Anfrage anhängen, so daß sie nicht einmal mehr versendet werden kann. Ich habe nicht ausprobiert was dann passiert. Bei "multiple read" bist du selbst verantwortlich!

Was argv_usr anspricht, das Lesen eines ZUSAMMENHÄNGENDEN Datenblocks (z.B. DB, können aber auch Merker sein, wenn genug vorhanden) ist KEIN Fall für multiple read. daveReadBytes schickt die Anfrage an die CPU und überläßt es ihr, ob sie Antwort gibt oder Fehler meldet. Es gibt aber die "Komfort"-Funktionen daveReadManyBytes
und daveWriteManyBytes, die zerlegen die Anfrage und setzen die Anworten auch wieder zu einem Block zusammen.
Nachteil: Wenn du ein Byte mehr liest als in die Antwort_PDU paßt, macht es 2 Anfragen daraus, deine Kommunikation ist nur halb so schnell und du merkst es nicht.
Aber vielleicht möchtest du lieber das Datenvolumen verringern, z.B. im DB einen DINT gegen INT tauschen oder reserviertes Feld aus einem UDT schmeißen.
 
Zurück
Oben