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