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库)
今天继续我们的小白教程,老鸟就不要在这浪费时间了😊。 前面一期我们介绍了CODESYS的文件操作库CAA File。这一期主要介绍CODESYS的SysFile库所包含的文件读写功能块,主要包括文件路径、名称、大小的获取以及文件的创建、打开、读、写、拷贝…...
Linux安装redis
Linux安装redis一.下载二.解压配置1.创建文件夹2.上传文件3.解压4.编译配置三.启动测试1.启动2.防火墙配置3.测试四.设置开机自启1.配置脚本2.添加服务3.测试一.下载 redis官网:https://redis.io/ redis官方下载地址:http://download.redis.io/releases…...
计算机组成与体系结构 性能设计 William Stallings 第2章 性能问题
2.1 优化性能设计例如,当前需要微处理器强大功能的桌面应用程序包括:图像处理、三维渲染、语音识别、视频会议、多媒体创作、文件的声音和视频注释、仿真建模从计算机组成与体系结构的角度来看,一方面,现代计算机的基本组成与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是用于科学计算(…...
雅思经验(6)
反正我是希望遇到的雅思听力section 4.里面填空的地方多一些,之后单选的部分少一些。练了一下剑9 test3 的section 4,感觉还是不难的,都是在复现,而且绕的弯子也不是很多。本次考试的目标就是先弄一个六分,也就是说&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服务提供商摘要 内网穿透是一种方便的技术,可以让用户随时随地访问内网设备。有两种方式可以使用内网穿透:自己搭建,使用nps/frps软件;购买服务,快速享受内网穿透带来的便利。 nps 内网穿透。参考…...
vue3组件库项目学习笔记(八):Git 使用总结
目前组件库的开发已经接近尾声,因为这次是使用 git 进行协作的开发模式,在团队协作的时候遇到很多的问题,开发过程中发现小伙伴们对于 git 的使用还不是很熟练,这里就简单总结一下常用的 git 的操作,大致有:…...
ISO7320FCQDRQ1数字隔离器LMG1025QDEETQ1半桥GaN驱动器
1、数字隔离器 DGTL ISO 3000VRMS 2CH 8SOIC型号:ISO7320FCQDRQ1批次:新技术:容性耦合类型:通用隔离式电源:无通道数:2输入 - 侧 1/侧 2:2/0通道类型:单向电压 - 隔离:30…...
openmmlab 语义分割算法基础
本文是openmmlab AI实战营的第六次课程的笔记,以下是我比较关注的部分。简要介绍语义分割:如下图,左边原图,右边语义分割图,对每个像数进行分类应用语义分割在个各种场景下都非常重要,特别是在自动驾驶和医…...
2023年深圳/东莞/惠州CPDA数据分析师认证报名入口
CPDA数据分析师认证是中国大数据领域有一定权威度的中高端人才认证,它不仅是中国较早大数据专业技术人才认证、更是中国大数据时代先行者,具有广泛的社会认知度和权威性。 无论是地方政府引进人才、公务员报考、各大企业选聘人才,还是招投标加…...
RabbitMQ-客户端源码之AMQChannel
AMQChannel是一个抽象类,是ChannelN的父类。其中包含唯一的抽象方法: /*** 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注意力机制(Squeeze-and-Excitation Networks):是一种通道类型的注意力机制,就是在通道维度上增加注意力机制,主要内容是是…...
Vue2笔记03 脚手架(项目结构),常用属性配置,ToDoList(本地存储,组件通信)
Vue脚手架 vue-cli 向下兼容可以选择较高版本 初始化 全局安装脚手架 npm install -g vue/cli 创建项目:切换到项目所在目录 vue create xxx 按照指引选择vue版本 创建成功 根据指引依次输入上面指令即可运行项目 也可使用vue ui在界面上完成创建&…...
Java程序的执行顺序、简述对线程池的理解
点个关注,必回关 文章目录一、Java程序是如何执行的二、合理利用线程池能够带来三个好处一、Java程序是如何执行的 我们日常的工作中都使用开发工具(IntelliJ IDEA 或 Eclipse 等)可以很方便的调试程序,或者是通 过打包工具把项目…...
【前言】嵌入式系统简介
随手拍拍💁♂️📷 日期: 2022.12.01 地点: 杭州 介绍: 2022.11.30下午两点时,杭州下了一场特别大的雪。隔天的12月路过食堂时,边上的井盖上发现了这个小雪人。此时边上的雪已经融化殆尽,只有这个雪人依旧维持着原状⛄…...
React设计原理—1框架原理
阅读前须知 本文是笔者学习卡颂的《React设计原理》的读书笔记,对书中有价值内容以Q&A方式进行呈现,同时结合了自己的理解🤔阅读时推荐先看问题,想想自己的答案,再和答案比对一下本文属于前端框架科普,…...
(C00034)基于Springboot+html前后端分离技术的宿舍管理系统-有文档
基于Springboothtml技术的宿舍管理系统-有文档项目简介项目获取开发环境项目技术运行截图项目简介 基于Springboothtml的前后端分离技术的宿舍管理系统项目为了方便对学生宿舍进行管理而设计,分为后勤、宿管、学生三种用户,后勤对整体宿舍进行管理、宿管…...
Flink面试题
一 基础篇Flink的执行图有哪几种?分别有什么作用Flink中的执行图一般是可以分为四类,按照生成顺序分别为:StreamGraph-> JobGraph-> ExecutionGraph->物理执行图。1)StreamGraph顾名思义,这里代表的是我们编写…...
Python学习笔记
前言:又从仓库翻出来了一些以前总结的文档,以下内容是我初学Python时网上找的或是图书馆借书抄写的笔记,现在再看有点零散不成体系,但是也还是纪念一下子吧。 Python学习笔记 对于初学编程的人来说,Python可以缩短编…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
