Пишем функциональный блок, производящий поиск файлов на внутренних дисках ПЛК и ПК производства BECKHOFF, работающих под управлением Windows NT, W2K, XP, XPe, CE. Для нормальной работы блока в проект необходимо включить библиотеку
(*Описание входов и выходов функционального блока*)
Вызов функционального блока
(*Объявление блока в программе MAIN*)
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
Комментариев нет:
Отправить комментарий