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

news2024/10/6 6:05:45

高速数据采集要保证速度,也要保证时刻的准确性。在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 :
UNION
	Value:UDINT;
	Bytes:ARRAY[0..3] OF BYTE;
END_UNION
END_TYPE

TYPE union_uint :
UNION
	Value:UINT;
	Bytes:ARRAY[0..1] OF BYTE;
END_UNION
END_TYPE

TYPE union_real :
UNION
	Value:REAL;
	Bytes:ARRAY[0..3] OF BYTE;
END_UNION
END_TYPE

TYPE union_lreal :
UNION
	Value:LREAL;
	Bytes:ARRAY[0..7] OF BYTE;
END_UNION
END_TYPE

TYPE DUT_SEND_DATA:
STRUCT
	STAMP :union_udint;//单位为微秒的时间戳
	data1:union_uint;//UInt类型的数值
	data2:union_real;//浮点数类型的数值
	data3:union_lreal;//双精度类型的数值	
END_STRUCT
END_TYPE

3、主程序的局部变量

VAR
	UDP_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;//超时长度us
	ob_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 THEN
	sendData.data1.Value:=sendData.data1.Value+1;
	IF UINT_TO_INT( sendData.data1.Value) >=30000 THEN
		sendData.data1.Value:=0;
	END_IF
	sendData.data3.Value:=UINT_TO_LREAL(sendData.data1.Value);
END_IF

//数据打包到发送缓冲器,直接操作字节数组。
pArray:=0;
FOR i:=0 TO SIZEOF(sendData.STAMP.Bytes)-1 BY 1 DO
	id_SendBuffer[pArray]:=sendData.STAMP.Bytes[i];
	pArray:=pArray+1;
END_FOR
FOR i:=0 TO SIZEOF(sendData.data1.Bytes)-1 BY 1 DO
	id_SendBuffer[pArray]:=sendData.data1.Bytes[i];
	pArray:=pArray+1;
END_FOR
FOR i:=0 TO SIZEOF(sendData.data2.Bytes)-1 BY 1 DO
	id_SendBuffer[pArray]:=sendData.data2.Bytes[i];
	pArray:=pArray+1;
END_FOR
FOR i:=0 TO SIZEOF(sendData.data3.Bytes)-1 BY 1 DO
	id_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1069382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国庆出游远程实测:ToDesk 、TeamViewer、AnyDesk远程控制软件稳定性

ToDesk 、TeamViewer、AnyDesk远程控制软件稳定性 【前言】【实测软件】【测试环境】【实操体验】1. 软件安装2. 登录速度3. 文件传输4. 操作延迟5. 画面清晰度6. 安全防护 【本文小结】 【前言】 随着科技的不断发展&#xff0c;远程控制软件已成为我们生活中不可或缺的一部分…

数据结构-图-最短路径问题

最短路径问题 单源最短路径Dijkstra算法原理代码实现 Bellman-Ford算法原理代码实现SPFA优化SPFA代码实现 多元最短路径Floyd-Warshall算法原理代码实现 单源最短路径 &#x1f680;最短路径&#xff1a;从图G的某个顶点出发到达另一个顶点的最短路径&#xff0c;其中最短是指…

鼠标灵敏度怎么调?4个方法提高使用体验感!

“不知道怎么回事&#xff0c;我的鼠标反应很慢慢&#xff0c;有时候好像会有延迟。使用起来感觉特别不舒服。这个问题应该怎么解决呢&#xff1f;希望大家帮帮我&#xff01;” 在使用电脑的过程中&#xff0c;鼠标是很常用的一个工具。调整鼠标的灵敏度对电脑的使用体验会有显…

DBeaver 导出数据的问题 SQL 错误: jdbc 驱动内部错误 Java heap space

DBeaver 导出结果集 报错 具体操作如下&#xff1a; 网友给出的解决方案是 &#xff1a;调整java参数 dbeaver.ini -startup plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_6…

第八章 排序 九、归并排序

一、定义 把两个或多个有序的序列合并成一个有序序列 二、2路归并 三、归并排序 四、例子 1、首先将数组A复制一份到另一个B数组。 2、在定义三个指针分别指向A数组头部、中间、尾部。定义两个指针指向B数组的头部和中间。 3、然后比较B数组中头指针和中间指针的数字大小&a…

Dockerfile自定义容器

1、Dockerfile Dockerfile 是用于构建 Docker 镜像的文本文件&#xff0c;其中包含一系列的指令和配置&#xff0c;用于定义镜像的构建过程。通过 Dockerfile&#xff0c;你可以定义镜像的基础操作系统、依赖、环境设置、应用程序等信息&#xff0c;从而实现可复制、自动化的镜…

mmcv视频处理,如何遇到异常帧不中断

背景 mmcv读取视频帧如果遇到error&#xff0c;则会直接停止执行。但是&#xff0c;视频后面的内容有时候也十分重要&#xff0c;所以这个时候就需要一种方式可以继续处理后续帧。 处理方法 修改mmcv的VideoReader中的__next__函数&#xff0c;修改为如下&#xff1a; def _…

