FC_ReadFromFileWithLen - Allgemeine Informationen
Typ |
Funktion |
Verfügbar ab |
SystemInterface_1.32.6.0 |
Versionen: |
Aktuelle Version |
Anzahl der Bytes aus einer Datei lesen
Mit der Funktion steht neben FC_ReadFromFile() eine zweite Lesefunktion zur Verfügung. Die Funktion liest eine Anzahl (i_diCount) an Bytes aus einer mit i_diFileId gekennzeichneten Datei in eine Variable (i_pbyVarAdr) und liefert die Anzahl der gelesenen Bytes zurück.
Wenn die in (i_diCount) erforderlichen Bytes nicht gelesen werden können, wird keine Fehlermeldung ausgegeben (negativer Rückgabewert). Dies kann erfolgen, wenn versucht wird, über das Dateiende hinaus zu lesen.
Die Höchstzahl der zu verarbeitenden Bytes beträgt 32 kByte.
HINWEIS: Die Abarbeitung dieser Funktion dauert einige 100 ms. Deshalb sollten die Zeiten für die Zyklusüberwachung der Task, in der diese Funktion ausgeführt wird, einmalig erhöht werden. Beispiel: FC_CycleCheckTimeSet(500, 2).
Eingang |
Datentyp |
Beschreibung |
---|---|---|
i_diFileId |
DINT |
Name der Datei, aus der gelesen werden soll |
i_pbyVarAdr |
POINTER TO BYTE |
Variable, in die gelesene Byte geschrieben werden |
i_diCount |
DINT |
Anzahl der zu lesenden Byte (max. 32 KB) |
Datentyp |
Beschreibung |
---|---|
DINT |
>=0: Anzahl gelesener Bytes. -3: Falsche Datei-ID (< 1000000 oder > 1000009). -5: Lesefehler oder Datei nicht geöffnet. -9: Ungültiger Parameter. |
Speichern Sie den Text "Dies ist ein Test!" (15 Zeichen ohne ") in einer Datei namens "Test.txt" und übertragen Sie diese in das Stammverzeichnis (ide0:) der Steuerung.
TYPE ET_States :
(
Prepare := 0,
Read4Bytes := 10,
Read30Bytes := 20,
CleanUp := 30,
Finished := 100
);
END_TYPE
PROGRAM SR_ReadFile
VAR
etState : ET_States := ET_States.Prepare;
diOverrunTimeDefault : DINT := 0;
diWDogFactorDefault : DINT := 0;
diFileId : DINT := 0;
diBytesToBeRead : DINT := 0;
diBytesRead : DINT := 0;
diResult : DINT := 0;
byVarArray : ARRAY[1..32] OF BYTE;
END_VAR
CASE etState OF
ET_States.Prepare:
diResult := FC_CycleCheckTimeGet(iq_diOverrunTime := diOverrunTimeDefault, iq_diWDogFactor := diWDogFactorDefault);
diResult := FC_CycleCheckTimeSet(i_diOverrunTime := 500, i_diWDogFactor := 2);
etState := ET_States.Read4Bytes;
ET_States.Read4Bytes:
diFileId:=FC_Open_ReadFile('ide0:/Test.txt');
diBytesToBeRead := 4;
diBytesRead := FC_ReadFromFileWithLen(i_diFileId := diFileId, i_pbyVarAdr := ADR(byVarArray), i_diCount := diBytesToBeRead);
// Result:
// diBytesRead = 4
// byVarArray[1] = 84 (T), byVarArray[2] = 104 (h), byVarArray[3] = 105 (i), byVarArray[4] = 115 (s)
diResult := FC_CloseFile(i_diFileId := diFileId);
etState := ET_States.Read30Bytes;
ET_States.Read30Bytes:
diFileId:=FC_Open_ReadFile('ide0:/Test.txt');
diBytesToBeRead := 30;
diBytesRead := FC_ReadFromFileWithLen(i_diFileId := diFileId, i_pbyVarAdr := ADR(byVarArray), i_diCount := diBytesToBeRead);
// Result:
// diBytesRead = 15
// byVarArray[1] = 84 (T) ... byVarArray[15] = 33 (!), byVarArray[16] = 0 ... byVarArray[32] = 0
diResult := FC_CloseFile(i_diFileId := diFileId);
etState := ET_States.CleanUp;
ET_States.CleanUp:
diResult := FC_CycleCheckTimeSet(i_diOverrunTime := diOverrunTimeDefault, i_diWDogFactor := diWDogFactorDefault);
etState := ET_States.Finished;
ET_States.Finished:
;
END_CASE