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.

Für das Update wird:

Ein erfolgreiches Update endet mit eFwUpdateState = eFwU_FwUpdateDone.

Wenn das Update nicht erforderlich ist, wird dies über eFwUpdateState = eFwU_NoFwUpdateRequired signalisiert.

Das Firmware-Update erfolgt über den angegebenen Kanal (A = 0 oder B = 1) aus stDriveRef. Bei zweikanaligen Geräten kann nur einer der beiden Kanäle verwendet werden. Der andere Kanal signalisiert eFwUpdateState = eFwU_UpdateViaOtherChannelActive bzw. eFwUpdateState = eFwU_UpdateViaOtherChannel.

Während des Firmware-Updates (eFwUpdateState = eFwU_FwUpdateInProgress) signalisiert iLoadProgress 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. Der Antriebsverstärker 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.

FB_SoEAX5000FirmwareUpdate_ByDriveRef 2: Eingänge

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

Name

Typ

Beschreibung

stDriveRef

ST_DriveRef

Referenz auf den Antrieb. Die Referenz auf den Antrieb kann im System Manager direkt in die SPS gelinkt werden. Hierzu muss eine Instanz der Struktur ST_PlcDriveRef lokiert und die NetID vom Bytearray in einen String konvertiert werden. (Typ: ST_DriveRef)

bExecute

BOOL

Der Baustein wird über eine positive Flanke an diesem Eingang aktiviert.

tTimeout

TIME

Maximale Zeit, die bei der Ausführung des Funktionsbausteins nicht überschritten werden darf.

sFirmwareVersion

STRING(20)

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, z. B. v1.05 Build 0009
  • "v1.05_b00??" aktuellstes Build einer vorgegebenen Version, z. B. v1.05
  • "v1.??_b00??" aktuellstes Build einer vorgegebenen Hauptversion, z. B. v1
  • " " aktuellstes Build der aktuellsten Version

Kundenspezifische Firmware-Builds:

  • "v1.05_b1009" für ein spezifisches Build, z. B. v1.05 Build 0009
  • "v1.05_b10??" aktuellstes Build einer vorgegebenen Version, z. B. v1.05
  • "v1.??_b10??" aktuellstes Build einer vorgegebenen Hauptversion, z. B. v1
  • "v?.??_b10??" aktuellstes Build der aktuellsten Version
  • "v1.05_b8909" für ein spezifisches Build, z. B. v1.05 Build 8909
  • "v1.05_b89??" aktuellstes Build einer vorgegebenen Version, z. B. v1.05
  • "v1.??_b89??" aktuellstes Build einer vorgegebenen Hauptversion, z. B. v1
  • "v?.??_b89??" aktuellstes Build der aktuellsten Version

Debug-Builds:

  • "v1.05_b9009" für ein spezifisches Build, z. B. v1.05 Build 9009
  • "v1.05_b90??" aktuellstes Build einer vorgegebenen Version, z. B. v1.05
  • "v1.??_b90??" aktuellstes Build einer vorgegebenen Hauptversion, z. B. v1
  • "v?.??_b90??" aktuellstes Build der aktuellsten Version

sFirmwarePath

T_MaxString

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

sNetIdIPC

T_AmsNetId

AMS-NetID der Steuerung (IPC)

iReqEcState

UINT

Gewünschter EtherCAT-Status nach dem Update, nur wenn tatsächlich ein Update ausgeführt wird. Die Status sind in der PLC Lib Tc2_EtherCAT als globale Konstanten definiert.

FB_SoEAX5000FirmwareUpdate_ByDriveRef 3: Ausgänge

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

Name

Typ

Beschreibung

bBusy

BOOL

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

bError

BOOL

Dieser Ausgang wird gesetzt, nachdem der bBusy-Ausgang zurückgesetzt wurde, wenn ein Fehler bei der Übertragung des Kommandos auftritt.

iAdsErrId

UINT

Liefert bei gesetztem bError-Ausgang den ADS-Fehlercode des zuletzt ausgeführten Befehls.

iSercosErrId

UINT

Liefert bei gesetztem bError-Ausgang den Sercos-Fehler des zuletzt ausgeführten Befehls.

iDiagNumber

UDINT

Liefert bei gesetztem bError-Ausgang den Antriebsverstärkerfehler des letzten Firmware-Updates.

eFwUpdateState

E_FwUpdateState

Liefert den Status der Firmware-Updates (Siehe E_FwUpdateState).

iLoadProgress

INT

Liefert den Fortschritt des eigentlichen Firmware-Updates in Prozent.

sSelectedFirmwareFile

STRING(MAX_STRING_LENGTH)

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](
          eFwUpdateState => eFwUpdateState[I],
          sSelectedFirmwareFile => sSelectedFirmwareFile[I],
        );
      IF NOT fbFirmwareUpdate[I].bBusy THEN
        fbFirmwareUpdate[I](bExecute := FALSE);
        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 := 0; (* Error *)
      END_IF
    END_IF
END_CASE