SOEM源码解析——ecx_init_context(初始化句柄)

0 工具准备

1.SOEM-master-1.4.0源码

1 ecx_init_context函数总览

/*** @brief 初始化句柄* @param context 句柄*/
void ecx_init_context(ecx_contextt *context)
{int lp;*(context->slavecount) = 0;/* clean ec_slave array *//* 清空从站信息数组 */memset(context->slavelist, 0x00, sizeof(ec_slavet) * context->maxslave);memset(context->grouplist, 0x00, sizeof(ec_groupt) * context->maxgroup);/* clear slave eeprom cache, does not actually read any eeprom *//* 清空EEPROM缓存,实际上不读取任何EEPROM */ecx_siigetbyte(context, 0, EC_MAXEEPBUF);for(lp = 0; lp < context->maxgroup; lp++){/* default start address per group entry *//* 设置每个组条目的默认起始地址 */context->grouplist[lp].logstartaddr = lp << EC_LOGGROUPOFFSET;}
}

从以上代码可以看出,ecx_init_context的工作主要分为3块:
(1)初始化从站、分组列表
(2)清空EEPROM缓存
(3)初始化从站分组逻辑起始地址

1.1 初始化从站、分组列表

SOEM源码使用memset函数将从站、分组列表内容全部设置为0x00,相关语句如下:

memset(context->slavelist, 0x00, sizeof(ec_slavet) * context->maxslave);
memset(context->grouplist, 0x00, sizeof(ec_groupt) * context->maxgroup);

1.2 清空EEPROM缓存

SOEM源码通过ecx_siigetbyte函数去读取EEPROM,ecx_siigetbyte函数原型如下:

/** Read one byte from slave EEPROM via cache.通过从站EEPROM缓存区读取一个字节*  If the cache location is empty then a read request is made to the slave. 如果读取的缓存区为空则向从站发起读取*  Depending on the slave capabilities the request is 4 or 8 bytes.*  @param[in] context = context struct 句柄*  @param[in] slave   = slave number 从站序号*  @param[in] address = eeprom address in bytes (slave uses words) EEPROM数据地址(从站使用字为单位)*  @return requested byte, if not available then 0xff 读取结果,如果不可用则返回0xff*/
uint8 ecx_siigetbyte(ecx_contextt *context, uint16 slave, uint16 address)

ecx_init_context函数传入该函数的参数2为0、参数3为EC_MAXEEPBITMAP
(1)当传入的slave不是EEPROM缓存数据从站拥有者时,就会清空EEPROM缓存区。相关语句如下:

/* cache里的EEPROM数据不属于传入从站 */if (slave != context->esislave){/* clear esibuf cache map *//* 清空esibuf指向的EEPROM缓存区*/memset(context->esimap, 0x00, EC_MAXEEPBITMAP * sizeof(uint32));/* 将EEPROM cache所属从站设置为传入从站*/context->esislave = slave;}

其中context->esislave的初始值为0,如果有从站的EEPROM被读取到缓存区,则该值>0。这样当重复初始化从站时便会将之前读取到的EEPROM缓存区清空。简单来说,该语句可以保证context->esislave的值为0,这样后续有人使用到该函数都会因为slave不等于context->esislave从而绕过缓存区去直接读取EEPROM获取EEPROM数据。
(2)当传入的address大于等于EC_MAXEEPBUF不会进行任何操作,这样便完成了EEPROM缓存区的清空操作。相关语句如下:

if (address < EC_MAXEEPBUF){......}

1.3 初始化从站分组逻辑起始地址

这里按顺序为每个从站分组逻辑起始地址设置为0 * 65536、1 * 65536…n * 65536,这样相当于每个分组逻辑寻址空间大小为64KB,这恰好等于ESC支持的最大DPRAM存储空间:64KB。这样大的逻辑寻址空间对于每一个分组来说都绰绰有余,实际的应用中单个从站PDO一般仅几十字节。
在这里插入图片描述
相关语句如下:

for(lp = 0; lp < context->maxgroup; lp++){/* default start address per group entry *//* 设置每个组条目的默认起始地址 */context->grouplist[lp].logstartaddr = lp << EC_LOGGROUPOFFSET;}

