我只完成了pv模式,对于csp模式我不知道是哪里出现了问题,有知道的可以在下方评论
这个代码我的pv模式可以正常运行和控制电机,csp模式可以使能电机,但是电机不转

#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];
uint16 control;
int16 speed;
uint16 control_world;
uint16 state;
int32 curr_position;
int32 position;
int32 position2;
int add_position;
int i;
int ret;
char run = 1;
// 使从站进入op状态
void slavetop(int i)
{ec_slave[i].state = EC_STATE_OPERATIONAL;ec_send_processdata();ec_receive_processdata(EC_TIMEOUTRET);ec_writestate(0);}
void endsignal(int sig)
{run = 0;printf("EtherCAT stop.\n");//signal( SIGINT, SIG_DFL );
}
// 写目标位置
void position_to_add(int32 position)
{uint8 p1,p2,p3,p4,p5,p6;p1 = position % 255;p2 = position / 255;p3 = p2 % 255;p4 = p2 / 255;p5 = p4 % 255;p6 = p4 / 255;ec_slave[0].outputs[0x0002] = p1;ec_slave[0].outputs[0x0003] = p3;ec_slave[0].outputs[0x0004] = p5;ec_slave[0].outputs[0x0005] = p6;printf("%d--%d--%d--%d--%d\n",ec_slave[0].outputs[0x0002],ec_slave[0].outputs[0x0003],p5,p6,curr_position);
}
// 读取当前位置
int32 read_position()
{return ec_slave[0].outputs[0x000d] + (ec_slave[0].outputs[0x000e] << 8) + (ec_slave[0].outputs[0x000f] << 16);
}
void simpletest(char *ifname)
{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);ec_configdc();for(i=0;i<ec_slavecount;i++){printf("slave%d to op\n", i);slavetop(i);}if(ec_slave[0].state == EC_STATE_OPERATIONAL){ec_writestate(0);ec_configdc();while(run){state = ec_slave[0].outputs[0x000a] + (ec_slave[0].outputs[0x000b]<<8);if((state & 0x004f) == 0x0040){ec_slave[0].outputs[0x0000] = 0x06;ec_slave[0].outputs[0x0001] = 0x00;ec_slave[0].outputs[0x000c] = 0x08;// csp模式是8,pv模式是3printf("slave to op40,%X--%X\n",control_world,state);}else if((state & 0x006f) == 0x0021){ec_slave[0].outputs[0x0000] = 0x07;ec_slave[0].outputs[0x0001] = 0x00;printf("slave to op21\n");}else if((state & 0x006f) == 0x0023){ec_slave[0].outputs[0x0000] = 0x0f;ec_slave[0].outputs[0x0001] = 0x00;printf("slave to op23\n");printf("mode:%d\n",ec_slave[0].outputs[0x0c]);}else if((state & 0x006f) == 0x0027){//pv模式写入速度//speed = 25000;//ec_SDOwrite(1, 0x60ff, 0x00, FALSE, sizeof(speed), &speed, EC_TIMEOUTRXM);ec_slave[0].outputs[0x0000] = 0x1f;ec_slave[0].outputs[0x0001] = 0x00;// 加速减速运行if(state == 0x1237){if(i < 100){add_position++;}if(i > 5000 && i < 5100){add_position--;}i++;}curr_position = read_position();// 读取位置position = curr_position + 10;position_to_add(position);// 将位置写入}else{ret = sizeof(control);ec_SDOread(1,0x6040,0x00,FALSE,&ret,&control,EC_TIMEOUTRXM);printf("why what who%X\n",control);}ec_send_processdata();ec_receive_processdata(EC_TIMEOUTRET);usleep(500);// 周期大小}}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);
}

SOEM控制伺服电机相关推荐

  1. 三菱伺服电机选型手册_PLC触摸屏控制伺服电机程序设计

    伺服电机又称执行电机,它是控制电机的一种.它是一种用电脉冲信号进行控制的,并将脉冲信号转变成相应的角位移或直线位移和角速度的执行元件.根据控制对象的不同,由伺服电机组成的伺服系统一般有三种基本控制方式 ...

  2. abb伺服电机如何进行挑选_PLC是怎么控制伺服电机的?如何设计一个伺服系统?...

    点上面蓝色字体直观学机械可长期订阅我们 法律顾问:赵建英律师 (一)PLC是怎么控制伺服电机的? 在回答这个问题之前,首先要清楚伺服电机的用途,相对于普通的电机来说,伺服电机主要用于精确定位,因此大家 ...

  3. plc控制伺服电机 四轴攻丝机案例(包含伺服接线图)

    plc控制伺服电机 四轴攻丝机案例(包含伺服接线图) 该程序为plc控制伺服电机的工程案例程序,包含伺服电机接线图,包含程序流程的详细解释说明可. 程序包括伺服电机的启动,停止,原点定位,回归原点,位 ...

  4. 上位机与s7-200通讯控制伺服电机

    版权声明:本文为博主原创文章,未经博主允许不得转载. 内容简介:根据所做项目情况与大家分享学习内容,本篇文章主要从上位机和下位机两部分分享plc控制伺服电机的连线.控制方式及上位机部分,包括程序,如有 ...

  5. 树莓派产生PWM控制伺服电机和步进电机踩坑

    树莓派产生PWM控制伺服电机和步进电机踩坑 本人最近在做项目当中,涉及到利用PWM对伺服电机(servo motor)和步进电机(step motor)的控制.分享下所写的代码,以及遇到的问题,希望可 ...

  6. PLC是怎么控制伺服电机的?又该如何设计一个伺服系统?

    导读 在了解PLC如何控制伺服电机之前,我们要明确两个问题:PLC是怎么控制伺服电机的?以及如何设计一个伺服系统?然后从这两个问题下手,开始详细的讲述PLC如何控制伺服,它们是怎么相辅相成的! 一 . ...

  7. PLC是如何控制伺服电机的?

    在回答这个问题之前,首先要清楚伺服电机的用途,相对于普通的电机来说,伺服电机主要用于精确定位,因此大家通常所说的伺服控制,其实就是对伺服电机的位置控制.其实,伺服电机还用另外两种工作模式,那就是速度控 ...

  8. STM32HAL库RS485-ModBus协议控制伺服电机

    STM32HAL库RS485-ModBus协议控制伺服电机 一个月前,接手了一个学长的毕设小车,小车采用rs485通信的modbus协议驱动轮毂电机,与往常我学习的pwm控制电机方法大相径庭,在这里以 ...

  9. python如何控制伺服驱动_在控制伺服电机的驱动中,控制器和驱动器各有什么功能和作用?...

    展开全部 控制器的功能和作用:62616964757a686964616fe78988e69d8331333431366335 控制电机的转速,在电动车行业还要求控制器有刹车断电.欠压保护.欠压回升值 ...

  10. stm32单片机控制伺服电机转动固定角度

    stm32单片机控制伺服电机转动固定角度 在用伺服电机进行二维平台移动时,会涉及让二维平台移动一个步长的情况,落实到伺服电机上,就是让伺服电机转动一个固定的角度.所以本文说说让伺服电机转动固定角度,然 ...

最新文章

  1. 单例模式 之 单例模式——枚举
  2. 【9915】乘积最大
  3. 全新视角:用变分推断统一理解生成模型(VAE、GAN、AAE、ALI)
  4. win32 c++源码大全_网站源码,服务器,域名三者是什么关系?
  5. MSN Messenger终于好使了
  6. LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
  7. oracle em界面监控出来的奇怪图像_海康poe主机断电重启后不出图像,显示用户被锁定...
  8. go基本数据类型与运算符
  9. LeetCode题 - 1 两数之和
  10. Python爬虫扩展库scrapy选择器用法入门(一)
  11. 进程与线程的区别和联系
  12. 请问用微信很少语音而且打字不喜欢打错别字的是什么样的人?能说明这样的人办事认真吗?
  13. TLE5012B磁编码器原理及优点,径向充磁磁铁的安装。AS5047、AS5048、AS5600、TLE5012、MA730
  14. 富士康iPhone生产线自动化进展太缓,所以无法遵守中国的加班条例?
  15. 不同角色给rules重新赋值校验规则
  16. python在工业上的应用_工业+python - IT屋-程序员软件开发技术分享社区
  17. .NET 6 RC2 版本发布
  18. 学习笔记-应用光学 第一章 几何光学的基本定律
  19. 用Python批量替换更改掉txt文本的内容
  20. 微软Exchange服务器被黑客攻击以部署Cuba勒索软件

热门文章

  1. cad残留卸载清理工具,强力清理CAD注册表残留
  2. 大学生数学建模赛题解析及优秀论文-2021电工杯A题高铁牵引供电系统运行数据分析及等值建模(附Python代码)
  3. html编写回到顶部,html回到顶部代码
  4. Mac OS X 下 U盘安装盘简易制作教程
  5. Maven SCM Release版本控制与发布
  6. linux每天定时开关机,如何实现ubuntu每天定时关机
  7. 结构型模式分类与简介
  8. 计算机基础-操作系统
  9. DB2数据库问题总结
  10. 预付费电能表远传抄表系统