EtherCat--SOME协议栈常用函数学习笔记

一、SOME协议栈常用函数
(一)、ec_find_adapters (ethercatmain.c) -- 返回可用网络适配器列表

ec_adaptert * ec_find_adapters (void)
{
ec_adaptert * ret_adapter;
ret_adapter = oshw_find_adapters();
return ret_adapter;
}

typedef struct ec_adapter ec_adaptert;

struct ec_adapter

{
char name[EC_MAXLEN_ADAPTERNAME];

char desc[EC_MAXLEN_ADAPTERNAME];

ec_adaptert *next;

};

(二)、ecx_setupnic (nicdrv.c) -- 初始化网卡设备,返回1时初始化成功,初始化SOEM,将socket绑定到ifname

调用-> ec_init(ifname) //ifname:(一)中获取的desc信息

int ecx_setupnic(ecx_portt *port, const char *ifname, int secondary)
{

。。。

return 1;
}

(三)、ecx_config_init (ethercatconfig.c) -- 枚举并初始化从站,返回值为从站个数

调用-> ec_config_init(FLASE)

int ecx_config_init(ecx_contextt *context, uint8 usetable)

{

。。。

return wkc;

}

(四)、ec_statecheck (ethercatmain.c) -- 等待所有从站运行到安全状态 SAFE_OP

ec_statecheck(0, EC_STATE_SAFE_OP, 50000);

(五)、ec_slave[EC_MAXSLAVE] (ethercatmain.c) -- 从站信息

typedef struct ec_slave

{

uint16 state; //从站状态

uint32 eep_id // ID from EEprom

。。。

}ec_slavet;

(六)、切换从站状态

rnec_readstate(slave);

if (ec_slave[slave].state != EC_STATE_BOOT)

{

ec_slave[slave].state = EC_STATE_INIT;

ec_slave[0].state = EC_STATE_INIT;

ec_writestate(slave);

osal_usleep(1000);

ec_slave[slave].state = EC_STATE_BOOT;

ec_slave[0].state = EC_STATE_BOOT;

ec_writestate(slave);

osal_usleep(1000);

}

(七)、ecx_SDOwrite(ethercatcoe.h)-- 写入SDO数据

调用-> ec_SDOwrite(从站,序列,子序列,FALSE,size,&bufdata,EC_TIMEOUTRXM);

int ecx_SDOwrite(ecx_contextt *context , uint16 Slave , uint16 Index , uint8 SubIndex ,

boolean CA , int psize , void *p , int Timeout)

{

。。。

}

(八)、ecx_SDOread(ethercatcoe.h)-- 读取SDO数据

调用-> ec_SDOread(从站,序列,子序列,FALSE,&len,&bufdata,EC_TIMEOUTRXM);

int ecx_SDOread(ecx_contextt *context , uint16 slave , uint16 Index , uint8 subIndex ,

boolean CA , int *psize , void *p , int timeout)

{

。。。

}

(九)、ec_FPWR(ethercatbase.c)-- 配置的地址物理写(FPWR)

int ec_FPWR(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
{
return ecx_FPWR(&ecx_port, ADP, ADO, length, data, timeout);
}

(十)、ecx_FOEwrite(ethercatfoe.c)-- FOE写数据

调用-> ec_FOEwrite

(十一)、ecx_FOEread(ethercatfoe.c)-- FOE读数据

调用-> ec_FOEread

二、WinPcap免安装实现
WinPcap安装实现的逻辑实际上相当于 对 wpcap.dll、packet.dll 和 npf.sys 这三个文件放到相应的系统文件夹下。

1、x86 系统

对于32位系统而言,我们需要把 x86版本的wpcap.dll、packet.dll 和 npf.sys这三个文件进行拷贝到不同位置,分别为:

wpcap.dll (x86版本) 拷贝到 C:\Windows\system32\ 下

packet.dll (x86版本) 拷贝到 C:\Windows\system32\ 下

npf.sys (x86版本) 拷贝到 C:\Windows\system32\drivers\ 下

成功后,就相当于WinPcap的免安装版就OK了。

2、x64 系统

对于64位系统而言,比较复杂一点,拿C++程序对WinPcap 封装来讲

(1)如果C++编译出来的程序本身是64位的,在x64位的系统上运行,步骤简单些

wpcap.dll (x64版本) 拷贝到 C:\Windows\system32\ 下

packet.dll (x64版本) 拷贝到 C:\Windows\system32\ 下

npf.sys (x64版本) 拷贝到 C:\Windows\system32\drivers\ 下

(2)如果C++编译出来的程序本身是32位的,希望兼容x86和x64都能运行,步骤复杂些

wpcap.dll (x64版本) 拷贝到 C:\Windows\system32\ 下

packet.dll (x64版本) 拷贝到 C:\Windows\system32\ 下

npf.sys (x64版本) 拷贝到 C:\Windows\system32\drivers\ 下

wpcap.dll (x86版本) 拷贝到 C:\Windows\SysWOW64\ 下

packet.dll (x86版本) 拷贝到 C:\Windows\SysWOW64\ 下


原文链接:https://blog.csdn.net/qq_41931610/article/details/129548135

posted @ 2024-11-18 18:50  czcbzc  阅读(7)  评论(0编辑  收藏  举报