FC_ReadFromFileWithLen - Allgemeine Informationen

Übersicht

Typ

Funktion

Verfügbar ab

SystemInterface_1.32.6.0

Versionen:

Aktuelle Version

Aufgabe

Anzahl der Bytes aus einer Datei lesen

Beschreibung

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

Schnittstelle

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)

Rückgabewert

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.

Beispiel

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