SOEM控制伺服电机
我只完成了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控制伺服电机相关推荐
- 三菱伺服电机选型手册_PLC触摸屏控制伺服电机程序设计
伺服电机又称执行电机,它是控制电机的一种.它是一种用电脉冲信号进行控制的,并将脉冲信号转变成相应的角位移或直线位移和角速度的执行元件.根据控制对象的不同,由伺服电机组成的伺服系统一般有三种基本控制方式 ...
- abb伺服电机如何进行挑选_PLC是怎么控制伺服电机的?如何设计一个伺服系统?...
点上面蓝色字体直观学机械可长期订阅我们 法律顾问:赵建英律师 (一)PLC是怎么控制伺服电机的? 在回答这个问题之前,首先要清楚伺服电机的用途,相对于普通的电机来说,伺服电机主要用于精确定位,因此大家 ...
- plc控制伺服电机 四轴攻丝机案例(包含伺服接线图)
plc控制伺服电机 四轴攻丝机案例(包含伺服接线图) 该程序为plc控制伺服电机的工程案例程序,包含伺服电机接线图,包含程序流程的详细解释说明可. 程序包括伺服电机的启动,停止,原点定位,回归原点,位 ...
- 上位机与s7-200通讯控制伺服电机
版权声明:本文为博主原创文章,未经博主允许不得转载. 内容简介:根据所做项目情况与大家分享学习内容,本篇文章主要从上位机和下位机两部分分享plc控制伺服电机的连线.控制方式及上位机部分,包括程序,如有 ...
- 树莓派产生PWM控制伺服电机和步进电机踩坑
树莓派产生PWM控制伺服电机和步进电机踩坑 本人最近在做项目当中,涉及到利用PWM对伺服电机(servo motor)和步进电机(step motor)的控制.分享下所写的代码,以及遇到的问题,希望可 ...
- PLC是怎么控制伺服电机的?又该如何设计一个伺服系统?
导读 在了解PLC如何控制伺服电机之前,我们要明确两个问题:PLC是怎么控制伺服电机的?以及如何设计一个伺服系统?然后从这两个问题下手,开始详细的讲述PLC如何控制伺服,它们是怎么相辅相成的! 一 . ...
- PLC是如何控制伺服电机的?
在回答这个问题之前,首先要清楚伺服电机的用途,相对于普通的电机来说,伺服电机主要用于精确定位,因此大家通常所说的伺服控制,其实就是对伺服电机的位置控制.其实,伺服电机还用另外两种工作模式,那就是速度控 ...
- STM32HAL库RS485-ModBus协议控制伺服电机
STM32HAL库RS485-ModBus协议控制伺服电机 一个月前,接手了一个学长的毕设小车,小车采用rs485通信的modbus协议驱动轮毂电机,与往常我学习的pwm控制电机方法大相径庭,在这里以 ...
- python如何控制伺服驱动_在控制伺服电机的驱动中,控制器和驱动器各有什么功能和作用?...
展开全部 控制器的功能和作用:62616964757a686964616fe78988e69d8331333431366335 控制电机的转速,在电动车行业还要求控制器有刹车断电.欠压保护.欠压回升值 ...
- stm32单片机控制伺服电机转动固定角度
stm32单片机控制伺服电机转动固定角度 在用伺服电机进行二维平台移动时,会涉及让二维平台移动一个步长的情况,落实到伺服电机上,就是让伺服电机转动一个固定的角度.所以本文说说让伺服电机转动固定角度,然 ...
最新文章
- 单例模式 之 单例模式——枚举
- 【9915】乘积最大
- 全新视角:用变分推断统一理解生成模型(VAE、GAN、AAE、ALI)
- win32 c++源码大全_网站源码,服务器,域名三者是什么关系?
- MSN Messenger终于好使了
- LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
- oracle em界面监控出来的奇怪图像_海康poe主机断电重启后不出图像,显示用户被锁定...
- go基本数据类型与运算符
- LeetCode题 - 1 两数之和
- Python爬虫扩展库scrapy选择器用法入门(一)
- 进程与线程的区别和联系
- 请问用微信很少语音而且打字不喜欢打错别字的是什么样的人?能说明这样的人办事认真吗?
- TLE5012B磁编码器原理及优点,径向充磁磁铁的安装。AS5047、AS5048、AS5600、TLE5012、MA730
- 富士康iPhone生产线自动化进展太缓,所以无法遵守中国的加班条例?
- 不同角色给rules重新赋值校验规则
- python在工业上的应用_工业+python - IT屋-程序员软件开发技术分享社区
- .NET 6 RC2 版本发布
- 学习笔记-应用光学 第一章 几何光学的基本定律
- 用Python批量替换更改掉txt文本的内容
- 微软Exchange服务器被黑客攻击以部署Cuba勒索软件