Django使用SMTP发送邮件教程

CONTENTS 1. SMTP介绍2. 申请邮箱授权码3. Django发送邮件 1. SMTP介绍 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议&#xff0c;它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。SMTP 协议属于 TCP/I…

fiddler 的用法

使用fiddler进行抓包 举例一些常见的代理工具 1.wireshark:功能非常强大,但是使用起来更复杂一些 2.fiddler:功能虽然比wireshark少,但是使用简单方便,功能也足以应付大部分场景了 安装了fiddler之后,http和https的请求和响应都会被抓包工具捕捉到,其他的不会 打开软件,左侧是…

网络安全:六种常见的网络攻击手段

1、什么是VPN服务&#xff1f; 虚拟专用网络&#xff08;或VPN&#xff09;是您的设备与另一台计算机之间通过互联网的安全连接。VPN服务可用于在离开办公室时安全地访问工作计算机系统。但它们也常用于规避政府审查制度&#xff0c;或者在电影流媒体网站上阻止位置封锁&#…

mybatis:mybatis-generator插件使用

mybatis&#xff1a;mybatis-generator插件使用 1 idea配置 idea&#xff0c;点击File->Settings->Plugins->设置&#xff0c;点击&#xff1a;Manage Plugin Repositories: 配置如下&#xff1a; http://plugins.jetbrains.com/下载插件并重启idea&#xff1a; 2 …

Avalonia环境搭建

1.开发文档 开发文档&#xff0c; GitHub项目地址 https://github.com/avaloniaui/avalonia 2.VS2022 及扩展安装 建议使用vs2022最新版本下载并安装扩展Avalonia for Visual Studio 2022 3.安装Avalonia UI模板 dotnet new install Avalonia.Templates 查看安装版本 dot…

3 个令人惊艳的 AI 文档神器,开源了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 现今的互联网时代&#xff0c;无论哪个行业&#xff0c;在日常各种工作的沟通协作中&#xff0c;我们都免不了要与各种文档打交道。 但是&#xff0c;人的精力与任务处理速度毕竟有限&…

WinApp自动化测试之工具的选择

WinApp&#xff08;Windows APP&#xff09;是运行在Windows操作系统上的应用程序&#xff0c;通常会提供一个可视的界面&#xff0c;用于和用户交互。 例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome&#xff0c;都属于WinApp。常见的WinA…

8. Java本项目知识基础---下篇

Java本项目知识基础—下篇 1. String 拼接字符串 进行头部、中部、尾部拼接 &#xff08;简单、内存占用大&#xff09; StringBuffer或StringBuilder进行append拼接&#xff08;复杂、内存占用小&#xff09; public static void main(String[] args) {String str "abc…

Z410 2023款无人机,专为零基础开发者打造的入门级开源无人机

为什么开发Z410升级款-Easydrone无人机 新手开发者通常在本科阶段加入人工智能行业&#xff0c;对无人机二次开发往往一知半解&#xff0c;面临着C、Python、ROS和mavlink等一系列入门知识&#xff0c;学习起来非常困难&#xff0c;学习的过程中也面临许多挫折。为了帮助零基础…

vcruntime140.dll缺失如何修复,vcruntime140.dll重新安装方法分享

大家好&#xff01;今天&#xff0c;我非常荣幸能够站在这里&#xff0c;与大家分享关于vcruntime140.dll丢失的问题以及三种修复方法。希望通过我的演讲&#xff0c;能够帮助到在座的各位&#xff0c;解决我们在使用电脑过程中遇到的一些问题。 首先&#xff0c;让我们来了解一…

京东数据分析平台:9月中上旬白酒消费市场数据分析

9月份&#xff0c;围绕白酒的热点不断。9月5日&#xff0c;瑞幸咖啡官微发布消息称&#xff0c;瑞幸与贵州茅台跨界合作推出的酱香拿铁刷新单品纪录&#xff0c;首日销量突破542万杯&#xff0c;销售额破1亿元。9月14日&#xff0c;贵州茅台官微发布消息称与德芙推出联名产品“…

VMProtect使用教程(VC++MFC中使用)

VMProtect使用教程(VCMFC中使用) VMProtect是一种商业级别的代码保护工具&#xff0c;可以用于保护VC MFC程序。以下是使用VMProtect保护VC MFC程序的步骤&#xff1a; 1. 下载并安装VMProtect,C包含库及目录。 2. 在VC MFC项目中添加VMProtectSDK.h头文件&#xff0c;并在需…

Spring Boot如何配置CORS支持

Spring Boot如何配置CORS支持 CORS&#xff08;跨源资源共享&#xff09;是一种Web浏览器的安全性功能&#xff0c;用于控制网页上的脚本文件从不同的源加载其他网页资源。在开发现代Web应用程序时&#xff0c;通常需要跨域请求不同的资源&#xff0c;如API服务或其他Web应用程…