2 总结

ecx_init_context函数是SOEM主站在初始化网卡及端口参数后首个执行的函数,用于初始化句柄,该函数具体的工作如下:
(1)初始化从站、分组列表
(2)清空EEPROM缓存
(3)初始化从站分组逻辑起始地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10设置windows永不更新

以下方法能全部设置都要全部设置。 方法一&#xff1a;Windows设置 要想关闭Win10自动更新&#xff0c;比较简单的一种方法就是进入到Windows设置中&#xff0c;将Windows更新直接关闭。步骤如下&#xff1a; 1、按“Windows I”键&#xff0c;打开Windows设置&#xff0c;再…

服务器数据恢复—Zfs文件系统下文件被误删除的如何恢复数据?

服务器故障&#xff1a; 一台zfs文件系统服务器&#xff0c;管理员误操作删除服务器上的数据。 服务器数据恢复过程&#xff1a; 1、将故障服务器所有磁盘编号后取出&#xff0c;硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做扇区级别的镜像备…

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法&#xff1a; 报/usr/bin/ld: cannot find -lc 我们下载glibc-static&#xff1a; 选择x86_64的。 还有一个是libxcrypt-static&#xff0c;依旧在这个网站里搜。 rpm -ivh glibc-static-2.28-239.el8.x…

使用seldom编写http接口用例

在编写接口用例的过程中&#xff0c;针对一个接口&#xff0c;往往只是参数不同&#xff0c;那么参数化就非常有必要了。 seldom 中参数化的用法非常灵活&#xff0c;这里仅介绍file_data() 的N种玩法。 二维列表 当参数比较简单时可以试试下面的方式。 参数化数据 {"…

软考高项-IT部分

信息化体系 信息化技术应用:龙头 信息资源:核心任务 信息网络:应用基础 信息技术和产业:建设基础 信息化人才:成功之本 信息化法规:保障 信息化趋势 产业信息化、产品信息化、社会生活信息化、国民经济信息化 新型基础设施建设 2018年召开的中央经济工作会议,首…

onnx 模型加载部署运行方式

1.通过文件路径的onnx模型加载方式: 在onnxruntime下面的主要函数:session Ort::Session(env, w_modelPath.c_str(), sessionOptions); 这里的文件路径是宽字节的&#xff0c;通过onnx文件路径直接加载模型。 在opencv下使用dnn加载onnx模型的主要函数: std::string model…

北京联通iptv组播配置

多年前折腾过iptv&#xff0c;近期搬家换了个大电视&#xff0c;打算把iptv配置好了&#xff0c;尽管不怎么看&#xff0c;但聊胜于无。 其实很简单&#xff0c;用到了一些工具&#xff0c;记录如下 1. openwrt配置 因为有软路由&#xff0c;所以就借助openwrt了&#xff0c;一…

【qemu逃逸】HITB2017-babyqemu 2019数字经济-qemu

前言 由于本地环境问题&#xff0c;babyqemu 环境都没有起起&#xff0c;这里仅仅做记录&#xff0c;exp 可能不正确。 HITB2017-babyqemu 设备逆向 设备定位啥的就不说了&#xff0c;先看下实例结构体&#xff1a; 其中 dma_state 结构体如下&#xff1a; 这里看字段猜测…

linux入门到地狱

linux—001入门 IT圈必备(前端工作者用的比较少) 老旧电脑跑linux不容易卡 我代码没保存windows闪退&#xff0c;僵停(vs2019卡掉线)&#xff0c;重启更新,占用cpu内存服务报错pip各种bug 出来生态环境友好其他的全是bug(bug时间成本超过了windows快捷友好生态) 那就说明wind…

ICP学习记录

1. 流程图 ICP&#xff08;一&#xff09;原理详解_icp原理-CSDN博客 ICP算法详解——我见过最清晰的解释-CSDN博客 ICP算法理解-CSDN博客 ICP知识点梳理笔记_icp非凸_KalutSirocco的博客-CSDN博客 【精选】【图像配准】点云配准ICP算法介绍&#xff1a;基础流程、ICP算法…

