SOEM控制io超简洁程序

2023-05-16

SOEM控制io超简洁程序

我想用SOEM简单控制io模块,因为我的io模块每个出入输出旁边都会有一个小灯,所以这也算是点灯程序,但是我看了例子并不知道怎么修改,都说igh麻烦,我感觉这比igh更麻烦,然后我看例子和网上的例子分析了一下,要和io从站进行数据交互,要做什么必须的操作。

初始化分析

1,ec_init(ifname)
这是最开始做的,功能:初始化SOEM,将socket绑定到ifname,ifname是你的网卡名字
2,ec_config_init(FALSE)
查看总线情况,可以得出从站数量,调用这个函数之后全局变量ec_slavecount保存的是从站数量
3,ec_config_map(&IOmap);
进行内存映射,在全局处有这么一个定义char IOmap[4096];,然后操作从站out or in,就是往这个数组写入或者读取,然后映射到真实从站
4,ec_slave[i].state = EC_STATE_OPERATIONAL; ec_send_processdata();
使从站状态转换为op状态,并把这个操作命令写入到从站

控制输出

以输出为例,想要控制io的输出,需要这两句代码

ec_slave[0].outputs[0x0001] = 0x0f;
ec_send_processdata();

主要是分析一下这句话ec_slave[0].outputs[0x0001] = 0x0f,
在http://openethercatsociety.github.io/doc/soem/tutorial_8txt.html里面有这么一个图是讲映射例子的
在这里插入图片描述
看起来好像是不太容易懂啊,没关系,我还有这一个
在这里插入图片描述
所以所有从站的input和output都映射在IOmap数组里面,我们怎么知道我们要控制的io在数组什么位置呢
那就要用到test/linux/slaveinfo例子了

$ sudo ./slaveinfo eth1 -map

可以看到这么一些信息
在这里插入图片描述
所以我要控制的io就是在0x0001位置,0x0f就是赋的值,8位output,将会有4位输出1,表现就是小灯亮四个

控制io完整程序

这个程序只有基本功能,没有多线程或者其他各种检查

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

#include "ethercattype.h"
#include "nicdrv.h"
#include "ethercatbase.h"
#include "ethercatmain.h"
#include "ethercatdc.h"
#include "ethercatcoe.h"
#include "ethercatfoe.h"
#include "ethercatconfig.h"
#include "ethercatprint.h"

char IOmap[4096];
// 使从站进入op状态
void slavetop(int i)
{
        ec_slave[i].state = EC_STATE_OPERATIONAL;
        ec_send_processdata();
        ec_receive_processdata(EC_TIMEOUTRET);
        ec_writestate(0);

}
void simpletest(char *ifname)
{
        int i,k = 1000,j=0;
        if(ec_init(ifname))
        {   
                printf("start ethernet at %s\n",ifname);
                if ( ec_config_init(FALSE) > 0 ) 
                {   
                        printf("found %d slave on the bus\n",ec_slavecount);
                        ec_config_map(&IOmap);
                        for(i=0;i<ec_slavecount;i++)
                        {   
                                printf("slave%d to op\n", i); 
                                slavetop(i);
                        }   
                        if(ec_slave[j].state == EC_STATE_OPERATIONAL)
                        {   
                                while(k--)//控制运行周期数
                                {   
                                        ec_slave[0].outputs[0x0001] = 0x0f;
                                        ec_send_processdata();
                                        ec_receive_processdata(EC_TIMEOUTRET);
                                        usleep(5000);//发送周期
                                }   
                        }   
                        else
                        {
                                slavetop(j);
                                printf("slave again to op\n");
                        }
                }
                else
                {
                        printf("no slave on the bus\n");
                }
        }
        else
        {
                printf("no ethernet card\n");
        }
}
int main(int argc, char *argv[])
{
        printf("SOEM (Simple Open EtherCAT Master)\nSimple test\n");

        if (argc > 1)
        {
                simpletest(argv[1]);
        }
        else
        {
                printf("Usage: simple_test ifname1\nifname = eth0 for example\n");
        }

        printf("End program\n");
        return (0);
}

所以,在我这里执行是这样的

在这里插入图片描述

结论

