当前位置: 首页 > news >正文

借助PLC-Recorder,汇川中型PLC(AM、AC系列,CODESYS平台)2ms高速采集的方法

高速数据采集要保证速度,也要保证时刻的准确性。在windows系统里,时间稳定性是个很难的问题。如果PLC发送的数据里带有时间信息,则可以由PLC来保证采样周期的稳定性。

从V2.12版本开始,PLC-Recorder软件可以处理发送电文里的时间戳,有网友用0.24ms的速度外发,软件也能够稳定接收并精确确定数据的时刻。

本文向大家展示一下汇川CODESYS平台PLC(AM等系列)通过UDP快速通讯的实现方法。

一、测试条件

下面用AM401实现带有时间戳的高速数据采集,测试条件如下:

  • PLC的主任务设置成1ms的循环(最小只能设置成1ms。测试发现设置为“惯性滑行”时,实际周期为3ms)。
  • 通讯协议:UDP(目前只有该协议,在高速模式下才支持时间戳)。
  • 编程软件和系统:InoProShop(基于CODESYS V3平台)
  • PLC的系统版本:3.5.11.10,IP地址:192.168.0.1
  • 微型工控机(Intel® Celeron J1900 2.0GHz四核低功耗处理器) 4核 4G内存,SSD硬盘,无风扇,WIN10系统,无其他大型软件。IP地址:192.168.0.100。

二、测试结论

本次测试采用了连续循环,每两个周期发送一次(上升沿触发)。实测发送周期:2ms

三、PLC的发送程序

1、时间戳

通过读取PLC的启动后的运行时间(精确到纳秒,本软件支持微秒和毫秒时间戳)来获得时间戳,输出恰好uint32类型(PLC里是udint),此处选择微秒为单位,从0到4_294_967_295之间递增,自然翻转(自动归零)。70分钟翻转一次。时间戳是个时间差值,PLC-Recorder在开始记录时,会将首个时间戳与计算机的当前时间进行比较(对时),后续就用相对时间进行计算,并自动处理翻转的问题。因此,PLC不需要保证绝对时钟的准确性,只要相对稳定即可。

2、自定义的数据结构

本试验用联合数据类型(Union),结合结构变量解决结构体变量转字节数组的问题,详细参考文章。相关数据结构如下:

TYPE union_udint :
UNIONValue:UDINT;Bytes:ARRAY[0..3] OF BYTE;
END_UNION
END_TYPETYPE union_uint :
UNIONValue:UINT;Bytes:ARRAY[0..1] OF BYTE;
END_UNION
END_TYPETYPE union_real :
UNIONValue:REAL;Bytes:ARRAY[0..3] OF BYTE;
END_UNION
END_TYPETYPE union_lreal :
UNIONValue:LREAL;Bytes:ARRAY[0..7] OF BYTE;
END_UNION
END_TYPETYPE DUT_SEND_DATA:
STRUCTSTAMP :union_udint;//单位为微秒的时间戳data1:union_uint;//UInt类型的数值data2:union_real;//浮点数类型的数值data3:union_lreal;//双精度类型的数值	
END_STRUCT
END_TYPE

3、主程序的局部变量

VARUDP_Peer_1 :UDP_Peer;UDP_Send_1:UDP_Send;ib_Connect_Enable: BOOL:=TRUE;//连接允许PLC_IpAddrLocal:STRING:='192.168.0.1' ;//PIC本地IP地址,此处用于计算机仿真,实际请参考PLC配置进行修改。PLC_PortLocal:UINT:=1217;//PIC本地端口号vb_dConnection: __XWORD;//UDP通讯句柄ob_Connect_Done: BOOL;//连接完成ob_Connect_Busy: BOOL;//正在连接ob_Connect_Error: BOOL;//连接出错ob_Connect_Actived: BOOL;//连接成功ob_Connect_ErrorID: DWORD;//连接错误信息ib_Send_Enabled: BOOL:=TRUE;//发送允许	isi_ServerIP: STRING:='192.168.0.100' ;//服务器IP地址,此处用于计算机仿真,实际请参考PLC配置进行修改。;isi_ServerPort: UINT:=5010;	// 服务器端口号id_SendLength: UINT:=200;//发送长度(字节)id_SendBuffer:ARRAY[0..199] OF BYTE;//发送缓冲器。vd_SendTimeOut: UDINT:=500000;//超时长度usob_SendDone: BOOL;ob_SendBusy: BOOL;ob_SendErrorID: DWORD;sendData:DUT_SEND_DATA;clockus:ULINT;pArray:UINT;i:UINT;sendPulse:BOOL;
END_VAR

