FB_SoEAX5000FirmwareUpdate_ByDriveRef
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:
- Der konfigurierte Slave-Typ ermittelt, z. B. AX5103-0000-0010.
- Der aktuelle Slave mit der vorgegebenen Slave-Adresse ermittelt, z. B. AX5103-0000-0009.
- Die aktuelle Slave-Firmware ermittelt, z. B. v1.05_b0009.
- Ein Vergleich der Konfiguration und des gefundenen Slaves auf Anzahl der Kanäle, Strom, Revision und Firmware ausgeführt.
- Der Name des erforderlichen Firmware-Files ermittelt und die Datei gesucht.
- Der Firmware-Update (falls erforderlich) ausgeführt.
- Der aktuelle Slave mit der vorgegebenen Slave-Adresse erneut ermittelt.
- Der Slave in den vorgegebenen EtherCAT-Status geschaltet.
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:
|
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:
Kundenspezifische Firmware-Builds:
Debug-Builds:
|
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. |
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