EtherCAT主站SOEM函数详解----状态读取函数

  • ecx_readstate
  • ecx_writestate

在控制驱动器等从站中,经常需要只知道从站的状态,在SOEM开发的主站中,如何读取从站的工作状态是非常重要的,本文将重点讲解SOEM中读取从站工作状态的函数。

ecx_readstate

该函数在ethercatmain.h文件中,用于读取从站的状态

/** Read all slave states in ec_slave.* @param[in] context = context struct* @return lowest state found*/
int ecx_readstate(ecx_contextt *context);

实现代码如下所示:

/** Read all slave states in ec_slave.* @param[in] context = context struct* @return lowest state found*/
int ecx_readstate(ecx_contextt *context)
{uint16 slave, fslave, lslave, configadr, lowest, rval, bitwisestate;ec_alstatust sl[MAX_FPRD_MULTI];uint16 slca[MAX_FPRD_MULTI];boolean noerrorflag, allslavessamestate;boolean allslavespresent = FALSE;int wkc;/* Try to establish the state of all slaves sending only one broadcast datagram.* This way a number of datagrams equal to the number of slaves will be sent only if needed.*/rval = 0;wkc = ecx_BRD(context->port, 0, ECT_REG_ALSTAT, sizeof(rval), &rval, EC_TIMEOUTRET);if(wkc >= *(context->slavecount)){allslavespresent = TRUE;}rval = etohs(rval);bitwisestate = (rval & 0x0f);if ((rval & EC_STATE_ERROR) == 0){noerrorflag = TRUE;context->slavelist[0].ALstatuscode = 0;}   else{noerrorflag = FALSE;}switch (bitwisestate){case EC_STATE_INIT:case EC_STATE_PRE_OP:case EC_STATE_BOOT:case EC_STATE_SAFE_OP:case EC_STATE_OPERATIONAL:allslavessamestate = TRUE;context->slavelist[0].state = bitwisestate;break;default:allslavessamestate = FALSE;break;}if (noerrorflag && allslavessamestate && allslavespresent){/* No slave has toggled the error flag so the alstatuscode* (even if different from 0) should be ignored and* the slaves have reached the same state so the internal state* can be updated without sending any datagram. */for (slave = 1; slave <= *(context->slavecount); slave++){context->slavelist[slave].ALstatuscode = 0x0000;context->slavelist[slave].state = bitwisestate;}lowest = bitwisestate;}else{/* Not all slaves have the same state or at least one is in error so one datagram per slave* is needed. */context->slavelist[0].ALstatuscode = 0;lowest = 0xff;fslave = 1;do{lslave = *(context->slavecount);if ((lslave - fslave) >= MAX_FPRD_MULTI){lslave = fslave + MAX_FPRD_MULTI - 1;}for (slave = fslave; slave <= lslave; slave++){const ec_alstatust zero = { 0, 0, 0 };configadr = context->slavelist[slave].configadr;slca[slave - fslave] = configadr;sl[slave - fslave] = zero;}ecx_FPRD_multi(context, (lslave - fslave) + 1, &(slca[0]), &(sl[0]), EC_TIMEOUTRET3);for (slave = fslave; slave <= lslave; slave++){configadr = context->slavelist[slave].configadr;rval = etohs(sl[slave - fslave].alstatus);context->slavelist[slave].ALstatuscode = etohs(sl[slave - fslave].alstatuscode);if ((rval & 0xf) < lowest){lowest = (rval & 0xf);}context->slavelist[slave].state = rval;context->slavelist[0].ALstatuscode |= context->slavelist[slave].ALstatuscode;}fslave = lslave + 1;} while (lslave < *(context->slavecount));context->slavelist[0].state = lowest;}return lowest;
}

ecx_writestate

该函数也在ethercatmain.h文件中,用于写入从站的状态。

/** Write slave state, if slave = 0 then write to all slaves.* The function does not check if the actual state is changed.* @param[in]  context        = context struct* @param[in] slave    = Slave number, 0 = master* @return Workcounter or EC_NOFRAME*/
int ecx_writestate(ecx_contextt *context, uint16 slave)

实现源代码:

/** Write slave state, if slave = 0 then write to all slaves.* The function does not check if the actual state is changed.* @param[in]  context        = context struct* @param[in] slave    = Slave number, 0 = master* @return Workcounter or EC_NOFRAME*/
int ecx_writestate(ecx_contextt *context, uint16 slave)
{int ret;uint16 configadr, slstate;if (slave == 0){slstate = htoes(context->slavelist[slave].state);ret = ecx_BWR(context->port, 0, ECT_REG_ALCTL, sizeof(slstate),&slstate, EC_TIMEOUTRET3);}else{configadr = context->slavelist[slave].configadr;ret = ecx_FPWRw(context->port, configadr, ECT_REG_ALCTL,htoes(context->slavelist[slave].state), EC_TIMEOUTRET3);}return ret;
}

EtherCAT主站SOEM函数详解---- ecx_readstate、ecx_writestate相关推荐

  1. EtherCAT主站SOEM在Ubuntu上的移植

    EtherCAT主站SOEM在Ubuntu上的移植 原文:https://blog.csdn.net/ethercat_i7/article/details/52794069?utm_medium=d ...

  2. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  3. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  4. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

  5. 【FFmpeg】函数详解(一)

    FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...

  6. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  7. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

  8. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  9. python基础知识~ 函数详解2

    python~函数详解2  1 生成器函数    定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数   须知 yield和return一样,都可以返回数 ...

最新文章

  1. 如何在Hybris Commerce的backoffice里创建扩展字段
  2. 通过示例Hibernate–第2部分(DetachedCriteria)
  3. gson解析php,php,android_关于 Gson 解析JSON数据。。。,php,android - phpStudy
  4. 安川伺服调试软件_2020南昌三菱伺服回收广东收购价
  5. UI设计实用排版法则,优秀可临摹案例,剖析设计实例
  6. mysql xa 使用_MySQL如何实现 XA 规范
  7. 每单配送费41元,Nuro无人车正式开始自动驾驶送货
  8. 记录jquery的ajax
  9. OZ Report 오즈 리포트 개발
  10. 变电站红外图像数据集
  11. Edge浏览器快捷键
  12. 微信小程序快捷键和windows快捷键
  13. 车牌字符识别LPRNet:License Plate Recognition via Deep Neural Networks
  14. 软著申请需要多少钱?大概需要多久?
  15. 认识一下身边的互联网---经典互联网书籍阅读总结
  16. matlab数据转换为tecplot格式[ASCII码格式下的plt文件]
  17. Mysql 解决1251 client does not support ...问题
  18. 云洲智能,能否成为科创板无人船艇第一股?
  19. 联想笔记本更换固态硬盘和重装系统
  20. 什么是语义化标签,常见的语义化标签介绍

热门文章

  1. Bash 单行注释与多行注释
  2. 8K播放网络全终端播放器H5播放器网页直播/点播播放器EasyPlayer和vlc播放RTSP流地址不兼容问题排查解决
  3. 【财务】FMS财务管理系统---应收管理
  4. 实例61小写字母转大写
  5. spring boot 源码解析52-actuate中MVCEndPoint解析
  6. 微信小程序和微信H5有什么区别?
  7. 乘云创数,华为云企业快成长大数据技术创新论坛(深圳站)圆满落幕!
  8. M1 Mac上更好的 Golang 使用方案
  9. 微信小程序+PHP 从零写一个微信小程序
  10. ch01: 初识数据库