MyBatis-Plus复习总结(一)

文章目录 一、环境搭键二、基本CRUD2.1 BaseMapper2.2 插入2.3 删除2.4 修改2.5 查询 三、通用Service四、常用注解4.1 雪花算法4.2 注解TableLogic 五、条件构造器和常用接口5.1 Wrapper介绍5.2 QueryWrapper5.3 UpdateWrapper5.4 condition5.5 LambdaQueryWrapper5.6 LambdaU…

live555交叉编译(ubuntu+arm平台)

1.下载源码 wget ​​​​​​http://live555.com/liveMedia/public/live555-latest.tar.gz 2.解压 tar -zxvf live555-latest.tar.gz 3.修改配置文件 1&#xff09;进入live文件夹 2&#xff09;复制一份配置文件 cp config.armlinux config.myarmlinux 3) vim config…

Android SpannableString 文字中设置多个片段颜色

文字 恭喜y******x成功解冻红包&#xff0c;200元微信到账成功 恭喜x******9成功解冻红包&#xff0c;200元微信到账成功 恭喜j******4成功解冻红包&#xff0c;200元微信到账成功 恭喜5******n成功解冻红包&#xff0c;200元微信到账成功 恭喜9******s成功解…

Gradle中的依赖Dependencies说明与使用总结

【1】依赖的方式 Gradle 中的依赖分别为直接依赖&#xff0c;项目依赖&#xff0c;本地jar 依赖。 dependencies {//①.依赖当前项目下的某个模块[子工程]implementation project(:subject01)//②.直接依赖本地的某个jar文件implementation files(libs/foo.jar, libs/bar.jar…

spring-session-core排除某些接口不设置session

这里写自定义目录标题 需求实现 需求 今天先写一下如何实现&#xff0c;之后再更新一篇如何发现这个问题的。 我们的项目使用了spring-session-core来存储共享session&#xff0c;存在redis中&#xff0c;然后在cookie中是设置了key为SESSION的session。但是我们有一些开放接口…

Windows PowerShell 和 Linux BashShell 极简对比

声明&#xff1a;本文不会涉及原理&#xff0c;详细的介绍&#xff0c;也不是入门文章。仅仅从使用上进行简单比较 命令 在 bash 中&#xff0c;一个命令是一个单独的进程&#xff1b;而在 PowerShell 中&#xff0c;命令被称为 cmdlets&#xff0c;他们不是独立的可执行程序&…

行业安卓主板-基于RK3568/3288/3588的电子班牌/人脸识别门禁/室内对讲门禁方案解决方案(二)

电子班牌 智能电子班牌可在主页实时显示班级全面的基本信息&#xff0c;包括天气、班名、课程表、值日表等&#xff0c;并发布学校通知、班级通知。学生可刷卡自动登陆系统进行课堂反馈&#xff0c;教师和家长可及时了解教学反馈&#xff0c;打通学校、教师、学生之间的互动通…

Hive 解析 JSON 字符串数据的实现方式

文章目录 通过方法解析现实示例 通过序列化实现示例 通过方法解析现实 在 Hive 中提供了直接解析 JSON 字符串数据的方法 get_json_object(json_txt, path)&#xff0c;该方法参数解析如下&#xff1a; json_txt&#xff1a;顾名思义&#xff0c;就是 JSON 字符串&#xff1b;…

elasticsearch索引按日期拆分

1.索引拆分原因 如果单个索引数据量过大会导致搜索变慢&#xff0c;而且不方便清理历史数据。 例如日志数据每天量很大&#xff0c;而且需要定期清理以往日志数据。例如原索引为sc_all_system_log&#xff0c;现按天拆分索引sc_all_system_log20220902&#xff0c;sc_all_syste…

B-DS二叉树_输出所有目标路径

Description 给定二叉树和一个整数目标targetSum&#xff0c;输出所有从根结点到叶子结点的路径总和等于targetSun的路径。 Input 第一行输入t&#xff0c;表示有t个测试样例。 第二行起&#xff0c;每一行首先输入一个整数targetSum&#xff0c;接着输入n&#xff0c;接着输…