1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我只完成了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--%dn”,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 %sn”,ifname); if ( ec_config_init(FALSE) 》 0 ) { printf(“found %d slave on the busn”,ec_slavecount); ec_config_map(&IOmap); ec_configdc(); for(i=0;i《ec_slavecount;i++) { printf(“slave%d to opn”, 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模式是3 printf(“slave to op40,%X--%Xn”,control_world,state); } else if((state & 0x006f) == 0x0021) { ec_slave[0].outputs[0x0000] = 0x07; ec_slave[0].outputs[0x0001] = 0x00; printf(“slave to op21n”); } else if((state & 0x006f) == 0x0023) { ec_slave[0].outputs[0x0000] = 0x0f; ec_slave[0].outputs[0x0001] = 0x00; printf(“slave to op23n”); printf(“mode:%dn”,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%Xn”,control); } ec_send_processdata(); ec_receive_processdata(EC_TIMEOUTRET); usleep(500);// 周期大小 } } else { printf(“slave again to opn”); } } else { printf(“no slave on the busn”); } } else { printf(“no ethernet cardn”); } } int main(int argc, char *argv[]) { printf(“SOEM (Simple Open EtherCAT Master)nSimple testn”); signal( SIGINT , endsignal ); if (argc 》 1) { simpletest(argv[1]); } else { printf(“Usage: simple_test ifname1nifname = eth0 for examplen”); } printf(“End programn”); return (0); } |
|
|
|
只有小组成员才能发言,加入小组>>
2434 浏览 0 评论
9099 浏览 4 评论
36771 浏览 19 评论
5025 浏览 0 评论
24743 浏览 34 评论
1528浏览 2评论
1743浏览 1评论
2193浏览 1评论
1553浏览 0评论
524浏览 0评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:56 , Processed in 1.455635 second(s), Total 76, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号