1.APC系列有默认的根目录,不可修改【C:\Program Files\Inovance PAC\RtosManager\InovanceTechnologies\WorkSpace\RtFiles\AppData\PlcLogic】,自定义的文件夹也是存在这个目录下
2.代码
1).文件操作功能块
FUNCTION_BLOCK FB_WriteContent2File
VAR_INPUT
wsContent : WSTRING(MAX_WSTRING_LEN);
sFolderName : STRING(80) := 'xx\Logs'; (* 文件夹名称:汇川AI系列默认路径:C:\Program Files\Inovance PAC\RtosManager\InovanceTechnologies\WorkSpace\RtFiles\AppData\PlcLogic *)
sFileName : STRING(80) := 'SystemLog'; (* 文件名 -- 系统会默认加上系统时间:XXXX-XX-XX-XX *)
sFileType : STRING(80) := '.log'; (* 文件名后缀 *)
bExecute : BOOL; (* 功能触发 *)
END_VAR
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrorID : WORD;
wsErrorMsg : WSTRING(255);
END_VAR
VAR
nStep : UINT;
rtExecute : R_TRIG;
sSystemDate : STRING(80);
sSystemTime : STRING(80);
sTpPath : STRING(80);
{region '文件操作使用'}
nFileID : DWORD;
fbFolderCreat : DirCreate;
fbFileClose : FileClose;
fbFileOpen : FileOpen;
fbFileWrite : FileWrite;
{endregion}
arUtf8Byte : ARRAY[1..(MAX_WSTRING_LEN * 3 + 3)] OF BYTE; (* wstring转UTF8格式单位最大占3个字节 *)
nWriteLength : INT;
{region ' 系统时间 '}
nYear : UINT;
nMonth : UINT;
nDay : UINT;
nHour : UINT;
{endregion}
END_VAR
{region '控制流程'}
rtExecute(CLK := bExecute);
IF NOT bExecute THEN
bBusy := FALSE;
bError := FALSE;
wsErrorMsg := "";
nStep := 0;
RETURN;
END_IF
IF rtExecute.Q AND NOT bBusy THEN
bBusy := TRUE;
bError := FALSE;
wsErrorMsg := "";
nStep := 50;
END_IF
CASE nStep OF
50: (* 判断输入的内容是否为空,如果为空,退出,默认不打印 *)
IF wsContent = "" THEN
nStep := 8888;
ELSE
CmpHCUtils.GetSystemDate(uiYear=> nYear, uiMonth=> nMonth, uiDay=> nDay, uiHour=> nHour);
sSystemDate := CONCAT(CONCAT(CONCAT(CONCAT(TO_STRING(nYear), '-'), TO_STRING(nMonth)), '-'), TO_STRING(nDay));
sSystemTime := CONCAT(CONCAT(sSystemDate, '-'), TO_STRING(nHour));
sTpPath := CONCAT(CONCAT(sFolderName, '\'), sSystemDate);
nStep := 100;
END_IF
100: (* 创建文件夹 *)
fbFolderCreat(Execute:= TRUE, DirName:= sTpPath);
IF NOT fbFolderCreat.Busy THEN
IF NOT fbFolderCreat.Error THEN
nStep := 200;
ELSIF fbFolderCreat.ErrorID = 18 THEN (* 文件夹已经存在 *)
nStep := 200;
ELSE
nErrorID := fbFolderCreat.ErrorID;
wsErrorMsg := Standard64.WCONCAT("Creat Folder error, [DirCreate]ErrorID: ", TO_WSTRING(fbFolderCreat.ErrorID));
nStep := 9999;
END_IF
fbFolderCreat(Execute:= FALSE);
END_IF
200: (* 打开之前执行一次关闭文件夹 *)
sTpPath := CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(sTpPath, '\'), sFileName), ' '), sSystemTime), sFileType);
IF nFileID <> 0 THEN
fbFileClose(Execute:= TRUE, FileID:= nFileID);
IF NOT fbFileClose.Busy THEN
IF NOT fbFileClose.Error THEN
nStep := 300;
ELSIF fbFileClose.ErrorID = 16 THEN (* 文件不存在 *)
nStep := 300;
ELSE
nErrorID := fbFileClose.ErrorID;
wsErrorMsg := Standard64.WCONCAT("Colse File error, [FileClose]ErrorID: ", TO_WSTRING(fbFileClose.ErrorID));
nStep := 9999;
END_IF
fbFileClose(Execute:= FALSE);
END_IF
ELSE
nStep := 300;
END_IF
300: (* 打开文件 *)
fbFileOpen(Execute:= TRUE, FileName:= sTpPath, Mode:= HC_OmronUtils.ACCESS_MODE.AM_APPEND_PLUS, FileID=> nFileID);
IF NOT fbFileOpen.Busy THEN
IF NOT fbFileOpen.Error THEN
WSTRING_TO_UTF8(wsContent:= wsContent, arUtf8Byte=> arUtf8Byte, nLen=> nWriteLength);
nStep := 400;
ELSE
nErrorID := fbFileOpen.ErrorID;
wsErrorMsg := Standard64.WCONCAT("Open File error, [FileOpen]ErrorID: ", TO_WSTRING(fbFileOpen.ErrorID));
nStep := 9999;
END_IF
fbFileOpen(Execute:= FALSE);
END_IF
400: (* 写入数据 *)
fbFileWrite(Execute:= TRUE, FileID:= nFileID, WriteBuf:= (arUtf8Byte[1]), Size:= TO_UINT(nWriteLength));
IF NOT fbFileWrite.Busy THEN
IF NOT fbFileWrite.Error THEN
nStep := 500;
ELSE
nErrorID := fbFileWrite.ErrorID;
wsErrorMsg := Standard64.WCONCAT("File Write error, [FileWrite]ErrorID: ", TO_WSTRING(fbFileWrite.ErrorID));
nStep := 9999;
END_IF
fbFileWrite(Execute:= FALSE);
END_IF
500: (* 关闭文件 *)
IF nFileID <> 0 THEN
fbFileClose(Execute:= TRUE, FileID:= nFileID);
IF NOT fbFileClose.Busy THEN
IF NOT fbFileClose.Error THEN
nStep := 8888;
ELSIF fbFileClose.ErrorID = 16 THEN (* 文件不存在 *)
nStep := 8888;
ELSE
nErrorID := fbFileClose.ErrorID;
wsErrorMsg := Standard64.WCONCAT("Colse File error, [FileClose]ErrorID: ", TO_WSTRING(fbFileClose.ErrorID));
nStep := 9999;
END_IF
fbFileClose(Execute:= FALSE);
END_IF
ELSE
nStep := 8888;
END_IF
8888: (* 正常结束流程 *)
bBusy := FALSE;
bError := FALSE;
nStep := 0;
9999: (* 异常结束流程步 *)
bBusy := FALSE;
bError := TRUE;
nStep := 0;
END_CASE
{endregion}
2).自定义功能:WSTRING_TO_UTF8
FUNCTION WSTRING_TO_UTF8 : UINT
VAR_INPUT
wsContent : WSTRING(MAX_WSTRING_LEN);
END_VAR
VAR_OUTPUT
nLen : INT; (* BYTE数组的有效长度 *)
arUtf8Byte : ARRAY[1..((MAX_WSTRING_LEN * 3 ) + 3)] OF BYTE; (* wstring转UTF8格式单位最大占3个字节 *)
END_VAR
VAR
i : INT;
END_VAR
{region ' 初始化数据 '}
nLen := 0;
MemSet(pbyDest:= ADR(arUtf8Byte), byValue:= 0,dwSize:= SIZEOF(arUtf8Byte));
{endregion}
{region ' 数据转换 '}
ConvertUTF16toUTF8(sourceStart:= ADR(wsContent[0]), targetStart:= ADR(arUtf8Byte), dwTargetBufferSize:= SIZEOF(arUtf8Byte), bStrictConversion:= TRUE);
FOR i := 1 TO TO_INT((MAX_WSTRING_LEN * 3 ) + 3) BY 1 DO
IF arUtf8Byte[i] <> 0 THEN
nLen := nLen + 1;
ELSE
EXIT;
END_IF
END_FOR
nLen := nLen + 1;
arUtf8Byte[nLen] := 10; (* 换行符号 *)
3.实列调用
VAR
bStartTest : BOOL;
wsTestContent : WSTRING(MAX_WSTRING_LEN);
fbWrite2File : FB_WriteContent2File;
END_VAR
fbWrite2File(wsContent:= wsTestContent, bExecute:= bStartTest);
IF bStartTest AND NOT fbWrite2File.bBusy THEN
bStartTest := FALSE;
END_IF
4.测试结果展示
