网站建设ftpwordpress加载视频

张小明 2026/1/9 21:25:28
网站建设ftp,wordpress加载视频,网络服务协议模板,wordpress安装脚本打不开1.调试背景和目标在PROFINET的设备开发中#xff0c;为了验证通讯链路的完整性#xff0c;做了PLC到STM32的回环测试#xff0c;即PLC周期下发数据#xff0c;然后STM32接收后将数据放在SPI发送区下个周期发回。测试目标#xff1a;验证SPI收发是否可靠#xff1b;验证 P…1.调试背景和目标在PROFINET的设备开发中为了验证通讯链路的完整性做了PLC到STM32的回环测试即PLC周期下发数据然后STM32接收后将数据放在SPI发送区下个周期发回。测试目标验证SPI收发是否可靠验证 PLC 周期1ms下 SeqBack 是否严格递增 1确认数据完整时序稳定为下个阶段丢包率测试提供基础理论上返回的数据SeqBack应该严格执行每个周期1的情况但是在实际测试中我看到PLC端下个周期采集的数据减去上个周期数据往往差值为2偶尔会出现3下面重点分析这种情况为什么出现2.回环链路的整体流程和和关键时序整体流程在PCL的OB30中写SeqPLC数据,周期1ms递增ERTEC去打你收到PCL输出数据并写道缓存区shadow bufferERTEC通过SPI主机模式发送一帧给STM32STM32通过DMA接收解析再将收到数据通过SPI回传ERTEC在下个PROFINET周期将STM32数据填入输入数据PCL在OB30下一个周期读SwqBack.。关键时序整个系统包含五个不同的“时间点”环节时间来源是否可控PLC OB35 采样点PLC 周期任务可控ERTEC PNIO 周期PNIO 固定同步周期不可控ERTEC Shadow Buffer 更新点内部逻辑固定延迟不可控STM32 SPI DMA 完成时刻SPI 数据完成时刻半可控PLC Input 更新到程序PROFINET 栈行为不可控这5个点无法完全对齐疑似问题的根源。3.实际测试现象记录3.1.SPI的NSS每个字节都会短暂的拉高一次300ns通过示波器测试SPI收发数据时发现在接收一帧数据NSS拉低后在一帧67字节数据中每个字节都会短暂的拉高一次。影响STM32无法通过NSS外部中断判断帧边界只能采用DMA固定字节接收比较稳定3.2 PLC和STM32的丢包统计都是异常偏高使用博途软件监控PLC数据发现丢包数据大概在百分之50左右SeqBack和LastSeqBack差值通过监控发现大多数保持在2左右使用STM32主循环打印日志显示如下:total_cnt141294, lost_cnt70816, repeat74536total_cnt146294, lost_cnt73321, repeat77042total_cnt151293, lost_cnt75824, repeat79546这个丢失的数据大概也在百分之50通过每次回调打印delta也就是两次接收差值显示如下delta 2 delta 2 delta 2 delta 1 delta 2 delta 3 delta 2大多数为2偶尔会出现1和3这个现象看起来像是数据跳了过去。3.3 将PLC的OB30周期从1ms改为5ms后回环测试比较稳定了不会出现上述现象分析应该是STM32接收和处理数据的时机与PROFINET的时机对不上才导致的。比如PLC在T0发送数据给ERTECERTEC在T0delta1发送给STM32STM32在T0delta1delta2解析并回传ERTEC在下个周期T1才回传给PLC。如果STM32 的解析时机刚好落在两个 PROFINET 周期之间PLC 的采样点刚好落在更新前后边界就会出现这种情况。4 尝试解决方案方案 1降低 PLC 序号递增速度已验证例如PLC 每 5ms 才递增一次 seqPLCSTM32 1ms 解析 → 保证每次递增都会被采样到这样 delta 1 变成正常情况。这可大幅减少误报使丢包统计更接近真实情况。方案 2ACK 握手机制待验证PLC发新序号等 STM32 回环确认再递增 seq确保每个序号一定被 STM32 接收。5 总结本次调试中出现的“50% 丢包率”并非链路问题而是PLC、ERTEC、STM32 三者节拍不同步导致 STM32 下采样了 PLC 的序号引入了大量“伪丢包”。链路本身是稳定的。 通过调整序号递增策略或丢包判断逻辑即可得到真实的丢包率。6 代码附录(* 回环测试 IF G_VAR.ResetFlag THEN DO4 : 1; G_VAR.seqPLC : 0; G_VAR.ResetFlag : FALSE; ELSE DO4 : 0; //每个周期加1 G_VAR.seqPLC 1; END_IF; // G_VAR.seqPLC_Byte[0] : DWORD_TO_BYTE(SHR(IN : G_VAR.seqPLC, N : 24)); G_VAR.seqPLC_Byte[1] : DWORD_TO_BYTE(SHR(IN : G_VAR.seqPLC, N : 16)); G_VAR.seqPLC_Byte[2] : DWORD_TO_BYTE(SHR(IN : G_VAR.seqPLC, N : 8)); G_VAR.seqPLC_Byte[3] : DWORD_TO_BYTE(G_VAR.seqPLC); //写序号到输出区:周期执行 DO0 : G_VAR.seqPLC_Byte[0]; DO1 : G_VAR.seqPLC_Byte[1]; DO2 : G_VAR.seqPLC_Byte[2]; DO3 : G_VAR.seqPLC_Byte[3]; //拼接输入区接收到的字节 #SeqBack : SHL(IN : BYTE_TO_DWORD(DI0), N : 24) OR SHL(IN : BYTE_TO_DWORD(DI1), N : 16) OR SHL(IN : BYTE_TO_DWORD(DI2), N : 8) OR BYTE_TO_DWORD(DI3); //总接收帧数 //判断接收到的数据是否更新 IF #SeqBack G_VAR.LastSeqBack THEN IF G_VAR.TotalCount DWORD#0 THEN G_VAR.LastSeqBack : #SeqBack; G_VAR.TotalCount : 1; G_VAR.IncOK_Cnt : 1; ELSE IF #SeqBack G_VAR.LastSeqBack THEN #value_diff : #SeqBack - G_VAR.LastSeqBack; G_VAR.TotalCount : G_VAR.TotalCount #value_diff; IF #value_diff DWORD#1 THEN G_VAR.IncOK_Cnt 1; ELSE //跳帧 G_VAR.LostCount : G_VAR.LostCount (#value_diff - DWORD#1); END_IF; //更新接收数据 G_VAR.LastSeqBack : #SeqBack; ELSIF #SeqBack G_VAR.LastSeqBack THEN ; ELSE ; END_IF; END_IF; END_IF; //计算丢包率 IF G_VAR.TotalCount DWORD#0 THEN G_VAR.LossRate : ((DWORD_TO_DINT(G_VAR.LostCount) * 1000) / DWORD_TO_DINT(G_VAR.TotalCount)); ELSE G_VAR.LossRate : 0; END_IF; *)uint8_t parse_frame(uint8_t *rx_buf, uint8_t *tx_buf, uint8_t *dataOffset) { // for (int offset 0; offset SPI_FRAME_LEN; offset) { if (rx_buf[offset] ! SPI_FRAME_HEAD) continue; uint8_t len rx_buf[(offset 1) % SPI_FRAME_LEN]; if (len 0 || len SPI_FRAME_LEN) continue; uint16_t checksum_pos (offset 2 len) % SPI_FRAME_LEN; uint8_t calc_sum len; for (int i 0; i len; i) { calc_sum rx_buf[(offset 2 i) % SPI_FRAME_LEN]; } uint8_t recv_sum rx_buf[checksum_pos]; if (recv_sum ! calc_sum) { continue; } // now micros(); // dt now - last_us; // last_us now; //printf(offset %d\n, offset); //判断是否是第一帧数据 if(rx_buf[(offset 6) % SPI_FRAME_LEN]) { last_seq 0; lost_cnt 0; total_cnt 0; repeat_or_back_cnt 0; first_frame 1; //tx_ready 1; } //处理接收到的数据 uint8_t seq_bytes[4]; seq_bytes[0] rx_buf[(offset 2) % SPI_FRAME_LEN]; //PLC发送过来的序列号 seq_bytes[1] rx_buf[(offset 3) % SPI_FRAME_LEN]; seq_bytes[2] rx_buf[(offset 4) % SPI_FRAME_LEN]; seq_bytes[3] rx_buf[(offset 5) % SPI_FRAME_LEN]; uint32_t cur_seq parse_seqPLC(seq_bytes); if(first_frame) { first_frame 0; last_seq cur_seq; return 0; } else { if(cur_seq last_seq) { uint32_t delta cur_seq - last_seq; total_cnt delta; if(delta 1) { lost_cnt (delta - 1); } } else { repeat_or_back_cnt; } } last_seq cur_seq; /* //回环数据 tx_buf[(offset 2) % SPI_FRAME_LEN] seq_bytes[0]; tx_buf[(offset 3) % SPI_FRAME_LEN] seq_bytes[1]; tx_buf[(offset 4) % SPI_FRAME_LEN] seq_bytes[2]; tx_buf[(offset 5) % SPI_FRAME_LEN] seq_bytes[3]; */ //memset( frame_buf_rx, 0, SPI_FRAME_LEN); //发送测试数据 // test_data_tx; // // uint8_t test_sum 0; // tx_buf[(offset 2) % SPI_FRAME_LEN] (uint8_t)((test_data_tx 24) 0xFF); // tx_buf[(offset 3) % SPI_FRAME_LEN] (uint8_t)((test_data_tx 16) 0xFF); // tx_buf[(offset 4) % SPI_FRAME_LEN] (uint8_t)((test_data_tx 8) 0xFF); // tx_buf[(offset 5) % SPI_FRAME_LEN] (uint8_t)(test_data_tx 0xFF); // for(int i 2; i 6; i) // { // test_sum tx_buf[(offset i) % SPI_FRAME_LEN]; // } // tx_buf[(offset 6) % SPI_FRAME_LEN] test_sum; // for (int i 0; i SPI_FRAME_LEN; i) // { // tx_buf[(offset i) % SPI_FRAME_LEN] rx_buf[(offset i) % SPI_FRAME_LEN]; // //printf(tx[%d]: 0x%02Xrx:0x%02X\r\n, i, tx_buf[i],rx_buf[i]); // } *dataOffset offset; return 0; } return 1; }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

