29 января 2010 г.

TwinCAT: Функциональный блок поиска файлов

Пишем функциональный блок, производящий поиск файлов на внутренних дисках ПЛК и ПК производства BECKHOFF, работающих под управлением Windows NT, W2K, XP, XPe, CE. Для нормальной работы блока в проект необходимо включить библиотеку TcUtilities.lib, поставляемую вместе с TwinCAT. Наш функциональный блок будет выдавать массив файлов (вместе с расширениями), массив имён файлов (без расширений) и флаг завершения поиска.

(*Описание входов и выходов функционального блока*)
FUNCTION_BLOCK FB_SEARCH_FILES
VAR_INPUT
   bSearch, bAbort, bReset: BOOL;      (*Управление блоком*)
   sDirectory: STRING;                 (*Директория для поиска*)
END_VAR
VAR_OUTPUT
   sFile: ARRAY [1..99] OF STRING;     (*Массив файлов*)
   sName: ARRAY [1..99] OF STRING;     (*Массив имён файлов*)
   bDone: BOOL;                        (*Поиск завершён*)
END_VAR
VAR
   bySearch: BYTE;
   fbFileSearch: FB_EnumFindFileEntry := (sNetID := '', tTimeout := t#10s);
   iNumber: BYTE := 1;
END_VAR


(*Тело функционального блока*)
CASE bySearch OF
   0: (*Пуск*)
      IF bSearch THEN
         bDone := bSearch := FALSE;
         fbFileSearch.eCmd := eEnumCmd_First;
         bySearch := bySearch + 1;
      END_IF

       IF bReset THEN
         iNumber := 1;
         bDone := bReset := FALSE;
      END_IF

   1: (*Обнуление массива имён*)
      FOR iNumber := 1 TO 99 DO
         sFile[iNumber] := sName[iNumber] := '';
      END_FOR

      IF iNumber > 99 THEN
         iNumber := 1;
         bySearch := bySearch + 1;
      END_IF

   2: (*Включение/выключение*)
      IF bAbort THEN
         bDone := bAbort := FALSE;
         fbFileSearch.eCmd := eEnumCmd_Abort;
      END_IF

      fbFileSearch (bExecute := FALSE);
      fbFileSearch (bExecute := TRUE);
      bySearch := bySearch + 1;

   3: (*Обработка и ожидание завершения поиска*)
      fbFileSearch (bExecute := FALSE, sPathName := sDirectory);
         IF NOT(fbFileSearch.bBusy) THEN
            IF NOT(fbFileSearch.bError) THEN
               IF NOT(fbFileSearch.bEOE) THEN
                  sFile[iNumber] := fbFileSearch.stFindFile.sFileName;
                  sName[iNumber] := DELETE(fbFileSearch.stFindFile.sFileName, 4, 16);
                  fbFileSearch.eCmd := eEnumCmd_Next;
                  iNumber := iNumber + 1;
                  bySearch := 2;
               ELSE
                  bDone := TRUE;
                  iNumber := 1;
                  bySearch := 0;
               END_IF
            ELSE
               bDone := FALSE;
               iNumber := 1;
               bySearch := 0;
            END_IF
         END_IF
END_CASE


Вызов функционального блока FB_SEARCH_FILES прост. В нижеприведённом примере блок производит бесконечное (зацикленное) обновление массива файлов с расширением .txt (см. вход sDirectory), расположенных на диске C:\.

(*Объявление блока в программе MAIN*)
PROGRAM MAIN
VAR
   fbSearchFiles: FB_SEARCH_FILES;
END_VAR

(*Вызов функционального блока*)
fbSearchFiles (bSearch := TRUE, sDirectory := 'c:\*.txt', sFile => );
   IF fbSearchFiles.bDone THEN
      fbSearchFiles (bSearch := FALSE);
   END_IF

Комментариев нет:

Отправить комментарий