TwinCAT 3:写入文件

2024-04-28

我想从 PLC 中导出一些数据,方法是将其写入文本文件并将其保存到 USB 记忆棒中。我设法创建了文本文件,但我无法写入任何内容。

我在以下代码中使用 TwinCAT 标准库中的函数:

PROGRAM P_WriteFile
VAR
    nStateP         :   INT :=  1;
    fbOpenFile      :   FB_FileOpen;    // open or create file
    fbWriteFile     :   FB_FilePuts;    // write to file
    fbCloseFile     :   FB_FileClose;   // Close file

    sPath           :   STRING  :=  '\Hard Disk2\foobar.txt';    // target path
    sAmsNetID       :   STRING  := '1.23.34.456.1.1';
    sOutput         :   STRING  :=  'foo';

    bDone           :   BOOL;
END_VAR

CASE nStateP OF
1:
// open/create file
    fbOpenFile(sNetId := sAmsNetID, sPathName := sPath, nMode := 2, bExecute := TRUE, tTimeout := INT_TO_TIME(200), bBusy =>, bError => , nErrId =>, hFile => );
    IF fbOpenFile.bBusy THEN
        nStateP :=  2;
    END_IF
2:
    // write to file
    IF NOT fbOpenFile.bError THEN
        fbWriteFile(sNetId := sAmsNetID, hFile := fbOpenFile.hFile, sLine := sOutput, bExecute := TRUE, tTimeout := INT_TO_TIME(200), bBusy =>, bError =>, nErrId =>);
        fbOpenFile(bExecute := FALSE);
    END_IF  
    IF fbWriteFile.bBusy THEN
        nStateP :=  3;
    END_IF

3:
    // Close file
    IF NOT fbWriteFile.bBusy AND NOT fbWriteFile.bError THEN
        fbCloseFile(sNetId := sAmsNetID, hFile := fbOpenFile.hFile, bExecute := TRUE, tTimeout := INT_TO_TIME(200), bBusy =>, bError =>, nErrId =>);
    END_IF

    IF fbWriteFile.bBusy THEN
        nStateP :=  4;
    END_IF

4:
    IF NOT fbCloseFile.bBusy AND NOT fbCloseFile.bError THEN
        bDone   :=  TRUE;
        nStateP :=  1;
    ELSE
        bDone   :=  FALSE;
    END_IF
END_CASE

该程序输入所有状态,但结果是一个空文本文件,我无法在控制面板上打开该文件。 (“访问 \Hard Disk2\foobar.txt 时发生共享冲突”)

此外,函数的 bBusy - 变量(例如 FB_FileOpen.bBusy)不会更改回“FALSE”。

如果有人能帮助我,那就太好了! 谢谢 :)


一般来说: busy 标志告诉您功能块当前正忙于执行您请求 FB 执行的操作。这意味着您不应在状态机繁忙时更改状态机的状态,反之亦然。在进行下一步之前,您还应该检查操作是否成功(通过查看 bError 标志)。只要您正在调用的功能块处于繁忙状态 (bBusy = true),您就可以在 bExecute 标志设置为低的情况下调用该功能块。我通常做的是将其设置为两个单独的阶段来打开,例如:

某种伪代码:

Step1_Open:
  FBOPENFILE(bExecute=TRUE)...
   GOTO STEP2_OPEN

Step2_Open:
  FBOPENFILE(bExecute=FALSE)
  IF NOT FBOPENFILE.bBusy AND NOT FBOPENFILE.bError THEN
     GOTO Step3_StartWrite
  END_IF

Step3_StartWrite
  FBWRITEFILE(bExecute=TRUE)
  GOTO STEP4_WRITEFILE

Step4_Writefile:
  FBWRITEFILEFILE(bExecute=FALSE)
  IF NOT FBWRITEFILEFILE.bBusy AND NOT FBWRITEFILEFILE.bError THEN
     NEXT STEP
  END_IF

...等等...

因此,在您的示例中,第二阶段非常关键。在写入完成之前不应关闭文件,一旦 bBusy 为 false,就会关闭该文件。您基本上要做的就是在文件仍在写入时关闭它!另外,您可以删除“fbOpenFile(bExecute := FALSE);”在此阶段,因为一旦您(成功)打开文件并拥有文件句柄,您就不需要再对该功能块进行任何调用。

其他想法:

sAmsNetId 是您计算机本地的吗?如果是本地的我认为不需要提供。

我已经编写了自己的文件编写器,我已经使用它很长一段时间并且正在工作。它的代码是:

fbRisingEdge(CLK := bExecute);
CASE eFileWriteStep OF
    E_FileWriteStep.IDLE :
        IF fbRisingEdge.Q THEN
            nFileHandle := 0;
            bBusy := TRUE;
            eFileWriteStep := E_FileWriteStep.OPEN;
            nFileWriteSubStep := 0;
        END_IF

    E_FileWriteStep.OPEN :
        CASE nFileWriteSubStep OF
            0 :
                fbFileOpen(sPathName := sPathName, bExecute := FALSE);
                fbFileOpen(sPathName := sPathName, bExecute := TRUE);
                nFileWriteSubStep := nFileWriteSubStep + 1;
            1 :
                fbFileOpen(bExecute := FALSE);
                IF NOT fbFileOpen.bBusy THEN
                    IF fbFileOpen.bError THEN
                        bError := TRUE;
                        eFileWriteStep := E_FileWriteStep.CLEAN;
                        nFileWriteSubStep := 0;
                    ELSE
                        nFileHandle := fbFileOpen.hFile;
                        eFileWriteStep := E_FileWriteStep.WRITE;
                        nFileWriteSubStep := 0;
                    END_IF
                END_IF
            END_CASE

    E_FileWriteStep.WRITE :
        CASE nFileWriteSubStep OF
            0 :
                fbFileWrite(bExecute := FALSE);
                fbFileWrite(hFile := nFileHandle,
                            pWriteBuff := aFileData,
                            cbWriteLen := UDINT_TO_UINT(UPPER_BOUND(aFileData, 1)),
                            bExecute := TRUE);
                nFileWriteSubStep := nFileWriteSubStep + 1;
            1 :
                fbFileWrite(bExecute := FALSE);
                IF NOT fbFileWrite.bBusy THEN
                    IF fbFileWrite.bError THEN
                        bError := TRUE;
                        eFileWriteStep := E_FileWriteStep.CLEAN;
                    ELSE
                        eFileWriteStep := E_FileWriteStep.CLEAN;
                        nBytesWritten := fbFileWrite.cbWrite;
                    END_IF
                nFileWriteSubStep := 0;
                END_IF
        END_CASE

    E_FileWriteStep.CLOSE :
        CASE nFileWriteSubStep OF
            0 :
                fbFileClose(bExecute := FALSE);
                fbFileClose(hFile := nFileHandle, bExecute := TRUE);
                nFileWriteSubStep := 1;
            1 :
                fbFileClose(bExecute := FALSE);
                IF NOT fbFileClose.bBusy THEN
                    IF fbFileClose.bError THEN
                        bError := TRUE;
                    END_IF
                eFileWriteStep := E_FileWriteStep.CLEAN;
                nFileHandle := 0;
                nFileWriteSubStep := 0;
                END_IF
        END_CASE

    E_FileWriteStep.CLEAN :
        IF nFileHandle <> 0 THEN
            eFileWriteStep := E_FileWriteStep.CLOSE;
            nFileWriteSubStep := 0;
        ELSE
            eFileWriteStep := E_FileWriteStep.IDLE;
            bBusy := FALSE;
        END_IF
END_CASE

您可以在开始时通过上升沿激活功能块。要写入的数据由字节数组 (aFileData) 提供。在此状态机的末尾,您还有一些清理代码以及最终的错误处理。在此代码中,您还可以看到我如何确保上一步成功,然后再继续下一步。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TwinCAT 3:写入文件 的相关文章

  • PLC的自抗扰控制(ADRC)算法

    自抗扰控制算法 网上很多文章有理论推导和讲解 大家也可以关注韩京清教授的论文和书籍 这里就不赘述了 博途PLC ADRC自抗扰控制完整源代码可以参看下面这篇文章 博途PLC 1200 1500PLC自抗扰控制 ADRC 完整SCL源代码 R
  • 基于PLC S7-200恒压变频供水系统设计

    基于PLC S7 200恒压变频供水系统设计 有Wincc仿真设计 xff0c 梯形图程序 系统主要由PLC 变频器 电动机 水阀 传感器构成 xff0c 该系统用PLC作为控制器 xff0c 将控制信号传递给变频器 xff0c 变频器控制
  • 三菱PLC与上位机进行通讯

    三菱PLC与上位机串口通信 一 三菱Fx系列PLC编程口通讯协议地址算法1 DEVICE READ xff08 读出软设备状态值 xff09 2 DEVICE WRITE xff08 向PLC 软设备写入值 xff09 3 位设备强制置位
  • 西门子PLC S7-200SMART Modbus TCP通讯的步骤和要点

    Modbus TCP是一个非常传统 xff0c 应用广泛的通讯协议 xff0c 很多智能设备都支持该协议 西门子S7 200SMART及1200 1500系列都免费支持 xff08 300和400还是要高昂收费 xff09 xff0c 并且
  • Smart PLC与Wincc通过Simatic NET建立OPC通讯(1)

    有已经组态好的XDB文件可以在我的博客下载中心下载SIMATIC NET通讯 xff0c 下载完成直接导入到Simaticnet软件即可 xff0c 如下图 xff1a 下载链接 xff1a https download csdn net
  • 欧姆龙fins通讯协议

    https wenku baidu com view fca336f6e43a580216fc700abb68a98270feac67 html
  • 西门子PLC内部的数据类型大全

    西门子PLC的数据类型种类繁多 本文进行了收集 并指明了适用范围 长度 供需要进行数据采集和分析的朋友们参考 本表格整理自博图V14 不保证更高级版本不会新增数据类型 请使用中注意 类别 数据类型 长度 位 长度 字节 S7 300 400
  • PLC的通信模式

    说到PLC的通讯模式 主要有两种 一种是并行通讯模式 一种是串行通讯模式 这两种通信模式有什么区别呢 PLC串行通信 串行通信一般是用二进制的位 BIT 为单位的数据传输方式 每次都只传送一位 然后除了地线之外 在一个数据传输方向上面只要一
  • 西门子S7-300 PLC 的50个经典问题

    1 使用CPU 315F和ET 200S时应如何避免出现 通讯故障 消息 使用CPU S7 315F ET 200S以及故障安全DI DO模块 那么您将调用OB35 的故障安全程序 而且 您已经接受所有监控时间的默认设置值 并且愿意接收 通
  • step7-micro/win 在win10系统下安装步骤

    1 摘要 安装不成功可以多尝试几次 别人安装N次 下载过N个安装包 也就这个安装包安装成功了 其他的不成功 原因尚未可知 2 准备工作 软件包链接 https pan baidu com s 1VcKuwNO3czAi0zSbJiqjDw
  • 三菱PLC 红绿灯 步进指令 STL

    自己写的红绿灯 有启动 停止两个按钮 南北通行4S 东西通行5S 链接 https caiyun 139 com m i 0E5CJEoVGt4D0 提取码 kVOA SET 启动 启动标志 RST 启动 停止标志 SET 停止 停止标志
  • TwinCAT3中松下伺服A6BF的全闭环设置步骤

    以TwinCAT3和A6BF进行全闭环测试 带有编码器和绝对式光栅尺 实测有效 扫描硬件 首先安装EtherCAT网口驱动 点击安装网卡驱动 TWINCAT Show Realtime Ethercat Compatibel Devices
  • 西门子PLC s7-1200学习之路

    1 Introduction 最近因为一个项目需要使用西门子PLC 买了一个入门级的PLC s7 1200 并完成了一个PLC和PC通过TCP进行通信的小程序 为了防止活干完了 内容就全忘了 所以用一个笔记进行梳理和总结 入门一种语言 需要
  • 西门子、三菱指令大全

    一 西门子PLC编程指令 1 位逻辑指令 1 1 常开接点 地址 1 2 常闭接点 地址 1 3 XOR 位异或 1 4 NOT 信号流反向 1 5 输出线圈 1 6 中间输出 1 7 R 线圈复位 1 8 S 线圈置位 1 9 RS 复位
  • 西门子S7-200 SMART编程软件下载

    概述 西门子S7 200 SMART是一款入门级且非常好用的PLC 相比较于欧姆龙 三菱等同级别PLC SMART的编程软件架构更合理且逻辑性强 且官方一直在持续更新 截止于2021年8月 官方最新版编程软件 STEP7 MicroWIN
  • Java使用S7协议连接西门子PLC1200、1500

    Java使用S7协议连接西门子PLC1200 1500 1 引入s7包 2 测试代码 可参考使用 1 引入s7包 使用 https github com s7connector s7connector
  • 从 C# 向 PLC 发送 FINS 命令

    我尝试发送FINS命令通过 UDP 从 PC C NET 发送到 PLC 以太网模块 Omron 但没有从 PLC 得到任何响应 并且不知道从哪里可以开始故障排除 PLC has a very simple ladder logic as
  • TwinCAT3 基于 Jenkins 构建

    是否可以在 Jenkins 上构建 TwinCAT3 解决方案 我已经用 msbuild 和 devenv com 尝试过了 msbuild MSBuild 不支持 tspproj devenv com tspproj 找不到该项目类型所基
  • 如何将 BIT2 类型链接到变量?

    In most input cardsBeckhoff 有两个变量 Limit 1 and limit 2 他们有个BIT2datatype 大小为0 2字节 即有两位 如下图所示Limit 1 Bit0 Value smaller equ
  • OPC-UA 的替代方案 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 作为访问由各种 PLC 组成的系统的过程数据的解决方案 是否有 OPC UA 的合适替代方案 独立于平

随机推荐

  • 在 Swift 4 IOS 中将 XML 数据获取到 String 中

    我有一个 XML 字符串格式 我想使用 Swift 4 从它获取单个值到字符串变量 我的数据如下 let myString Adasdnajinasdshabjdbaiusd Encrypted Text Sample let MyResu
  • 分段表单上传和 NSURLSession.uploadTaskWithRequest 之间的区别

    来自网络编程领域 我非常喜欢使用多部分表单请求来上传文件 然而 在iOS中 我们有一个东西叫做NSURLSession用方法uploadTaskWithRequest 这似乎是调用进行图像上传等操作的方法 您能解释一下这两种方法之间的区别吗
  • XMLHttpRequest 无法加载 ZScaler 的问题

    我在 EC2 实例中托管了一个网站 并使用以下命令访问该页面http ec2 网址 该页面向同一实例上托管的另一个 Web 应用程序发出 ajax 请求 如果我访问通过 ZScaler 代理的页面 我会得到XMLHttpRequest ca
  • 后视模式无效

    为什么这个正则表达式在 Python 中有效 但在 Ruby 中无效
  • 如何以编程方式设置(文本)视图属性?

    我拼命尝试以编程方式设置表中单元格的 TextView 属性 但无法使其工作 每当我设置布局属性时 该字段将不会出现 但不会给出任何错误或异常 我将其归结为这个简单的例子 package mmo application listpro im
  • 如何包装 UnityEngine.Debug.Log 但在单击时保留代码行

    我有这种代码 目的是包装UnityEngine Debug Log所以我也可以在生产中禁用它们 以便我可以稍后查找 过滤 using System public enum LogType DEBUG CRITICAL public clas
  • 找不到不使用 GL11Ext 进行绘图的 android 2d opengl sprite 类的合适示例

    正如 SpriteMethodTest 所说 绘制精灵的方法有很多种 首先 我尝试了canvas 并遇到了一些性能问题 接下来 我决定学习opengl 我使用 GL11Ext 扩展取得了第一个成就 但是 默认情况下您知道 当您绘制纹理时 它
  • 如何使用 JAVA 将本地图像而不是 URL 发送到 Microsoft Cognitive Face API

    我正在尝试使用 Microsoft 认知服务的 Face API 我想知道如何通过 Rest API 调用将本地图像发送到 Face API 并使用它请求结果JAVA 有人可以帮我解决这个问题吗 Microsoft 在其网站上提供的测试选项
  • 如何将 Slick 插值查询拆分为多行?

    有什么方法可以将 Slick 插值查询拆分为代码中的多行吗 我的查询往往会变得相当长 所以我寻找类似以下的东西 val query sql select from DOCUMENTS sql where language lang orde
  • jQuery 文本区域中的每一行

    html
  • CDO.消息编码问题

    我们目前正在将邮件递送系统更改为仅使用UTF 8 发件人姓名似乎有问题 当电子邮件包含非 ASCII 字符 希伯来语 时 主题和正文呈现正常 但发件人姓名 如出现在我的 gmail 帐户中 变为 有一行代码 myMail BodyPart
  • 是否需要显式事务回滚?

    许多例子都主张显式回滚数据库事务 大致如下 using var transaction try do some reading and or writing here transaction Commit catch SqlExceptio
  • 查找数组中是否有任何项目符合条件

    我是 JavaScript 新手 现在 我有一个包含多个对象的数组 因此 我想迭代它 如果任何对象与条件匹配 那么我想返回一个值并停止该循环 我的 obj 数组就像 var obj type numberOfQuestions techno
  • 在生产 PostgreSQL 连接中将rejectUnauthorized 设置为 false 可以吗?

    我们最近转移到 Heroku 并在尝试将我们的应用程序连接到数据库时 它不断拒绝我们的查询 并显示消息 自签名证书 传入rejectUnauthorized解决了这个问题 但现在我想知道 我们应该在生产中这样做吗 如果没有 我们连接到 He
  • 尝试导入 cv2(opencv-python) 包时出错

    我正在尝试使用 cv2 opencv python 包访问我的网络摄像头 当我尝试导入它时 出现此错误 Traceback most recent call last File server py line 6 in
  • 在普罗米修斯中找不到查询 label_values [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 在 Grafana 文档中 我发现我应该能够查询我的 Prometheus 服务器以获取使用以下命令提供监控数据的所有实例 lab
  • Mysql使用tenant_id进行复合索引

    我们有一个多租户应用程序 该应用程序有一个包含 129 个字段的表 这些字段都可以在 WHERE 和 ORDER BY 子句中使用 我花了 5 天的时间试图找出最适合我们的索引策略 我获得了很多知识 但我仍然有一些问题 1 创建索引时 我应
  • 组件输入属性上的双向数据绑定

    我正在尝试在 angular2 上做一些事情 但我无法找到有关此行为的信息 我有一个应用程序实现像这样的自定义组件 import Component Input from angular2 core Component selector m
  • 如何将目录结构解析为字典?

    我有目录结构列表 例如 a b a b c a b c d a b c e a b c f g a b c f h a b c f i 我想将它转换成像树结构一样的字典 a b c d None e None f g None h None
  • TwinCAT 3:写入文件

    我想从 PLC 中导出一些数据 方法是将其写入文本文件并将其保存到 USB 记忆棒中 我设法创建了文本文件 但我无法写入任何内容 我在以下代码中使用 TwinCAT 标准库中的函数 PROGRAM P WriteFile VAR nStat