CODESYS使用CAA File库进行文件操作的详细讲解
一、前言
在讲解CODESYS的文件操作前,我们要了解做本节的意义和作用,以及What?Why?When?Where?How?这涉及到在项目的疑难处理中,可以作为突破点的方法。
1.什么是文件操作?
文件操作是指程序对计算机文件系统中的文件进行创建、读取、写入、修改、删除等操作的过程。这是程序与外部存储设备(如硬盘、U盘等)进行数据交互的基本方式。
2.为何要文件操作?
- 数据持久化:程序运行时的数据存储在内存中,程序关闭后会丢失。通过文件操作可以将数据永久保存。
- 数据共享:不同程序之间可以通过文件共享数据。
- 配置存储:保存程序的设置和配置信息。
- 日志记录:记录程序运行状态和错误信息。 大数据处理:处理超出内存容量的数据。
3.文件操作的思考?
在工控领域,设备机台使用PLC的环境下,文件操作的功能或功能块往往不是很友好。当然对于触摸屏来说,可以通过FTP服务器的方式进行上传和下载文件等处理,在之前的博文中有详细讲过,如果使用上位机调用函数更为简单就可以做文件处理。
今天我们所讲的,是关于使用PLC,以CODESYS软件为案例,汇川Inoproshop为参考,使用库文件进行文件操作。事实上,关于此方面的内容,有些博文感觉写的不是很清楚,没有申根刨底的讲明白这个用法,而官网的案例也不是很符。因此经过我两三天的研究,总算搞精通了(也许是冰山一角吧)。如果别的PLC基于CODESYS开发的,那么基本原理是相通的,看这篇也足够了。
关于如何操作,我们下面详细讲解。
CODESYS使用CAA File库进行文件操作的详细讲解
二、关于库
1.库说明
CODESYS官方提供了两种库文件,Sysfile和CAA file,从类型上,Sysfile属于函数(功能),CAA file属于函数块(功能块)。而CAA file的底层实际上是根据Sysfile编写的,因此每调用一个CAA file都会有一个背景数据区。
2.库版本
本次讲解的库文件版本号:3.5.19.0,官方在线帮助版本:3.5.15.0,由于库的版本在不断迭代,因此不能全看在线帮助的内容,可能会误导大家,仅个人看法。
官方在线帮助网站:[https://content.helpme-codesys.com/en/libs/CAA%20File/Current/index.html]
注意:查找此类文件库,尽量在官网界面选EN(英文)。
关于官方的库的原文描述我就不照搬了,建议自行浏览一遍,知道大概就行,需要说明的是,有些功能块的数据类型是枚举类型,这些会令小白比较疑惑,所以创建数据变量一定要注意。
三、使用库
对于一个简单的文件,要显示创建,打开,写入,读取,关闭等,首先要添加库文件CAA File,见下图:
其次,调用File.Open,File.Write,File.SetPos,File.Read,File.Close等即可,见下代码:
//打开文件
Open_0(xExecute := openExecute,xDone => ,xBusy => ,xError => ,sFileName := 'Record2.csv',eFileMode := FILE.MODE.MAPPENDPLUS,xExclusive := ,eError => ,hFile => );
//写入文件
Write_0(xExecute := writeExecute,xAbort := ,udiTimeOut := 100000,xDone => ,xBusy => ,xError => ,xAborted => ,hFile := open_0.hFile,pBuffer := ADR(writeBuff[0]),szSize := writeSzie,eError => );
//指示文件
SetPos_0(xExecute:=setPosExecute , xDone=> , xBusy=> , xError=> , hFile:=open_0.hFile , udiPos:=udipos , eError=> ); //读取文件
Read_0(xExecute := SetPos_0.xDone,xAbort := ,udiTimeOut := 100000,xDone => ,xBusy => ,xError => ,xAborted => ,hFile := open_0.hFile,pBuffer := ADR(readBuff[0]),szBuffer := readSzie,eError => ,szSize => );
// IF Read_0.xDone THEN
// setPosExecute:=FALSE;
// END_IF//关闭文件
Close_0(xExecute:=closeExecute , xDone=> , xBusy=> , xError=> , hFile:=open_0.hFile , eError=> );
1.打开文件File.Open
功能块图。
(1)xExecute:可以是上升沿,每次上升沿会创建一个句柄(无报错下),即创建或打开一个文件的标识符。下降沿后,此标识符为0。因此必须要记录此标识符,或保持接通状态,直到文件操作结束。
除了File.Open外,其它功能块沿触发一次即可,没有其它注意事项。
(2)sFileName:字符串格式(STRING),无目录下,如’test.txt’,默认保存在PlcLogic下,或上一级目录,应该跟安装情况有关。具体可以通过Everything搜索。也可以通过DirCreate创建目录,如目录名’Dirtest’,在该目录下’DIRTEST\Record.csv’,见下图:
(3)eFileMode:此枚举类型包括以下几种(简化版):M0-可写(覆盖或新建),M1-只读,M2-读写(覆盖或新建),M3-附加写,M4-读写(必须存在且可修改),M5-读写(内容清除或新建),M6-读写(内容追加或新建)。
该数据类型举例:FILE.MODE.MREADPLUS,即MODE值:MREADPLUS,也可以直接配WORD等类型,WORD值:4;
以上几种模式为实际测试后的简要版解释(每次沿触发后的效果),详细的说,
①没有的文件,想要创建,必须使用M0,M2,M5,M6;
②文件可读,M1,M2,M4,M5,M6;
③文件可写,M0,M2,M3,M4,M5,M6;
④文件读及写,M2,M4,M5,M6。
⑤文件重新打开时,本身被覆盖或内容被清除,即文件数据清除,M2,M5;
⑥文件重新打开时,在文件基础上继续编写,即数据在末尾,不断叠加,M6;
⑦文件重新打开时,文件本身不受影响,可指定在文件的指示符处变更,如替换,新增等,M4;
这样的解释比较通俗易懂,而官方的解释文本,如果不去测试,根本不明白怎么回事。
(4)xDone,xBusy,xError,eError:状态的输出信号,将此引脚做逻辑处理即可,如xDone触发下一个功能块的运行等等。
(5)hFile:句柄(标识),当打开一个文件的时候,会输出一个标识符,用于指定这个文件,以及用于后续的读写操作等,如果标识符被清零,那么后续的操作肯定是无效的,数据类型:LWORD;
2.文件写入File.Write
(1)udiTimeOut:单位是微秒,如100000代表100ms,用于操作超时的设定。
(2)hFile:与File.Open的标识符保持一致即可,代表打开的文件可以被操作。
(3)pBuffer:数据的缓冲区,需要用ADR()取地址中的数据,否则会报错,其本身的数据类型是:LWORD;关于取地址中的数据类型,可以是任何数组或非数组的数据类型,如BYTE,INT,STRING,WSTRING等;
(4)szSize:写入的数据字节大小,数据类型:ULINT,官网推荐用SIZEOF确定,个人建议,根据项目内容,是多少写多少。本人测试下来,如果写空字符,再读取的时候可能会存在问题,尽量不要写空;
3.文件读取File.Read
具体引脚跟Write一样,对于读取的字节大小,没有严格