- FB_WriteReadFileTXT_2: 读写TXT/LOG/CSV文件(V2.0)
-
Function_Block,读、写TXT/LOG/CSV文件,只支持字符串类型,该功能块是把FB_ReadFileTXT和FB_WriteFileTXT两个功能块合并起来。
PROGRAM PRG_FileOperation
VAR
CycleRecordStart:BOOL;
CycleRecordingTime :TON;
Number :DINT:=0;
//FB_WriteReadFileTXT_2实例
s_fbWriteReadFileTXT_2 : FB_WriteReadFileTXT_2; (*把数据写成CSV文件*)
s_sgFileName:STRING(40) :='MyFile'; (* 文件名, 包含文件类型*)
bBusy : BOOL;
//原始数据,浮点型
Buffer : LREAL; (*Demo 用的原始浮点数据,本例中转成String才能写到文件*)
//写文件
s_bWriteFileCsv : BOOL;
BufferStr : ARRAY[0..86400, 0..3] OF STRING(40); (*实际写出到文件的数组*)
s_u32WriteMaxRow : UDINT := 86400; (*目标写出行数*)
//读文件
s_bReadFileCsv : BOOL;
s_u32ReadMaxRow : UDINT := 86400; (*目标读取行数*)
BufferStr2 : ARRAY[0..86400, 0..3] OF STRING(40); (*实际从文件读回来的数组*)
//读本地时间
ReadTime:FB_LocalSystemTime;
readtimeST :TIMESTRUCT;
data1 :STRING[10];
data2 :STRING[10];
timehm :STRING[20];
times :STRING[20];
//日期时间组合
DataAndTime :STRING[40];
END_VAR
(*Demo 准备数据*)
//读取PLC本地时间
ReadTime(bEnable:= TRUE, systemTime=> readtimeST);
data1:= CONCAT(CONCAT(TO_STRING(readtimeST.wYear),'/'), CONCAT(TO_STRING(readtimeST.wMonth),'/'));
data2:= CONCAT(data1,TO_STRING(readtimeST.wDay));
timehm:=CONCAT(CONCAT(TO_STRING(readtimeST.wHour),':'), CONCAT(TO_STRING(readtimeST.wMinute),':'));
times:=CONCAT(timehm, TO_STRING(readtimeST.wSecond));
DataAndTime:=CONCAT(CONCAT(data2,' '),times);
CycleRecordingTime(IN:=NOT CycleRecordingTime.Q,PT:=T#1S);
IF CycleRecordStart THEN
IF CycleRecordingTime.Q THEN
Number:=Number+1;
END_IF
ELSE
s_sgFileName:= CONCAT('DataLog',
CONCAT(TO_STRING(readtimeST.wYear),
CONCAT(TO_STRING(readtimeST.wMonth),
CONCAT(TO_STRING(readtimeST.wDay),
CONCAT(TO_STRING(readtimeST.wHour),
CONCAT(TO_STRING(readtimeST.wMinute),
CONCAT(TO_STRING(readtimeST.wSecond),'.csv')))))));
Number:=0;
END_IF
IF Number<=s_u32WriteMaxRow-1 THEN
//第一列数据:
BufferStr[Number,0] :='DATA';
//第二列数据
BufferStr[Number,1] :=DataAndTime;
//第三列数据
BufferStr[Number,2] :=LREAL_TO_FMTSTR(Buffer, 5, TRUE);
ELSE
(*写文件用上升沿触发*)
s_bWriteFileCsv := TRUE;
s_sgFileName:= CONCAT('DataLog',
CONCAT(TO_STRING(readtimeST.wYear),
CONCAT(TO_STRING(readtimeST.wMonth),
CONCAT(TO_STRING(readtimeST.wDay),
CONCAT(TO_STRING(readtimeST.wHour),
CONCAT(TO_STRING(readtimeST.wMinute),
CONCAT(TO_STRING(readtimeST.wSecond),'.csv')))))));
Number:=0;
END_IF
(*Demo 观察写出的数组字符串元素*)
(*==================================================================================================================
读写TXT, CSV, LOG文件, 只支持字符串, ARRAY[1..n] OF STRING(x)
==================================================================================================================*)
(*FB*)
(*Option*)
s_fbWriteReadFileTXT_2.sOption.bRecordOneRowPerCycle:=TRUE; (*True:一个扫描周期读写多行(多列),False:一次读写一行*)
s_fbWriteReadFileTXT_2.sOption.bDeleteOldFile:=TRUE; (*True:写入时, 删除同名原文件,如果不删除,从起始地址写数据而新数据不够长,后半部分可能仍然是原文件的数据*)
s_fbWriteReadFileTXT_2.sOption.bRecordCurTime:=TRUE; (*True:记录写入时间(只在OneRowPerCycle为False时有效)*)
s_fbWriteReadFileTXT_2.sOption.sgSeparator:='$T'; (*两列之间的分隔符,英语地区用 逗号$T*)
s_fbWriteReadFileTXT_2.sOption.bSameAddress_RW:=FALSE; (*True:把读回的数据BufferStr2写到文件, False:把BufferStr1写到文件*)
s_fbWriteReadFileTXT_2.sOption.bDeleteSpace_R:=FALSE; (*True:删除空格*)
//调用功能块
s_fbWriteReadFileTXT_2(
sgNetId := '',
sgDeviceName := 'E:\log',(*'\Hard disk\',*) (*路径, CE系统用 \Hard Disk\,Win7 用 C:\等盘符*)
sgFolderName := 'Recipe\CamTable', (*路径, 可选*)
sgFileName := s_sgFileName,
bReadFile := s_bReadFileCsv,
pDestBuffer := ADR(BufferStr2),
u32DestSize := SIZEOF(BufferStr2),
u32DestStrSize := SIZEOF(BufferStr2[1,1]),
u32ReadRowNum := s_u32ReadMaxRow,
u32ReadColNum := 2,
bWriteFile := s_bWriteFileCsv, (*写入文件*)
pSrcBuffer := ADR(BufferStr), (*如果 bSameAddress_RW = TRUE, 写入 u32DestADR 对应的变量*)
u32SrcSize := SIZEOF(BufferStr), (*如果 bSameAddress_RW = TRUE, 写入 u32DestSize 字节数*)
u32SrcStrSize := SIZEOF(BufferStr[0,0]), (*一个变量字节数(计算偏移用的)*)
u32WriteRowNum := s_u32WriteMaxRow, (*写入行数*)
u32WriteColNum := 4, (*写入列数*)
sOption := , (*选项*)
tTimeout := T#5S, (*超时时间*)
bBusy => bBusy, (*读写中*)
bDone => , (*读写完成*)
bError => , (*读写错误*)
u32ErrorID => , (*错误代码*)
hFile => );
//请除读写命令,以等待下一次触发
s_bReadFileCsv :=FALSE; (*读文件用上升沿触发*)
s_bWriteFileCsv := FALSE; (*写文件用上升沿触发*)
运行测试一下
CycleRecordStart 赋值为True,开始记录
保存成功,文件的后缀我加入了文件保存时的时间(年月日时分秒)
打开csv文件