FB_SoEAX5000FirmwareUpdate_ByDriveRef

FB_SoEAX5000FirmwareUpdate_ByDriveRef 1:

Mit dem Funktionsbaustein FB_SoEAX5000FirmwareUpdate_ByDriveRef 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.

Während des Updates dürfen die SPS und TwinCAT nicht gestoppt, die EtherCAT-Verbindung nicht unterbrochen und der AX5000 nicht ausgeschaltet werden!

VAR_INPUT

VAR_INPUT
   stDriveRef       : ST_DriveRef; 
   bExecute         : BOOL;    
   tTimeout         : TIME := DEFAULT_ADS_TIMEOUT;
   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" *)
   sNetIdIPC        : T_AmsNetId;
   iReqEcState      : UINT := EC_DEVICE_STATE_OP;
END_VAR

stDriveRef: Die Referenz auf den Antrieb kann im System Manager direkt in die SPS gelinkt werden. Hierzu muss eine Instanz der ST_PlcDriveRef verwendet werden und die NetID vom Bytearray in einen String konvertiert werden. Siehe ST_DriveRef.

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

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.

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".

sNetIdIPC: AMS-NetID der Steuerung (IPC).

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.

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
   bInit                : ARRAY[1..iNumOfDrives] OF BOOL := 2(TRUE);
   fbFirmwareUpdate     : ARRAY[1..iNumOfDrives] OF FB_SoEAX5000FirmwareUpdate_ByDriveRef;
    stPlcDriveRef AT %I* : ARRAY[1..iNumOfDrives] OF ST_PlcDriveRef;
   stDriveRef            : ARRAY[1..iNumOfDrives] OF ST_DriveRef;

    sFirmwareVersion     : ARRAY[1..iNumOfDrives] OF STRING(20) := 2('v1.05_b0009');

   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;
   bAnyInit            : BOOL;
   bAnyBusy            : BOOL;
   bAnyError           : BOOL;
END_VAR
CASE iUpdateState OF

0:
    bAnyInit := FALSE;
    FOR I := 1 TO iNumOfDrives DO
        IF bInit[I] THEN
           bAnyInit := TRUE;
           stDriveRef[I].sNetId     := F_CreateAmsNetId(stPlcDriveRef[I].aNetId);
           stDriveRef[I].nSlaveAddr := stPlcDriveRef[I].nSlaveAddr;
           stDriveRef[I].nDriveNo   := stPlcDriveRef[I].nDriveNo;
           stDriveRef[I].nDriveType := stPlcDriveRef[I].nDriveType;
           IF (stDriveRef[I].sNetId <> '') AND (stDriveRef[I].nSlaveAddr <> 0) THEN
                bInit[I] := FALSE;
           END_IF
        END_IF
    END_FOR

    IF NOT bAnyInit AND bExecute THEN
        iUpdateState := 1;
    END_IF   

1:
    FOR I := 1 TO iNumOfDrives DO
       fbFirmwareUpdate[I](
           stDriveRef       := stDriveRef[I],
           bExecute         := TRUE,
           tTimeout         := T#15s,
           sFirmwareVersion := sFirmwareVersion[I],
           sFirmwarePath    := sFirmwarePath,
           sNetIdIPC        := 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