倍福TwinCAT3数据记录DataRecord保存数据_txt/csv

文章详细描述了一个名为FB_WriteReadFileTXT_2的功能块,专用于处理字符串类型的TXT、LOG和CSV文件操作,包括文件命名策略和时间戳记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. FB_WriteReadFileTXT_2: 读写TXT/LOG/CSV文件(V2.0)
  2. 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文件

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值