赞
踩
使用ET2000和Wireshak分析Ethercat主站的实时性
1、EtherCAT
主站通过 ET2000
接入伺服控制器,ET2000
上行通过千兆网络接入 PC , 通过 wireshark
工具进行抓包。
2、保存抓包文件,通过 (eth.type == 0x88a4) && (ecat.cnt == 0)
命令过滤文件,并另存为 pcapng 格式文件。
3、进入 tshark
命令目录下,执行 .\tshark.exe -r "d:\1ms1axisSent.pcapng" -n -T fields -e esl.timestamp > "d:\1ms1axisSent.txt"
生成发送时间戳序列
4、执行时间戳抖动分析脚本,生成抖动曲线,详细代码如下:
# coding=utf-8 """ EtherCat 时间戳数据抓取绘图 """ import os import codecs import chardet import numpy as np import pandas as pd import matplotlib import matplotlib.pyplot as plt from scipy.stats import norm # 变量定义 sendTimeStamp = [] sendDeltTime = [] OverFlowSendDeltTime = [] # 支持中文字体展示 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # EtherCat 通信周期 单位微秒 Interval = 4000 name = "单轴匀速运行1小时时间抖动数据(4ms)" # 读取文件数据 file_path = "D:/1ms1axisSent.txt" with codecs.open(file_path, 'r', 'utf-16-le') as f: col = f.readlines() # 时间戳数据处理,获取12位长度并转化为整型 for item in col: if '0x' in item: tmp = item[-14:-2] sendTimeStamp.append(int(tmp, 16)) # 计算相隔的发送时间时间差 for i in range(len(sendTimeStamp) - 1): initval = sendTimeStamp[0] sendTmp = (sendTimeStamp[i + 1] - sendTimeStamp[i]) / 1000 # 精度设置微妙 sendDeltTime.append(sendTmp) if abs(sendTmp - Interval) > 600: print('idx is ' + str(i) + 'timestamp is ' + str(sendTimeStamp[i + 1])) OverFlowSendDeltTime.append(sendTmp - Interval) elif abs(sendTmp - Interval) > 120: OverFlowSendDeltTime.append(sendTmp - Interval) # 转化成 np , 便于统计数据 send_data = np.asarray(sendDeltTime) send_rst = np.asarray(OverFlowSendDeltTime) # 获取均值、标准差和最大值 mu = send_data.mean() sigma = send_data.std() max_idx = np.argmax(send_rst) # 直方图柱子的数量 num_bins = 400 # 绘制图形 plt.figure(figsize = (40, 5), dpi = 100) # 4. 绘制原始时间戳 plt.subplot(221) plt.title("原始时间戳") plt.plot(sendTimeStamp) # 1. 绘制原始数据集 plt.subplot(222) plt.title("原始数据折线图") plt.plot(sendDeltTime) # 2. 绘制越限数据集 plt.subplot(223) plt.plot(send_rst) plt.title("越限数据折线图(规格120us)") # 在图形中标注出最大值 show_max = '[' + str(max_idx) + ' ' + str(send_rst[max_idx]) + ']' plt.plot(max_idx, send_rst[max_idx], 'ko') plt.annotate(show_max, xy=(max_idx, send_rst[max_idx]),xytext=(max_idx,send_rst[max_idx])) plt.text(800, 658, "最大值: " + str(send_rst[max_idx])) # 3. 绘制直方图 plt.subplot(224) plt.title("原始数据直方图") plt.text(3400, 0.002, "平均值: " + str(mu)) plt.text(3400, 0.004, "偏差值: " + str(sigma)) n,bins,patches = plt.hist(send_data, num_bins, density=True, edgecolor="black",facecolor='gray',alpha=0.6) plt.suptitle(name) plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。