codesys工程ST语言学习笔记(六)ST语言读写CVS文件excel格式(文件读写)
时间:2023-01-11 18:30:00
codesys读写CVS文件
工程下载地址 |
-------------------------------------------------------------工程下载链接(点击下载)------------------------------------------------------------

也可以在微信微信官方账号下载。微信官方账号链接在文章底部。 |
点击第一篇文章不编译程序或建立项目codesys工程ST语言学习笔记(1)建立项目和编译
codesys文件写txt文件 codesys工程ST语言学习笔记
codesys文件写txt文件 codesys工程ST语言学习笔记(3)阅读文件操作txt,访问hello world 文件
如果不能打开下载项目的视图 |
参见上一篇博文 |
—————————————————— 点击 转codesys学习笔记(5)—————————————————
·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 udiBytesRed = 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 |
----------------------------------------codesys工程ST语言学习笔记(二)写文件操作与添加库方法------------------------------------
----------------------------------codesys工程ST语言学习笔记(三)读文件操作txt,访问hello world 文件--------------------------
【关注微信公众号一起来交流】 |