1. 测试背景与方法
为了验证STM32到PLC之间的链路可靠性,我设计了一种更简单的测试方式:
- STM32 每周期向 PROFINET 回环链路发送一个递增值,PLC只负责接收并计算差值;
- PLC周期发送一个递增值,STM32负责接收并计算差值,以此统计丢包率。
为了同时测试,在PLC的OB30定时发送,在OB1接收和解析,STM32还是在回调中更新数据。
测试变量(两类):
STM32 → ERTEC(SPI)→ PLC的发送周期
PLC(或 STM32 回调)侧的累加周期(统计频率)
2. STM32侧丢包测试结果
这个是PLC发送,STM32接收的测试:
| PLC发送周期 | 测得丢包率 | 备注 |
|---|---|---|
| 1ms | ≈ 50% | 严重跳变 |
| 2ms | ≈ 0.5% | 大幅下降 |
| 3ms | ≈ 56 / 300000 ≈ 0.018% | 已很低 |
| 4ms | 0% | 完全稳定 |
初步结论:发送周期越短,丢包越严重,周期越长,丢包越低,甚至为0.
3. PLC侧丢包测试结果
STM32发送的数据,PLC接收解析的测试:
| STM32发送周期 | 测得丢包率 | 备注 |
|---|---|---|
| 每个回调累加 | ≈ 50% | 和 STM32 的 1ms 情况一致 |
| 每两个回调累加一次 | ≈ 88 / 100000 ≈ 0.088% | 极低 |
| 每三个回调累加一次 | 153 / 300000 ≈ 0.05% | 进一步下降 |
| 每四个回调累加一次 | 0% | 稳定无跳变 |
4. 现象分析
经过上述测试,主要感觉还是采样点和数据刷新点错位的问题,参考上一篇笔记中,感觉这两个问题是同一个问题导致的。
丢包并不是“链路真的丢数据”,而是采样点与数据刷新点“错位”导致的假丢包。
5.改另一种测试方式:周期递增,N个周期检查
之前测试的逻辑由于错位有些问题,现在改为1ms递增一次,每N个周期去观察递增的数据对不对。
PLC端:OB30里1ms发送一次递增数据;
STM32端:每个回调里递增一次数据;
PLC监测:在循环中断中处理逻辑;
10ms监测一次数据;大概接收420000数据时,丢失的数据为3800左右;
丢包率为1.2%左右。
STM32端监测:处理逻辑,按照回调周期处理数值,在主循环打印;
100ms监测一次数据,两次差值在98,99,100,101,102之间均为正常值,否则判断丢失值;
丢包率为0%;
10ms监测一次数据,两次差值在8-12之间,即9,0,11三个值判断正常,否则计算差值:
丢包率很小;
6.总结
经过以上测试,可以看到之前分析的链路错位问题导致的假丢包的论证应该是正确的,改进测试方式后,丢包率下降明显。