4、PLC程序

GetSystemTime(uliTimeUs=>clockus);//获取运行时间(微秒为单位)
sendPulse:=NOT(sendPulse);//发送脉冲,每周期跳变一次
sendData.STAMP.Value:=ULINT_TO_UDINT(clockus);//截取低4字节的值。
//周期计数
IF sendPulse THENsendData.data1.Value:=sendData.data1.Value+1;IF UINT_TO_INT( sendData.data1.Value) >=30000 THENsendData.data1.Value:=0;END_IFsendData.data3.Value:=UINT_TO_LREAL(sendData.data1.Value);
END_IF//数据打包到发送缓冲器,直接操作字节数组。
pArray:=0;
FOR i:=0 TO SIZEOF(sendData.STAMP.Bytes)-1 BY 1 DOid_SendBuffer[pArray]:=sendData.STAMP.Bytes[i];pArray:=pArray+1;
END_FOR
FOR i:=0 TO SIZEOF(sendData.data1.Bytes)-1 BY 1 DOid_SendBuffer[pArray]:=sendData.data1.Bytes[i];pArray:=pArray+1;
END_FOR
FOR i:=0 TO SIZEOF(sendData.data2.Bytes)-1 BY 1 DOid_SendBuffer[pArray]:=sendData.data2.Bytes[i];pArray:=pArray+1;
END_FOR
FOR i:=0 TO SIZEOF(sendData.data3.Bytes)-1 BY 1 DOid_SendBuffer[pArray]:=sendData.data3.Bytes[i];pArray:=pArray+1;
END_FOR
//UDP通讯链路创建
UDP_Peer_1(xEnable:=ib_Connect_Enable,strIpAddrLocal:=PLC_IpAddrLocal,uiPortLocal:=PLC_PortLocal,xDone=>ob_Connect_Done,xBusy=>ob_Connect_Busy,xError=>ob_Connect_Error,dwErrorID=>ob_Connect_ErrorID,	xActive=>ob_Connect_Actived,hPeer=>vb_dConnection);//UDP发送指令
UDP_Send_1(xExecute:=ob_Connect_Actived AND vb_dConnection<>0 AND ib_Send_Enabled AND sendPulse,hPeer:=vb_dConnection,strIpAddrDst:=isi_ServerIP,uiPortDst:=isi_ServerPort,uiSize:=id_SendLength,pbyData:=ADR(id_SendBuffer),udiTimeOut:=vd_SendTimeOut,xDone=> ob_SendDone,xBusy=>ob_SendBusy,dwErrorID=>ob_SendErrorID);

四、PLC-Recorder侧的通讯设置

请用帕姆齐设备类型,目前,仅该类型支持时间戳功能,并选择时间戳单位为us(PLC-Recorder V2.12.7开始支持该功能)。需要配置来源的IP地址及本机收听的端口号。

五、PLC-Recorder的通道配置

此处虽然配置了采集周期,但在高速模式下不再使用该周期,以收到信息的时刻为准(以下是PLC-Recorder V3的界面,与V2稍微不同,请注意)。

六、PLC-Recorder的变量配置

从最后一个变量的起始地址和变量长度可以确定该通道的通讯电文的长度。对于TCP类型的连接,电文长度需要通过最后变量进行确定(下例子看出电文长度为200字节)。

对于UDP类型的通讯,UDP是按照完整报文进行传输的,可以自动获取长度信息,因此,不需要关注最后变量。

变量配置时,不需要定义所有的变量,仅需要定义自己关注的变量即可。

起始地址为0的变量就是PLC里定义的时间戳。

七、记录数据的情况

