CODESYS开发教程10-文件读写(SysFile库)

news2024/11/25 16:26:58

今天继续我们的小白教程,老鸟就不要在这浪费时间了😊。

前面一期我们介绍了CODESYS的文件操作库CAA File。这一期主要介绍CODESYS的SysFile库所包含的文件读写功能块,主要包括文件路径、名称、大小的获取以及文件的创建、打开、读、写、拷贝和删除功能等。

一、SysFile库简介

与上一期介绍的目录和文件操作库CAA File不同,SysFile属于CODESYS比较底层的库,其中结构和功能块的定义与C语言非常接近。使用该库需要在“库管理器”中添加SysFile库,这里使用的是3.5.15版本。

需要注意的是,SysFile库中所有功能均为函数(FUNCTION),与CAA File库中的功能块(FUNCTION_BLOCK)是不同。函数可以直接使用,而功能块需要先声明后使用。因为CODESYS的函数内部的变量在运行后是不会保留的,这个与功能块是不同。使用的时候要分清楚,避免因为初始状态不同导致的问题。

二、SysFile库的主要功能块

提供对运行时系统的文件功能的访问。仅能进行文件相关的操作。

1.基本定义

(1)文件访问模式ACCESS_MODE

定义文件打开的模式。

名称

初始值

说明

AM_READ

0

使用读取权限打开现有文件。如果文件不存在,则报打开失败错误。

AM_WRITE

1

创建具有写入权限的新文件。如果文件确实存在,则丢弃内容。

AM_APPEND

2

使用附加(仅写)权限打开现有文件。如果文件不存在,则打开失败。

AM_READ_PLUS

3

打开具有读/写权限的现有文件。如果文件不存在,则打开失败。

AM_WRITE_PLUS

4

创建具有读/写权限的新文件。如果文件确实存在,则丢弃内容。

AM_APPEND_PLUS

5

使用附加(读/写)访问权限打开现有文件。如果文件不存在,“打开”将创建一个新文件。

注意:对于所有*_PLUS模式,读取文件后,只能在调用SysFileGetPos或SysFileSetPos后才能进行写入!如果在SysFileRead之后立即调用SysFileWrite,则文件指针可能位于无效位置!正确的使用方式如下:

SysFileRead();

SysFileGetPos();

SysFileWrite();

(2)文件的时间戳SYS_FILETIME

定义文件的时间戳结构。

tCreation:文件创建时间。

tLastAccess:访问文件的时间。

tLastModification:上次修改的时间。

(3)文件状态SYS_FILE_STATUS

定义指定文件的实际文件状态。

名称

初始值

说明

FS_OK

0

文件已被打开。

FS_NO_FILE

1

没有可用文件。

FS_ILLEGAL_POS

2

文件中的非法位置。

FS_FULL

3

文件系统上没有多余空间。

FS_EOF

4

已达到文件结尾。

(4)错误码定义Errors

此错误码定义位于CmpErrors库中,文件读写中常用的如下表所示:

名称

初始值

说明

ERR_OK

16#0

操作成功

ERR_FAILED

16#1

操作失败

ERR_PARAMETER

16#2

参数错误

ERR_NO_OBJECT

16#10

指定的文件不存在

ERR_NOTIMPLEMENTED

16#C

操作么有执行

ERR_NOT_SUPPORTED

16#18

操作不支持

由于错误定义较多,这里只列了比较常用的几个,上表中没有列出的可以参考官方文档。

2.文件操作函数

文件操作函数如下表:

函数名称

功能

备注

SysFileOpen

打开文件

成功则返回文件句柄

SysFileRead

读取文件内容

返回读取的字节数

SysFileWrite

写入文件

返回写入的字节数

SysFileFlush

缓冲内容写入文件

返回运行系统错误码

SysFileClose

关闭文件

返回运行系统错误码

SysFileCopy

拷贝文件

SysFileRename

文件重命名

SysFileDelete

删除文件

SysFileEOF

检查文件是否到达结尾

SysFileGetPos

获取文件指针当前位置

SysFileGetSize

获取文件尺寸

返回值为文件尺寸

SysFileGetTime

获取文件最后修改时间

SysFileSetPos

设置文件指针位置

SysFileGetName

获取文件名称

SysFileGetPath

获取文件路径

SysFileGetStatus

获取文件状态?

SysFileTruncate

重新设置文件尺寸

SysFileDeleteByHandle

根据handle删除文件

SysFileGetSizeByHandle

根据handle获取文件大小

SysFileGetName2

根据handle获取文件名称

SysFileGetStatus2

根据handle获取文件状态

3.常用的函数介绍

SysFile库文件操作函数的参数比较类似,下面对几个常用的函数进行介绍。

(1)SysFileOpen

szFile:文件名称。可以包含绝对或相对路径,注意路径需要用斜杠“/”表示,不能用反斜杠“\”。

am:打开模式,类型为SysFile.ACCESS_MODE。

pResult:返回运行系统错误代码,类型为POINTER TO RTS_IEC_RESULT,含义在CMPErrors库中定义,见第一部分介绍。

返回值:成功则返回文件句柄,类型为SysFile.RTS_IEC_HANDLE,失败则返回RTS_INVALID_HANDLE。

(2)SysFileClose、SysFileFlush

hFile:文件句柄,类型为SysFile.RTS_IEC_HANDLE。

返回值:返回运行系统错误代码,类型为RTS_IEC_RESULT。

(3)SysFileRead和SysFileWrite

hFile:文件句柄。

pbyBuffer:指向读或者写缓冲区首地址,类型为POINTER TO BYTE。

ulSize:需要读取或写入的字节数。注意必须小于等于缓冲区尺寸。

pResult:返回运行系统错误代码。

返回值:成功则返回读取或写入的字节,失败则返回0。数据类型为_XWORD,实际与DWORD等价。

(4)SysFileGetSize

szFileName:文件名称

pResult:返回运行系统错误代码。

返回值:文件尺寸。

(5)SysFileGetTime

szFileName:文件名称

ptFileTime:文件时间,类型为POINTER TO SYS_FILETIME。

返回值:返回运行系统错误代码,类型为SysFile.RTS_IEC_RESULT。

注意:以上函数中凡是类型为RTS_IEC_RESULT的返回值,如果是在函数中作为输入,则需要定义为指针POINTER TO RTS_IEC_RESULT或者使用ADR()来获取错误码;如果作为函数返回值,则为SysFile.RTS_IEC_RESULT。

三、SysFile库使用示例

SysFile库的函数可以直接一起顺序使用,也可以像CAA File库中的功能块一样按状态机的方式进行操作。以下示例为文件写入的分步操作。本次测试使用的控制器是禾川的Q0,使用其它控制器时需要正确指定可进行读写操作的目录位置。

程序变量定义如下:

PROGRAM testSysFile

VAR

       bExecute : BOOL;

       szFileName    : STRING:='/testfile.txt';

       pbyBuffer      : POINTER TO BYTE;

       ulSize            : DWORD;

       ErrorCode      : INT;

       Done             : BOOL;

       stContent      : STRING:='hello everyone!';

       Mode            : SysFile.ACCESS_MODE := 1;      //0-AM_READ; 1-AM_WRITE; 2-AM_APPEND; 3-AM_READ_PLUS; 4-AM_WRITE_PLUS; 5-AM_APPEND_PLUS

       iStep      : INT := 0;      //运转流程

       OP_TRIG : R_TRIG;

       bError            : BOOL;

       hFile       : SysFile.RTS_IEC_HANDLE;

       pRes              : SysFile.RTS_IEC_RESULT;

       iRet        : DWORD;

END_VAR

程序如下:

bExecute:=TRUE;

OP_TRIG(CLK := bExecute);

pbyBuffer:=ADR(stContent);

ulSize:=SIZEOF(stContent);

IF OP_TRIG.Q AND iStep=0 THEN

       iStep := 1;

END_IF

CASE iStep OF

0:

       IF bExecute=FALSE THEN

              Done := FALSE;

              ErrorCode := 0;

              bError := FALSE;

       END_IF

1:

       hFile := SysFileOpen(szFileName, Mode, ADR(pRes)); //打开文件

       IF (pRes<>0 OR hFile=SysFile.RTS_INVALID_HANDLE) THEN

              bError := TRUE;

       ELSE

              iStep := 2;

       END_IF

2:

       iRet:=SysFileWrite(hFile, pbyBuffer, ulSize, ADR(pRes)); //内容写入文件

       IF (iRet=0) THEN

              SysFileClose(hFile);

              bError := TRUE;

       ELSE

              iStep := 3;

       END_IF

3:

       pRes:=SysFileFlush(hFile); //缓存内容写入文件

       IF (pRes=0) THEN

              iStep := 4;

       ELSE

              SysFileClose(hFile);

              bError := TRUE;

       END_IF

4:

       pRes:=SysFileClose(hFile); //关闭文件

       IF pRes=0 THEN

              Done := TRUE;

              iStep := 0;

       ELSE

              bError := TRUE;

       END_IF

END_CASE

//错误检查

IF bError THEN

       iStep := 0;

       ErrorCode := 1;

END_IF

注意:SysFile库的文件读写操作是不能被其它周期任务中断的。当需要读写的文件较大时,需要的时间会比较长。这时候需要把运行读写程序的任务周期调长,保证读写操作能够顺利完成。如果任务时间不够,可能会出现文件没有读完或者写完的情况。

四、结论

SysFile库实际上属于运行系统的文件操作函数,不管是操作方式还是参数定义都与C语言的对应函数类似,对C语言比较熟悉的朋友应该很容易上手。另外需要注意的是底层操作函数与平台相关性较大,比如读写时间与所使用的的控制器平台关系很大,最好是在自己使用的平台上做一些读写测试后设置合理的任务周期,避免出现文件读写不完整问题。

关于SysFile库读写大文件的问题,还有一种思路是把以上代码封装成功能块,在读或者写过程中把大文件拆分成尺寸较小的块,通过分步多次读写,每次进入读写流程时读或者写一块,直至所有内容读写完成。当然这个流程会复杂一些,嫌麻烦的还是直接用CAA File库来实现吧~~~^-^。

------------------

原创不易,感兴趣的多支持!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql数据库安装

三种安装方式 tar -xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz [rootsc-mysql opt]# tar -xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz [rootsc-mysql opt]# ls apache-zookeeper-3.6.3-bin kafka_2.12-2.8.1.tgz apache-zookeeper-3.6.3-bin.tar.gz mysql…

无线局域网

无线局域网&#xff08;Wireless Local Ara Network&#xff0c;WLAN&#xff09; 一、无线局域网的组成 无线局域网可分为两大类&#xff1a;&#xff08;1&#xff09;有基础设施的&#xff1b;&#xff08;2&#xff09;无基础设施的。 1. IEEE802.11 对于有基础设施的无…

Spring boot 实战指南(三):整合Elasticsearch、swagger、redis、mq

文章目录一、Elasticsearch创建项目配置maven完善依赖es连接配置实体映射repositoryservicecontroller二、swagger依赖启动类路径匹配配置配置类controller注解三、redis一、Elasticsearch 官方文档 Elasticsearch教程 自己搭建了一个简单的demo&#xff0c;仓库在这里&#…

分布式之CAP理论分析

写在前面 任何存在的事物都有其内在的特性&#xff0c;分布式也不例外&#xff0c;那么分布式都有什么特性呢&#xff1f;国外有大牛就帮我们总结了如下的三点&#xff1a; C:Consitency,一致性 A&#xff1a;Available&#xff0c;可用性 P&#xff1a;Partition tolerance&…

细讲一个 TCP 连接能发多少个 HTTP 请求(二)

第三个问题&#xff1a;一个 TCP 连接中 HTTP 请求发送可以一起发送么&#xff08;比如一起发三个请求&#xff0c;再三个响应一起接收&#xff09;&#xff1f; HTTP/1.1 存在一个问题&#xff0c;单个 TCP 连接在同一时刻只能处理一个请求&#xff0c;意思是说&#xff1a;两…

测试员都是背锅侠?测试人员避“锅”攻略,拿走不谢

最近发生了一起生产事故&#xff0c;究其根源&#xff0c;事故本身属于架构或者需求层面需要规避的问题&#xff0c;测试人员的责任其实是非常小的&#xff0c;但实际情况是&#xff1a;相关测试人员因此承担了很大的压力&#xff0c;成为质量问题的“背锅侠”。 实际上&#…

极验2代验证码分析

目标链接 aHR0cDovL3d3dy5qc2dzai5nb3YuY246NTg4ODgvbWluaS9uZXR3ZWIvU01MaWJyYXJ5LmpzcA接口分析 点击搜索就会跳出验证码&#xff0c;netWebServlet.json 的请求&#xff0c;会返回 challenge 和 gt 接着可以看响应请求图片信息的接口&#xff0c;可以看到请求参数包含cha…

iOS 组件化或SDK时对资源加载注意点

本文针对cocoapods进行打包的资源做个讲解&#xff0c;针对自身项目注意调整资源访问策略。 资源文件打包方式 使用pod lib create AppResourceModule 来进行演示。 use_frameworks! target AppResourceModule_Example dopod AppResourceModule, :path > ../ end podfil…

Python+Flask+MySQL开发的在线外卖订餐系统(附源码)

文章目录一、项目模块及功能介绍1、登录模块2、注册模块3、商家用户模块4、买家用户模块5、系统管理员模块源码二、项目结构三、环境依赖四、运行方法五、系统部分界面展示1、首页2、注册界面3、登录界面4、商家主界面5、商家菜单界面6、商家添加菜品界面7、商家修改菜品界面8、…

数值程序分析

原文来自微信公众号“编程语言Lab”&#xff1a;数值程序分析 搜索关注“编程语言Lab”公众号&#xff08;HW-PLLab&#xff09;获取编程语言更多技术内容&#xff01; 欢迎加入编程语言社区 SIG-程序分析&#xff0c;了解更多程序分析相关的技术内容。 加入方式&#xff1a;添…

实现自动化部署前端项目,从安装Jenkins到部署完成的整体配置 --适合初学Jenkins、想实现或者学习自动化部署的同学,知识点比较全面,过程写的清晰

前言 一、什么是Jenkins 二、Jenkins安装配置 Linux环境安装JDK Linux环境安装Maven Linux安装Jenkins 启动Jenkins jenkins配置 配置汉化版的jenkins 安装gitHub插件 gitHub配置 jenkins的配置 jenkins的gitHub配置 jenkins的java环境配置 小总结 两种情况 第…

RPCMon:一款基于ETW的RPC监控工具

关于RPCMon RPCMon是一款基于事件跟踪的WindowsRPC监控工具&#xff0c;该工具是一款GUI工具&#xff0c;可以帮助广大研究人员通过ETW&#xff08;Event Tracing for Windows&#xff09;扫描RPC通信。 RPCMon能够为广大研究人员提供进程之间RPC通信的高级视图&#xff0c;该…

谋变2023:家电巨头进击的“三大关口”

2022年的中国家电行业&#xff0c;无疑在艰难中前行。奥维云网&#xff08;AVC&#xff09;推总数据显示&#xff0c;2022年中国家电市场&#xff08;不含3C&#xff09;零售额为7081亿元&#xff0c;同比下滑7.4%。下滑背后的推力是多样的&#xff0c;包括地产市场下行、消费者…

服务端返回内容跨域CORS之后,也在chrome/edge浏览器里显示出响应信息

由于浏览器的同源策略&#xff0c;服务端返回的内容跨域&#xff0c;且没有允许跨域CORS的请求头之后&#xff0c;浏览器无法显示出服务端返回的信息&#xff0c;不方便问题排查。比如&#xff1a;Access to XMLHttpRequest at http://localhost:6001/service-app/query/common…

springcloud-工程创建(IDEA)

文章目录介绍springcloud 常用组件1.创建父工程2.删除父工程的src目录3.修改父工程的pom文件4 springcloud 版本依赖5.创建子模块6 子项目下创建启动类介绍 Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具&#xff0c;它为开发中的配置管理、服务发现、断路器、智…

最全面的内网open虚拟专用网络通道搭建过程

内网open虚拟专用网络通道搭建过程 文章目录内网open虚拟专用网络通道搭建过程前言一、环境准备二、安装open虚拟专用通道2.1、安装依赖包2.2、开始安装三、证书配置3.1、easy-rsa配置修改3.2、初始化与创建CA根证书3.3、生成服务端证书3.4、生成客户端证书3.5、创建服务端配置…

SpringCloud微服务~面试题

1. SpringCloud常见组件有哪些&#xff1f; 问题说明&#xff1a;这个题目主要考察对SpringCloud的组件基本了解 难易程度&#xff1a;简单 参考话术&#xff1a; SpringCloud包含的组件很多&#xff0c;有很多功能是重复的。其中最常用组件包括&#xff1a; 注册中心组件&…

【冲刺金三银四】2023年网络安全工程师面试题合集

以下为信息/网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作~ 【一一帮助网络安全提升点我一一】 ①网络安全学习路线 ②20份渗透测试电子书 ③安全攻防357页笔记 ④50份安全攻防面试指南 ⑤安全红队渗透工具包 …

市场调研计划书如何写?

想要做好一个产品&#xff0c;市场调研是必不可少的一步&#xff0c;也是第一步&#xff0c;那么如何进行市场调研呢&#xff1f;以下是我整理的一份市场调研计划书&#xff0c;希望能够帮助到大家&#xff01;&#xff01;&#xff01; 一、文档版本控制 主要记录文档的版本…

Reverse_SSH:一款基于SSH的反向Shell工具

关于Reverse_SSH Reverse_SSH上一款基于SSH的反向Shell工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以使用SSH来实现反向Shell&#xff0c;并同时拥有下列功能&#xff1a; 1、使用原生SSH语句管理和连接反向Shell&#xff1b; 2、动态、本地和远程转发&#…