Mit libnodave FCs in S7-315 übertragen

Mibra

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
ich beschäftige mich seit kurzem mit libnodave und komme mit den Funktionen ganz gut zurecht. Ich gerne FCs auf die CPU schreiben.
Ich hab in der Doku dazu nichts gefunden. Jedoch hab ich hier im Forum schon öfters davon gelesen.

Ist es überhaupt möglich mit Libnodave FCs in die CPU zu schreiben?

Und wenn ja, wie bzw. wo in Libnodave finde ich ein Beispiel oder eine Erklärung?

Danke schonmal im Vorraus

MfG
 
Jo...

In libnodave gibt es ein Beispielprogramm "testmpiload", welches genau diesen zweck erfüllen sollte!

Ich hab diese Funktion auch mal in meine gänderte libnodave eingebaut, jedoch nie in meine Connection Lib, da Ich bisher nicht zum testen gekommen bin!

So hab Ichs drinn, keine garantie obs funzt:

Code:
int DECL2 davePutProgramBlock(daveConnection * dc, int blockType, int number, 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;

    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
    };

    memcpy(progBlock+4,buffer,maxPBlockLen);

    rawLen=daveGetU16from(progBlock+14);
    netLen=daveGetU16from(progBlock+38);

    pup[17]='P';
    paInsert[19]='P';
    sprintf((char*)pup+19,"1%06d%06d",rawLen,netLen);

    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);

                    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;
                    }
                    //if (res==maxPBlockLen) pablock[1]=1;    //more blocks
                    //else {
                    //    pablock[1]=0;    //last block
                    //    blockCont=0;
                    //}    
                    progBlock[1]=res;
                    _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);
                }    
            } 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;
}
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Jochen für die schnelle Antwort!

Ich werde mir sobald ich Zeit habe deinen Code mal genauer anschaun.
Ich dachte immer, dass mit "Programblock" ein OB gemeint ist und kein FB.
Aber scheinbar geht beides.

Was ich nicht gefunden habe ist wie kann ich eine AWL Funktion in die S7 übertragen?
Bzw. wie und wo übergibt man in "testMPIload" die Bausteinnummer und -inhalt?

Ich möchte z.B.: eine AWL-Funktion mit folgendem Inhalt:

Code:
AUF   DB320
AUF   DI 11
U     DIX 10.0
=     DBX. 0.2

Danke schonmal im Vorraus.
 
Danke Jochen für die schnelle Antwort!

Ich werde mir sobald ich Zeit habe deinen Code mal genauer anschaun.
Ich dachte immer, dass mit "Programblock" ein OB gemeint ist und kein FB.
Aber scheinbar geht beides.

Was ich nicht gefunden habe ist wie kann ich eine AWL Funktion in die S7 übertragen?
Bzw. wie und wo übergibt man in "testMPIload" die Bausteinnummer und -inhalt?

Ich möchte z.B.: eine AWL-Funktion mit folgendem Inhalt:

Code:
AUF   DB320
AUF   DI 11
U     DIX 10.0
=     DBX. 0.2

Danke schonmal im Vorraus.

Du musst den AWL Code erst mal in MC7 Code umwandeln. Das macht libnodave nicht!!!

Ich hab das mal angefangen in meiner Lib zu realisieren, das ist aber noch lang nicht fertig! Nur der WEG MC7->AWL ist fertig, der bringt dir jedoch nichts!
 
Hi,
ok, "MC7-Code" sagt mir nichts.
Kannst du evtl hier ein paar links zu dem Thema posten, dann
kann ich mir des mal genauer anschaun.

MfG und danke!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ok, "MC7-Code" sagt mir nichts.
Kannst du evtl hier ein paar links zu dem Thema posten, dann
kann ich mir des mal genauer anschaun.

MfG und danke!

Die AWL Anweisungen werden in HEX-Code übersetzt, wobei jede Anweisung einen bestimmten COde hat. Mehr Infos gibts hier: http://www.sps-forum.de/showthread.php?t=27703

Wie gesagt, Bausteine von der CPU laden, und wieder in AWL Code übersetzten kannst du mit meiner Bibliothek machen (http://siemensplctoolboxlib.codeplex.com/) aber anderstrum ists noch nicht drinn! (Nur angefangen).
 
Zurück
Oben