codesys工程ST语言学习笔记(六)ST语言读写CVS文件excel格式(文件读写)

codesys读写CVS文件

工程下载地址

-------------------------------------------------------------工程下载链接(点击下载)------------------------------------------------------------

codesys工程ST语言学习笔记(六)ST语言读写CVS文件excel格式(文件读写)_第1张图片
也可以在微信公众号下载。公众号链接在文章最下方

不会编译程序或者建立工程的点击第一篇文章codesys工程ST语言学习笔记(一)建立工程与编译
codesys文件写txt文件 codesys工程ST语言学习笔记(二)写文件操作与添加库方法
codesys文件写txt文件 codesys工程ST语言学习笔记(三)读文件操作txt,访问hello world 文件

下载的工程的视图如果打不开
参见上篇博文

—————————————————— 点击 转codesys学习笔记(五)—————————————————

·CODESYS·
之前笔者使用函数读取txt文件可以正常读取,但是遇到读excel的文件就会返回一组字符串乱码

--------------这是由于excel返回的数据需要进行类型转换,所以需要从byte转成word最后到字符串格式。-----------------
一个表格的每一个字节转成字符串,然后对这个表格的所有字符串进行拼接,就完成这个表格的格式转换了!

文件操作函数详细见博客

-----------------codesys文件写txt文件 codesys工程ST语言学习笔记(二)写文件操作与添加库方法--------------------------

详细代码

读文件函数

FUNCTION ReadDataFun : st_Split
VAR_INPUT
	hFile: RTS_IEC_HANDLE := RTS_INVALID_HANDLE;
	dwLength:__XWORD;
END_VAR
VAR
	byteRead:BYTE;
	udiBytesRead,pppPos:__XWORD;
	udiReadError1: RTS_IEC_RESULT;
	tWord:WORD;
	tStr: STRING(2);
	strNum:STRING;
END_VAR

IF hFile <> RTS_INVALID_HANDLE	THEN
	WHILE byteRead <> 44 DO							//44为ASCII码中的逗号符号(‘,')的十进制数值
		udiBytesRead := SysFileRead(hFile:= hFile, pbyBuffer:= ADR(byteRead), ulSize:=1, pResult:=ADR(udiReadError1));
		IF byteRead = 44 OR udiBytesRead = 0 THEN
			byteRead := 0;
			EXIT;
		END_IF
		tWord := BYTE_TO_WORD(byteRead);			//将字节数转成WORD类型
		tStr := WORD_AS_STRING(tWord,FALSE);		//将WORD类型数据转成字符串
		strNum := CONCAT(strNum,tStr);				//进行字符串拼接
	END_WHILE
	StrTrimA(ADR(strNum));							//删掉字符串中前导和末尾的空格
	ReadDataFun.lrNum := strNum;					//返回读取的cvs字符串
	SysFileGetPos(hFile, ADR(pppPos));				//获取文件指针的当前位置
	IF pppPos >= dwLength THEN						//判断当前位置是否大于文件中的字符串总长度,可由此判断是否读取完毕
		ReadDataFun.bEnd := TRUE;
	ELSE
		ReadDataFun.bEnd := FALSE;
	END_IF
END_IF

写文件函数

FUNCTION WriteDataFun : BOOL
VAR_INPUT
	hFile: RTS_IEC_HANDLE:= RTS_INVALID_HANDLE;
	lWriteData: string;
END_VAR
VAR
	udiBytesWrite: __XWORD;
	udiWriteError: RTS_IEC_RESULT;
	strWriteData: STRING(10);
	cycleNum: DINT;
	num: DINT;
	byteWriteBuffer: ARRAY[0..9] OF BYTE;
END_VAR

IF hFile <> RTS_INVALID_HANDLE THEN
	
	//'$R'是回车符,'$N'是换行符,可通过WORD_AS_STRING转换得到,例如WORD:= 10(10是由ASCII码对应的十六进制数16#0a转化的十进制数),转换后得到string:= '$N',可查询ASCII码表
	WriteDataFun:= FALSE;
	
	strWriteData:= CONCAT(lWriteData,',');				//字符串后面接上逗号
	StrTrimA(ADR(strWriteData));						//删除字符串前导和末尾的空格
	cycleNum:= StrLenA(ADR(strWriteData));				//计算字符串长度
	FOR num:= 0 TO cycleNum DO
		byteWriteBuffer[num]:= strWriteData[num];		//将字符串内容转换成字节数组
	END_FOR
	udiBytesWrite:= SysFileWrite(hFile:= hFile, pbyBuffer:= ADR(byteWriteBuffer), ulSize:= SIZEOF(byteWriteBuffer), pResult:= ADR(udiWriteError));
	
	WriteDataFun:= TRUE;
END_IF
codesys工程ST语言学习笔记(六)ST语言读写CVS文件excel格式(文件读写)_第2张图片
展示结果
codesys工程ST语言学习笔记(六)ST语言读写CVS文件excel格式(文件读写)_第3张图片
领取文件
关注微信公众号回复:codesys

----------------------------------------codesys工程ST语言学习笔记(二)写文件操作与添加库方法------------------------------------
----------------------------------codesys工程ST语言学习笔记(三)读文件操作txt,访问hello world 文件
--------------------------

【关注微信公众号一起来交流】

你可能感兴趣的:(codesys学习笔记,ST语言,codesys,文件读写)