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

news2024/11/24 22:59:57

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.coloradmin.cn/o/1173908.html

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

相关文章

python-在系统托盘显示CPU使用率和内存使用率

一、添加轮子 1.添加托盘区图标库 infi.systray from infi.systray import SysTrayIcon 2.添加图像处理库 Pillow from PIL import Image, ImageDraw, ImageFont 3.添加 psutil 来获取CPU、内存信息 import psutil 二、完整代码 from infi.systray import SysTrayIcon …

简单-【1 绪论】

关键字&#xff1a; 数据类型、数据结构定义、递归关键、线性结构、非线性结构、算法特性、算法目标、时间复杂度排序

【异常错误】Multiple top-level packages discovered in a flat-layout: [

今天在配置环境时&#xff0c;在运行代码&#xff1a; pip install -e . 出现了以下错误&#xff1a; 解决方案 在setup.py中显示加入一行 py_modules[]&#xff0c;如&#xff1a; setup(namexxxx,versionx.x,py_modules[], ) 再次运行pip指令安装即可解决。 error: Mul…

由于找不到msvcr110.dll无法继续执行此代码怎么解决?5个解决方法分享

MSVCP110.dll是Microsoft Visual C 2012运行时库的一部分&#xff0c;它包含了许多用于支持C应用程序运行的函数。当您在运行某些程序时&#xff0c;可能会遇到“msvcp110.dll丢失”的错误提示。为了解决这个问题&#xff0c;您可以尝试以下5种方法&#xff1a; 方法1. 重新安装…

思维模型 霍布森选择效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。这是一个设计好的陷阱&#xff0c;也许你认为你有选择&#xff0c;然后冥冥之中你的选择却很少&#xff0c;尽在所谓的“命运”掌握之中。 1 霍布森选择效应的应用 1.1 iphone的营销策略之…

为什么说IT企业知识库是知识共享的驱动力?

在快速发展和不断变化的IT行业中&#xff0c;知识的积累和共享是保持竞争力的关键。一个完善的知识库可以帮助企业有效管理和传承内部知识&#xff0c;提高团队的工作效率和协作能力。随着企业规模的扩大和员工的流动性增加&#xff0c;一个完善的知识库可以确保知识的传承和持…

leetcode 684. 冗余连接

树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges &#xff0c;edges[i] …

阿里云域名实战

一、准备阿里云服务器&#xff0c;实现网站功能 &#xff08;1&#xff09;百度搜索阿里云 &#xff08;2&#xff09;登录阿里云 可以使用支付宝&#xff0c;淘宝账号登录 &#xff08;3&#xff09;点击控制台 (4)创建实例&#xff0c;购买云服务器 &#xff08;5&#x…

蓝桥杯每日一题2023.11.5

题目描述 方格分割 - 蓝桥云课 (lanqiao.cn) 题目分析 对于每个图我们可以从中间开始搜索&#xff0c;如果到达边界点就说明找到了一种对称的方法&#xff0c;我们可以直接对此进行答案记录每次进行回溯就会找到不同的图像&#xff0c;如果是一样的图像则算一种情况&#xff…

pcigo图床插件的简单开发

1.前言&#xff1a; 如果想写一个图床并且投入使用&#xff0c;那么&#xff0c;接入picgo一定是一个不错的选择。picgo有着windows&#xff0c;mac&#xff0c;linux等多个客户端版本。实用且方便。 2. 开发的准备&#xff1a; 2.0. 需要安装一个node node这里我就不详细说…

zip文件解压缩命令全

zip文件解压缩命令全 入门Zip 用法选项示例语法形式和选项基本语法压缩目录将文件添加到现有压缩文件解压缩文件将 zip 文件解压缩到指定目录列出 zip 文件中的内容将 zip 文件加密将 zip 文件解密将 zip 文件中的文件转成 UTF-8 编码Zip 压缩示例创建新的 zip 压缩文件将文件添…

1.1 HTML4

一. 前言 1. 两位先驱 艾伦麦席森图灵 二战时期&#xff0c;破译了德军的战争编码一英格玛。让二战提前2年结束&#xff0c;拯救了上千万人的生命。设立图灵奖&#xff0c;被后人誉为:人工智能之父。 约翰冯诺依曼 制订了现代计算机标准一一冯诺依曼体系结构。提出:计算机要…

“网站不安全”该如何解决

当我们的网站被客户访问的时候&#xff0c;经常会出现提示不安全的情况&#xff0c;导致客户的不信任&#xff0c;从而出现客户流失的现象&#xff0c;这种情况我们应该如何解决呢&#xff1f; 首先&#xff0c;我们要确定网站会出现不安全的原因&#xff0c;一般来说&#xff…

Docker 学习路线 4:Docker 基础知识

Docker是一个平台&#xff0c;简化了在轻量、可移植的容器中构建、打包和部署应用程序的过程。在本节中&#xff0c;我们将介绍Docker的基础知识、其组件以及您需要开始使用的关键命令。 容器是什么&#xff1f; 容器是一个轻量级、独立的可执行软件包&#xff0c;包含运行应…

装修服务预约小程序的内容如何

大小装修不断&#xff0c;市场中大小品牌也比较多&#xff0c;对需求客户来说&#xff0c;可以线下咨询也可以线上寻找品牌&#xff0c;总是可以找到满意的服务公司&#xff0c;而对装修公司来说如今线下流量匮乏&#xff0c;很多东西也难以通过线下方式承载&#xff0c;更需要…

CATIA环境编辑器用不了时创建项目快捷方式

CATIA环境编辑器用不了时创建项目快捷方式 一、参考适用情况示例二、 解决步骤(一) 先正确放置winb_64部署包(二) 添加环境文件(三) 修改加入的环境文件(四) 复制本机CATIA快捷方式后重命名(五) 修改快捷方式目标的值 一、参考适用情况示例 二、 解决步骤 (一) 先正确放置winb…

什么是类和对象?this引用是什么?Java如何初始化对象?

目录 一.什么是面向对象 面向过程&#xff1a; 面向对象&#xff1a; 二.类与对象 类的概念 类的定义格式 对象的概念 注意 关于类和对象的说明 三.this引用 为什么要有this引用&#xff1f; 什么是this引用 this引用的特性 四.对象的构造及初始化 构造方法 特…

LangChain+LLM实战---使用知识图谱和大模型来实现多跳问答

原文&#xff1a;Knowledge Graphs & LLMs: Multi-Hop Question Answering 可以使用检索增强方法来克服大型语言模型(Large Language Models, llm)的局限性&#xff0c;比如幻觉和有限的知识。检索增强方法背后的思想是在提问时引用外部数据&#xff0c;并将其提供给LLM&a…

ok-解决qt5发布版本,直接运行exe缺少各种库的问题

已实验第二种方法可用。 工具&#xff1a;电脑必备、QT下的windeployqt Qt 官方开发环境使用的动态链接库方式&#xff0c;在发布生成的exe程序时&#xff0c;需要复制一大堆 dll&#xff0c;如果自己去复制dll&#xff0c;很可能丢三落四&#xff0c;导致exe在别的电脑里无法…

【漏洞复现】Metinfo6.0.0任意文件读取漏洞复现

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现代码审计漏洞点 1.5、深度利用EXP编写 1.6、漏洞挖掘1.7修复建议 1.1、漏洞描述 漏洞名称&#xff1a;MetInfo任意文件…