EtherCAT主站SOEM函数详解---- ecx_readstate、ecx_writestate
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相关推荐
- EtherCAT主站SOEM在Ubuntu上的移植
EtherCAT主站SOEM在Ubuntu上的移植 原文:https://blog.csdn.net/ethercat_i7/article/details/52794069?utm_medium=d ...
- C语言网络编程:accept函数详解
文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...
- 【FFmpeg】函数详解(三)
FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...
- 【FFmpeg】函数详解(二)
FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...
- 【FFmpeg】函数详解(一)
FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...
- 【ES6】Generator函数详解
[ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...
- mysql的聚合函数综合案例_MySQL常用聚合函数详解
一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...
- python平方数迭代器_对python中的高效迭代器函数详解
python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...
- python基础知识~ 函数详解2
python~函数详解2 1 生成器函数 定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数 须知 yield和return一样,都可以返回数 ...
最新文章
- 如何在Hybris Commerce的backoffice里创建扩展字段
- 通过示例Hibernate–第2部分(DetachedCriteria)
- gson解析php,php,android_关于 Gson 解析JSON数据。。。,php,android - phpStudy
- 安川伺服调试软件_2020南昌三菱伺服回收广东收购价
- UI设计实用排版法则,优秀可临摹案例,剖析设计实例
- mysql xa 使用_MySQL如何实现 XA 规范
- 每单配送费41元,Nuro无人车正式开始自动驾驶送货
- 记录jquery的ajax
- OZ Report 오즈 리포트 개발
- 变电站红外图像数据集
- Edge浏览器快捷键
- 微信小程序快捷键和windows快捷键
- 车牌字符识别LPRNet:License Plate Recognition via Deep Neural Networks
- 软著申请需要多少钱?大概需要多久?
- 认识一下身边的互联网---经典互联网书籍阅读总结
- matlab数据转换为tecplot格式[ASCII码格式下的plt文件]
- Mysql 解决1251 client does not support ...问题
- 云洲智能,能否成为科创板无人船艇第一股?
- 联想笔记本更换固态硬盘和重装系统
- 什么是语义化标签,常见的语义化标签介绍