这样看的话,是非常简单了,但是在我想要进一步控制伺服电机的时候用这个只是按字节操作,而伺服控制字什么的都是双字节和四字节,我尝试用这个读取了只是一个字节的操作模式,读取的是正确的。我看到应该用ec_SDOread()和ec_SDOwrite(),但是我并没有成功,在调用这两个函数就出现了问题,我不知道在哪的问题,有知道的可以告诉我一下吗

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SOEM控制io超简洁程序 的相关文章

  • 记一次因gstreamer安装错误导致的系统报错

    问题出现 xff1a 前一天无脑安装gstreamer xff0c 按照网上杂七杂八的教程一通乱装 xff0c 最后死于qt gstreamer安装 第二天发现 xff0c 进入系统设置后 xff0c 点击 详细信息 无效 xff1a 第一
  • Kotlin扩展插件 kotlin-android-extensions

    Kotlin扩展插件 kotlin android extensions 在学习第一行代码第三版的时候 xff0c 发现书中有提到 kotlin android extensions这个插件 xff0c 可以直接使用布局中的控件id来操作v
  • linux软件管理

    1 使用网络安装资源安装软件 1 切换目录 cd etc yum repos d 2 建立文件 vim westos repo 文件必须以 repo结尾 redhat 仓库名称 name 61 haha 对软件源的描述 baseurl 61
  • 移除JSONArray中匹配的元素

    移除JSONArray中匹配的元素 helper isBookOrChange获取类中isBookOrChange值 64 param jarr 64 return 64 author taiyang public JSONArray ge
  • 移动平均法又称滑动平均法、滑动平均模型法(Moving average,MA)

    转自http jingji 100xuexi com view otdetail 20130625 230f09b0 6e36 473b 8830 7f2b873a5252 html 什么是移动平均法 移动平均法是用一组最近的实际数据值来预
  • centos7 结束多pid同名进程脚本文件

    centos7 结束多pid同名进程脚本文件 创建脚本 vi k sh 输入脚本内容 PIDS 61 96 ps e awk 39 0 9 0 9 0 9 39 1 39 printf 34 d 34 1 39 96 echo PIDS k
  • Docker之Linux(Centos)安装

    系统 Docker官网 Home Docker 关闭防火墙和关闭SELinux都是因为我使用虚拟机安装了纯净的centos系统 非必需 关闭防火墙 systemctl stop firewalld service 关闭防火墙 systemc
  • 微信小程序开发工具格式化代码快捷键以及更改快捷键

    Alt 43 Shift 43 f 如果不喜欢默认可以自定义更改 注意事项
  • 最新UNI-APP 安卓本地(离线)打包(图文详细教程)

    uni app 官方文档地址 原生开发者支持 Android Studio 下载地址 xff1a Download Android Studio and SDK tools Android Developers App离线SDK下载 xff
  • Git 命令行学习笔记( 图解 )

    Git 官网 分布式版本控制工具 可以团队协作合作开发 代码合并等 github 和 国产 码云gitee 都是代码托管工具就是远程仓库 下载可以去官网或者去腾讯软件中心下载 官网有时候下载很慢 腾讯软件中心 如果有腾讯电脑管家直接管家下载
  • Laravel安装与初始化

    下载Laravel 使用 composer 安装 首先composer切换成中国镜像 下载更快 composer config g repo packagist composer https packagist phpcomposer co
  • 虚拟机安装Centos图文安装教程

    清华大学开源软件镜像站 Tsinghua Open Source Mirror 清华镜像 http mirrors aliyun com 阿里云镜像 vm虚拟机下载 VMware虚拟机中文版官方下载 虚拟机 华军软件园 虚拟机 安装 错误1
  • 虚拟机LNMP图文安装教程(一)

    xshell 链接虚拟机 centos 7 ip addr 查看本地IP地址 安装LNMP LNMP 官网 LNMP一键安装包 CentOS RadHat Debian Ubuntu下自动编译安装Nginx PHP MySQL PHPMyA
  • 虚拟机LNMP操作记录(二)

    netstat nltp 查看当前端口 LNMP php多版本 lnmp文件目录里 运行 install sh mphp MySQL连接 更换环境变量的PHP版本 cd usr bin ll grep php rm rf php php f
  • Deep Learning 最优化方法之Momentum(动量)

    本文是Deep Learning 之 最优化方法系列文章的Momentum xff08 动量 xff09 方法 主要参考Deep Learning 一书 整个优化系列文章列表 xff1a Deep Learning 之 最优化方法 Deep
  • phpStudy redis设置密码

    使用框架 链接redis时 xff0c 报错 xff1a AUTH 96 failed ERR Client sent AUTH but no password is set tcp 127 0 0 1 6379 解决方案一 xff1a 解

