servocom_app.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120
  1. #include "global.h"
  2. #include "servocom_app.h"
  3. servo_param_t servo_x,servo_y;
  4. //伺服通讯命令反馈。
  5. char servo_com_cmd_fb[SERVO_COM_CMD_NUMBER+1];
  6. //华创伺服参数读取列表
  7. servo_com_cmd_t servo_com_cmd_table[SERVO_AXISNUM][SERVO_COM_CMD_NUMBER] ={{
  8. //命令编码-------目标地址-------------通讯个数--------------数值地址------------------ID--------------CMD-cycle-time---回调函数
  9. {HANDSHAKE, SERVO_ADDR_HAND, 1,(unsigned char *)&servo_x.handshake, SERVO_X_COM_ID,0x03,0,50,servo_com_respone},
  10. {DI_MODE_SW, SERVO_ADDR_DI_MODE_SW, 2,(unsigned char *)&servo_x.di_function_set, SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  11. {DO_TARR_SW, SERVO_ADDR_DO_TARR_OV, 2,(unsigned char *)&servo_x.do_function_set, SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  12. {CTRL_MODE_SET, SERVO_ADDR_MODE_SET, 1,(unsigned char *)&servo_x.ctrl_mode_set, SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  13. {MOTOR_DIR_SET, SERVO_ADDR_MOTOR_DIR, 1,(unsigned char *)&servo_x.motor_dir_set, SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  14. {TARR_SOURCE_SEL,SERVO_ADDR_TARR_SEL, 14,(unsigned char *)&servo_x.tarr_source_sel,SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  15. {TARR_LIMIT12_SET, SERVO_ADDR_LIMIT_SET, 9,(unsigned char *)&servo_x.tarr_Plimit1_sel,SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  16. {SPEED_LIMIT_SET,SERVO_ADDR_SPEED_SET, 3,(unsigned char *)&servo_x.speed_plimit_set,SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  17. {TARR_BASE_SET, SERVO_ADDR_TARBASE_SET, 3,(unsigned char *)&servo_x.tarr_basis, SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  18. {ALARM_REST, SERVO_ADDR_ALARM_REST, 1,(unsigned char *)&servo_x.alarmrest, SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  19. {SERVO_RESTART, SERVO_ADDR_SERVO_RESTART,1,(unsigned char *)&servo_x.restart, SERVO_X_COM_ID,0x06,0,50,servo_com_respone},
  20. {ALARM_CODE, SERVO_ADDR_ALARM_CODE, 1,(unsigned char *)&servo_x.alarmcode, SERVO_X_COM_ID,0x03,1,50,servo_com_respone},
  21. {ENCODE_FB, SERVO_ADDR_ENCODE_FB, 2,(unsigned char *)&servo_x.encode, SERVO_X_COM_ID,0x03,1,50,servo_com_respone}
  22. },
  23. {
  24. {HANDSHAKE, SERVO_ADDR_HAND, 1,(unsigned char *)&servo_y.handshake, SERVO_Y_COM_ID,0x03,0,50,servo_com_respone},
  25. {DI_MODE_SW, SERVO_ADDR_DI_MODE_SW, 2,(unsigned char *)&servo_y.di_function_set, SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  26. {DO_TARR_SW, SERVO_ADDR_DO_TARR_OV, 2,(unsigned char *)&servo_y.do_function_set, SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  27. {CTRL_MODE_SET, SERVO_ADDR_MODE_SET, 1,(unsigned char *)&servo_y.ctrl_mode_set, SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  28. {MOTOR_DIR_SET, SERVO_ADDR_MOTOR_DIR, 1,(unsigned char *)&servo_y.motor_dir_set, SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  29. {TARR_SOURCE_SEL,SERVO_ADDR_TARR_SEL, 14,(unsigned char *)&servo_y.tarr_source_sel,SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  30. {TARR_LIMIT12_SET, SERVO_ADDR_LIMIT_SET, 9,(unsigned char *)&servo_y.tarr_Plimit1_sel,SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  31. {SPEED_LIMIT_SET,SERVO_ADDR_SPEED_SET, 3,(unsigned char *)&servo_y.speed_plimit_set,SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  32. {TARR_BASE_SET, SERVO_ADDR_TARBASE_SET, 3,(unsigned char *)&servo_y.tarr_basis, SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  33. {ALARM_REST, SERVO_ADDR_ALARM_REST, 1,(unsigned char *)&servo_y.alarmrest, SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  34. {SERVO_RESTART, SERVO_ADDR_SERVO_RESTART,1,(unsigned char *)&servo_y.restart, SERVO_Y_COM_ID,0x06,0,50,servo_com_respone},
  35. {ALARM_CODE, SERVO_ADDR_ALARM_CODE, 1,(unsigned char *)&servo_y.alarmcode, SERVO_Y_COM_ID,0x03,1,50,servo_com_respone},
  36. {ENCODE_FB, SERVO_ADDR_ENCODE_FB, 2,(unsigned char *)&servo_y.encode, SERVO_Y_COM_ID,0x03,1,50,servo_com_respone}
  37. }
  38. };
  39. /*
  40. * 伺服通讯命令函数
  41. *
  42. * @author laz
  43. *
  44. * @param cmd
  45. */
  46. static void servo_com_cmd(unsigned short axis,unsigned char cmd)
  47. {
  48. int i,cyckletime;
  49. switch(axis)
  50. {
  51. case X_AXIS:
  52. for(i=0;i<SERVO_COM_CMD_NUMBER;i++)
  53. {
  54. if(cmd==servo_com_cmd_table[0][i].cmdcode){
  55. break;
  56. }
  57. }
  58. if(servo_com_cmd_table[0][i].dir==0) {//单次通讯
  59. servo_x.cmd_fb[servo_com_cmd_table[0][i].cmdcode]=0;
  60. //添加单次采集命令
  61. modbus_master_add_once_cmd(
  62. &master1,
  63. servo_com_cmd_table[0][i].cmdcode, //命令编码
  64. servo_com_cmd_table[0][i].id, //设备ID
  65. servo_com_cmd_table[0][i].cmd, //命令码
  66. servo_com_cmd_table[0][i].address, //10
  67. servo_com_cmd_table[0][i].number, //10
  68. servo_com_cmd_table[0][i].value, //数据存放位置
  69. servo_com_cmd_table[0][i].respone_timeout, //50ms超时时间(不包括通讯必须时间)
  70. servo_com_cmd_table[0][i].servo_on_respone //不需要回调函数
  71. );
  72. }
  73. else
  74. {
  75. if(cmd==ENCODE_FB)cyckletime=100;
  76. else cyckletime=1000;
  77. //添加循环采集命令
  78. modbus_master_add_period_cmd(
  79. &master1,
  80. servo_com_cmd_table[0][i].cmdcode, //命令编码
  81. servo_com_cmd_table[0][i].id, //设备ID
  82. servo_com_cmd_table[0][i].cmd, //命令码
  83. servo_com_cmd_table[0][i].address, //10
  84. servo_com_cmd_table[0][i].number, //10
  85. servo_com_cmd_table[0][i].value, //数据存放位置
  86. servo_com_cmd_table[0][i].respone_timeout, //50ms超时时间(不包括通讯必须时间)
  87. servo_com_cmd_table[0][i].servo_on_respone,//不需要回调函数
  88. cyckletime //1000ms采集一次
  89. );
  90. }
  91. break;
  92. case Y_AXIS:
  93. for(i=0;i<SERVO_COM_CMD_NUMBER;i++)
  94. {
  95. if(cmd==servo_com_cmd_table[1][i].cmdcode){
  96. break;
  97. }
  98. }
  99. if(servo_com_cmd_table[1][i].dir==0) {//单次通讯
  100. servo_y.cmd_fb[servo_com_cmd_table[0][i].cmdcode]=0;
  101. //添加单次采集命令
  102. modbus_master_add_once_cmd(
  103. &master1,
  104. servo_com_cmd_table[1][i].cmdcode, //命令编码
  105. servo_com_cmd_table[1][i].id, //设备ID
  106. servo_com_cmd_table[1][i].cmd, //命令码
  107. servo_com_cmd_table[1][i].address, //10
  108. servo_com_cmd_table[1][i].number, //10
  109. servo_com_cmd_table[1][i].value, //数据存放位置
  110. servo_com_cmd_table[1][i].respone_timeout, //50ms超时时间(不包括通讯必须时间)
  111. servo_com_cmd_table[1][i].servo_on_respone //不需要回调函数
  112. );
  113. }
  114. else
  115. {
  116. if(cmd==ENCODE_FB)cyckletime=100;
  117. else cyckletime=1000;
  118. //添加循环采集命令
  119. modbus_master_add_period_cmd(
  120. &master1,
  121. servo_com_cmd_table[1][i].cmdcode, //命令编码
  122. servo_com_cmd_table[1][i].id, //设备ID
  123. servo_com_cmd_table[1][i].cmd, //命令码
  124. servo_com_cmd_table[1][i].address, //10
  125. servo_com_cmd_table[1][i].number, //10
  126. servo_com_cmd_table[1][i].value, //数据存放位置
  127. servo_com_cmd_table[1][i].respone_timeout, //50ms超时时间(不包括通讯必须时间)
  128. servo_com_cmd_table[1][i].servo_on_respone,//不需要回调函数
  129. cyckletime //1000ms采集一次
  130. );
  131. }
  132. break;
  133. }
  134. }
  135. /*
  136. * 伺服通讯,故障清除函数
  137. *
  138. * @author laz
  139. *
  140. * @param aixs
  141. */
  142. int clr_com_servo_alarm(unsigned short axis)
  143. {
  144. static unsigned long clr_com_servo_x_delay=0;
  145. static unsigned long clr_com_servo_y_delay=0;
  146. switch(axis)
  147. {
  148. case X_AXIS:
  149. if(dwTickCount>=clr_com_servo_x_delay)
  150. {
  151. servo_x.alarmrest=1;
  152. clr_com_servo_x_delay=dwTickCount+1000;
  153. servo_com_cmd(axis,ALARM_REST);
  154. }
  155. break;
  156. case Y_AXIS:
  157. if(dwTickCount>=clr_com_servo_y_delay)
  158. {
  159. servo_y.alarmrest=1;
  160. servo_com_cmd(axis,ALARM_REST);
  161. clr_com_servo_y_delay=dwTickCount+1000;
  162. }
  163. break;
  164. }
  165. return 1;
  166. }
  167. /*
  168. * 伺服通讯,设置细分,设置周长
  169. *
  170. * @author laz
  171. *
  172. * @param aixs
  173. */
  174. void set_com_servo_param(unsigned short axis,unsigned short cycle_pluse,unsigned short cycle_length)
  175. {
  176. switch(axis)
  177. {
  178. case X_AXIS:
  179. servo_x.cycle_pulse=cycle_pluse;
  180. servo_x.cycle_length=cycle_length;
  181. break;
  182. case Y_AXIS:
  183. servo_y.cycle_pulse=cycle_pluse;
  184. servo_y.cycle_length=cycle_length;
  185. break;
  186. }
  187. }
  188. /*
  189. * 伺服通讯,设置伺服告警极性
  190. *
  191. * @author laz
  192. *
  193. * @param aixs
  194. */
  195. void set_com_alarm_reverse(unsigned short axis,int value)
  196. {
  197. switch(axis)
  198. {
  199. case X_AXIS:
  200. servo_x.alarm_Reverse=value;
  201. break;
  202. case Y_AXIS:
  203. servo_y.alarm_Reverse=value;
  204. break;
  205. }
  206. }
  207. /*
  208. * 伺服通讯,获取伺服故障代码
  209. *
  210. * @author laz
  211. *
  212. * @param aixs
  213. */
  214. int get_alarm_code(unsigned short axis)
  215. {
  216. switch(axis)
  217. {
  218. case X_AXIS:
  219. return (servo_x.alarmcode);
  220. break;
  221. case Y_AXIS:
  222. return (servo_y.alarmcode);
  223. break;
  224. }
  225. return 0;
  226. }
  227. /*
  228. * 伺服通讯,编码转换长度计算
  229. *
  230. * @author laz
  231. *
  232. * @param encode 伺服编码
  233. * gearratio,齿轮比
  234. */
  235. static long encode_to_length(long encode,unsigned short cycle_length)
  236. {
  237. float pos;
  238. pos=encode;
  239. pos=(float)(pos/ENCODE_17BIT);
  240. pos*= cycle_length;
  241. return (long)(pos);
  242. }
  243. /*
  244. * 伺服通讯,位置设置值
  245. *
  246. * @author laz
  247. *
  248. * @param axis
  249. * pos,
  250. */
  251. int axis_set_com_pos(unsigned short axis,long pos )
  252. {
  253. switch(axis)
  254. {
  255. case X_AXIS:
  256. servo_x.precode=servo_x.encode-pos;
  257. break;
  258. case Y_AXIS:
  259. servo_y.precode=servo_y.encode-pos;
  260. break;
  261. }
  262. return 1;
  263. }
  264. /*
  265. * 伺服通讯,长度值
  266. *
  267. * @author laz
  268. *
  269. * @param axis
  270. */
  271. static long axis_get_com_pos(unsigned short axis)
  272. {
  273. switch(axis)
  274. {
  275. case X_AXIS:
  276. if(servo_x.encode>=servo_x.precode)
  277. return(encode_to_length(servo_x.encode-servo_x.precode,servo_x.cycle_length));
  278. else
  279. return(encode_to_length(servo_x.precode-servo_x.encode,servo_x.cycle_length));
  280. break;
  281. case Y_AXIS:
  282. if(servo_y.encode>=servo_y.precode)
  283. return(encode_to_length(servo_y.encode-servo_y.precode,servo_y.cycle_length));
  284. else
  285. return(encode_to_length(servo_y.precode-servo_y.encode,servo_y.cycle_length));
  286. break;
  287. }
  288. return 0;
  289. }
  290. /*
  291. * 伺服通讯,//频率转换为转速
  292. *
  293. * @author laz
  294. *
  295. * @param freq 伺服的频率
  296. * rerurn 伺服的转速
  297. */
  298. static unsigned short freq_to_speed(unsigned short freq,unsigned short cycle_pulse)
  299. {
  300. if(freq==0)return 1;
  301. if(cycle_pulse==0)return 1;
  302. return(freq*60/cycle_pulse+1);
  303. }
  304. /*
  305. * 伺服通讯,读取编码次数
  306. *
  307. * @author laz
  308. *
  309. * @param axis
  310. * times 读取次数
  311. */
  312. void read_encode_value_cmd(unsigned short axis,unsigned short times)
  313. {
  314. int i=0;
  315. switch(axis)
  316. {
  317. case X_AXIS:
  318. //servo_x.cmd_fb[ENCODE_FB]=0;
  319. for(i=0;i<times;i++)servo_com_cmd(axis,ENCODE_FB);
  320. break;
  321. case Y_AXIS:
  322. //servo_y.cmd_fb[ENCODE_FB]=0;
  323. for(i=0;i<times;i++)servo_com_cmd(axis,ENCODE_FB);
  324. break;
  325. }
  326. }
  327. /*
  328. * 伺服通讯,读取长度值
  329. *
  330. * @author laz
  331. *
  332. * @param axis
  333. */
  334. long get_encode_value(unsigned short axis)
  335. {
  336. switch(axis)
  337. {
  338. case X_AXIS:
  339. return axis_get_com_pos(axis);
  340. break;
  341. case Y_AXIS:
  342. return axis_get_com_pos(axis);
  343. break;
  344. }
  345. return 0;
  346. }
  347. /*
  348. * 伺服通讯,伺服轴通讯回调函数
  349. *
  350. * @author laz
  351. *
  352. *
  353. */
  354. static void servo_axis_com_respone(unsigned short axis,servo_param_t *servo_axis,modbus_master_cmd_t *cmd, unsigned char *respone, int length)
  355. {
  356. switch(cmd->cmdcode)
  357. {
  358. case HANDSHAKE:
  359. servo_axis->cmd_fb[HANDSHAKE]=cmd->cmdcode;
  360. break;
  361. case DI_MODE_SW:
  362. servo_axis->cmd_fb[DI_MODE_SW]=cmd->cmdcode;
  363. break;
  364. case DO_TARR_SW:
  365. servo_axis->cmd_fb[DO_TARR_SW]=cmd->cmdcode;
  366. break;
  367. case CTRL_MODE_SET:
  368. servo_axis->cmd_fb[CTRL_MODE_SET]=cmd->cmdcode;
  369. break;
  370. case MOTOR_DIR_SET:
  371. servo_axis->cmd_fb[MOTOR_DIR_SET]=cmd->cmdcode;
  372. break;
  373. case TARR_SOURCE_SEL:
  374. servo_axis->cmd_fb[TARR_SOURCE_SEL]=cmd->cmdcode;
  375. break;
  376. case TARR_LIMIT12_SET:
  377. servo_axis->set_tarr_OKflag++;
  378. servo_axis->cmd_fb[TARR_LIMIT12_SET]=cmd->cmdcode;
  379. break;
  380. case SPEED_LIMIT_SET:
  381. servo_axis->set_tarr_OKflag++;
  382. servo_axis->cmd_fb[SPEED_LIMIT_SET]=cmd->cmdcode;
  383. break;
  384. case TARR_BASE_SET:
  385. servo_axis->set_tarr_OKflag++;
  386. servo_axis->cmd_fb[TARR_BASE_SET]=cmd->cmdcode;
  387. break;
  388. case ALARM_REST:
  389. servo_axis->cmd_fb[ALARM_REST]=cmd->cmdcode;
  390. break;
  391. case SERVO_RESTART:
  392. servo_axis->cmd_fb[SERVO_RESTART]=cmd->cmdcode;
  393. break;
  394. case ALARM_CODE:
  395. servo_axis->cmd_fb[ALARM_CODE]=cmd->cmdcode;
  396. if(servo_axis->alarmcode>0){
  397. if(servo_axis->alarm_Reverse)servo_axis->alarm_flag=0;else servo_axis->alarm_flag=1;
  398. }
  399. else {
  400. if(servo_axis->alarm_Reverse)servo_axis->alarm_flag=1;else servo_axis->alarm_flag=0;
  401. }
  402. break;
  403. case ENCODE_FB:
  404. servo_axis->cmd_fb[ENCODE_FB]=cmd->cmdcode;
  405. get_encode_value(axis);
  406. break;
  407. default:
  408. break;
  409. }
  410. }
  411. static int servo_com_get_alarm(unsigned short axis)
  412. {
  413. switch(axis)
  414. {
  415. case X_AXIS:
  416. axis_x_com_alarm=servo_x.alarm_flag;
  417. break;
  418. case Y_AXIS:
  419. axis_y_com_alarm=servo_y.alarm_flag;
  420. break;
  421. }
  422. return 1;
  423. }
  424. /*
  425. * 伺服通讯,通讯回调函数
  426. *
  427. * @author laz
  428. *
  429. *
  430. */
  431. void servo_com_respone(modbus_master_cmd_t *cmd, unsigned char *respone, int length)
  432. {
  433. #if X_USERING_TARR == 1
  434. if(cmd->id==SERVO_X_COM_ID)servo_axis_com_respone(X_AXIS,&servo_x,cmd,respone,length);
  435. #endif
  436. #if Y_USERING_TARR == 1
  437. if(cmd->id==SERVO_Y_COM_ID)servo_axis_com_respone(Y_AXIS,&servo_y,cmd,respone,length);
  438. #endif
  439. }
  440. //设置位置+转矩模式下的转矩配置
  441. int set_servo_postotarr_limit(unsigned short axis,int tarr,
  442. unsigned short P_freq,unsigned short N_freq,
  443. unsigned short dir)
  444. {
  445. switch(axis)
  446. {
  447. case X_AXIS:
  448. //配置扭矩模式下的速度限制、扭矩限制、扭矩基准值
  449. servo_x.speed_plimit_set=freq_to_speed(P_freq,servo_x.cycle_pulse);
  450. servo_x.speed_nlimit_set=freq_to_speed(N_freq,servo_x.cycle_pulse);
  451. if(tarr<100)tarr=100;
  452. if(dir)servo_x.tarr_limit_set=-tarr;
  453. else servo_x.tarr_limit_set=tarr;
  454. servo_com_cmd(axis,SPEED_LIMIT_SET);
  455. //servo_x.cmd_fb[SPEED_LIMIT_SET]=0;//清除反馈命令
  456. //转矩的基准值设置
  457. servo_x.tarr_basis=tarr-50;
  458. servo_x.tarr_basis_up=50;
  459. servo_x.tarr_basis_dw=30;
  460. servo_com_cmd(axis,TARR_BASE_SET);
  461. //servo_x.cmd_fb[TARR_BASE_SET]=0;//清除反馈命令
  462. servo_x.set_tarr_OKflag=0;
  463. sw_timer_start(&servo_x.timer, 1, 0);//1S超时
  464. break;
  465. case Y_AXIS:
  466. //配置扭矩模式下的速度限制、扭矩限制、扭矩基准值
  467. servo_y.speed_plimit_set=freq_to_speed(P_freq,servo_y.cycle_pulse);
  468. servo_y.speed_nlimit_set=freq_to_speed(N_freq,servo_y.cycle_pulse);
  469. if(tarr<100)tarr=100;
  470. if(dir)servo_y.tarr_limit_set=-tarr;
  471. else servo_y.tarr_limit_set=tarr;
  472. servo_com_cmd(axis,SPEED_LIMIT_SET);
  473. //servo_y.cmd_fb[SPEED_LIMIT_SET]=0;//清除反馈命令
  474. //转矩的基准值设置
  475. servo_y.tarr_basis=tarr-50;
  476. servo_y.tarr_basis_up=50;
  477. servo_y.tarr_basis_dw=30;
  478. servo_com_cmd(axis,TARR_BASE_SET);
  479. //servo_y.cmd_fb[TARR_BASE_SET]=0;//清除反馈命令
  480. servo_y.set_tarr_OKflag=0;
  481. sw_timer_start(&servo_y.timer, 1, 0);//1S超时
  482. break;
  483. }
  484. return 1;
  485. }
  486. //转矩模式下的扭矩配置
  487. //设置位置+转矩模式下的转矩配置
  488. int set_servo_tarr_limit(unsigned short axis,int maxtarr,int mintarr,
  489. unsigned short P_freq,unsigned short N_freq,
  490. unsigned short dir)
  491. {
  492. switch(axis)
  493. {
  494. case X_AXIS:
  495. if(maxtarr<400)maxtarr=400;
  496. if(maxtarr>=2000)maxtarr=2000;
  497. //扭矩1,扭矩2的配置
  498. servo_x.tarr_Plimit1_sel=mintarr;
  499. servo_x.tarr_Nlimit1_sel=mintarr;
  500. servo_x.tarr_Plimit2_sel=maxtarr;
  501. servo_x.tarr_Nlimit2_sel=maxtarr;
  502. servo_x.speed_limit_sel=0;
  503. servo_x.speed_ai_sel=1;
  504. //配置扭矩模式下的速度限制、扭矩基准值
  505. servo_x.speed_plimit_set=freq_to_speed(P_freq,servo_x.cycle_pulse);
  506. servo_x.speed_nlimit_set=freq_to_speed(N_freq,servo_x.cycle_pulse);
  507. if(dir)servo_x.tarr_limit_set=-(maxtarr+100);
  508. else servo_x.tarr_limit_set=(maxtarr+100);
  509. servo_com_cmd(axis,TARR_LIMIT12_SET);
  510. //servo_x.cmd_fb[TARR_LIMIT12_SET]=0;//清除反馈命令
  511. //转矩的基准值设置
  512. servo_x.tarr_basis=mintarr-50;
  513. servo_x.tarr_basis_up=50;
  514. servo_x.tarr_basis_dw=30;
  515. servo_com_cmd(axis,TARR_BASE_SET);
  516. //servo_x.cmd_fb[TARR_BASE_SET]=0;//清除反馈命令
  517. servo_x.set_tarr_OKflag=0;
  518. sw_timer_start(&servo_x.timer, 1, 0);//1S超时
  519. break;
  520. case Y_AXIS:
  521. if(maxtarr<400)maxtarr=400;
  522. if(maxtarr>=2000)maxtarr=2000;
  523. //扭矩1,扭矩2的配置
  524. servo_y.tarr_Plimit1_sel=mintarr;
  525. servo_y.tarr_Nlimit1_sel=mintarr;
  526. servo_y.tarr_Plimit2_sel=maxtarr;
  527. servo_y.tarr_Nlimit2_sel=maxtarr;
  528. servo_y.speed_limit_sel=0;
  529. servo_y.speed_ai_sel=1;
  530. //配置扭矩模式下的速度限制、扭矩基准值
  531. servo_y.speed_plimit_set=freq_to_speed(P_freq,servo_y.cycle_pulse);
  532. servo_y.speed_nlimit_set=freq_to_speed(N_freq,servo_y.cycle_pulse);
  533. if(dir)servo_y.tarr_limit_set=-(maxtarr+100);
  534. else servo_y.tarr_limit_set=(maxtarr+100);
  535. servo_com_cmd(axis,TARR_LIMIT12_SET);
  536. //servo_y.cmd_fb[TARR_LIMIT12_SET]=0;//清除反馈命令
  537. //转矩的基准值设置
  538. servo_y.tarr_basis=mintarr-50;
  539. servo_y.tarr_basis_up=50;
  540. servo_y.tarr_basis_dw=30;
  541. servo_com_cmd(axis,TARR_BASE_SET);
  542. //servo_y.cmd_fb[TARR_BASE_SET]=0;//清除反馈命令
  543. servo_y.set_tarr_OKflag=0;
  544. sw_timer_start(&servo_y.timer, 1, 0);//1S超时
  545. break;
  546. }
  547. return 1;
  548. }
  549. /**
  550. * 获取转矩配置是否成功
  551. *
  552. * @author laz
  553. *
  554. * @param axis
  555. */
  556. int get_tarr_set(unsigned short axis)
  557. {
  558. switch(axis)
  559. {
  560. case X_AXIS:
  561. if(servo_x.set_tarr_OKflag==2)return 2;//配置成功
  562. if(sw_timer_expire(&servo_x.timer))return 0;//配置超时
  563. else return 1;//配置中
  564. break;
  565. case Y_AXIS:
  566. if(servo_y.set_tarr_OKflag==2)return 2;//配置成功
  567. if(sw_timer_expire(&servo_y.timer))return 0;//配置超时
  568. else return 1;//配置中
  569. break;
  570. }
  571. return 0;
  572. }
  573. //设置转矩模式下的X配置初始化
  574. static int set_ctrl_tarr_axis_init(unsigned short axis,servo_param_t *servo_axis,unsigned short mode)
  575. {
  576. switch(mode)
  577. {
  578. case 0:
  579. servo_axis->tarr_source_sel=0;//来源A
  580. servo_axis->tarr_modea_sel=0;
  581. servo_axis->tarr_modeb_sel=0;
  582. servo_axis->tarr_limit_sel=0;
  583. servo_axis->tarr_ai_sel=1;
  584. servo_axis->tarr_Plimit1_sel=3000;
  585. servo_axis->tarr_Nlimit1_sel=3000;
  586. servo_axis->tarr_Plimit2_sel=3000;
  587. servo_axis->tarr_Nlimit2_sel=3000;
  588. servo_axis->speed_limit_sel=0;
  589. servo_axis->speed_ai_sel=1;
  590. servo_axis->speed_plimit_set=200;
  591. servo_axis->speed_nlimit_set=100;
  592. servo_axis->tarr_limit_set=50;
  593. servo_com_cmd(axis,TARR_SOURCE_SEL);
  594. //转矩的基准值设置
  595. servo_axis->tarr_basis=0;
  596. servo_axis->tarr_basis_up=200;
  597. servo_axis->tarr_basis_dw=0;
  598. servo_com_cmd(axis,TARR_BASE_SET);
  599. //servo_axis->cmd_fb[TARR_SOURCE_SEL]=0;//清除反馈命令
  600. break;
  601. case 1:
  602. servo_axis->tarr_source_sel=3;//来源A
  603. servo_axis->tarr_modea_sel=0;
  604. servo_axis->tarr_modeb_sel=0;
  605. servo_axis->tarr_limit_sel=2;
  606. servo_axis->tarr_ai_sel=1;
  607. servo_axis->tarr_Plimit1_sel=200;
  608. servo_axis->tarr_Nlimit1_sel=200;
  609. servo_axis->tarr_Plimit2_sel=1000;
  610. servo_axis->tarr_Nlimit2_sel=1000;
  611. servo_axis->speed_limit_sel=0;
  612. servo_axis->speed_ai_sel=1;
  613. servo_axis->speed_plimit_set=200;
  614. servo_axis->speed_nlimit_set=100;
  615. servo_axis->tarr_limit_set=1000;
  616. servo_com_cmd(axis,TARR_SOURCE_SEL);
  617. //转矩的基准值设置
  618. servo_axis->tarr_basis=0;
  619. servo_axis->tarr_basis_up=200;
  620. servo_axis->tarr_basis_dw=0;
  621. servo_com_cmd(axis,TARR_BASE_SET);
  622. //servo_axis->cmd_fb[TARR_SOURCE_SEL]=0;//清除反馈命令
  623. break;
  624. }
  625. return 1;
  626. }
  627. //设置转矩模式下的配置
  628. static int set_ctrl_tarr_config(unsigned short axis,unsigned short mode)
  629. {
  630. switch(axis)
  631. {
  632. case X_AXIS:
  633. set_ctrl_tarr_axis_init(axis,&servo_x,mode);
  634. break;
  635. case Y_AXIS:
  636. set_ctrl_tarr_axis_init(axis,&servo_y,mode);
  637. break;
  638. }
  639. return 1;
  640. }
  641. //设置伺服运行模式
  642. //0位置+转矩模式,转矩改变由通讯方式
  643. //1转矩模式,采用转矩切换方式
  644. static void set_servo_axis_mode(unsigned short axis,servo_param_t *servo_axis,unsigned short mode)
  645. {
  646. //SetEn(axis, MOTOR_EN);//停机关使能
  647. switch(mode)
  648. {
  649. case 0:
  650. //配置DI5功能为模式1切换和极性
  651. servo_axis->di_function_set=DI__FUNCTION_POSTARRSEL;
  652. servo_axis->di_polarity= DI_NCLOSE;
  653. servo_com_cmd(axis,DI_MODE_SW);
  654. //servo_axis->cmd_fb[DI_MODE_SW]=0;//清除反馈命令
  655. //配置DO3为转矩到达输出和极性
  656. servo_axis->do_function_set=DO_FUNCTION_VALUE;
  657. servo_axis->do_polarity= DI_NCLOSE;
  658. servo_com_cmd(axis,DO_TARR_SW);
  659. //servo_axis->cmd_fb[DO_TARR_SW]=0;//清除反馈命令
  660. //配置控制模式
  661. servo_axis->ctrl_mode_set=CTRL_POSTOTARR_MODE;
  662. servo_com_cmd(axis,CTRL_MODE_SET);
  663. //servo_axis->cmd_fb[CTRL_MODE_SET]=0;//清除反馈命令
  664. //配置转矩的方式:
  665. set_ctrl_tarr_config(axis,mode);
  666. //配置扭矩模式下的速度限制、扭矩限制、扭矩基准值
  667. //set_servo_postotarr_limit(axis,550,10000,10000,SERVO_TARR_CCW);
  668. //配置超时设置
  669. sw_timer_start(&servo_axis->timer, 2, 0);//2S超时
  670. break;
  671. case 1:
  672. //配置DI5功能为模式1切换和极性
  673. servo_axis->di_function_set=DI__FUNCTION_TARRSEL;
  674. servo_axis->di_polarity= DI_NOPEN;
  675. servo_com_cmd(axis,DI_MODE_SW);
  676. //servo_axis->cmd_fb[DI_MODE_SW]=0;//清除反馈命令
  677. //配置DO3为转矩到达输出和极性
  678. servo_axis->do_function_set=DO_FUNCTION_VALUE;
  679. servo_axis->do_polarity= DI_NCLOSE;
  680. servo_com_cmd(axis,DO_TARR_SW);
  681. //servo_axis->cmd_fb[DO_TARR_SW]=0;//清除反馈命令
  682. //配置控制模式
  683. servo_axis->ctrl_mode_set=CTRL_TARR_MODE;
  684. servo_com_cmd(axis,CTRL_MODE_SET);
  685. //servo_axis->cmd_fb[CTRL_MODE_SET]=0;//清除反馈命令
  686. //配置转矩的方式:
  687. set_ctrl_tarr_config(axis,mode);
  688. //配置扭矩模式下的速度限制、扭矩限制、扭矩基准值
  689. //set_servo_tarr_limit(axis,1000,1000,20000,10000,SERVO_TARR_CCW);
  690. //配置超时设置
  691. sw_timer_start(&servo_axis->timer, 2, 0);//2S超时
  692. break;
  693. }
  694. }
  695. //设置伺服运行模式
  696. //0位置+转矩模式,转矩改变由通讯方式
  697. //1转矩模式,采用转矩切换方式
  698. static void set_servo_mode(unsigned short axis,unsigned short mode)
  699. {
  700. switch(axis)
  701. {
  702. case X_AXIS:
  703. set_servo_axis_mode(X_AXIS,&servo_x,mode);
  704. break;
  705. case Y_AXIS:
  706. set_servo_axis_mode(Y_AXIS,&servo_y,mode);
  707. break;
  708. }
  709. }
  710. /**
  711. * 伺服通讯初初始化函数
  712. *
  713. * @author laz
  714. *
  715. * @param cmd
  716. */
  717. static int servo_com_init(unsigned short axis,servo_param_t *servo_axis)
  718. {
  719. //通讯握手三次
  720. switch(servo_axis->init_step)
  721. {
  722. case 0://握手
  723. servo_axis->IO_TO_COM=0;
  724. servo_com_cmd(axis,HANDSHAKE);
  725. //servo_axis->cmd_fb[HANDSHAKE]=0;//清除反馈命令
  726. sw_timer_start(&servo_axis->timer, 1, 0);//1S超时
  727. servo_axis->init_step++;
  728. servo_axis->com_number++;
  729. break;
  730. case 1://判断握手情况。
  731. if (sw_timer_expire(&servo_axis->timer)){//握手超时
  732. if(servo_axis->com_number>=3){//三次通讯超时,通讯失败。
  733. servo_axis->init_step=0xF0;
  734. }
  735. else{//没有到三次继续通讯。
  736. servo_axis->init_step=0;
  737. }
  738. }
  739. if(servo_axis->cmd_fb[HANDSHAKE]==HANDSHAKE)//通讯成功
  740. {
  741. servo_axis->com_ok_number++;
  742. if(servo_axis->com_ok_number>=3){//通讯成功3次
  743. servo_axis->init_step++;
  744. servo_axis->com_number=0;
  745. }
  746. else{
  747. servo_axis->init_step=0;
  748. }
  749. }
  750. break;
  751. case 2://配置伺服驱动器。
  752. //停机关使能
  753. //SetEn(axis, 1);
  754. set_servo_mode(axis,RUN_MODE);
  755. servo_axis->com_number++;
  756. sw_timer_start(&servo_axis->timer, 2, 0);//1S超时
  757. servo_axis->init_step++;
  758. break;
  759. case 3://判断配置IO情况。
  760. if (sw_timer_expire(&servo_axis->timer)){//配置失败
  761. if(servo_axis->com_number>=3){//三次配置失败,通讯失败。
  762. servo_axis->init_step=0xF1;
  763. }
  764. else{//配置没有成功重新配置。
  765. servo_axis->init_step=2;
  766. }
  767. }
  768. //配置成功
  769. if(servo_axis->cmd_fb[DI_MODE_SW]==DI_MODE_SW&&servo_axis->cmd_fb[DO_TARR_SW]==DO_TARR_SW
  770. &&servo_axis->cmd_fb[CTRL_MODE_SET]==CTRL_MODE_SET
  771. &&servo_axis->cmd_fb[TARR_SOURCE_SEL]==TARR_SOURCE_SEL
  772. //&&(servo_axis->cmd_fb[SPEED_LIMIT_SET]==SPEED_LIMIT_SET&&RUN_MODE==0
  773. //||servo_axis->cmd_fb[TARR_LIMIT12_SET]==TARR_LIMIT12_SET&&RUN_MODE==1)
  774. &&servo_axis->cmd_fb[TARR_BASE_SET]==TARR_BASE_SET){
  775. servo_axis->init_step++;
  776. }
  777. break;
  778. case 4://初始化配置扭矩模式下的速度限制、扭矩限制、扭矩基准值
  779. if(RUN_MODE==0)
  780. {
  781. set_servo_postotarr_limit(axis,550,10000,10000,SERVO_TARR_CCW);
  782. }
  783. else
  784. {
  785. set_servo_tarr_limit(axis,1000,1000,20000,10000,SERVO_TARR_CCW);
  786. }
  787. servo_axis->init_step++;
  788. break;
  789. case 5://设置告警和清除告警的读取模式,循环读取ALARMCODE;
  790. Set_Servo_Runmode(axis,1);//设置伺服运行在通讯模式,
  791. servo_com_cmd(axis,ALARM_CODE);
  792. //servo_axis->cmd_fb[ALARM_CODE]=0;//清除反馈命令
  793. servo_axis->init_step++;
  794. break;
  795. case 6://配置成功,输出使能
  796. servo_axis->IO_TO_COM=1;//配置为IO模式
  797. servo_axis->init_step=101;
  798. servo_com_cmd(axis,ENCODE_FB);
  799. return 1;
  800. break;
  801. case 0xF1://配置失败处理
  802. servo_com_cmd(axis,SERVO_RESTART);//伺服重启
  803. servo_axis->cmd_fb[SERVO_RESTART]=0;//清除反馈命令
  804. servo_axis->init_step++;
  805. break;
  806. case 0xF2://配置失败处理
  807. if(servo_axis->cmd_fb[SERVO_RESTART]==SERVO_RESTART){
  808. ;//SetEn(X_AXIS, MOTOR_EN);//设置使能
  809. return 0xF2;
  810. }
  811. case 0xF0://配置失败处理
  812. return 0xF0;
  813. break;
  814. }
  815. return 0;
  816. }
  817. //获取伺服通讯初始化状态
  818. int GetServoComState(unsigned short axis)
  819. {
  820. switch(axis)
  821. {
  822. case X_AXIS:
  823. return servo_x.IO_TO_COM;
  824. break;
  825. case Y_AXIS:
  826. return servo_x.IO_TO_COM;
  827. break;
  828. }
  829. return 0;
  830. }
  831. //设置扭矩的应用
  832. void SetServoComUse(unsigned short axis,unsigned short enable)
  833. {
  834. switch(axis)
  835. {
  836. case X_AXIS:
  837. if(enable)
  838. {
  839. SetEn(X_AXIS, MOTOR_DISEN);
  840. servo_x.init_step=0;
  841. }
  842. else
  843. {
  844. servo_x.init_step=0xF0;
  845. }
  846. break;
  847. case Y_AXIS:
  848. if(enable)
  849. {
  850. SetEn(Y_AXIS, MOTOR_DISEN);
  851. servo_y.init_step=0;
  852. }
  853. else
  854. {
  855. servo_y.init_step=0xF0;
  856. }
  857. break;
  858. }
  859. }
  860. //伺服运行测试位置
  861. static sw_timer_t servo_com_timer;//伺服通讯定时器。
  862. unsigned char servo_test_step=0;
  863. long X_pos;
  864. int servo_test_pluse_mode(void)
  865. {
  866. static long servo_test_delay=0;
  867. memcpy(&user_datas[610],&dwYRealPos,4);
  868. memcpy(&user_datas[612],&olddwYRealPos[0],4);
  869. SERVO_STEP=servo_test_step;
  870. switch(servo_test_step)
  871. {
  872. case 1:
  873. if(RUN_MODE==0)servo_test_step++;//转矩模式+位置模式测试
  874. else servo_test_step=20;//转矩模式的,转矩1,2限制测试
  875. break;
  876. case 2:
  877. //SetEn(X_AXIS, MOTOR_EN);
  878. SetEn(Y_AXIS, MOTOR_EN);
  879. //SetPos(X_AXIS,0);
  880. SetPos(Y_AXIS,0);
  881. //扭矩模式+位置模式(轴--扭矩%--正转速度限制--反转速度限制--方向)
  882. //set_servo_postotarr_limit(X_AXIS,200,400,100,SERVO_TARR_CW);
  883. set_servo_postotarr_limit(Y_AXIS,200,4000,2000,SERVO_TARR_CW);
  884. //设置位置模式
  885. Set_Ctrlmode_trans(Y_AXIS,POS_MODE);
  886. //
  887. //Set_Ctrlmode_trans(Y_AXIS,TARR_MODE_LIMIT1);
  888. sw_timer_start(&servo_com_timer, 10, 0);
  889. servo_test_step++;
  890. //CTHL_XSavePosBuff=servo_com_timer.usec;
  891. break;
  892. case 4://位置运行
  893. AxisMovePosAccDecNotStop(Y_AXIS,2000,50000,1000,1000,20,50,50);
  894. servo_test_step++;
  895. break;
  896. case 5:
  897. if(get_tarr_set(Y_AXIS)==2)//设置扭矩完成
  898. {
  899. if(abs(dwYRealPos)>=10000)
  900. {
  901. Set_Ctrlmode_trans(Y_AXIS,TARR_MODE);//设置成为扭矩模式
  902. AxisEgmStop(Y_AXIS);
  903. servo_test_step++;
  904. }
  905. }
  906. else if(get_tarr_set(Y_AXIS)==0)//配置超时
  907. {
  908. servo_test_step=0xF0;
  909. }
  910. break;
  911. case 6://
  912. if(GetTarr(Y_AXIS))//转矩到达
  913. {
  914. servo_test_delay=dwTickCount + 1000; //维持1S
  915. servo_test_step++;
  916. }
  917. break;
  918. case 7://
  919. if(dwTickCount>=servo_test_delay)
  920. {
  921. if(GetTarr(Y_AXIS))
  922. {
  923. Set_Ctrlmode_trans(Y_AXIS,POS_MODE);//转位置模式;
  924. set_servo_postotarr_limit(Y_AXIS,250,4000,2000,SERVO_TARR_CCW);//配置转矩及方向
  925. servo_test_step++;
  926. }
  927. }
  928. break;
  929. case 8://松轴
  930. AxisMovePosAccDecNotStop(Y_AXIS,2000,-50000,1000,1000,20,50,50);
  931. servo_test_step++;
  932. break;
  933. case 9:
  934. if(get_tarr_set(Y_AXIS)==2)//设置扭矩完成
  935. {
  936. if(abs(dwYRealPos)>=10000)
  937. {
  938. Set_Ctrlmode_trans(Y_AXIS,TARR_MODE);//设置成为扭矩模式
  939. servo_test_delay=dwTickCount + 5000;
  940. servo_test_step++;
  941. }
  942. }
  943. else if(get_tarr_set(Y_AXIS)==0)//配置超时
  944. {
  945. servo_test_step=0xF0;
  946. }
  947. break;
  948. case 10://
  949. if(dwTickCount>=servo_test_delay)
  950. {
  951. if(GetTarr(Y_AXIS))//转矩到达
  952. {
  953. servo_test_delay=dwTickCount + 1000; //维持1S
  954. servo_test_step++;
  955. }
  956. }
  957. break;
  958. case 11://
  959. if(dwTickCount>=servo_test_delay)
  960. {
  961. if(GetTarr(Y_AXIS))
  962. {
  963. Set_Ctrlmode_trans(Y_AXIS,POS_MODE);//转位置模式;
  964. servo_test_delay=dwTickCount + 100;
  965. servo_test_step++;
  966. }
  967. }
  968. break;
  969. case 12://1S后转转矩模式
  970. if(dwTickCount>=servo_test_delay)
  971. {
  972. Set_Ctrlmode_trans(Y_AXIS,TARR_MODE);//转位置模式;
  973. servo_test_step++;
  974. }
  975. break;
  976. case 13://
  977. if(GetTarr(Y_AXIS))//转矩到达
  978. {
  979. servo_test_delay=dwTickCount + 1000; //维持1S
  980. AxisEgmStop(Y_AXIS);
  981. servo_test_step++;
  982. }
  983. break;
  984. case 14://
  985. if(dwTickCount>=servo_test_delay)
  986. {
  987. if(GetTarr(Y_AXIS))
  988. {
  989. Set_Ctrlmode_trans(Y_AXIS,POS_MODE);//转位置模式;
  990. servo_test_step=0;
  991. }
  992. }
  993. break;
  994. case 20://配置扭矩
  995. //SetEn(X_AXIS, MOTOR_EN);
  996. //SetPos(X_AXIS,0);
  997. SetPos(Y_AXIS,0);
  998. //扭矩模式,用扭矩1和扭矩2之间的切换
  999. //扭矩模式+位置模式(轴--最大扭矩--最小扭矩--正转速度限制--反转速度限制--方向)
  1000. //set_servo_tarr_limit(X_AXIS,200,100,400,100,SERVO_TARR_CW);
  1001. set_servo_tarr_limit(Y_AXIS,200,100,4000,2000,SERVO_TARR_CW);
  1002. //设置最大扭矩限制
  1003. Set_Ctrlmode_trans(Y_AXIS,TARR_MODE_MAXLIMIT);
  1004. //
  1005. //Set_Ctrlmode_trans(Y_AXIS,TARR_MODE_LIMIT1);
  1006. sw_timer_start(&servo_com_timer, 10, 0);
  1007. //servo_test_step++;
  1008. break;
  1009. case 21://扭矩运行
  1010. if(get_tarr_set(Y_AXIS)==2)//设置扭矩完成
  1011. {
  1012. if(abs(dwYRealPos)>=10000)
  1013. {
  1014. SetEn(Y_AXIS, MOTOR_EN);//运行
  1015. servo_test_step++;
  1016. }
  1017. }
  1018. else if(get_tarr_set(Y_AXIS)==0)//配置超时
  1019. {
  1020. servo_test_step=0xF0;
  1021. }
  1022. break;
  1023. case 22://维持运行
  1024. servo_test_delay=dwTickCount + 10000; //维持10S
  1025. servo_test_step++;
  1026. break;
  1027. case 23://切换扭矩,并维持运行
  1028. if(dwTickCount>=servo_test_delay)
  1029. {
  1030. Set_Ctrlmode_trans(Y_AXIS,TARR_MODE_MINLIMIT); //切换成扭矩
  1031. servo_test_delay=dwTickCount + 10000; //维持10S
  1032. servo_test_step++;
  1033. }
  1034. break;
  1035. case 24://停止,切换方向,重新设置
  1036. if(dwTickCount>=servo_test_delay)
  1037. {
  1038. SetEn(Y_AXIS, MOTOR_EN);//停止
  1039. set_servo_tarr_limit(Y_AXIS,200,100,4000,2000,SERVO_TARR_CCW);//切换方向
  1040. Set_Ctrlmode_trans(Y_AXIS,TARR_MODE_MAXLIMIT);
  1041. servo_test_step++;
  1042. }
  1043. break;
  1044. case 25://运行
  1045. if(get_tarr_set(Y_AXIS)==2)//设置扭矩完成
  1046. {
  1047. if(abs(dwYRealPos)>=10000)
  1048. {
  1049. SetEn(Y_AXIS, MOTOR_EN);//运行
  1050. servo_test_step++;
  1051. }
  1052. }
  1053. else if(get_tarr_set(Y_AXIS)==0)//配置超时
  1054. {
  1055. servo_test_step=0xF0;
  1056. }
  1057. break;
  1058. case 26://维持运行
  1059. servo_test_delay=dwTickCount + 10000; //维持10S
  1060. servo_test_step++;
  1061. break;
  1062. case 27://切换扭矩
  1063. if(dwTickCount>=servo_test_delay)
  1064. {
  1065. Set_Ctrlmode_trans(Y_AXIS,TARR_MODE_MINLIMIT); //切换成扭矩
  1066. servo_test_delay=dwTickCount + 10000; //维持10S
  1067. servo_test_step++;
  1068. }
  1069. break;
  1070. case 28://停止
  1071. if(dwTickCount>=servo_test_delay)
  1072. {
  1073. SetEn(Y_AXIS, MOTOR_EN);//停止
  1074. servo_test_step=0;
  1075. }
  1076. break;
  1077. }
  1078. if(M0045)
  1079. {
  1080. M0045=0;
  1081. AxisContinueMoveChangeSpeed(Y_AXIS,CHANGE_SPEED,STOP_SPEED,10,10);
  1082. }
  1083. if(M0046)
  1084. {
  1085. M0046=0;
  1086. servo_test_step++;
  1087. }
  1088. if(M0047)
  1089. {
  1090. M0047=0;
  1091. //配置扭矩模式下的速度限制。
  1092. servo_y.speed_plimit_set=LIMIT_SPEED;
  1093. servo_y.speed_nlimit_set=LIMIT_SPEED;
  1094. servo_com_cmd(Y_AXIS,SPEED_LIMIT_SET);
  1095. servo_y.cmd_fb[SPEED_LIMIT_SET]=0;//清除反馈命令
  1096. }
  1097. return 0;
  1098. }
  1099. //伺服运行
  1100. int servo_com_run(void)
  1101. {
  1102. int runflag;
  1103. #if X_USERING_TARR==1
  1104. runflag=servo_com_init(X_AXIS,&servo_x);//初始化
  1105. servo_com_get_alarm(X_AXIS);
  1106. #endif
  1107. #if Y_USERING_TARR==1
  1108. runflag=servo_com_init(Y_AXIS,&servo_y);//初始化
  1109. servo_com_get_alarm(Y_AXIS);
  1110. #endif
  1111. //servo_test_pluse_mode();
  1112. return runflag;
  1113. }