TwinCat dyn. ändern der Profibus Slave Adresse

msauerpb

Level-2
Beiträge
207
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich muss in meinem TwinCat Projekt zur Laufzeit (änderung über HMI) die Profibus Slave Adresse meiner EL6731-0010 ändern können. Dazu habe ich folgende Code geschrieben:

Code:
// I----------------------------------------------------------------------------
// I                    Schreiben der Profibus Slave Adresse 
// I----------------------------------------------------------------------------
_WriteSlaveAdr                      := FALSE;
_ExecuteEc                          := FALSE;


IF (stPERS.SET_FIELDBUS.PbSlaveAdr <> _PbSlaveAdr) THEN
    _WriteSlaveAdr                  := FALSE; // TRUE;
    _PbSlaveAdr                     := stPERS.SET_FIELDBUS.PbSlaveAdr;
    _State                          := 10;
END_IF


CASE _State OF
    0: ;
   
    10:
        _WriteSlaveAdr              := TRUE;
        _NextState                  := 20;
    
    20:
        _WriteSlaveAdr              := FALSE;
        _NextState                  := 30;
        
    30: 
        _ExecuteEc                  := TRUE;
        _StateEc                    := EC_DEVICE_STATE_INIT;
        _WriteSlaveAdr              := FALSE;
        _NextState                  := 40;
    
    40:
        _ExecuteEc                  := FALSE;
        IF (_BusyEc) THEN
            _NextState              := 40;
        ELSE
            _NextState              := 50;
        END_IF


    50:
        _ExecuteEc                  := TRUE;
        _StateEc                    := EC_DEVICE_STATE_OP;
        _NextState                  := 60;
    
    60:
        _ExecuteEc                  := FALSE;
        IF (_BusyEc) THEN
            _NextState              := 60;
        ELSE
            _NextState              := 0;
        END_IF


ELSE
    _NextState                      := 0;
END_CASE


_fbEcSetSlaveState  (sNetId     := EcMaster_AdsAdres.sNetId,
                     nSlaveAddr := EL6731_0010.SlaveAddr.port,
                     bExecute   := _ExecuteEc,
                     tTimeOut   := T#10S,
                     reqState   := _StateEc,
                     bBusy      => _BusyEc,
                     bError     => _ErrorEc,
                     nErrId     => _ErrorIdEc,
                     currState  => );
                     


_DataPbAdressWrite[2]               := stPERS.SET_FIELDBUS.PbSlaveAdr;
// ADSWRITE mit NETID=NetId der EL6731-0010, PPORT=200, IDXGRP=16#F480, IDXOFFS=0, LEN=4,DATA[0]=16#45,DATA[1]=16#23,DATA[2]=Stationsadresse,DATA[3]=0, wird von der aktuellen Version V00.75 unterstützt
_fbPbAdressWrite(   NETID   := EL6731_0010_AdsAdres.sNetId,
                    PORT    := 200,
                    IDXGRP  := 16#F480,
                    IDXOFFS := 0,
                    LEN     := SIZEOF(_DataPbAdressWrite),
                    SRCADDR := ADR(_DataPbAdressWrite),
                    WRITE   := _WriteSlaveAdr,
                    TMOUT   := T#20S,
                    ERR     => _ErrorWriteSlaveAdr,
                    ERRID   => _ErrorIdWriteSlaveAdr);


_State                              := _NextState;

Ich kann feststellen, dass im CoE Interface die neue Slave Adresse angezeigt wird und auch so übernommen ist. Allerdings bekomme ich einen TimeOut von dem ADS Write Baustein.
Mache ich da in der Reihenfolge beim schreiben noch etwas falsch?

Danke für Eure Hilfe.
gruss
martin
 
Du tackerst da wie ein Weltrekordler durch deine Schrittkette. In jedem Zyklus geht es weiter.
Die CoE bzw. ADS-Bausteine brauchen aber etwas Zeit (deshalb haben sie ja auch einen Timeout - auch wenn 20 Sek so gross sind wie ich es nie sehe).

Ich könnte mir also gut vorstellen der Aufruf von _fbEcSetSlaveStatei die Ursache ist.
=> Schau das du erst nach erfolgreichem Abschluss der/des Bausteins in der Schrittkette weitergehst. Sinnvollwerweise fragt man auch noch ab ob der Aufruf erfolgreich war :-)

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mir jetzt nochmal die Definition des FB ADSWRITE angeschaut und übersehen, dass der ja auch ein Busy Flag hat. Nachdem ich in meinem State 20 die Abfrage dieses Busy Flags eingefügt hatte und erst weitergehe, wenn Busy false ist, bekomme ich auch keinen TimeOut Fehler mehr.

Danke für den Tip.

gruss
martin
 
Zurück
Oben