随机推荐

  • Swoole小练习之Tcp传输

    话不多说直接上代码 注意 我使用的端口都是一台服务器上的 具体实现应该是跨服务器的 通过Tcp传输 客户端 同步客户端 client 61 new Swoole Client SWOOLE SOCK TCP if client gt con
  • php workerman入门之运行起来

    如果你有服务器的话可以使用服务器操作或者学习 如果没有请安装一个虚拟机并安装php环境 可以参考我之前的文章 Windows安装虚拟机图文安装教程 山山河川的博客 CSDN博客 虚拟机LNMP图文安装教程 一 山山河川的博客 CSDN博客
  • php workerman入门之搭建websocket服务

    依旧参考官网 简单的开发示例 workerman手册 示例二 lt php use Workerman Worker use Workerman Connection TcpConnection require once DIR vendo
  • workerman+TP6实战网站客服系统之项目初始化

    TP6 官方手册 安装 ThinkPHP6 0完全开发手册 看云 安装TP6 composer create project topthink think tp6 nbsp 报错 nbsp 解决问题 PHP默认把这个 proc open 函
  • 虚拟机LNMP操作记录(三)

    nginx配置多站点之端口访问 查看nginx conf文件 lnmp 已经默认添加了引入vhost下所有文件的准备 复制server里面的内容 server listen 80 default server reuseport liste
  • workerman+TP6实战网站客服系统之前端页面部署

    前端演示效果 主攻后端和workman所以本次前端页面比较简单 后续会有聊天高级版的教程敬请期待 Layui下载 Layui 经典开源模块化前端 UI 组件库 nbsp nbsp 粘贴到tp6项目里面 nbsp 然后创建模板页面
  • PHP多进程(一)之pcntl_fork

    知识来源 nbsp nbsp nbsp nbsp 知识无价 拒绝白嫖 Linux下PHP多进程编程 共44课时 PHP课程 51CTO学堂 多进程的作用是一个程序启动多个进程 一个程序启动起来本应该是一个进程 但它可作为父进程启动多个子进程
  • PHP多进程(二)之pcntl_wait

    知识来源 nbsp nbsp nbsp nbsp 知识无价 拒绝白嫖 Linux下PHP多进程编程 共44课时 PHP课程 51CTO学堂 上篇文章我们说到父进程应该回收子进程结束之后产生的数据 这样才会不浪费系统资源 一个程序启动之后 变
  • PHP前后分离接口加密探讨( AES+RSA )

    参考文章 php之RSA加密解密 小吴 斌的博客 CSDN博客 php rsa加密 RSA和AES的区别 LC超人在良家的博客 CSDN博客 aes rsa PHP实现非对称加密的方法 私钥及公钥加密解密的方法 php 公钥 私钥 Lord
  • Deep Learning 最优化方法之RMSProp

    本文是Deep Learning 之 最优化方法系列文章的RMSProp方法 主要参考Deep Learning 一书 整个优化系列文章列表 xff1a Deep Learning 之 最优化方法 Deep Learning 最优化方法之S
  • PHP多进程(三) 理解多进程

    知识来源 nbsp nbsp nbsp nbsp 知识无价 拒绝白嫖 Linux下PHP多进程编程 共44课时 PHP课程 51CTO学堂 本篇是一个过渡篇 重在理解多进程 以及进程执行过程和进程执行后的数据 nbsp 废话不多说直接上代码
  • 深入springboot原理——一步步分析springboot启动机制(starter机制)

    前言 使用过springboot的同学应该已经知道 xff0c springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程 本文的目的就是一步步分析springboot的启动过程 xff0c 分析sprin
  • dependencies和dependencyManagement区别

    文章目录 dependenciesdependencyManagement使用场景 区别 xff1a 总结 xff1a dependencies 父项目中的dependencies xff0c 子项目都会自动引入 xff0c 默认被所有的子
  • 【Git】解决Ctrl+V无法粘贴文本的问题

    解决Ctrl 43 V无法粘贴文本的问题 问题 xff1a 在我们使用Git Bash将项目克隆至本地时 xff0c 经常需要复制网址 xff0c 但此时却出现问题 xff1a Ctrl 43 V无反应 或是如下图只有 V xff1a 解决
  • 操作系统引导(开机过程)

    操作系统安装在C盘中 xff0c 其一步步启动的过程如下 xff1a 操作系统要启动 xff0c 操作系统的数据需要先被放入主存里 如图所示 xff0c 计算机的主存由RAM和ROM组成 xff0c ROM芯片被集成在电脑主板上 xff0c
  • igh ethercat master及简单介绍

    接触ethercat也有一段时间了 xff0c 做些小总结吧 1 xff0c 关于ethercat ethercat是基于工业以太网的一种总线协议 我接触的igh ethercat master for linux是以用ethercat协议
  • Linux下IGH Ethercat Master安装

    引言 简单igh ethercat master安装 1 xff0c 准备工作 xff08 1 xff09 一个Linux系统 xff0c 在虚拟机里面也可以 xff0c 不过如果在虚拟机里面需要一些其他的设置 xff0c 这个最后再说 L
  • 在树莓派/4.x内核下安装IgH EtherCAT master主站

    树莓派安装ethercat主站 环境 xff1a 4 14 91 rt49 v7 下载源码 xff0c 解压 tar xvf ethercat 1 5 2 tar bz2 cd ethercat 1 5 2 configure enable
  • C语言中static修饰函数和变量用法

    static修饰函数 xff0c 局部变量和全局变量的用法 在c语言中static关键字可以修饰函数和变量 修饰变量又可以分为修饰全局变量和局部变量 static作用是限定变量的生命周期 xff0c 限定变量或函数的作用域 写在前面 xff
  • SOEM控制io超简洁程序

    SOEM控制io超简洁程序 我想用SOEM简单控制io模块 xff0c 因为我的io模块每个出入输出旁边都会有一个小灯 xff0c 所以这也算是点灯程序 xff0c 但是我看了例子并不知道怎么修改 xff0c 都说igh麻烦 xff0c 我