SOEM代码Slaveinfo Demo分析
分析Windows版本的Demo,以便之后移植到STM32F746上。
1. slaveinfo.exe入口函数为main,需要一个以太网PHY的网卡名,网卡名在Windows下是\Device\NPF_{XXXXXXX...XXXXXXXXX},在STM32F746下如何表示?
2. 首先需要调用ec_init,初始化网卡,绑定socket
/* initialise SOEM, bind socket to ifname */if (ec_init(ifname)){printf("ec_init on %s succeeded.\n",ifname);
ec_init位于ethercatmain.c中,ec_init里边是ecx_init,再往里边是ecx_setupnic,exc_setupnic位于nicdrv.c中,这个nicdrv.c相当于Windows下的网卡驱动。值得注意的是ecx_contextt结构体,这个结构体定义在ethercatmain.h中
/** Context structure , referenced by all ecx functions*/
typedef struct ecx_context ecx_contextt;
struct ecx_context
{/** port reference, may include red_port */ecx_portt *port;/** slavelist reference */ec_slavet *slavelist;/** number of slaves found in configuration */int *slavecount;/** maximum number of slaves allowed in slavelist */int maxslave;/** grouplist reference */ec_groupt *grouplist;/** maximum number of groups allowed in grouplist */int maxgroup;/** internal, reference to eeprom cache buffer */uint8 *esibuf;/** internal, reference to eeprom cache map */uint32 *esimap;/** internal, current slave for eeprom cache */uint16 esislave;/** internal, reference to error list */ec_eringt *elist;/** internal, reference to processdata stack buffer info */ec_idxstackT *idxstack;/** reference to ecaterror state */boolean *ecaterror;/** internal, position of DC datagram in process data packet */uint16 DCtO;/** internal, length of DC datagram */uint16 DCl;/** reference to last DC time from slaves */int64 *DCtime;/** internal, SM buffer */ec_SMcommtypet *SMcommtype;/** internal, PDO assign list */ec_PDOassignt *PDOassign;/** internal, PDO description list */ec_PDOdesct *PDOdesc;/** internal, SM list from eeprom */ec_eepromSMt *eepSM;/** internal, FMMU list from eeprom */ec_eepromFMMUt *eepFMMU;/** registered FoE hook */int (*FOEhook)(uint16 slave, int packetnumber, int datasize);/** registered EoE hook */int (*EOEhook)(ecx_contextt * context, uint16 slave, void * eoembx);
};
在exc_setupnic中,入参是ecx_context.port,网卡名,false(单网卡模式)。该函数作用是绑定socket
/** Basic setup to connect NIC to socket.* @param[in] port = port context struct* @param[in] ifname = Name of NIC device, f.e. "eth0"* @param[in] secondary = if >0 then use secondary stack instead of primary* @return >0 if succeeded*/
int ecx_setupnic(ecx_portt *port, const char *ifname, int secondary)
由于secondary是false(单网卡模式),因此直接进入else
else{InitializeCriticalSection(&(port->getindex_mutex));InitializeCriticalSection(&(port->tx_mutex));InitializeCriticalSection(&(port->rx_mutex));port->sockhandle = NULL;port->lastidx = 0;port->redstate = ECT_RED_NONE;port->stack.sock = &(port->sockhandle);port->stack.txbuf = &(port->txbuf);port->stack.txbuflength = &(port->txbuflength);port->stack.tempbuf = &(port->tempinbuf);port->stack.rxbuf = &(port->rxbuf);port->stack.rxbufstat = &(port->rxbufstat);port->stack.rxsa = &(port->rxsa);ecx_clear_rxbufstat(&(port->rxbufstat[0]));psock = &(port->sockhandle);}
InitializeCriticalSection作用是初始化一个临界资源对象。详情见百度。“临界区”CCriticalSection是临界资源对象指针,该函数无返回值。单进程的各个线程可以使用临界资源对象来解决同步互斥问题,该对象不能保证哪个线程能够获得到临界资源对象,该系统能公平的对待每一个线程。
之后就是配置port
再之后就是用Winpcap,Winpcap与socket区别见 https://blog.csdn.net/code_while/article/details/80234336
我们使用Winpcap发送RAW数据包 https://blog.csdn.net/ykiwmy/article/details/86560781
上图是来自Winpcap官方文档的一个架构图,Winpcap最底层是一个NPF(Netgroup Packet Filter,网络组包过滤)驱动,这是一个NDIS中间件驱动,所有经过网卡的数据包都会“途经”该驱动,在收到路过的数据包时,NPF可以选择仅仅统计一下包的情况或写入文件(做流量监控),或者写到一个环形缓冲区中,然后用户态程序调用wpcap.dll中一些函数,使用WinAPI和驱动程序交互,获取驱动缓冲区中的数据,则达到了监控底层数据包的目的。至于发送数据包,用户态程序调用Winpcap的SDK函数,这些函数调用dll中的方法,dll再用API和NPF通信,NPF是很最低层的驱动了,但它并不负责直接收发数据,NPF再调用更底层的网卡驱动实现数据包的发送。
pcap_open见 https://blog.csdn.net/swartz_lubel/article/details/75670474
pcap_open主要目的是使用winpcap打开网卡接口\Device\NPF_{XXXXXXX...XXXX}
然而这个winpcap在STM32F746上并没有,是否应该参考linux下的demo?
继续看ec_setupheader,作用是组以太网帧,采用广播模式发送,
/** Fill buffer with ethernet header structure.* Destination MAC is always broadcast.* Ethertype is always ETH_P_ECAT.* @param[out] p = buffer*/
void ec_setupheader(void *p)
{ec_etherheadert *bp;bp = p;bp->da0 = htons(0xffff);bp->da1 = htons(0xffff);bp->da2 = htons(0xffff);bp->sa0 = htons(priMAC[0]);bp->sa1 = htons(priMAC[1]);bp->sa2 = htons(priMAC[2]);bp->etype = htons(ETH_P_ECAT);
}
至此,ec_init结束,作用是使用pcap_open打开网卡接口,并组以太网帧头(类型是ETH_P_ETH)。ec_init成功会返回1。
3. ec_config
int ec_config ( uint8 usetable,void * pIOmap )
Enumerate / map and init all slaves.
Parameters:[in] usetable = TRUE when using configtable to init slaves, FALSE otherwise[out] pIOmap = pointer to IOmapReturns:Workcounter of slave discover datagram = number of slaves found
返回值是number of slaves found,之后ec_configdc配置分布式时钟
之后就是不断地打印出ec_slave结构体数组里的slave信息。
SOEM代码Slaveinfo Demo分析相关推荐
- qml demo分析(threadedanimation-线程动画)
一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...
- go-pitaya学习笔记(9)-rate_limiting demo分析
学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...
- go-pitaya学习笔记(6)-cluster-protobuf demo分析
学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...
- go-pitaya学习笔记(7)-custom_metrics demo分析
学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...
- 用PlanAhead进行RTL代码开发与分析
用PlanAhead进行RTL代码开发与分析 这里介绍如何用PlanAhead进行RTL代码开发与分析.需要说明一点,本章所用的所有实例都可以在PlanAhead的安装目录E:\Xilinx\11.1 ...
- 用70行代码实现日志分析程序
python又一力作,感受python的强大.用70行代码实现日志分析程序 功能介绍:可直接对文本日至进行分组和排序功能,完了输出结果粘贴到excel里就可以直接生成图表,对于排查一些生产环境问题有很 ...
- wordpress漏洞_用软件工具扫描WordPress / Shopify主题恶意代码以及漏洞分析相关工具...
Shopify的主题模板相对于其他WordPress市场的主题,价格偏高,很多卖家选择免费的去授权或者卖家使用后下载后的主题,那么这么就会有不法恶意人士向代码里面加入恶意代码或者制造一些主题漏洞后面, ...
- 数据结构与算法--代码鲁棒性案例分析
代码鲁棒性 鲁棒是robust的音译,就是健壮性.指程序能够判断输入是否符合规范,对不合要求的输入能够给出合理的结果. 容错性是鲁棒的一个重要体现.不鲁棒的代码发生异常的时候,会出现不可预测的异常,或 ...
- 数据结构与算法--代码完整性案例分析
确保代码完整性 在撸业务代码时候,经常面对的是接口的设计,在设计之初,我们必然要先想好入参,之后自然会有参数的校验过程,此时我们需要把可能的输入都想清楚,从而避免在程序中出现各种纰漏.但是难免面面俱到 ...
- Go内存管理之代码的逃逸分析
基本上,每种编程语言都有其自己的内存模型.每个变量,常量都存储在内存的某个物理位置上,这些存储位置通过内存指针访问. 至于变量,就是程序里赋予内存存储位置的名称.程序可以根据需要进行操作,并且可以将新 ...
最新文章
- ApacheCN 学习资源汇总 2019.3
- C#里面Console.Write与Console.WriteLine有什么区别????
- 2014目标!!!!
- 10.线程池与连接池
- Spring MVC @RequestMapping注解详解
- 25道Spring框架面试题
- 【最详细】BFPRT算法:时间复杂度O(n)求第k小的数字
- HH SaaS电商系统的品牌模块设计
- linux绑定team网卡,linux 实现双网卡绑定单个IP——team篇
- jq苹果手机全屏下点击无效果_苹果系统自带外挂?无需越狱也可录制动作脚本...
- 吴恩达深度学习——2.3 logistic回归损失函数
- 使用php递归计算目录大小
- 计算机科学与技术专业大学排名2020,2020计算机科学与技术专业最好大学排名:160余所大学上榜...
- windows借鉴linux了吗,Windows应该借鉴Linux的10大功能特征
- 万能手机解锁工具v1.0绿色加强版
- javase核心day13
- Aurora使用教程 第一讲
- pyspark入门---机器学习实战预测婴儿出生率(二)使用ML库
- 快牙网传——推送通知
- 新手用canvas画时钟
热门文章
- 图像特征:突出显示稀疏突出区域Image Signature:Highlighting Sparse Salient Regions
- 计算机多媒体故障,多媒体教室设备常见故障及处理方法
- 计算机室 多媒体教室制度,多媒体教室管理、使用制度
- \opencv\build\x86下的vc6、vc7、vc8、vc9、vc10、vc11、vc12、vc14、vc15是什么意思?
- CMM3上的集成软件管理
- 推荐 Word、EXCEL必备工具箱
- python 编程实例
- python学习手册 第7章 字符串
- 弄一个html的登录页面,如何制作一个简单的HTML登录页面(附代码)
- 搭建vue并且实现360和谷歌浏览器对office(ntko)在线编辑工具的集成