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

汇川中型PLC(AM、AC系列,CODESYS平台)高速采集(2ms)的一个方案

一、案例介绍
高速数据采集要保证速度,也要保证时刻的准确性。在windows系统里,时间稳定性是个很难的问题。如果PLC发送的数据里带有时间信息,则可以由PLC来保证采样周期的稳定性。
从V2.12版本开始,PLC-Recorder软件可以处理发送电文里的时间戳,有网友用0.24ms的速度外发,软件也能够稳定接收并精确确定数据的时刻。
本文向大家展示一下汇川CODESYS平台PLC(AM等系列)通过UDP快速通讯的实现方法。
二、测试条件
下面用AM401实现带有时间戳的高速数据采集,测试条件如下:
1、PLC设置:PLC的主任务设置成1ms的循环(最小只能设置成1ms。测试发现设置为“惯性滑行”时,实际周期为3ms)。
2、通讯协议:UDP(目前只有该协议,在高速模式下才支持时间戳)。
3、编程软件和系统:InoProShop(基于CODESYS V3平台)
4、PLC的系统版本:3.5.11.10,IP地址:192.168.0.1
5、采集主机:微型工控机(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_TYPE
TYPE union_uint :UNIONValue:UINT;Bytes:ARRAY[0..1] OF BYTE;END_UNION
END_TYPE
TYPEunion_real :UNIONValue:REAL;Bytes:ARRAY[0..3] OF BYTE;END_UNION
END_TYPE
TYPE union_lreal :UNIONValue:LREAL;Bytes:ARRAY[0..7] OF BYTE;END_UNION
END_TYPE
TYPE DUT_SEND_DATA:STRUCTSTAMP :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。需要配置来源的IP地址及本机收听的端口号。
image
六、PLC-Recorder的通道配置
此处虽然配置了采集周期,但在高速模式下不再使用该周期,以收到信息的时刻为准。
image
七、PLC-Recorder的变量配置
从最后一个变量的起始地址和变量长度可以确定该通道的通讯电文的长度。对于TCP类型的连接,电文长度需要通过最后变量进行确定(下例子看出电文长度为200字节)。
image
对于UDP类型的通讯,UDP是按照完整报文进行传输的,可以自动获取长度信息,因此,不需要关注最后变量。
变量配置时,不需要定义所有的变量,仅需要定义自己关注的变量即可。
起始地址为0的变量就是PLC里定义的时间戳。
image
八、记录数据的情况
这是用离线分析软件Ana打开的历史数据文件(分析时长:0.5小时,采集次数96万)。从左侧的统计数据可以看出,平均采集周期是2ms(与PLC1ms的周期对应)。从右侧的波形和标尺可以看出,点距非常均匀。
image
九、总结
汇川的中型PLC是基于CODESYS平台,UDP通讯程序可以供其他类似系统借鉴。
采集的速度越快,需要的技术越复杂,代价也越大。PLC-Recorder的主动采集模式,基本只需要在PLC-Recorder里配置变量,不需要在PLC做什么复杂工作,这种方式很便捷,但是速度也有限(最快20ms)。高速模式,就需要在PLC里配置通讯,组织数据,然后调用通讯语句,才能够实现,因此,对于PLC工程师也有了一点要求。
高速模式采用标准以太网通讯协议,这也是大部分PLC都具备的能力,因此,可以被广泛用于快速数据采集。
640 (3)
640 (4)

http://www.jsqmd.com/news/255080/

相关文章:

  • 【毕业设计】基于springboot的高校教室设备故障报修信息管理系统(源码+文档+远程调试,全bao定制等)
  • 大模型训练_week3_day15_Llama概念_《穷途末路》
  • PyTorch Mobile部署,从模型优化到边缘设备落地
  • 【毕业设计】基于SpringBoot的大学生体测数据管理系统(源码+文档+远程调试,全bao定制等)
  • Java计算机毕设之基于SpringBoot的大学生体测数据管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 【课程设计/毕业设计】基于SpringBoot学院设备报修管理系统设计与实现基于springboot的高校教室设备故障报修信息管理系统【附源码、数据库、万字文档】
  • Java计算机毕设之基于 Web Service 技术的警务数据交互平台设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 大盘风险控制策略分析报告 - 2026年01月16日
  • 多智能体系统在品牌价值评估中的应用:量化无形资产
  • AI Agent的对话系统在心理健康领域的应用
  • 基于 Flutter × OpenHarmony 构建歌曲信息区域的实践解析
  • 笔记05. 自由度
  • 基于 Flutter × OpenHarmony 构建播放器进度条区域的实践解析
  • Java毕设项目:基于SpringBoot的大学生体测数据管理系统(源码+文档,讲解、调试运行,定制等)
  • Object类:equal、super、toString
  • cnblog批量上传图片脚本小记
  • Java毕设项目:基于 Web Service 技术的警务数据交互平台设计与实现(源码+文档,讲解、调试运行,定制等)
  • 计算机Java毕设实战-基于SpringBoot的校园设备维护报修系统基于springboot的高校教室设备故障报修信息管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 新能源汽车整车控制器VCU学习模型,适用于初学者。 1、模型包含高压上下电,行驶模式管理,能量...
  • 计算机Java毕设实战-基于SpringBoot的大学生体测数据管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机Java毕设实战-基于 Web Service 技术的警务数据交互平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Linux 内网环境构建与配置深度解析
  • Git 从入门到封神:一站式精通 Git 所有核心用法(零基础 → 进阶 → 大神级实战,万字干货)
  • 手撸工业级Socket客户端是什么体验
  • 04谓词逻辑基本概念
  • 威纶通触摸屏与三菱变频器modbus通讯 威纶通与三菱变频器直接相连,进行modbus通讯
  • 计算机Java毕设实战-基于SpringBoot+vue的高校学生实习综合服务平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 基于Qt5+osg3.4+opencascade7.0开发的三维CAD,目前软件支持主流的3D...
  • Java毕设项目:基于SpringBoot+vue的高校学生实习综合服务平台设计与实现(源码+文档,讲解、调试运行,定制等)
  • 直接上干货,这个旋转编码器记米模块我在纺织机械和包装设备上用过不下十次。核心就俩字——抗造!先看PLC程序,再聊触摸屏怎么配