LabVIEW与PLC交互

devtools/2025/2/8 17:33:25/

一、写法

写命令立即读出

写命令后立即读出,在同一时间不能有多个地方写入,因此需要在整个写入后读出过程加锁
在这里插入图片描述
项目中会存在多个循环并行执行该VI,轮询PLC指令
在这里插入图片描述
在锁内耗时,就是TCP读写的实际耗时为5-8ms,在主VI六个循环里统计的耗时是读取PLC寄存器的整个耗时为10-40ms:
在这里插入图片描述
因此可以得出结论,由于锁会让TCP读写的代码块变为同步,因此如果越多地方在同一时操作PLC寄存器,会增加整体耗时。
在项目中轮询信号应该只在一个地方批量把寄存器里的值读取出来。

写法1:以"写命令立即读出"用一个地方批量读取,其他地方间隔写入

下面用fins udp进行测试:

  • 读取是可重入
  • 写入是不可重入
  • 在操作tcp时加锁

工况1

  • 一个循环批量轮询PLC信号,间隔1ms
  • 一个循环读取字符串(INT数组),间隔2000ms
  • 32个循环4s内随机间隔写入一个寄存器
    在这里插入图片描述
    在这里插入图片描述
    轮询的耗时大概为20-30ms,写入的时间也大概为20-30ms,对应
    在这里插入图片描述

工况2

  • 一个循环批量轮询PLC信号,间隔1ms
  • 一个循环读取字符串(INT数组),间隔1ms
  • 32个循环4s内随机间隔写入一个寄存器
    轮询的耗时大概为20-50ms,写入的时间也大概为20-50ms,耗时相对第一种加长
    在这里插入图片描述
    增加一个读取条码的循环后,耗时增加

工况3

  • 一个循环批量轮询PLC信号,间隔1ms
  • 一个循环读取字符串(INT数组),间隔1ms
  • 32个循环写入一个寄存器,间隔1ms
    轮询的耗时大概为20-50ms,写入的时间也大概为20-50ms,耗时相对第一种加长,相对第二种无变化
    在这里插入图片描述
    结合工况2,可以得出write.vi的间隔减少,不影响read.vi的耗时,因此轮询的地方越少越好

工况4

  • 一个循环批量轮询PLC信号,间隔1ms
  • 一个循环读取字符串(INT数组),间隔1ms
  • 32个循环写入一个寄存器,间隔1ms
  • 增加8个循环轮询一个寄存器,间隔1ms
    轮询的耗时大概为150-200ms,写入的时间也大概为150-200ms,耗时大大加长
    在这里插入图片描述
    在这里插入图片描述
    结合工况2和工况3,可以得出read.vi的间隔减少,会影响read.vi的耗时,因此轮询的地方越少越好

工况5

  • 一个循环批量轮询PLC信号,间隔1ms
  • 一个循环读取字符串(INT数组),间隔1ms
  • 32个循环写入一个寄存器,间隔1ms
  • 增加8个循环轮询一个寄存器,间隔2000ms
    轮询的耗时大概为20-50ms,写入的时间也大概为20-50ms,耗时相对第一种加长,和第二种相当
    在这里插入图片描述
    在这里插入图片描述
    结合工况3和工况4,可以得出read.vi的间隔减少,会影响read.vi的耗时,但是间隔较长的话,影响会比较小,因此轮询的地方越少越好

工况5

  • 一个循环批量轮询PLC信号,间隔1ms
  • 一个循环读取字符串(INT数组),间隔2000ms
  • 32个循环写入一个寄存器,间隔1ms
  • 增加8个循环轮询一个寄存器,间隔2000ms
    轮询的耗时大概为20-50ms,写入的时间也大概为20-50ms,耗时相对第一种加长,和第二种相当
    但是读取条码的耗时会加长,30-158ms
    在这里插入图片描述
    在这里插入图片描述
    结合工况5,可以得出read.vi的耗时需要看同一时间有多少在执行,由于锁,耗时会浮动较大

二、测试

  • PC和PLC交互的耗时在于:①交互的时间,多个PC操作一个PLC的时候,可能会减慢,②同一个程序,多个地方读写,锁的耗时

  • PC执行一条读/写指令的耗时是相同的,批量读1000个地址和读1个地址的耗时是一样的

  • 多个地方在同时读写,会因为锁的原因,实际执行是按顺序执行的,也就是说,同一时间,很多地方在读/写的话,会存在先后执行关系
    以下日志实际是6个同时写入,<注液孔定位1X_PC>先写完,<注液孔定位2Data_PC>最后写完,总耗时是411
    在这里插入图片描述

  • 以50ms轮训,PLC拿到复位信号,大概在30ms以内,说明PC和PLC彼此响应的时间都比较快
    在这里插入图片描述

三、交互原则

1、所有地址规划在一个较小的范围内,以免返回字节过多,测试1000个一次读取和一次
2、尽量减少轮询的地方,最好只有一个循环在轮询,通过队列来触发流程
3、最简交互:

  • 握手交互
    ①PLC→PC:将结论置0,将握手赋值非0,具体值可以再规划,例如可以按照工位,触发工位1,就将握手赋值1等等
    ②PC→PLC:轮询握手,不为0时,把值缓存下来,并将握手赋值为0
  • 数据交互
    ③PC→PLC:执行正常流程,把所有该发送的数据尽量调整至一条指令发送,由于大部分PLC不支持随机写,所以要求数据尽量连续

http://www.ppmy.cn/devtools/157138.html

相关文章

Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用

概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案&#xff0c;包括 DTO语言 更全面更强大的缓存机制&#xff0c;以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力&#xff0c;包括Jimmer独创的远程异常 …

尚硅谷spring框架视频教程——学习笔记二(数据库、事务、webflux)

目录 一、数据库操作二、事务操作1. 事务的四个特性2. 事务的底层逻辑3. 注意事项4. 启动事务操作5. 事务传播行为&#xff08;propagation&#xff09;6. 事务隔离级别7. 其他配置 三、Spring5新功能——webflux 一、数据库操作 spring框架使用JDBCTemplate对JDBC&#xff08…

华为支付-免密支付接入免密代扣说明

免密代扣包括支付并签约以及签约代扣场景。 开发者接入免密支付前需先申请开通签约代扣产品&#xff08;即申请配置免密代扣模板及协议模板ID&#xff09;。 华为支付以模板维度管理每一个代扣扣费服务&#xff0c;主要组成要素如下&#xff1a; 接入免密支付需注意&#x…

SQL条件分支中的大讲究

在SQL中&#xff0c;条件分支用于根据不同的条件执行不同的操作&#xff0c;适用于数据查询、数据更新以及存储过程等场景。合理使用SQL条件分支&#xff0c;可以优化数据操作流程&#xff0c;提高代码的可读性和可维护性。 目录 1. 逻辑判断的基本概念 2. CASE 语句&#xf…

Visual Studio(VS)没有显示垂直滚轮or垂直滚轮异常显示

前言&#xff1a; 前段时间&#xff0c;我换上了新电脑。满心欢喜地安装好 VS&#xff0c;准备大干一场时&#xff0c;却发现了一个小麻烦 —— 垂直滚轮显示异常&#xff08;如图 1&#xff09;。这种显示方式实在让我难以适应&#xff0c;每一次操作都觉得别扭。 于是&#…

Redis进阶

Redis持久化&#xff1a; 前面我们讲到mysql事务有四个比较核心的特性&#xff1a; 原子性&#xff1a;保证多个操作打包成一个。一致性&#xff1a;A给B100&#xff0c;A少一百&#xff0c;B必须多一百。持久性&#xff1a;针对事务操作必须要持久生效&#xff0c;不管是重启…

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…

Java项目: 基于SpringBoot+mybatis+maven+mysql实现的装饰工程管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql实现的装饰工程管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面…