这是用离线分析软件Ana打开的历史数据文件(分析时长:0.5小时,采集次数96万)。从左侧的统计数据可以看出,平均采集周期是2ms(与PLC1ms的周期对应)。从右侧的波形和标尺可以看出,点距非常均匀。

八、小结

汇川的中型PLC是基于CODESYS平台,UDP通讯程序可以供其他类似系统借鉴。

采集的速度越快,需要的技术越复杂,代价也越大。PLC-Recorder的主动采集模式,基本只需要在PLC-Recorder里配置变量,不需要在PLC做什么复杂工作,这种方式很便捷,但是速度也有限(最快20ms)。高速模式,就需要在PLC里配置通讯,组织数据,然后调用通讯语句,才能够实现,因此,对于PLC工程师也有了一点要求。

高速模式采用标准以太网通讯协议,这也是大部分PLC都具备的能力,因此,可以被广泛用于快速数据采集。

2023-10-8

相关文章:

借助PLC-Recorder,汇川中型PLC(AM、AC系列,CODESYS平台)2ms高速采集的方法

高速数据采集要保证速度&#xff0c;也要保证时刻的准确性。在windows系统里&#xff0c;时间稳定性是个很难的问题。如果PLC发送的数据里带有时间信息&#xff0c;则可以由PLC来保证采样周期的稳定性。 从V2.12版本开始&#xff0c;PLC-Recorder软件可以处理发送电文里的时间…...

