一:写文件
1.添加库
点击库管理器–点击添加库
点击高级
搜索添加,需要添加的库有:
StringUtils,3.3.15.0
SysFile,3.5.15.0
SysTypes2 Interfaces,3.5.4.0
Util,3.5.15.0
2.添加功能块
编写功能块WriteData_Fun代码
局部变量:
FUNCTION_BLOCK WriteData_Fun
VAR_INPUT
input_String:WSTRING;
start:UINT;//文件写入开始位置
END_VAR
VAR_OUTPUT
end:UINT;//文件写入结束位置
END_VAR
VAR
xWrite : BOOL:=TRUE;//文件写入标志
szFileName : STRING(128) := 'E:\CoDeSys/Test1.txt';//文件存储路径和名称
hFile : SysTypes.RTS_IEC_HANDLE := SysTypes.RTS_INVALID_HANDLE;//文件句柄:初始化为无效的文件句柄
iecResult : SysTypes.RTS_IEC_RESULT;//写文件结果
wsTextLine : WSTRING(10) := "Übersetzer";
sUTF8TextLine : STRING;//用于存储转换后的UTF-8编码字符串
udiPos : __XWORD;
udiWrite : __XWORD;
END_VAR
程序:
IF xWrite THEN
//打开指定路径的文件,并将文件句柄保存在hFile中,同时通过iecResult记录函数执行的结果
//hFile存储打开文件后返回的文件句柄,如果打开文件成功,hFile获得有效的文件句柄,否则返回无效的句柄值。
//文件句柄是操作系统为文件分配的唯一标识符,之后的文件操作需要使用这个句柄来标识文件
//am:指定文件的打开方式,SYSFILE.AM_APPEND_PLUS表示以追加写入的方式打开文件,即在文件末尾添加内容,不会覆盖原有内容
//pResult:指针参数,用于接收函数执行的结果
hFile := SysFileOpen(szFile:=szFileName, am:=SYSFILE.AM_APPEND_PLUS , pResult:=ADR(iecResult));
IF hFile <> RTS_INVALID_HANDLE THEN
//将字符串从UTF16编码转换为UTF8编码
//sourceStart:输入参数,指向UTF-16编码字符串的起始位置
//targetStart:输出参数,指向UTF-8编码字符串的起始位置
//dwTargetBufferSize:输入参数,表示目标缓冲区的大小,即可以容纳转换后的UTF-8编码字符串的最大字节数
//bStrictConversion: 这是一个布尔型的输入参数,用于指定转换是否采用严格模式。如果为TRUE,则表示采用严格模式进行转换,如果为FALSE,则表示采用宽松模式进行转换。
Stu.ConvertUTF16toUTF8(sourceStart := ADR(input_String), targetStart := ADR(sUTF8TextLine), dwTargetBufferSize := SIZEOF(input_String), bStrictConversion := TRUE);
//sysfileSetpos:用于设置文件指针的位置,即将文件指针定位到指定的偏移量位置。
//ulOffset: 输入参数,它表示要设置文件指针的偏移量位置。即用于表示文件指针要定位的起始位置。
sysfileSetpos(hFile:=hFile,ulOffset:= start);
//SysFileWrite函数:将数据从指定的缓冲区写入到文件中,并返回写入的字节数。这个值会被赋给udiWrite
//pbyBuffer: 输入参数,它是指向要写入文件的数据缓冲区的指针。
//ulSize: 输入参数,表示要写入的数据的大小(字节数)。
//pResult: 输出参数,用于存储函数执行的结果。
udiWrite := SysFileWrite(hFile:=hFile, pbyBuffer:=ADR(sUTF8TextLine), ulSize:=INT_TO_UDINT(LEN(sUTF8TextLine)), pResult:=ADR(iecResult));
//关闭文件
iecResult := SysFileClose(hFile:=hFile);
//更新文件写入的结束位置
end:=start+LEN(WSTRING_TO_STRING(input_String));
END_IF
END_IF
3.编写主程序PLC_PRG代码
局部变量:
PROGRAM PLC_PRG
VAR
fbWriteFile : WriteData_Fun;//实例化WriteData_Fun功能块
i: INT;
start:INT;
end: INT;
sign_sta:BOOL:=TRUE;
content_str: WSTRING(INT#14);//INT#14 :可以存储14个Unicode字符
END_VAR
程序:
IF sign_sta = TRUE THEN
FOR i:=1 TO 6 BY 1 DO
content_str:="Hello world! ";//空格也可以识别,很舒服的编码
fbWriteFile(input_String:=content_str,start:=start,end=>end);
start:=end;
END_FOR
sign_sta:=FALSE;
END_IF
4.结果:
源码资源获取见文章末尾。不着急的话可以评论区私信
二:读文件
1.添加库
具体添加库的方式参照一:写文件。需要添加的库有:
StringUtils,3.3.15.0
SysFile,3.5.15.0
SysTypes2 Interfaces,3.5.4.0
Util,3.5.15.0
2.编写主程序PLC_PRG代码
局部变量
PROGRAM PLC_PRG
VAR
xRead : BOOL:=TRUE;
szFileName : STRING(128) := 'E:\CoDeSys\Read_TXT/test2.txt';//文件的路径和名称,根据你的个人情况进行修改
hFile : SysTypes.RTS_IEC_HANDLE;//句柄
iecResult : SysTypes.RTS_IEC_RESULT;//记录函数执行的结果
recive : STRING;//存放读取文件的内容
udiRead : __XWORD;
udiSize : LWORD; //用来存储文件的大小
END_VAR
程序
IF xRead THEN
//打开指定路径的文件,并将文件句柄保存在hFile中,同时通过iecResult记录函数执行的结果
//hFile存储打开文件后返回的文件句柄,如果打开文件成功,hFile获得有效的文件句柄,否则返回无效的句柄值。
//文件句柄是操作系统为文件分配的唯一标识符,之后的文件操作需要使用这个句柄来标识文件
//am:指定文件的打开方式,SYSFILE.AM_READ,以只读的方式打开文件
//pResult:指针参数,用于接收函数执行的结果
hFile := SysFileOpen(szFile:=szFileName, am:=SYSFILE.AM_READ , pResult:=ADR(iecResult));
IF hFile <> RTS_INVALID_HANDLE THEN //hFile不是无效句柄,说明成功打开文件
//SysFileGetSize函数获取文件的大小,并将结果存储在udisize变量中
udisize:=SysFileGetSize(szFileName:=szFileName,pResult:=ADR(iecResult));
//将文件中的内容读取到指定的缓冲区中。成功读取时,将返回udiRead表示实际读取的字节数,失败时将返回错误代码,并将错误状态存储在iecResult变量中。
//pbyBuffer是用于存储读取内容的缓冲区
//ulSize是要读取的字节数
//pResult: 这是指向结果的指针,用于接收操作的结果状态。
udiRead := SysFileread(hFile:=hFile, pbyBuffer:=ADR(recive), ulSize:=udiSize, pResult:=ADR(iecResult));
//关闭文件
iecResult := SysFileClose(hFile:=hFile);
END_IF
END_IF
xRead:=FALSE;
3.可视化输出显示
可视化输出显示操作参照往期文章:
链接: Codesys-实例代码-可视化输出变量——Hello world!
4.结果显示
读和写两个工程资源获取:
提取码2023: 获取资源