Beckhoff# FB_EnumFindFileListでFileをリストアップする

みなさんこんにちわ。今回は指定されたDirectory内でFileをサーチしリストとして戻りのFunction blockを紹介します。難しいことはやっていません、少しだけのKnow-howが必要なだけです。

Function Block

ではまずFunction blockから紹介します。先のTaskを完成させるにはこのFB_EnumFindFileListというFunction blockを使用します。そのFBは指定されたDirectoryに、更に指定されたKeywordのFileリストを返してくれます。注意するのは新しいサーチは一個前にサーチは完全に終わる必要があり、そのサーチを完成するにはbEOEがTrueになるか、eCmd のパラメータからeEnumCmd_Abortを渡すのか、です。

そしてもしエラーが出る場合に、eEnumCmd_Abort が内部的にFunction blockに渡すという仕組みになってるようです。

VAR_INPUT

sNetID T_AmsNetIDTarget TwinCATの NetworkId 。空文字ならLocal Systemになります。
sPathName T_MaxStringサーチしたいDirectory(* 、?)などのKeywordも使用できます。
eCmd E_EnumCmdType := eEnumCmd_FirstFunction Blockのコマンド
pFindList DWORDST_FindFileEntry配列のアドレス
cbFindList UDINTST_FindFileEntry配列のサイズ(Byte)
bExecute BOOL立ち上げでFunction Block実行
tTimeout TIME := DEFAULT_ADS_TIMEOUT

VAR_OUTPUT

bBusy BOOLTrue=Function Block実行中
bError BOOLTrue=ADS Error
nErrId UDINTError 情報
bEOE BOOLEnd of enumeration
nFindFiles UDINT条件合うのFile数

TYPE E_EnumCmdType

Function Blockのコマンド種類です。この FB_EnumFindFileListだけではなく他にもFunction Blockがあります。

TYPE E_EnumCmdType :
(
        eEnumCmd_First := 0,
        eEnumCmd_Next,
        eEnumCmd_Abort
);
END_TYPE
eEnumCmd_FirstEnumerate first element.
eEnumCmd_NextEnumerate next element.
eEnumCmd_AbortCommand to abort enumeration (closes opened handles).


TYPE ST_FindFileEntry

ST_FindFileEntry配列はFB_EnumFindFileListの戻り値です。

sFileName T_MaxStringFile名
sAlternateFileName STRING(13)FileのAlternate名
fileAttributes ST_FileAttributesfile attributes 
fileSize T_ULARGE_INTEGER64 bit unsigned integer. The size of the file is equal to (dwHighPart * (0xFFFFFFFF+1)) + dwLowPart.
creationTime T_FILETIMEFileの生成時間.
lastAccessTime T_FILETIMEFileの最後アクセス時間
lastWriteTime T_FILETIMEFileの最後書き込み時間

TYPE T_FILETIME

このDUTは64Bitのタイプで100nanosecondから数える時間タイプです(January 1, 1601 (UTC))。

dwLowDateTime DWORD
dwHighDateTime DWORD

FUNCTION FILETIME_TO_DT

この関数ではFILETIME FormatからDATE_AND_TIMEに変換します。RangeはDT#1970-01-01-00:00:00 から DT#2106-02-06-06:28:15までです。

VAR_INPUT

fileTime T_FILETIME

Implementation

次は実装します。今回は以下のような画面を作り、Directory内のFileをBrowserから一覧できるようにします。

VAR

VAR
EnumFindFileList:FB_EnumFindFileList;
FindList:ARRAY[0..49]OF ST_FindFileEntry;
bExecute:BOOL;
commnd:E_EnumCmdType;
bBusy:BOOL;
hmiIndex:INT:=0;
bError: BOOL;
nErrID: UDINT;
bEOE: BOOL;
nFindFiles: UDINT;
hmiDisplayFileEntry:DUT_HMIFileEntry_Display;
FileTime:DT;
sBasicPath:STRING:=’file:\\\C:\FTPFiles\’;
bDisplay:BOOL;
hmiIndexDisplayBackup:INT;

END_VAR

Code

EnumFindFileList(
sNetId:=’192.168.217.146.1.1′
,sPathName:=’C:\FTPFiles\*.jpg’
,eCmd:=commnd
,pFindList:=ADR(FindList)
,cbFindList:=SIZEOF(FindList)
,bExecute:=bExecute
,bBusy=>bBusy
,bError=>bError
,nErrID=>nErrID
,bEOE=>bEOE
,nFindFiles=>nFindFiles
);

IF bExecute AND (EnumFindFileList.bEOE OR EnumFindFileList.bError)THEN
bExecute:=False;
END_IF

IF hmiIndex >=0 AND
hmiIndex <=15 THEN
hmiDisplayFileEntry.FileEntry:=FindList[hmiIndex];
END_IF
IF hmiIndex <0 THEN
hmiIndex:=15;
ELSIF hmiIndex >15 OR hmiIndex > EnumFindFileList.nFindFiles-1  THEN
hmiIndex:=0;
END_IF

IF hmiIndex <>hmiIndexDisplayBackup THEN
hmiIndexDisplayBackup:=hmiIndex;
bDisplay:=TRUE;
END_IF

hmiDisplayFileEntry.CreationTime:=
FILETIME_TO_DT(
fileTime:= hmiDisplayFileEntry.FileEntry.creationTime);

hmiDisplayFileEntry.LastAccesTime:=
FILETIME_TO_DT(
fileTime:= hmiDisplayFileEntry.FileEntry.lastAccessTime);

hmiDisplayFileEntry.LastModificationTime:=
FILETIME_TO_DT(
fileTime:= hmiDisplayFileEntry.FileEntry.lastWriteTime);

hmiDisplayFileEntry.ImagePath:=CONCAT(STR1:=sBasicPath,STR2:=hmiDisplayFileEntry.FileEntry.sFileName);

GVL.currentPath:=hmiDisplayFileEntry.FileEntry.sFileName;

Source Code

以下のLinkからSource Codeをダウンロードしてください。

https://github.com/soup01Threes/TwinCAT3/blob/main/Example_FB_EnumFindFileList.tnzip

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする