当前位置: 首页 > news >正文

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

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

前面一期我们介绍了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库来实现吧~~~^-^。

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

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

 

相关文章:

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

今天继续我们的小白教程&#xff0c;老鸟就不要在这浪费时间了&#x1f60a;。 前面一期我们介绍了CODESYS的文件操作库CAA File。这一期主要介绍CODESYS的SysFile库所包含的文件读写功能块&#xff0c;主要包括文件路径、名称、大小的获取以及文件的创建、打开、读、写、拷贝…...

Linux安装redis

Linux安装redis一.下载二.解压配置1.创建文件夹2.上传文件3.解压4.编译配置三.启动测试1.启动2.防火墙配置3.测试四.设置开机自启1.配置脚本2.添加服务3.测试一.下载 redis官网&#xff1a;https://redis.io/ redis官方下载地址&#xff1a;http://download.redis.io/releases…...

计算机组成与体系结构 性能设计 William Stallings 第2章 性能问题

2.1 优化性能设计例如&#xff0c;当前需要微处理器强大功能的桌面应用程序包括&#xff1a;图像处理、三维渲染、语音识别、视频会议、多媒体创作、文件的声音和视频注释、仿真建模从计算机组成与体系结构的角度来看&#xff0c;一方面&#xff0c;现代计算机的基本组成与50多…...

anaconda详细介绍、安装及使用(python)

anaconda详细介绍、安装及使用1 介绍1.1 简介1.2 特点1.3 版本下载2 Anaconda管理Python包命令3 安装3.1 windows安装4 操作4.1 Conda 操作4.2 Anaconda Navigator 操作4.3 Spyder 操作4.4 Jupyter Notebook 操作5 示例参考1 介绍 1.1 简介 Anaconda是用于科学计算&#xff08…...

雅思经验(6)

反正我是希望遇到的雅思听力section 4.里面填空的地方多一些&#xff0c;之后单选的部分少一些。练了一下剑9 test3 的section 4&#xff0c;感觉还是不难的&#xff0c;都是在复现&#xff0c;而且绕的弯子也不是很多。本次考试的目标就是先弄一个六分&#xff0c;也就是说&am…...

CentOS9源码编译libvirtd工具

卸载原有版本libvirt [rootcentos9 ~]# yum remove libvirt Centos9配置网络源 [rootcentos9 ~]# dnf config-manager --set-enabled crb [rootcentos9 ~]# dnf install epel-release epel-next-release 安装依赖包 [rootcentos9 ~]# yum install -y libtirpc-devel libxml2-de…...

搭建内网穿透

文章目录摘要npsfrp服务提供商摘要 内网穿透是一种方便的技术&#xff0c;可以让用户随时随地访问内网设备。有两种方式可以使用内网穿透&#xff1a;自己搭建&#xff0c;使用nps/frps软件&#xff1b;购买服务&#xff0c;快速享受内网穿透带来的便利。 nps 内网穿透。参考…...

vue3组件库项目学习笔记(八):Git 使用总结

目前组件库的开发已经接近尾声&#xff0c;因为这次是使用 git 进行协作的开发模式&#xff0c;在团队协作的时候遇到很多的问题&#xff0c;开发过程中发现小伙伴们对于 git 的使用还不是很熟练&#xff0c;这里就简单总结一下常用的 git 的操作&#xff0c;大致有&#xff1a…...

ISO7320FCQDRQ1数字隔离器LMG1025QDEETQ1半桥GaN驱动器

1、数字隔离器 DGTL ISO 3000VRMS 2CH 8SOIC型号&#xff1a;ISO7320FCQDRQ1批次&#xff1a;新技术&#xff1a;容性耦合类型&#xff1a;通用隔离式电源&#xff1a;无通道数&#xff1a;2输入 - 侧 1/侧 2&#xff1a;2/0通道类型&#xff1a;单向电压 - 隔离&#xff1a;30…...

openmmlab 语义分割算法基础

本文是openmmlab AI实战营的第六次课程的笔记&#xff0c;以下是我比较关注的部分。简要介绍语义分割&#xff1a;如下图&#xff0c;左边原图&#xff0c;右边语义分割图&#xff0c;对每个像数进行分类应用语义分割在个各种场景下都非常重要&#xff0c;特别是在自动驾驶和医…...

2023年深圳/东莞/惠州CPDA数据分析师认证报名入口

CPDA数据分析师认证是中国大数据领域有一定权威度的中高端人才认证&#xff0c;它不仅是中国较早大数据专业技术人才认证、更是中国大数据时代先行者&#xff0c;具有广泛的社会认知度和权威性。 无论是地方政府引进人才、公务员报考、各大企业选聘人才&#xff0c;还是招投标加…...

RabbitMQ-客户端源码之AMQChannel

AMQChannel是一个抽象类&#xff0c;是ChannelN的父类。其中包含唯一的抽象方法&#xff1a; /*** Protected API - called by nextCommand to check possibly handle an incoming Command before it is returned to the caller of nextCommand. If this method* returns true…...

注意力机制(SE,ECA,CBAM) Pytorch代码

注意力机制1 SENet2 ECANet3 CBAM3.1 通道注意力3.2 空间注意力3.3 CBAM4 展示网络层具体信息1 SENet SE注意力机制&#xff08;Squeeze-and-Excitation Networks&#xff09;:是一种通道类型的注意力机制&#xff0c;就是在通道维度上增加注意力机制&#xff0c;主要内容是是…...

Vue2笔记03 脚手架(项目结构),常用属性配置,ToDoList(本地存储,组件通信)

Vue脚手架 vue-cli 向下兼容可以选择较高版本 初始化 全局安装脚手架 npm install -g vue/cli 创建项目&#xff1a;切换到项目所在目录 vue create xxx 按照指引选择vue版本 创建成功 根据指引依次输入上面指令即可运行项目 也可使用vue ui在界面上完成创建&…...

Java程序的执行顺序、简述对线程池的理解

点个关注&#xff0c;必回关 文章目录一、Java程序是如何执行的二、合理利用线程池能够带来三个好处一、Java程序是如何执行的 我们日常的工作中都使用开发工具&#xff08;IntelliJ IDEA 或 Eclipse 等&#xff09;可以很方便的调试程序&#xff0c;或者是通 过打包工具把项目…...

【前言】嵌入式系统简介

随手拍拍&#x1f481;‍♂️&#x1f4f7; 日期: 2022.12.01 地点: 杭州 介绍: 2022.11.30下午两点时&#xff0c;杭州下了一场特别大的雪。隔天的12月路过食堂时&#xff0c;边上的井盖上发现了这个小雪人。此时边上的雪已经融化殆尽&#xff0c;只有这个雪人依旧维持着原状⛄…...

React设计原理—1框架原理

阅读前须知 本文是笔者学习卡颂的《React设计原理》的读书笔记&#xff0c;对书中有价值内容以Q&A方式进行呈现&#xff0c;同时结合了自己的理解&#x1f914;阅读时推荐先看问题&#xff0c;想想自己的答案&#xff0c;再和答案比对一下本文属于前端框架科普&#xff0c;…...

(C00034)基于Springboot+html前后端分离技术的宿舍管理系统-有文档

基于Springboothtml技术的宿舍管理系统-有文档项目简介项目获取开发环境项目技术运行截图项目简介 基于Springboothtml的前后端分离技术的宿舍管理系统项目为了方便对学生宿舍进行管理而设计&#xff0c;分为后勤、宿管、学生三种用户&#xff0c;后勤对整体宿舍进行管理、宿管…...

Flink面试题

一 基础篇Flink的执行图有哪几种&#xff1f;分别有什么作用Flink中的执行图一般是可以分为四类&#xff0c;按照生成顺序分别为&#xff1a;StreamGraph-> JobGraph-> ExecutionGraph->物理执行图。1&#xff09;StreamGraph顾名思义&#xff0c;这里代表的是我们编写…...

Python学习笔记

前言&#xff1a;又从仓库翻出来了一些以前总结的文档&#xff0c;以下内容是我初学Python时网上找的或是图书馆借书抄写的笔记&#xff0c;现在再看有点零散不成体系&#xff0c;但是也还是纪念一下子吧。 Python学习笔记 对于初学编程的人来说&#xff0c;Python可以缩短编…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...