桐乡网站建设,seo平台怎么样,新手如何开微商城店,wordpress 发布分离1#xff0c;不要在虚拟机测试#xff0c;否则IgH无法收发数据包
现象#xff1a;虚拟机中运行IgH master并绑定网卡后#xff0c;主站由ORPHANED状态转换成IDLE状态#xff0c;但无法收发数据报。
这是因为虚拟机用的是虚拟网卡#xff0c;需通过iptables将数据包到转…1不要在虚拟机测试否则IgH无法收发数据包
现象虚拟机中运行IgH master并绑定网卡后主站由ORPHANED状态转换成IDLE状态但无法收发数据报。
这是因为虚拟机用的是虚拟网卡需通过iptables将数据包到转发到真实的网卡上实现收发数据的目的。但IgH替换了网卡驱动程序收到数据包后处理流程没有走内核的网络协议栈所以工作中tcp/ip层的iptables就不起作用导致IgH无法正常收发报文。
虚拟机网络原理参考ubuntu20.04 搭建kernel调试环境第六篇下-网络原理-CSDN博客
解决物理机安装ubuntu用来测试IgH。
2获取IgH的INFO、WARNING、ERR信息
rootubuntu:/home/gsf# echo 7 7 7 7 /proc/sys/kernel/printk #define EC_MASTER_INFO(master, fmt, args...) \printk(KERN_INFO EtherCAT %u: fmt, master-index, ##args)#define EC_MASTER_WARN(master, fmt, args...) \printk(KERN_WARNING EtherCAT WARNING %u: fmt, master-index, ##args)#define EC_MASTER_ERR(master, fmt, args...) \printk(KERN_ERR EtherCAT ERROR %u: fmt, master-index, ##args) 3获取IgH的DEBUG信息
rootubuntu:/home/gsf# vim /etc/init.d/ethercat #MASTER_ARGS 改成下面MASTER_ARGSdebug_level2 务必注意注意make modules_install install后需要重新修改
DEBUG主要是输出一些收发报文的数据比如
[73996.353863] EtherCAT DEBUG 0: ec_master_send_datagrams(device_index 0)
[73996.353863] EtherCAT DEBUG 0: Adding datagram 0x2E
[73996.353864] EtherCAT DEBUG 0: frame size: 46
[73996.353864] EtherCAT DEBUG 0: Sending frame:
[73996.353864] EtherCAT DEBUG: FF FF FF FF FF FF 6C 24 08 29 52 19 88 A4 0E 10
[73996.353867] EtherCAT DEBUG: 05 2E 01 00 20 01 02 00 00 00 02 00 00 00 00 00
[73996.353869] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[73996.353871] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00
4dmesg日志不全
现象IgH源码中加了很多打印连接从站后发现dmesg会失了部分日志。
下面的下图显示的是ec_master_idle_thread -- ecrt_master_send -- ec_master_send_datagrams发送数据报文时增加的printk打印。
datagram-index用的是master-datagram_index初始化是master-datagram_index为0所以所有主站发送的数据报文的index应该是从0递增的最大值255master-datagram_index是uint8_t类型到最大值后又从0开始计数。 原因主站初始化时ec_master_idle_thread线程循环执行循环时间比较短见下面代码
ec_master_idle_thread函数if (ec_fsm_master_idle(master-fsm)) {set_current_state(TASK_INTERRUPTIBLE);schedule_timeout(1); --------------- 1个jiffies} else {schedule(); ---------切换到其他线程执行如果系统空闲会继续执行该线程}
不接从站printk信息比较少可以完整输出。接上从站代码流程复杂自己加了很多printk由于循环时间短每轮循环都有大量的信息来不及输出就丢失了部分log。
解决
方法一直接修改主站的循环周期
ec_master_idle_thread函数//ec_master_set_send_interval(master, 1000000 / HZ);
ec_master_set_send_interval(master, 5000000); -------改动1主站周期从4ms改成5sif (ec_fsm_master_idle(master-fsm)) {// set_current_state(TASK_INTERRUPTIBLE);// schedule_timeout(1); msleep(100); ----------改动2注掉上面2行} else {//schedule(); msleep(100); ----------改动2注掉上面1行}
方法二间接修改主站的循环周期
因为ec_master_idle_thread 每个周期都会执行ecrt_master_send -- ec_master_send_datagrams发送数据报文所以可以在发送报文时加个延时
ec_master_idle_thread函数//ec_master_set_send_interval(master, 1000000 / HZ);
ec_master_set_send_interval(master, 5000000); -------改动1主站周期从4ms改成5s-----------------------------------------------------------------------------void ec_master_send_datagrams(ec_master_t *master, /** EtherCAT master */ec_device_index_t device_index /** Device index. */)
{do {frame_data NULL;follows_word NULL;more_datagrams_waiting 0;// fill current frame with datagramslist_for_each_entry(datagram, master-datagram_queue, queue) {if (datagram-state ! EC_DATAGRAM_QUEUED ||datagram-device_index ! device_index) {continue;}……list_add_tail(datagram-sent, sent_datagrams);datagram-index master-datagram_index;EC_MASTER_DBG(master, 2, Adding datagram 0x%02X\n,datagram-index);msleep(100); ------------在这里加个延时
修改后log是全的。报文从0开始发送、接收是一一对应的 5过滤掉IgH主站插网线之前的log
IgH主站网卡没有插网线意味着网卡的link_state处于down状态ec_master_idle_thread周期性执行ecrt_master_send发送数据报文在ecrt_master_send中如果网卡处于link down状态则会设置报文为EC_DATAGRAM_ERROR在这里加个printk见下代码log中过滤关键字EC_DATAGRAM_ERROR就可以了。
void ecrt_master_send(ec_master_t *master)
{ec_datagram_t *datagram, *n;ec_device_index_t dev_idx;if (master-injection_seq_rt ! master-injection_seq_fsm) {// inject datagram produced by master FSMec_master_queue_datagram(master, master-fsm_datagram);master-injection_seq_rt master-injection_seq_fsm;}ec_master_inject_external_datagrams(master);for (dev_idx EC_DEVICE_MAIN; dev_idx ec_master_num_devices(master);dev_idx) {if (unlikely(!master-devices[dev_idx].link_state)) {// link is down, no datagram can be sentlist_for_each_entry_safe(datagram, n,master-datagram_queue, queue) {if (datagram-device_index dev_idx) {//在这里加行logprintk(KERN_ERR geshifei %s %d: set datagram-state EC_DATAGRAM_ERROR\n,__func__, __LINE__);datagram-state EC_DATAGRAM_ERROR;list_del_init(datagram-queue);}} 6IgH发送、接收的报文怎么看
以IgH读从站状态的广播报文0x0130为例打开DEBUG后demsg看到的报文 发送报文 [18773.590655] geshifei ec_master_send_datagrams 1059: Adding datagram datagram-index0 [18773.590656] EtherCAT DEBUG 0: frame size: 46 [18773.590656] EtherCAT DEBUG 0: Sending frame: [18773.590658] EtherCAT DEBUG: FF FF FF FF FF FF 6C 24 08 29 52 19 88 A4 0E 10 [18773.590664] EtherCAT DEBUG: 07 00 00 00 30 01 02 00 00 00 00 00 00 00 00 00 [18773.590669] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [18773.590674] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 响应报文 [18773.710617] EtherCAT DEBUG 0: Received frame: [18773.710618] EtherCAT DEBUG: FF FF FF FF FF FF 6E 24 08 29 52 19 88 A4 0E 10 [18773.710624] EtherCAT DEBUG: 07 00 01 00 30 01 02 00 00 00 02 00 01 00 00 00 [18773.710628] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [18773.710633] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 00 00 [18773.710636] geshifei ec_master_receive_datagrams 1224: datagram-index0 7wireshark报文怎么看 1注意source mac被从站改动过为什么改不清楚感觉没必要。
2正常情况下发送的报文WC 0响应报文的WC不为0存在从站的情况下
所以可通过上面两个特征来判断哪个是发送报文哪个是接收报文。 datagram-index用的是master-datagram_index初始化是master-datagram_index为0所以所有主站发送的数据报文的index应该是从0递增的最大值255master-datagram_index是uint8_t类型到最大值后又从0开始计数。
响应的报文不会也不能修改Index值因为IgH主站程序收到响应报文后需要根据报文的index去匹配对应的发送报文然后将发送报文从内部的发送队列中删除。