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\ 下

三、Inno Setup实现WinPcap依赖库拷贝

基本使用参考:Inno Setup使用教程 - 打包SpringBoot+Vue前后端分离项目_inno setup打包springboot+vue-CSDN博客

[Files]
Source: ".\Wpcap\npf.sys"; DestDir: "{win}\System32\drivers"; Flags: onlyifdoesntexist uninsneveruninstall 64bit; Check:IsWin64

Source: ".\Wpcap\x64\*"; DestDir: "{win}\System32"; Flags: onlyifdoesntexist uninsneveruninstall 64bit; Check:IsWin64

Source: ".\Wpcap\x86\*"; DestDir: "{syswow64}"; Flags: ignoreversion onlyifdoesntexist uninsneveruninstall

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值