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