正定城乡建设网站跨境电商平台有哪些及其特点

深度学习入门必看:TensorFlow-v2.9镜像一键部署指南 在人工智能技术席卷各行各业的今天,越来越多开发者希望快速迈入深度学习的大门。然而,一个常见的现实是:很多人还没开始写第一行模型代码,就已经被复杂的环境配置拦…

张小明 2026/1/9 6:54:23 网站建设

设计素材网站会员哪个最好网站做国际化

高效部署gemma.cpp:模型转换技术深度指南 【免费下载链接】gemma.cpp 适用于 Google Gemma 模型的轻量级独立 C 推理引擎。 项目地址: https://gitcode.com/GitHub_Trending/ge/gemma.cpp 在AI模型部署实践中,从Python训练环境到C推理引擎的模型转…

张小明 2026/1/8 22:05:18 网站建设

深圳网站页面设计江苏工程造价信息网官网

学生管理 目录 基于springboot vue学生管理系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue学生管理系统 一、前言 博主介绍&am…

张小明 2026/1/7 20:55:56 网站建设

c 网站开发实例教学网站建设 调研报告

第一章:Open-AutoGLM在Ubuntu虚拟机中的运行困境在尝试于Ubuntu虚拟机环境中部署和运行Open-AutoGLM时,开发者常遭遇一系列与环境依赖、资源分配及权限配置相关的挑战。这些问题不仅影响模型的启动效率,还可能导致推理过程中的不可预测中断。…

张小明 2026/1/7 21:07:30 网站建设

建设网站知乎军事新闻头条

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/6 23:02:50 网站建设

做一个网站一般要多少钱视频直播网站建设费用

目录已开发项目效果实现截图开发技术介绍核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!已开发项目效果…

张小明 2026/1/7 20:55:54 网站建设