读取CSV文件的用途

在使用TwinCAT3过程中,假如有些参数需要频繁的修改,或者是根据不同的制程要求设置不同的参数,这时候可以把这些参数放到一个CSV文件中,参数修改后,直接让TwinCAT plc重新读取参数就可以了,很方便。

本示例所使用到的功能块

FB_FileOpen, 用来打开CSV文件。
FB_FileGets, 用来取得CSV文件中的一整行数据。
FB_CSVMemBufferReader,更加数据分割符,把一整行数据解析成更小的数据单元。
FB_FileClose,用来关闭上文中打开的CSV文件。

所使用到的CSV文件

文件存放路径:C:\Temp\Demo.csv
CSV文件内容:

假定有四个参数Parameter1~Parameter4 需要经常调整,现场技术员不需要到plc程序里边,而只需要修改此CSV参数,然后重新读取数据就可以了。
在此,我把第一行Parameter1~Parameter4称为title行。
把100,110,120,132,成为参数行(Parameters)

具体代码

  1. 变量声明代码块
PROGRAM MAIN
VAR(*Huang HanSheng 2017-03-21*)   (* Read CSV file from computer*)fbFileClose: FB_FileClose;  fbFileGets: FB_FileGets;fbFileOpen: FB_FileOpen;fbCSVMemBufferReader: FB_CSVMemBufferReader;sCSVField,sCSVLine,tmpString: T_maxstring;  fileName:STRING := 'C:\Temp\Demo.csv';  //file directorylineIdx:INT;        //lineIdx=0-->Title, lineIdx=1-->ParametersSteps:eSteps;       // 自己定义的一个枚举变量bStart: BOOL;   strPara: ARRAY[1..4] OF STRING;  //输出参数数组   strTitle: ARRAY[1..4] OF STRING;  //输出参数Title数组
END_VAR

主程序代码段

DEFAULT_CSV_FIELD_SEP:= 16#2C;  //配置CSV文件的分割符,16#2C表明各个参数之间是用逗号分隔的。
IF bStart THEN      //bStart是总的开始变量,把bStart置位true,则程序开始读取数据CASE Steps OFStep_Init:          //读取CSV文件初始步骤fbFileOpen(bExecute:=FALSE);fbFileClose(bExecute:=FALSE);fbFileGets(bExecute:=FALSE);lineIdx:= 0;            Steps:= Step_OpenFile;Step_OpenFile:      //FB_FileOpen 用打开csv文件  fbFileOpen(sNetId:='',sPathName:=fileName,nMode:=FOPEN_MODEREAD OR FOPEN_MODETEXT, ePath:=PATH_GENERIC,bExecute:=TRUE,tTimeout:=T#3S,bBusy=> ,bError=>,nErrId=>,hFile=> );IF NOT fbFileOpen.bBusy AND NOT fbFileOpen.bError THEN  //确保打开Demo.csv文件正确无错误的情况下执行下一步          Steps:= Step_Getfile;END_IFStep_Getfile:   //用FB_FileGets取得文件中的一行数据,并把数据存放到sCSVLine变量中fbFileGets(sNetId:='',hFile:=fbFileOpen.hFile,bExecute:=TRUE,tTimeout:=T#3S,bBusy=> , bError=>,nErrId=> ,sLine=>sCSVLine,bEOF=> );IF  NOT fbFileGets.bBusy AND NOT fbFileGets.bError THEN(* FB_FileGets中sCSVLine读取到的数据是以一个换行符'$N'结尾的,但是在FB_CSVMemBufferReader功能块中,需要使用回车换行符'$R$N'来作为一行数据结束的分割符,所以此处为读取的数据添加'$R' 符号*)IF RIGHT(STR:= sCSVLine,SIZE:= 1) = '$N' THENsCSVLine:= REPLACE(STR1:=sCSVLine, STR2:='$r$n',L:=2,P:= LEN(STR:=sCSVLine) );                    END_IFfbFileGets(bExecute:=FALSE);//读取一行完成后,就停止执行FB_FileGets功能块IF lineIdx = 0 THEN         //此处如果lineIdx=0,则读取Title行Steps:=Step_Title;ELSIF lineIdx=1 THEN        此处如果lineIdx=1,则读取参数行Steps:=Step_Para;END_IFlineIdx:= lineIdx+1;END_IFStep_Title: //读取参数的Title,并用FB_CSVMemBufferReader分解为单个的数据,存入strTitle数组中//--------------------read 1st titlefbCSVMemBufferReader(eCmd:=eEnumCmd_First,pBuffer:=ADR(sCSVLine),cbBuffer:=SIZEOF(sCSVLine)-1, bOk=> ,getValue=>sCSVField, pValue=> ,cbValue=> ,bCRLF=> ,cbRead=> );strTitle[1]:= CSVFIELD_TO_STRING(in:= sCSVField,bQM:= FALSE);//--------------------read 2nd titlefbCSVMemBufferReader(eCmd:=eEnumCmd_Next,pBuffer:=ADR(sCSVLine),cbBuffer:=SIZEOF(sCSVLine)-1, bOk=> ,getValue=>sCSVField, pValue=> ,cbValue=> ,bCRLF=> ,cbRead=> );strTitle[2]:= CSVFIELD_TO_STRING(in:= sCSVField,bQM:= FALSE);//--------------------read 3rd titlefbCSVMemBufferReader(eCmd:=eEnumCmd_Next,pBuffer:=ADR(sCSVLine),cbBuffer:=SIZEOF(sCSVLine)-1, bOk=> ,getValue=>sCSVField, pValue=> ,cbValue=> ,bCRLF=> ,cbRead=> );strTitle[3]:= CSVFIELD_TO_STRING(in:= sCSVField,bQM:= FALSE);//--------------------read 4th titlefbCSVMemBufferReader(eCmd:=eEnumCmd_Next,pBuffer:=ADR(sCSVLine),cbBuffer:=SIZEOF(sCSVLine)-1, bOk=> ,getValue=>sCSVField, pValue=> ,cbValue=> ,bCRLF=> ,cbRead=> );strTitle[4]:= CSVFIELD_TO_STRING(in:= sCSVField,bQM:= FALSE);// 让Step 重回到Step_Getfile,准备读取参数行Steps:= Step_Getfile;Step_Para: //读取参数行,并用FB_CSVMemBufferReader分解为单个的数据,存入strPara中fbCSVMemBufferReader(eCmd:=eEnumCmd_First,pBuffer:=ADR(sCSVLine),cbBuffer:=SIZEOF(sCSVLine)-1, bOk=> ,getValue=>sCSVField, pValue=> ,cbValue=> ,bCRLF=> ,cbRead=> );strPara[1]:= CSVFIELD_TO_STRING(in:= sCSVField,bQM:= FALSE);//--------------------read 2nd parameterfbCSVMemBufferReader(eCmd:=eEnumCmd_Next,pBuffer:=ADR(sCSVLine),cbBuffer:=SIZEOF(sCSVLine)-1, bOk=> ,getValue=>sCSVField, pValue=> ,cbValue=> ,bCRLF=> ,cbRead=> );strPara[2]:= CSVFIELD_TO_STRING(in:= sCSVField,bQM:= FALSE);//--------------------read 3rd parameterfbCSVMemBufferReader(eCmd:=eEnumCmd_Next,pBuffer:=ADR(sCSVLine),cbBuffer:=SIZEOF(sCSVLine)-1, bOk=> ,getValue=>sCSVField, pValue=> ,cbValue=> ,bCRLF=> ,cbRead=> );strPara[3]:= CSVFIELD_TO_STRING(in:= sCSVField,bQM:= FALSE);//--------------------read 4th parameterfbCSVMemBufferReader(eCmd:=eEnumCmd_Next,pBuffer:=ADR(sCSVLine),cbBuffer:=SIZEOF(sCSVLine)-1, bOk=> ,getValue=>sCSVField, pValue=> ,cbValue=> ,bCRLF=> ,cbRead=> );strPara[4]:= CSVFIELD_TO_STRING(in:= sCSVField,bQM:= FALSE);// the steps go to Step_CloseSteps:= Step_Close;Step_Close: //关闭打开的Demo.csv文件fbFileClose(sNetId:='',hFile:=fbFileOpen.hFile,bExecute:=TRUE,tTimeout:=T#3S,bBusy=> , bError=> ,  nErrId=> );(*Huang HanSheng 2017-03-21*)   (* Read CSV file from computer*)
END_CASEEND_IF

Step的定义方法和具体代码:

TYPE eSteps :
(Step_Init := 0,Step_OpenFile:=10,Step_Getfile:=20,Step_Title:= 30,Step_Para:= 35,Step_Close:= 40,Step_Last:= 100
);
END_TYPE

TwinCAT3自带的Visualization功能检查程序

当点击bStart按钮后,就会下边的6个显示框会分别显示读取到的结果。

TwinCAT3读取CSV文件相关推荐

  1. 【OpenCV】读取csv文件

    csv简介 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个 ...

  2. 读取CSV文件内容,将其转换成JSON字符串输出

    CsvToJsonUtil 工具类作用:读取CSV文件内容,将其转换成JSON字符串输出 转换工具类代码如下: package com.test.util;import java.io.*; impo ...

  3. 技术图文:C# VS. Python 读取CSV文件指南

    背景 CSV 是一种以逗号进行特征分隔的文本文件类型,在数据库或电子表格中是一种非常常见的导入导出格式.本篇图文就以泰坦尼克号船员获救预测( Kaggle)中使用的数据集为例来说明 C#.Python ...

  4. python将二维列表内容写入和读取.csv文件

    python将列表按行写入至.csv文件 # coding:utf-8 import csv list=[[1,2,3,4],[5,6,7,8],[89,55,66666,5],['张三','李四', ...

  5. R语言读取CSV文件

    #读取CSV文件 data <- read.csv("drugbank.csv", header = FALSE)

  6. pandas读取csv文件的前几行数据(nrows参数)、pandas读取csv文件的中间几行数据(skiprows=range(a,b))

    pandas读取csv文件的前几行数据(nrows参数).pandas读取csv文件的中间几行数据(skiprows=range(a,b)) 目录 pandas读取csv文件的前几行数据.pandas ...

  7. pandas读取csv文件发生编码(encoding)错误:获取文件编码格式之后再读取文件

    pandas读取csv文件发生编码(encoding)错误:获取文件编码格式之后再读取文件 目录

  8. python读取csv文件并修改指定内容-pandas读取CSV文件时查看修改各列的数据类型格式...

    下面给大家介绍下pandas读取CSV文件时查看修改各列的数据类型格式,具体内容如下所述: 我们在调bug的时候会经常查看.修改pandas列数据的数据类型,今天就总结一下: 1.查看: Numpy和 ...

  9. python读取csv文件的方法-CSV文件在Python中的几种处理方式

    Comma Separated Values,简称CSV,它是一种以逗号分隔数值的文件类型.在数据库或电子表格中,它是最常见的导入导出格式,它以一种简单而明了的方式存储和共享数据,CSV文件通常以纯文 ...

最新文章

  1. 【Qt】菜单栏、工具栏、状态栏、右键菜单的实现
  2. hung-yi lee_p5-7_Gradient Descent(梯度下降)
  3. NeurIPS 2020 接收率创史低,千篇论文被摘要拒稿,官方:错误率只有 6%
  4. python commands模块_python commands模块在python3.x被subprocess取代
  5. MVC3.0 Razor实现Ajax数据分页
  6. ITK:将图像粘贴到另一个
  7. [傅里叶变换及其应用学习笔记] 九. 继续卷积的讨论
  8. sqlserver 数据库角色成员身份
  9. spring mvc---controller返回值
  10. 处女座的期末复习-贪心
  11. 我的世界光影Java优化_教程/提高帧率 - Minecraft Wiki,最详细的官方我的世界百科...
  12. oracle ebs 采购入库,ORACLE EBS/ERP 采购库存模块分录
  13. [开源]免费天气预报接口,提供七天预报(包括省市代码)
  14. Mac的邮件客户端使用--登录GMail邮箱和QQ邮箱的解决方案
  15. 高等数学---第一章导数定义的考法
  16. Python爬虫 Selenium实现自动登录163邮箱和Locating Elements介绍
  17. Tecplot中用excel表格绘制xy图的一点理解
  18. 计算二分类的特异性和灵敏度
  19. 机顶盒ttl无法输入_中兴盒子连接TTL线后无法输入代码、不跑码乱码的解决方法分享...
  20. 4、木马防范:木马分析检测及常见木马防护工具

热门文章

  1. 系统错误:蓝屏提示IRQL-NOT-LESS-OR EQUAL
  2. 二进制数与十六进制数之间如何互相转换
  3. 广义似然比检验matlab,第5章 资产定价模型的时间序列估计与检验.pptx
  4. [工作随笔]关于马戏团的故事
  5. js根据IP地址获取当前的省市
  6. RK3288 7.1 lt8911b MIPI转EDP
  7. 阿里原来这么容易就能进去…
  8. ps绘制超级五角星教程
  9. 读取raw格式数据,OpenCV显示
  10. 电池包IPX9K、IPX9测试目的