みなさんこんにちわ。今回は指定された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_AmsNetID | Target TwinCATの NetworkId 。空文字ならLocal Systemになります。 |
sPathName | T_MaxString | サーチしたいDirectory(* 、?)などのKeywordも使用できます。 |
eCmd | E_EnumCmdType := eEnumCmd_First | Function Blockのコマンド |
pFindList | DWORD | ST_FindFileEntry配列のアドレス |
cbFindList | UDINT | ST_FindFileEntry配列のサイズ(Byte) |
bExecute | BOOL | 立ち上げでFunction Block実行 |
tTimeout | TIME := DEFAULT_ADS_TIMEOUT |
VAR_OUTPUT
bBusy | BOOL | True=Function Block実行中 |
bError | BOOL | True=ADS Error |
nErrId | UDINT | Error 情報 |
bEOE | BOOL | End 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_First | Enumerate first element. |
eEnumCmd_Next | Enumerate next element. |
eEnumCmd_Abort | Command to abort enumeration (closes opened handles). |
TYPE ST_FindFileEntry
ST_FindFileEntry配列はFB_EnumFindFileListの戻り値です。
sFileName | T_MaxString | File名 |
sAlternateFileName | STRING(13) | FileのAlternate名 |
fileAttributes | ST_FileAttributes | file attributes |
fileSize | T_ULARGE_INTEGER | 64 bit unsigned integer. The size of the file is equal to (dwHighPart * (0xFFFFFFFF+1)) + dwLowPart. |
creationTime | T_FILETIME | Fileの生成時間. |
lastAccessTime | T_FILETIME | Fileの最後アクセス時間 |
lastWriteTime | T_FILETIME | Fileの最後書き込み時間 |
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