SOEM控制伺服电机方法

之前我写了一个控制伺服的程序,但是方式是错误的,后来也不怎么SOEM了,最近有用到,就重新写了一个测试程序,重新发布一下
我使用的是23位编码器电机

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.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];
typedef struct{uint16 control;uint8 mode;int32 tposition;int32 velocity;
}TxPdo_t;
typedef struct{uint16 status;int32 cposition;
}RxPdo_t;TxPdo_t *tpdo;
RxPdo_t *rpdo;int pdo_config(uint16 i);
int run = 1;
// 从站进入op状态
void slavetop(int i)
{int loop = 0;do{ec_slave[i].state = EC_STATE_OPERATIONAL;ec_send_processdata();ec_receive_processdata(EC_TIMEOUTRET);ec_writestate(i);ec_readstate();loop++;if(loop == 10000){if(ec_slave[i].ALstatuscode != 0)printf("ALstate code:%x\n",ec_slave[i].ALstatuscode);loop = 0;}}while(ec_slave[i].state != EC_STATE_OPERATIONAL);}
void endsignal()
{run = 0;printf("EtherCAT stop.\n");signal( SIGINT, SIG_DFL );
}
void simpletest(char *ifname)
{int app = 0;int firstflag = 1;int64 dctime = 0;int activebit4 = 0;if(ec_init(ifname)){printf("start ethernet at %s\n",ifname);if ( ec_config_init(FALSE) > 0 ){ec_slavet *slave;printf("found %d slave on the bus\n",ec_slavecount);ec_slave[0].state = EC_STATE_PRE_OP;ec_writestate(0);ec_send_processdata();ec_receive_processdata(EC_TIMEOUTRET);slave = &ec_slave[1];slave->PO2SOconfig = pdo_config;ec_config_map(&IOmap);ec_configdc();ec_dcsync0(1,TRUE,2000000,5000);slavetop(0);if(ec_slave[0].state == EC_STATE_OPERATIONAL){printf("all slave to op\n");tpdo = (TxPdo_t *)ec_slave[1].outputs;rpdo = (RxPdo_t *)ec_slave[1].inputs;while(run){app++;ec_receive_processdata(EC_TIMEOUTRET);if(firstflag){firstflag = 0;	tpdo->control = 0x00;tpdo->control = 0x40;}else if(((rpdo->status)&0x4f) == 0x40){tpdo->control = 0x06;tpdo->mode = 1;tpdo->tposition = rpdo->cposition;}else if(((rpdo->status)&0x6f) == 0x21){tpdo->control = 0x07;tpdo->mode = 1;tpdo->tposition = rpdo->cposition;}else if(((rpdo->status)&0x6f) == 0x23){int32 adv = 8388608;//加减速tpdo->control = 0x0f;tpdo->mode = 1;tpdo->tposition = rpdo->cposition;ec_SDOwrite(1,0x6083,0x00,FALSE,4,&adv,EC_TIMEOUTRXM);ec_SDOwrite(1,0x6084,0x00,FALSE,4,&adv,EC_TIMEOUTRXM);tpdo->velocity = 838860;//tpdo->tposition = 214748364;tpdo->tposition = 0;}else if(((rpdo->status)&0x6f) == 0x27){activebit4++;if(activebit4 < 1000){if(((tpdo->control) & 0x10) == 0x10){tpdo->control &= ~0x0010;}	else{tpdo->control |= 0x0010;}}}else{tpdo->control = 0x40;tpdo->mode = 0;}ec_send_processdata();usleep(2000);// 周期大小}printf("cyclic task end\n");do{ec_slave[1].state = EC_STATE_SAFE_OP;ec_writestate(1);}while(ec_slave[1].state == EC_STATE_OPERATIONAL);do{ec_slave[1].state = EC_STATE_PRE_OP;ec_writestate(1);}while(ec_slave[1].state == EC_STATE_SAFE_OP);do{ec_slave[1].state = EC_STATE_INIT;ec_writestate(1);}while(ec_slave[1].state == EC_STATE_PRE_OP);ec_close();}else{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");signal( SIGINT , endsignal );if (argc > 1){      simpletest(argv[1]);}else{printf("Usage: simple_test ifname1\nifname = eth0 for example\n");}   printf("End program\n");return (0);
}
//PDO配置
int pdo_config(uint16 i)
{uint16 value16 = 0;uint32 value32 = 0;value16 = 0;ec_SDOwrite(i,0x1C12,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM);ec_SDOwrite(i,0x1C13,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM);value16 = 0;ec_SDOwrite(i,0x1A00,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM);value32 = 0x60410010;ec_SDOwrite(i,0x1A00,1,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM);value32 = 0x60640020;ec_SDOwrite(i,0x1A00,2,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM);value16 = 2;ec_SDOwrite(i,0x1A00,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM);value16 = 0;ec_SDOwrite(i,0x1600,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM);value32 = 0x60400010;ec_SDOwrite(i,0x1600,1,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM);value32 = 0x60600008;ec_SDOwrite(i,0x1600,2,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM);value32 = 0x607A0020;ec_SDOwrite(i,0x1600,3,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM);//value32 = 0x60FF0020;value32 = 0x60810020;ec_SDOwrite(i,0x1600,4,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM);value16 = 4;ec_SDOwrite(i,0x1600,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM);value16 = 1;ec_SDOwrite(i,0x1C12,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM);ec_SDOwrite(i,0x1C13,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM);return 0;}

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

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

相关文章

大数据软件开发软件架构设计思路

文章目录 大数据技术和传统的软件开发技术在架构思路上有很大不同如何解决PB级数据进行计算的问题呢&#xff1f;移动计算程序到数据所在位置进行计算是如何实现的呢&#xff1f;小结 大数据技术和传统的软件开发技术在架构思路上有很大不同 大数据技术更为关注数据&#xff0…

新能源汽车冷却系统的水道管口类型有哪些?格雷希尔针对这些管口密封的快速接头有哪些?

对于新能源汽车&#xff0c;不仅电池&#xff0c;还有电机、电控、充电单元部件&#xff0c;都需要处于适宜的工作温度&#xff0c;才能维持整车的正常运行。而这些部件在运行过程中会产生大量的热量&#xff0c;如果不及时散热会对汽车的性能、寿命产生影响&#xff0c;甚至可…

Scrapy爬虫中合理使用time.sleep和Request

概述 在Scrapy爬虫中&#xff0c;我们需要深入分析time.sleep和Request对象对并发请求的影响。time.sleep函数用于在发起请求之前等待一段时间&#xff0c;而Request对象用于发送HTTP请求。我们必须仔细考虑这些操作对其他并发请求的潜在影响&#xff0c;以及在异步情况下可能…

收集最新的 Sci-Hub 网址(本文章持续更新2024)

自用收集最新的 Sci-Hub 网址 本文章持续更新收集 Sci-Hub 的可用网址链接仅供交流学习使用&#xff0c;如对您有所帮助&#xff0c;请收藏并推荐给需要的朋友&#xff0c;由于网站限制&#xff0c;不一定所有网址都能在您所在的位置访问&#xff0c;通常情况下&#xff0c;一…

TTS | NaturalSpeech语音合成论文详解及项目实现【正在更新中】

----------------------------------&#x1f50a; 语音合成 相关系列直达 &#x1f50a; ------------------------------------- ✨NaturalSpeech&#xff1a;正在更新中~ ✨NaturalSpeech2&#xff1a;TTS | NaturalSpeech2语音合成论文详解及项目实现 本文主要是 讲解了Nat…

基于孔雀优化算法的航线规划

MATLAB2020a下正常运行 上传明细-CSDN创作中心

Excel中部分sheet页隐藏并设置访问密码

1、新建sheet1 2、新建sheet2 3、隐藏sheet2 4、保护工作簿、输密码 5、密码二次确认 6、隐藏的sheet2已经查看不了 7、想要查看时&#xff0c;按图示输入原密码即可 8、查看sheet2内容

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Scrum&#xff08;敏捷开发框架之一&#xff09; 详细介绍和解释&#xff1a; 优缺点&#xff1a; 优点&#xff1a; 缺点&…

【MySQL】数据库之高级SQL查询语句补充

目录 一、补充正则表达式的查询regexp 二、补充case的用法 三、补充空值和null值的区别 一、补充正则表达式的查询regexp 要知道 在MySQL中使用正则表达式&#xff0c;一定要在前面加上regexp 正则表达式 ^ 匹配文本的开始字符 ‘^bd’ 匹配以 bd 开头的字符串 …

开关电源输入输出电压测试方法:如何用开关电源智能测试系统测试输入输出电压?

一、用万用表测量输入输出电压 1. 连接万用表到电路中 2. 将万用表调到直流电压挡&#xff0c;连接红表笔到开关电源正极&#xff0c;连接黑表笔到开关电源负极。 3. 打开电源&#xff0c;读取万用表显示的电压值。 二、用示波器测量输入输出电压 1. 连接示波器到电路中 2. 将示…

网络安全—PKI公钥基础设施

文章目录 前提知识散列函数非对称加密数字签名 PKI受信任的人RA注册CA颁发IKE数字签名认证&#xff08;交换证书&#xff09;密钥管理 前提知识 散列函数 散列也可以叫哈希函数&#xff0c;MD5、SHA-1、SHA-2、、&#xff08;不管叫啥&#xff0c;都记得是同一个东西就行&…

Address Already In Use: JVM_Bind 端口被占用的几个解决办法

Address Already In Use: JVM_Bind 端口被占用的几个解决办法 运行Tomcat时若出现Address already in use: JVM_Bind 端口被占用&#xff0c;一般使用下面几个办法可以解决&#xff1a; 假设端口为8080 1.启动cmd, 执行命令netstat -ano|findstr 8080 &#xff0c;会查询出占…

Leetcode 988. Smallest String Starting From Leaf (二叉树遍历好题)

Smallest String Starting From Leaf Medium 1.6K 227 Companies You are given the root of a binary tree where each node has a value in the range [0, 25] representing the letters ‘a’ to ‘z’. Return the lexicographically smallest string that starts at a le…

图神经网络——图学习

图学习 0. 前言1. 图2. 图学习3. 图神经网络小结 0. 前言 近年来&#xff0c;从社交网络到分子生物学等各个领域&#xff0c;数据的图表示越来越普遍。图神经网络 (Graph Neural Network, GNN) 是专为处理图结构数据而设计的&#xff0c;要充分挖掘图表示的潜力&#xff0c;深…

log4cplus visual c++ 编译及调试小记

简介 最近在调试一款SATA加密设备&#xff0c;发现设备有时加密出来的数据&#xff0c;再解密时与明文对不上&#xff0c;怀疑是通信问题。因此&#xff0c;急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉&#xff0c;所以随便选了个log4cplus软件集成到现有工具…

Easy Rules规则引擎实战

文章目录 简介pom 规则抽象规则Rule基础规则BasicRule事实类Facts&#xff1a;map条件接口动作接口 四种规则定义方式注解方式RuleBuilder 链式Mvel和Spel表达式Yml配置 常用规则类DefaultRuleSpELRule&#xff08;Spring的表达式注入&#xff09; 组合规则UnitRuleGroup 规则引…

009、引用

1. 引用与借用 下面的示例重新定义了一个新的 calculate_length 函数。与之前不同的是&#xff0c;新的函数签名使用了 String 的引用作为参数而没有直接转移值的所有权&#xff1a; fn main() { let s1 String::from("hello"); let len calculate_length(&s1…

Java学习,一文掌握Java之SpringBoot框架学习文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

我有实体店,为什么要做小程序

做小程序对于实体店来说有以下几个好处&#xff1a; 拓展线上渠道&#xff1a;随着移动互联网的普及&#xff0c;越来越多的消费者习惯在手机上进行购物和搜索相关信息。通过做小程序&#xff0c;你可以将线下实体店与线上渠道相结合&#xff0c;提供在线购买、预约、查询等功能…

Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…