vscode package.json文件开头的{总是提升警告

警告如下 Problems loading reference https://json.schemastore.org/stylelintrc.json: Unable to load schema from https://json.schemastore.org/stylelintrc.json: read ECONNRESET. 解决如下 在设置&#xff08;settings.json&#xff09;里 新增一条属性 "ht…...

$attrs 和 $listeners (vue2vue3)

目录 透传 Attributes Attributes 继承​ 对 class 和 style 的合并 v-on 监听器继承 深层组件继承 禁用 Attributes 继承 多根节点的 Attributes 继承 vue2 $attrs 和 $listeners $attrs 概念说明 $attrs 案例 $listeners 概念说明 $listeners案例 vue3 $attr…...

嵌入式系统中的加密性能:第2部分

本系列的第1部分讨论了影响系统级密码性能的硬件和软件变量。现在&#xff0c;在第2部分中&#xff0c;我们将重点介绍两种用于测量高级后备加速器性能的方法&#xff1a;1&#xff09;驱动器级加速器测试以识别加速器或SoC内存带宽约束&#xff0c;以及2&#xff09;应用程序/…...

STM32F103 最小系统 PCB 设计与原理

这篇文章是来自我学习&#xff1a; ​​​​​​带着你从手册开始画板 STM最小系统板教程系列(一)_哔哩哔哩_bilibili​​​​​​ 这套教程的笔记&#xff0c;同时本文中也参考了其他教程以及我遇到的困惑与自答&#xff0c;最终汇总。 一、单片机最小系统 单片机最小系统是由…...

JVM篇---第十一篇

系列文章目录 文章目录 系列文章目录一、如何选择垃圾收集器?二、什么是类加载器?三、什么是 tomcat 类加载机制?一、如何选择垃圾收集器? 如果你的堆大小不是很大(比如 100MB ),选择串行收集器一般是效率最高的。 参数: -XX:+UseSerialGC 。如果你的应用运行在单核的机…...

MongoDB——window11安装mongodb5.0.21版本服务端(图解版)

目录 一、mongodb官网下载地址二、安装步骤三、配置环境变量四、运行mongodb 一、mongodb官网下载地址 mongodb官网下载地址&#xff1a;https://www.mongodb.com/try/download/community 二、安装步骤 双击运行下载好的mongodb-windows-x86_64-5.0.21-signed.msi安装包&am…...

第1次 更多的bash shell命令

1.检测程序 程序都是进程在运行&#xff0c;进程里面有很多线程&#xff0c;面试经常会问进程和线程的区别&#xff0c;线程可以访问另一个线程的什么什么的&#xff0c;这些我都听腻了&#xff0c;区别就是进程会分配程序需要的空间&#xff0c;创建线程需要的资源&#xff0c…...

工业路由器项目应用(4g+5g两种工业路由器项目介绍)

引言&#xff1a; 随着工业智能化的不断发展&#xff0c;工业路由器在各个领域的应用越来越广泛。本文将介绍两个工业路由器项目的应用案例&#xff0c;一个是使用SR500 4g工业路由器&#xff0c;另一个是使用SR800 5g工业路由器。 详情&#xff1a;https://www.key-iot.com/i…...

国产开源无头CMS,MyCms v4.7 快捷生成接口开发后台

MyCms 是一款基于 Laravel 开发的开源免费的开源多语言商城 CMS 企业建站系统。 MyCms 基于 Apache2.0 开源协议发布&#xff0c;免费且可商业使用&#xff0c;欢迎持续关注我们。技术交流 QQ 群&#xff1a;887522124 加群请备注来源&#xff1a;如gitee、github、官网等 v4…...

C++(反向迭代器)

前言&#xff1a; 上一章我们介绍了适配器&#xff0c;也提了一下迭代器适配器&#xff0c;今天我们就从反向迭代器把迭代器适配器给解释一下。 既然 都叫迭代器容器了 就说名只要接口合适他可以封装实现各种容器需求包括vector list 。 目录 1.反向迭代器设计 1.1反向迭代…...

DataX和dataX-web 集群部署及使用

&#x1f4d1; DataX和dataX-web 集群部署及使用 一 . 安装前准备 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 DataX 采用 框架 插件 的模式…...

常见的数据存储方案:选择合适的方式来管理您的数据

对于数据存储方案的选择&#xff0c;是现代企业和个人都需要面对的重要决策。本文将为您介绍几种常见的数据存储方案&#xff0c;包括关系型数据库、NoSQL数据库以及分布式文件系统。通过了解每种方案的特点、操作方式和适用业务类型&#xff0c;希望能帮助您选择合适的数据存储…...

leetcode 221 最大正方形 + 1277 统计全为1的正方形子矩阵

题目 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 示例 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“…...

yolov7车牌识别(12种中文车牌类型)

12种中文车牌类型&#xff1a; 1.单行蓝牌 2.单行黄牌 3.新能源车牌 4.白色警用车牌 5 教练车牌 6 武警车牌 7 双层黄牌 8 双层武警 9 使馆车牌 10 港澳牌车 11 双层农用车牌 12 民航车牌 测试demo: 以yolov7-lite-s 为例: python detect_rec_plate.py --detect_model weigh…...

Mac PF命令防火墙

查看所有网络接口及其名称 ifconfig -a 文件目录&#xff1a;/etc/pf.conf 在文件末尾添加以下行&#xff1a; block drop from IP_ADDRESS其中&#xff0c;"IP_ADDRESS"是您要屏蔽的IP地址。 输入以下命令以重新加载pf防火墙配置文件&#xff1a; sudo pfctl …...

prototype-based learning algorithm(原型学习)

Prototype-based learning&#xff08;原型学习&#xff09;是一种机器学习方法&#xff0c;它的核心思想是通过存储一组代表性的样本&#xff08;原型&#xff09;&#xff0c;然后使用这些原型来进行分类、回归或聚类等任务。这种方法模拟了人类学习的方式&#xff0c;人们往…...

【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【遍历求和】&#xff0c;使用【二叉树】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&am…...

PHP知识大全

PHP知识大全 1. 变量如何定义&#xff1f;如何检查变量是否定义&#xff1f;如何删除一个变量&#xff1f;怎样检测变量是否设置&#xff1f; $定义 isset()// 检测变量是否设置 defined&#xff08;&#xff09;// 检测常量是否设置unset()//销毁指定的变量 empty()// 检测…...

Jmeter常用参数化技巧总结!

说起接口测试&#xff0c;相信大家在工作中用的最多的还是Jmeter。 JMeter是一个100&#xff05;的纯Java桌面应用&#xff0c;由Apache组织的开放源代码项目&#xff0c;它是功能和性能测试的工具。具有高可扩展性、支持Web(HTTP/HTTPS)、SOAP、FTP、JAVA 等多种协议。 在做…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...