借助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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu输入正确密码重新跳到登录界面

Ubuntu输入正确密码重新跳到登录界面 问题描述 输入正确的密码登录后闪一下又回到锁屏界面 输入正确的密码后还是回到这个界面 产生的原因 /etc/profile或者/etc/enviroment出现了问题,导致无法正常登录 该错误产生的原因不止一个 这里是因为/etc/profile或者/etc/enviromen出…

收银系统商品定价设计思考

一、背景 因为门店系统里商品总共也就几万款&#xff0c;一直以来都是根据条码由总部统一定价销售&#xff0c;现在有加盟店&#xff0c;各门店也有进行各自促销活动的需求&#xff0c;这就需要放开门店自主定价权&#xff0c;所以近段时间系统在商品定价上做了扩展。 二、商…

如何在雷电模拟器上安装Magisk并加载movecert模块抓https包(一)

环境&#xff1a;win10 64位&#xff0c;雷电模拟器版本4.0.78&#xff0c;Android版本7.1.2。 前几天写了一篇文章如何在逍遥模拟器上加载Magisk模块-CSDN博客&#xff0c;因为最近很忙&#xff0c;所以直到今天才有空写这一篇&#xff0c;记录如何在雷电模拟器上安装Magisk并…

基于uniapp的商城外卖小程序

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

LCD12864驱动开发

目录 一、概述 二、方框图 三、模块接口说明 1、串口接口管脚信号 2、并行接口 四、模块主要硬件构成说明 1、RS&#xff0c;R/W配4种模式&#xff1a; 2、E信号 五、指令说明 六、读写时序图 6.1 数据传输过程 6.2、时序图 6.3、串口读写时序 七、交流参数 八、软件…

TCP/IP(十五)拥塞控制

一 拥塞控制 ① 拥塞控制必要性 思考&#xff1a; 为什么要有拥塞控制呀,不是有流量控制了吗&#xff1f; ② 拥赛窗口 cwnd 什么是拥塞窗口? 和发送窗口有什么关系呢?明白&#xff1a; cwnd、swnd、rwnd 缩写 含义 ③ 如何知道当前网络是否出现了拥塞呢&#xff1f;…

2023年【危险化学品生产单位安全生产管理人员】及危险化学品生产单位安全生产管理人员模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品生产单位安全生产管理人员模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品生产单位安…

微信开发工具构建npm and git切换分支

目录 git切换分支NPM构建 git切换分支 案例&#xff1a; 再次查看分支就会发现自己的分支已切换&#xff0c;然后需要重新构建NPM一次 NPM构建 记得安装一下这个&#xff0c;然后在构建 如果未安装NPM&#xff0c;这时候需要打开命令端&#xff0c;安装操作&#xff0c;操作…

Configuration Change派发到App进程

整体时序 // DisplayContent.java boolean updateDisplayOverrideConfigurationLocked(Configuration values,ActivityRecord starting, boolean deferResume,ActivityTaskManagerService.UpdateConfigurationResult result) {int changes 0;boolean kept true;mAtmService.d…

Andriod学习笔记(一)

写在前面的话 App开发的编程语言Java和KotlinXML App连接的数据库App工程目录结构模块级别的编译配置文件清单文件 界面显示与逻辑处理 安卓是一种基于Linux内核的自由及开放源代码的操作系统&#xff0c;主要使用于移动设备。 Mininum SDK表示安卓该版本以上的设备都可以运行该…

Restclient-cpp库介绍和实际应用:爬取www.sohu.com

概述 Restclient-cpp是一个用C编写的简单而优雅的RESTful客户端库&#xff0c;它可以方便地发送HTTP请求和处理响应。它基于libcurl和jsoncpp&#xff0c;支持GET, POST, PUT, PATCH, DELETE, HEAD等方法&#xff0c;以及自定义HTTP头部&#xff0c;超时设置&#xff0c;代理服…

节日灯饰灯串灯出口欧洲CE认证检测

灯串&#xff08;灯带&#xff09;&#xff0c;这个产品的形状就象一根带子一样&#xff0c;再加上产品的主要原件就是LED&#xff0c;因此叫做灯串或者灯带。2022年&#xff0c;我国灯具及相关配件产品出口总额超过460亿美元。其中北美是最大的出口市场。其次是欧洲市场&#…

智能工厂MES系统,终端设备支持手机、PDA、工业平板、PC

一、开源项目简介 源计划智能工厂MES系统(开源版) 功能包括销售管理&#xff0c;仓库管理&#xff0c;生产管理&#xff0c;质量管理&#xff0c;设备管理&#xff0c;条码追溯&#xff0c;财务管理&#xff0c;系统集成&#xff0c;移动端APP。 二、开源协议 使用GPL-3.0开…

YOLOV7改进:最新开源移动端网络架构 RepViT | RepViTBlock即插即用,助力检测 | 清华 ICCV 2023

💡💡💡本文独家原创改进:轻量级 ViT 的高效架构选择,逐步增强标准轻量级 CNN(特别是 MobileNetV3)的移动友好性。 最终产生了一个新的纯轻量级 CNN 系列,即 RepViT RepViTBlock即插即用,助力检测 | 亲测在多个数据集能够实现涨点,并实现轻量化 收录: YOLOv7…

【Debian系统】:安装debian系统之后,很多命令找不到,需要添加sudo之后才能使用,以下解决方法

项目场景&#xff1a; 问题描述 解决方案&#xff1a; 1.临时解决方案 2.永久解决方案 1.首先打开编辑&#xff1a; 2.打开之后最后一行添加代码&#xff1a; 3.最后运行一遍 .bashrc 4.已经可以了&#xff0c;可以试试reboot&#xff0c;重启一下机子 一点一滴才能成长 …

Go语言入门心法(二): 结构体

一: Go语言中结构体认知 package mainimport "fmt"/*go语言中的结构体认知升维:*/ func main() {println(go语言中的结构体与c语言中的结构体类似;go语言中的结构体相当于java|python中类功能相当)type Book struct {title string // 标题author string // 作者…

UDP和TCP特点(部分)对比:

传输层的两个主要协议&#xff1a;TCP 和 UDP UDP和TCP特点&#xff08;部分&#xff09;对比&#xff1a; UDP&#xff1a;无连接&#xff0c; 不可靠传输&#xff0c; 面向数据报&#xff0c; 全双工。 TCP&#xff1a;有连接&#xff0c; 可靠传输&#xff0c; 面向字节流…

Android---java内存模型与线程

Java 内存模型翻译自 Java Memory Model&#xff0c;简称 JMM。它所描述的是多线程并发、CPU 缓存等方面的内容。 在每一个线程中&#xff0c;都会有一块内部的工作内存&#xff0c;这块内存保存了主内存共享数据的拷贝副本。但在 Java 线程中并不存在所谓的工作内存&#xff0…

C#实现OPC DA转OPC UA服务器

运行软件前提前安装好OPC运行组件&#xff1a; 为方便演示&#xff0c;提前准备好了一个DAServer服务器&#xff1a; 接下来开始配置&#xff1a; 该软件主要实现的功能如下&#xff1a; 配置过程也相对简单&#xff1a; 第一步&#xff1a; 编辑如下文件&#xff1a; 第二步…

YOLOv7改进策略:RIFormerBlock助力检测|CVPR2023 RIFormer:无需TokenMixer也能达成SOTA性能的极简ViT架构

💡💡💡本文属于原创独家改进: 稀疏重参数RIFormerBlock模型引入YOLOv7进行创新性 RIFormerBlock | 亲测在多个数据集实现涨点; 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLOv7自研创新结合,轻松…