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可以缩短编…...
最适合入门的100个深度学习实战项目
🚨注意🚨:最近经粉丝反馈,发现有些订阅者将此专栏内容进行二次售卖,特在此声明,本专栏内容仅供学习,不得以任何方式进行售卖,未经作者许可不得对本专栏内容行使发表权、署名权、修改…...
AssertionError: 618 columns passed, passed data had 508 columns【已解决】
问题描述 程序中断,报错如下AssertionError: 618 columns passed, passed data had 508 columns Exception has occurred: ValueError 618 columns passed, passed data had 508 columns AssertionError: 618 columns passed, passed data had 508 columnsThe abo…...
166_技巧_Power BI 窗口函数处理连续发生业务问题
166_技巧_Power BI 窗口函数处理连续发生业务问题 一、背景 在生产经营的数据监控中,会有一类指标需要监控是否连续发生,从而根据其在设定区间中的连续频次来评价业务。 例如: 员工连续迟到天数。销售金额连续上升或者下降。用户连续登陆…...
电子科技大学人工智能期末复习笔记(五):机器学习
目录 前言 监督学习 vs 无监督学习 回归 vs 分类 Regression vs Classification 训练集 vs 测试集 vs 验证集 泛化和过拟合 Generalization & Overfitting 线性分类器 Linear Classifiers 激活函数 - 概率决策 ⚠线性回归 决策树 Decision Trees 决策树构建递归…...
使用DDD指导业务设计的总结思考
领域驱动设计(DDD) 是 Eric Evans 提出的一种软件设计方法和思想,主要解决业务系统的设计和建模。DDD 有大量难以理解的概念,尤其是翻译的原因,某些词汇非常生涩,例如:模型、限界上下文、聚合、…...
面试官问:如何确保缓存和数据库的一致性?
如果你对这个问题有过研究,应该可以发现这个问题其实很好回答,如果第一次听到或者第一次遇到这个问题,估计会有点懵,今天我们来聊聊这个话题。 1、问题分析 首先我们来看看为什么会有这个问题! 我们在日常开发中&am…...
16.数据库Redis
一、基本概念 Redis(Remote Dictionary Server)译为“远程字典服务”,它是一款基于内存实现的键值型 NoSQL 数据库, 通常也被称为数据结构服务器,这是因为它可以存储多种数据类型,比如 string(字…...
【Redis高级-集群分片】
单机安装Redis首先需要安装Redis所需要的依赖:yum install -y gcc tclRedis安装包上传到虚拟机的任意目录:我放到了/tmp目录:解压缩:tar -zxvf /tmp/redis-6.2.4.tar.gz -C /tmp解压后:进入redis目录:cd /t…...
CSDN - CSDN27题解
文章目录幸运数字题目描述解题思路AC代码投篮题目描述解题思路AC代码通货膨胀-x国货币题目描述解题思路AC代码最后一位题目描述解题思路AC代码CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/41 这次题目描述刚开始好像有些问题,之后被修正了…...
docker拉取mysql
搜索mysql版本docker search mysql搜索获赞数(星星数量) 大于 1000 的镜像docker search --filterstars1000 mysql搜索官方发布的版本docker search --filter is-officialtrue mysql搜索版本号docker search mysql57拉取docker pull devbeta/mysql57查看下载镜像docker images启…...
做网站三年3万块钱/常用的关键词挖掘工具
首先谈一下最简单的Bash博弈。Bash博弈是这样的:两个人,n个物品,每个人每次都可以取走1-m个物品,取走最后一个物品的人胜利。问先手在什么条件下必胜。 #include <bits/stdc.h> #define ll long long #define inf 0x3f3f3f…...
石家庄做网站的/seo咨询邵阳
对于从零开始建网站的新手,知道下面十大忠告,可以少走弯路,早日走上康庄大道。 1、一定要做网站规划方案 一个网站的成功与否与建站前的网站规划有着极为重要的关系。在建立网站前应明确建设网站的目的,确定网站的功能,…...
网站怎么做动态图片/企业推广方式有哪些
一、通用函数: colorbar 显示彩色条 语法:colorbar \ colorbar(vert) \ colorbar(horiz) \ colorbar(h) \ hcolorbar(...) \ colorbar(...,peer,axes_handle) getimage 从坐标轴取得图像数据 语法:Agetimage(h) \ [x,y,A]getimage(h) \ [...…...
东莞科技网站建设/网站seo推广
借鉴文章: 用vector实现普通平衡树!_致上-CSDN博客_vector平衡树 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1.插入数值 x 2.删除数值 x (若有多个相同的数…...
中国设计师联盟官网/美国seo薪酬
移植了下HAL,发现编译出现如下错误 error: LOGE was not declared in this scope 比较了一下android4.1的 system/core/include/cutils/log.h和android4.0的对应文件, 发现在4.1当中已经将所有的LOG宏前面加了一个字母A 。所以出现上述编译错误。 修改HA…...
威海市环翠区建设局网站/有站点网络营销平台
浏览器指纹定位攻击路径实例 浏览器指纹 有些网站访问日志,由于设置了代理转发,只记录了代理服务器的ip,并没有记录访问者IP,这时候,如何去识别不同的访问者和攻击源呢? 这时候可以通过浏览器指纹来定位不…...