FB_SoEAX5000FirmwareUpdate

FB_SoEAX5000FirmwareUpdate 1:

Mit dem Funktionsbaustein FB_SoEAX5000FirmwareUpdate kann die Firmware des AX5000 überprüft und automatisch auf eine bestimme Version (Revision und Build) oder auf das aktuellste Build der konfigurierten Revision geändert werden.  

Zum Updaten wird:
- der konfigurierte Slave-Typ ermittelt, z.B. AX5103-0000-0010
- der aktuelle Slave mit der vorgegebenen Slaveadresse ermittelt, z.B. AX5103-0000-0009
- die aktuelle Slavefirmware ermittelt, z.B. v1.05_b0009
- ein Vergleich der Konfiguration und des gefundenen Slaves, auf Anzahl der Kanäle, Strom, Revision, Firmware ausgeführt
- der Name des erforderlichen Firmware-Files ermittelt und die Datei gesucht
- der Firmwareupdate (falls erforderlich) ausfgefürt
- der aktuelle Slave mit der vorgegebenen Slaveadresse erneut ermittelt
- der Slave in den vorgegebenen EtherCAT-State geschaltet

Ein erfolgreicher Update endet mit eFwUpdateState = eFwU_FwUpdateDone, ist der Update nicht erforderlich, wird diese über eFwUpdateState = eFwU_NoFwUpdateRequired signalisiert. Der Firmwareupdate erfolgt über den angegeben Kanal (A=0 oder B=1) aus der stDriveRef. Bei zweikanaligen Geräten kann nur einer der beiden Kanäle hierfür verwendet werden. Der andere Kanal signalisiert das über deneFwUpdateState = eFwU_UpdateViaOtherChannelActive bzw. = eFwU_UpdateViaOtherChannel.

Während des Firmwareupdates (eFwUpdateState = eFwU_FwUpdateInProgress) signalisiertiLoadProgress den Fortschritt in Prozent.

Hinweis

Fehlerhaftes Update durch Unterbrechungen

Unterbrechungen während des Updates können dazu führen, dass dieses nicht oder fehlerhaft ausgeführt wird. Die Klemme kann danach ohne die passende Firmware möglicherweise nicht mehr verwendet werden.

Während des Updates gilt:

  • Die SPS und TwinCAT dürfen nicht gestoppt werden.
  • Die EtherCAT-Verbindung darf nicht unterbrochen werden.
  • Der AX5000 darf nicht ausgeschaltet werden.

VAR_INPUT

VAR_INPUT
   sNetId           : T_AmsNetId;
   bExecute         : BOOL;    
   sFirmwareVersion : STRING(20);  (* version string vx.yy_bnnnn, e.g. "v1.05_b0009" for v1.05 Build 0009 *)
   sFirmwarePath    : T_MaxString; (* drive:\path, e.g. "C:\TwinCAT\Io\TcDriveManager\FirmwarePool" *)
   iReqEcState      : UINT := EC_DEVICE_STATE_OP;
   tTimeout         : TIME := DEFAULT_ADS_TIMEOUT;
END_VAR

sNetId: AMS-NetID der Steuerung (IPC).

bExecute: Über eine positive Flanke an diesem Eingang wird der Baustein aktiviert.

sFirmwareVersion: Gibt die gewünschte Firmware-Version in Form von vx.yy_bnnnn an, z.B. "v1.05_b0009" für Version v1.05 Build 0009.

    Release-Builds:
        "v1.05_b0009"     für ein spezifisches Build, zum Beispiel v1.05 Build 0009
        "v1.05_b00??"     aktuellstes Build einer vorgegebenen Version, zum Beispiel v1.05
        "v1.??_b00??"     aktuellstes Build einer vorgegebenen Hauptversion, zum Beispiel v1
        "v?.??_b00??"     aktuellstes Build der aktuellsten Version
        ""                              aktuellstes Build der aktuellsten Version

    Kundenspezifische Firmware-Builds:
        "v1.05_b1009"     für ein spezifisches Build, zum Beispiel v1.05 Build 0009
        "v1.05_b10??"     aktuellstes Build einer vorgegebenen Version, zum Beispiel v1.05
        "v1.??_b10??"     aktuellstes Build einer vorgegebenen Hauptversion, zum Beispiel v1
        "v?.??_b10??"     aktuellstes Build der aktuellsten Version

        ...

        "v1.05_b8909"     für ein spezifisches Build, zum Beispiel v1.05 Build 8909
        "v1.05_b89??"     aktuellstes Build einer vorgegebenen Version, zum Beispiel v1.05
        "v1.??_b89??"     aktuellstes Build einer vorgegebenen Hauptversion, zum Beispiel v1
        "v?.??_b89??"     aktuellstes Build der aktuellsten Version


    Debug-Builds:
        "v1.05_b9009"     für ein spezifisches Build, zum Beispiel v1.05 Build 9009
        "v1.05_b90??"     aktuellstes Build einer vorgegebenen Version, zum Beispiel v1.05
        "v1.??_b90??"     aktuellstes Build einer vorgegebenen Hauptversion, zum Beispiel v1
        "v?.??_b90??"     aktuellstes Build der aktuellsten Version
 

sFirmwarePath: Gibt den Pfad für den Firmwarepool an, in dem sich die Firmware-Dateien befinden, z.B. "C:\TwinCAT\Io\TcDriveManager\FirmwarePool".

iReqEcState: Gewünschter EtherCAT-State nach dem Update (nur wenn tatsächlich ein Update ausgeführt wird). Die States sind in der TcEtherCAT.lib als globale Konstanten definiert.

tTimeout: Da der Firmwareupdate bei großen EtherCAT-Netzwerken länger dauern kann, wird hier nur der Timeout für einzelne interne ADS-Instanzen vorgegeben.

VAR_IN_OUT

VAR_IN_OUT
    Axis : NCTOPLC_AXLESTRUCT;(* reference to NC axis *)
END_VAR

Axis: Achsstruktur.

VAR_OUTPUT

VAR_OUTPUT
   bBusy                 : BOOL;
   bError                : BOOL;
   iAdsErrId             : UINT;
   iSercosErrId          : UINT;
   iDiagNumber           : UDINT;
   eFwUpdateState        : E_FwUpdateState;
   iLoadProgress         : INT;
   sSelectedFirmwareFile : STRING(MAX_STRING_LENGTH); (* found firmware file, e.g. "AX5yxx_xxxx_-0010_v1_05_b0009.efw" *)
END_VAR

bBusy: Dieser Ausgang wird bei der Aktivierung des Funktionsbausteins gesetzt und bleibt gesetzt, bis eine Rückmeldung erfolgt.

bError: Dieser Ausgang wird, nachdem der bBusy-Ausgang zurückgesetzt wurde, gesetzt, sollte ein Fehler bei der Übertragung des Kommandos erfolgen.

iAdsErrId: Liefert bei gesetztem bError-Ausgang den ADS-Fehlercode des zuletzt ausgeführten Befehles

iSercosErrId: Liefert bei gesetztem bError-Ausgang den Sercos-Fehler des zuletzt ausgeführten Befehles

iDiagNumber: Liefert bei gesetztem bError-Ausgang den Antriebsfehler des letzten Firmware-Updates

eFwUpdateState: Liefert den Status der Firmware-Updates. Siehe E_FwUpdateState.

iLoadProgress: Liefert den Fortschritt des eigentlichen Firmware-Update in Prozent.

sSelectedFirmwareFile: Zeigt den Namen der gesuchten Firmware-Datei an.

Beispiel

VAR CONSTANT
   iNumOfDrives         : INT := 2;
END_VAR

VAR
    fbFirmwareUpdate     : ARRAY[1..iNumOfDrives] OF FB_SoEAX5000FirmwareUpdate;
    stNcToPlc AT %I*     : ARRAY[1..iNumOfDrives] OF NCTOPLC_AXLESTRUCT;
    sFirmwareVersion     : ARRAY[1..iNumOfDrives] OF STRING(20)(* := 2('v1.04_b0002')*);
    eFwUpdateState       : ARRAY[1..iNumOfDrives] OF E_FwUpdateState;
    sSelectedFirmwareFile: ARRAY[1..iNumOfDrives]OF STRING(MAX_STRING_LENGTH);

    iUpdateState         : INT;
    bExecute             : BOOL;
    sNetIdIPC            : T_AmsNetId := '';
    sFirmwarePath        : T_MaxString := 'C:\TwinCAT\Io\TcDriveManager\FirmwarePool';

    I                    : INT;
    bAnyBusy             : BOOL;
    bAnyError            : BOOL;
END_VAR
CASE iUpdateState OF

0:
    IF bExecute THEN
        iUpdateState := 1;
    END_IF

1:
    FOR I := 1 TO iNumOfDrives DO
       fbFirmwareUpdate[I](
           Axis := stNcToPlc[I],
           bExecute := TRUE,
           tTimeout := T#15s,
           sFirmwareVersion := sFirmwareVersion[I],
           sFirmwarePath := sFirmwarePath,
           sNetId := sNetIdIPC,
           iReqEcState := EC_DEVICE_STATE_OP,
           eFwUpdateState => eFwUpdateState[I],
        );
    END_FOR
    iUpdateState := 2;

2:
    bAnyBusy := FALSE;
    bAnyError:= FALSE;
    FOR I := 1 TO iNumOfDrives DO
       fbFirmwareUpdate[I](
           Axis := stNcToPlc[I],
           eFwUpdateState => eFwUpdateState[I],
           sSelectedFirmwareFile => sSelectedFirmwareFile[I],
        );
        IF NOT fbFirmwareUpdate[I].bBusy THEN
           fbFirmwareUpdate[I](bExecute := FALSE, Axis := stNcToPlc[I]);
           IF fbFirmwareUpdate[I].bError THEN
               bAnyError := TRUE;
           END_IF
        ELSE
           bAnyBusy := TRUE;
        END_IF
    END_FOR

    IF NOT bAnyBusy THEN
        bExecute := FALSE;

        IF NOT bAnyError THEN
           iUpdateState := 0; (* OK *)
        ELSE
           iUpdateState := 3; (* Error *)
        END_IF
    END_IF
3:
    (* Error handling *)
    iUpdateState := 0;

END_CASE