axis_motion.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. #ifndef __axis_H__
  2. #define __axis_H__
  3. #define AXIS_USING_FLOAT //使用浮点运算功能
  4. //#define AXIS_USING_DEBUG //使用调试
  5. //#define AXIS_IGNORE_REPEAT_STEP //去除重复步
  6. //#define AXIS_USING_ACC_TABLE_ONLY //使用加速表同时当减速表来减少内存,使能该选项将会减少内存占用,
  7. //但是减时间设置将无效化
  8. #define AXIS_MAX_ACCDEC_STEP 500 //加减速表的缓冲大小
  9. #define AXIS_TASK_NUMBER 5 //任务缓冲个数
  10. #define AXIS_CALC_ROUND(reg) 0
  11. #define PP_Stop 0
  12. #define PP_NoStop 1
  13. //任务数量必须大于1,不然就没有作用
  14. #if defined(AXIS_TASK_NUMBER) && (AXIS_TASK_NUMBER < 1)
  15. #error "axis tasks data buffer number must bigger 1!"
  16. #endif
  17. /*
  18. #define axis_MODE_PP 1 //位置模式
  19. #define axis_MODE_PV 2 //速度模式
  20. #define axis_MODE_STOP 3 //减速停止
  21. #define axis_MODE_EMGSTOP 4 //急停
  22. */
  23. typedef struct
  24. {
  25. unsigned short steps; //脉冲需要加减速度时保证加减周期需要的脉冲个数
  26. unsigned short period; //脉宽
  27. } axis_accdec_t;
  28. typedef enum
  29. {
  30. AXIS_OUT_ENABLE,
  31. AXIS_OUT_ERRCLEAR
  32. }axis_output_name;
  33. typedef enum
  34. {
  35. AXIS_MODE_PP, //PP定位模式
  36. AXIS_MODE_PV, //连续运动模式
  37. AXIS_MODE_PP_TASKS, //多段定位模式
  38. AXIS_MODE_STOP, //停止模式
  39. AXIS_MODE_EMGSTOP, //急停模式
  40. AXIS_MODE_HOLD //保持状态
  41. }axis_mode;
  42. typedef enum
  43. {
  44. AXIS_ALARM_NONE, //没有报警
  45. AXIS_ALARM_ERROR, //报警信号
  46. AXIS_ALARM_HW_POSITIVE, //硬件正限位信号
  47. AXIS_ALARM_HW_NEGATIVE, //硬件负限位信号
  48. AXIS_ALARM_SW_POSITIVE, //软件正限位信号
  49. AXIS_ALARM_SW_NEGATIVE //软件负限位信号
  50. }axis_alarm_code_t;
  51. typedef enum
  52. {
  53. AXIS_ACCDEC_STATUS_ACC,
  54. AXIS_ACCDEC_STATUS_DEC
  55. }axis_accdec_status;
  56. typedef struct
  57. {
  58. int position;
  59. int speed;
  60. unsigned short dst_speed_index;
  61. unsigned short dec_speed_index;
  62. unsigned short reg_value;
  63. int target_position;
  64. int dec_position;
  65. } axis_tasks_data_t;
  66. typedef enum
  67. {
  68. AXIS_AXIS_NO, //设置轴号
  69. AXIS_POSITION, //设置脉冲位置计数寄存器
  70. AXIS_CLOCK, //设置时钟
  71. AXIS_PERIOD, //加减速周期
  72. AXIS_MIN_STEP, //设置最小步进
  73. AXIS_START_SPEED, //设置最小速度
  74. AXIS_ACCDEC_MODE, //设置加减速模式
  75. AXIS_AAC_LMT, //设置加加速度限制
  76. AXIS_ACC_LMT, //设置加速度限制
  77. AXIS_SPEED_UNIT, //设置速度倍数
  78. AXIS_ACC_TIME, //加速时间
  79. AXIS_DEC_TIME, //减速时间
  80. AXIS_PP_STOP_SELECT, //数控到位是否停止
  81. AXIS_HOME_SPACE, //零点限位的距离
  82. AXIS_HOME_OFFSET, //零点偏移
  83. AXIS_HOME_FIND_SPEED, //零点查找速度
  84. AXIS_HOME_HIGH_SPEED, //高速回零速度
  85. AXIS_HOME_LOW_SPEED, //低速回零速度
  86. AXIS_DIR_REVERSE, //方向电平取反
  87. AXIS_EN_REVERSE, //使能电平取反
  88. AXIS_ALARM_REVERSE, //伺服告警极性转换
  89. AXIS_USE_ENCODE //使能使用编码器位置
  90. } axis_paramter_t;
  91. //轴对象的数据结构
  92. typedef struct
  93. {
  94. unsigned char axis_no; //轴号,也是硬件脉冲号
  95. unsigned char accdec_mode; //加减速模式,0是直线加减速,1是S加减速
  96. axis_mode run_mode; //当前模式
  97. //输入信号
  98. struct axis_input_struct {
  99. int alarm_sgn : 1; //报警信号 1表示有信号
  100. int fin_sgn: 1; //脉冲发送完后到位信号
  101. int dir_reverse:1; //伺服方向调转,该位能直接让硬件正反方向调换,但是不会影响软件
  102. int en_reverse:1; //使能方向调转,该位能直接让硬件使能电平反转,但是不会影响软件
  103. int alarm_reverse:1; //伺服告警极性设置,0位常开,1为常闭
  104. int hw_positive_lmt : 1; //正极限位 1表示有信号
  105. int hw_home_sgn : 1; //零点 1表示有信号
  106. int hw_negative_lmt : 1; //负极限位 1表示有信号
  107. int hw_slow_lmt:1; //减速信号 1表示有信号
  108. int sw_lmt_enable:1; //软件限位功能使能 1表示有信号,这时候软件限位功能才有效
  109. int home_high_speed_enable:1; //回零高速使能
  110. int manual_cw:1; //手动正转信号
  111. int manual_ccw:1; //手动反转信号
  112. } inputs;
  113. //输出运算信号,用户不应该直接修改该区域,由软件自动判断
  114. struct axis_out_struct {
  115. int enable:1; //使能信号
  116. int error_clear:1; //报警清除信号
  117. int error_alarm : 1; //故障报警
  118. int hw_positive_alarm : 1; //硬件正极限位报警
  119. int hw_negative_alarm : 1; //硬件负极限位报警
  120. int sw_positive_alarm : 1; //软件正极限位报警
  121. int sw_negative_alarm : 1; //软件负极限位报警
  122. int dir:1; //方向 1时是正方向,0时是反方向
  123. int on:1; //开关状态,0时是关,1时是开
  124. int homing:1; //回零标志位
  125. int manual_action : 1; //手动动作标志,当手动有动作的时候,该标志软件会置1,急停时强制清0
  126. } outputs;
  127. long sw_positive_limit; //正极软件限位
  128. long sw_negative_limit; //负极软件限位
  129. void (* handle)(); //回调事件
  130. //加减速配置
  131. unsigned short period; //时间单位,ms
  132. int clock; //轴的基础频率
  133. unsigned short max_aac; //最大加加速
  134. unsigned short max_acc; //最大加速值
  135. unsigned short max_dec; //最大减速值
  136. unsigned short min_steps; //最小步限制,保证有最小执行计数
  137. unsigned short acc_time; //加速时间单位个数
  138. unsigned short dec_time; //减速时间单位个数
  139. unsigned short accdec_count; //加减速的计数寄存器
  140. unsigned short PP_Stop_Select; //数控模式下到数停止选择,0正常停止,到数后继续直低速
  141. //速度配置
  142. unsigned short speed_unit; //速度单位,真实设置速度必须乘以该单位才是真正的频率
  143. unsigned short start_speed; //启动速度
  144. unsigned short stop_speed; //停止速度
  145. unsigned short target_speed_reg; //目标速度寄存器值
  146. //编码器配置
  147. unsigned char use_encode; //0表示不使用编码器位置,1表示使用编码器位置
  148. long plus_stop_position; //运行指定脉冲数停止位置
  149. //加减速度表
  150. int acc_table_size; //加速表大小
  151. int dec_table_size; //减速表大小
  152. unsigned short acc_number_table[AXIS_MAX_ACCDEC_STEP]; //当前速度满足周期的脉冲数
  153. unsigned short acc_reg_table[AXIS_MAX_ACCDEC_STEP]; //当前速度对应的寄存器值
  154. #ifndef AXIS_USING_ACC_TABLE_ONLY
  155. unsigned short dec_number_table[AXIS_MAX_ACCDEC_STEP]; //当前速度满足周期的脉冲数
  156. unsigned short dec_reg_table[AXIS_MAX_ACCDEC_STEP]; //当前速度对应的寄存器值
  157. #endif
  158. #ifdef AXIS_USING_DEBUG
  159. unsigned int acc_speed_table[AXIS_MAX_ACCDEC_STEP]; //当前速度满足周期的脉冲数
  160. #ifndef AXIS_USING_ACC_TABLE_ONLY
  161. unsigned int dec_speed_table[AXIS_MAX_ACCDEC_STEP]; //当前速度对应的寄存器值
  162. #endif
  163. #endif
  164. //软件自动计算,用户一般情况不应该去修改
  165. long dec_position; //开始减速度的脉冲位置
  166. long acc_position; //加速脉冲数量
  167. long position; //当前的脉冲位置
  168. long target_position; //目标的脉冲位置
  169. long feed; //只能是-1或者1,用于去掉读取方向的复杂运算
  170. long encoder; //编码器输入值
  171. unsigned short cur_speed_index; //当前速度编号,针对的是脉冲表
  172. unsigned short acc_speed_index; //目标速度编号,针对的是脉冲表
  173. unsigned short dec_speed_index; //目标速度编号,针对的是脉冲表
  174. unsigned short dst_period; //目标速度的寄存器值
  175. unsigned char cur_accdec_status; //当前加减速状态,0表示正在加速,1表示正在减速
  176. unsigned short cur_speed;//当前速度
  177. unsigned short cur_reg_value;//当前寄出器的值。
  178. //回零参数配置
  179. unsigned char home_method; //回零模式,为0是默认的常规回零模式,后续可能根据需要进行添加
  180. unsigned char home_step; //回零状态步
  181. unsigned home_high_speed; //回零速度
  182. unsigned home_low_speed; //回零低速,一般当有碰到减速信号时才会用到
  183. unsigned home_find_speed; //查找零点的速度
  184. int home_offset; //原点偏移,回零可以根据该参数再进行一次移动
  185. int home_space; //离开零点需要的至少空间
  186. long negative_space; //离开限位需要的至少空间
  187. #ifdef AXIS_TASK_NUMBER
  188. char cur_task_index; //当前任务位置
  189. char task_number; //任务数
  190. axis_tasks_data_t tasks[AXIS_TASK_NUMBER]; //任务缓冲池
  191. #endif
  192. } axis_object_t;
  193. typedef struct
  194. {
  195. char index; //编号,辅助识别用,意义不大
  196. int posi; //阶段位置
  197. unsigned short speed; //该阶段期望的速度
  198. //计算变量
  199. unsigned short dst_speed_index; //目标速查表编号
  200. unsigned short reg; //该阶段速度对应的寄存器值
  201. int decposition; //减速位置
  202. } axis_stage_task_t;
  203. //硬件正极限信号
  204. #define AXIS_HW_POSITIVE_SGN(axis) axis->inputs.hw_positive_lmt
  205. //硬件负极限信号
  206. #define AXIS_HW_NEGATIVE_SGN(axis) axis->inputs.hw_negative_lmt
  207. //方向反向信号
  208. #define AXIS_REVERSE_SGN(axis) axis->inputs.dir_reverse
  209. //软件极限保护使能信号
  210. #define AXIS_SW_PROTECCT_SGN(axis) axis->inputs.sw_lmt_enable
  211. //减速信号
  212. #define AXIS_SLOW_SGN(axis) axis->inputs.hw_slow_lmt
  213. //报警信号
  214. #define AXIS_ALARM_SGN(axis) axis->inputs.alarm_sgn
  215. //回零时使能高速,当有减速信号开关时才使用
  216. #define AXIS_HOMING_HIGH_SPEED_ENABLE(axis) axis->inputs.home_high_speed_enable
  217. //是否正在回零点
  218. #define AXIS_IS_HOMING(axis) (axis->outputs.homing)
  219. //是否正在自动运行
  220. #define AXIS_IS_RUNNING(axis) (axis->outputs.on)
  221. //是否停止状态
  222. #define AXIS_IS_STOP(axis) (axis->outputs.on == 0)
  223. //是否出现错误
  224. #define AXIS_IS_ERROR(axis) (axis->outputs.error_alarm)
  225. //硬件正极限信号
  226. #define AXIS_EXCEED_HW_POSITIVE(axis) (axis->outputs.hw_positive_alarm)
  227. //硬件负极限信号
  228. #define AXIS_EXCEED_HW_NEGATIVE(axis) (axis->outputs.hw_negative_alarm)
  229. //软件正极限信号
  230. #define AXIS_EXCEED_SW_POSITIVE(axis) (axis->outputs.sw_positive_alarm)
  231. //软件负极限信号
  232. #define AXIS_EXCEED_SW_NEGATIVE(axis) (axis->outputs.sw_negative_alarm)
  233. //硬件使能信号
  234. #define AXIS_IS_ENABLE(axis) (axis->outputs.enable)
  235. //硬件清除报警信号
  236. #define AXIS_IS_ERRCLEAR(axis) (axis->outputs.error_clear)
  237. void axis_run(axis_object_t *axis);
  238. void axis_start(axis_object_t *axis);
  239. void axis_stop(axis_object_t *axis);
  240. void axis_emgstop(axis_object_t *axis);
  241. void axis_pp(axis_object_t *axis, int rel, int position, int speed,long slowpos);
  242. void axis_pv(axis_object_t *axis, int dir, int speed);
  243. void axis_pv_change_speed(axis_object_t *axis, int speed);
  244. void axis_stop_at(axis_object_t *axis, int postion);
  245. void axis_init_task(axis_object_t *axis, int dir);
  246. void axis_add_pp_task(axis_object_t *axis, int feed, int speed);
  247. void axis_start_pp_task(axis_object_t *axis);
  248. void axis_ccw(axis_object_t *axis);
  249. void axis_cw(axis_object_t *axis);
  250. void axis_home_run(axis_object_t *axis);
  251. void axis_home(axis_object_t *axis, int method, int home_speed, int find_speed);
  252. void axis_home_enable_high_speed(axis_object_t *axis, int high_speed);
  253. void axis_stop_all(axis_object_t *axis);
  254. void axis_set_ouput(axis_object_t *axis, axis_output_name type, int value);
  255. void axis_it_handle(void *handle);
  256. int axis_cw_lmt(axis_object_t *axis);
  257. int axis_ccw_lmt(axis_object_t *axis);
  258. axis_alarm_code_t axis_alarm_code(axis_object_t *axis);
  259. void axis_enable(axis_object_t *axis);
  260. void axis_disable(axis_object_t *axis);
  261. void axis_set_parameter(axis_object_t *axis, axis_paramter_t cmd, int argv);
  262. int axis_get_parameter(axis_object_t *axis, axis_paramter_t cmd);
  263. void axis_enable_software_lmt(axis_object_t *axis, int positive, int negative);
  264. void axis_disable_software_lmt(axis_object_t *axis);
  265. void axis_enable_irq_callback(axis_object_t * axis, void(*handle)());
  266. void axis_disable_irq_callback(axis_object_t * axis);
  267. void axis_pv_change_speed_table(axis_object_t *axis, int target_speed);
  268. void axis_set_accdec(axis_object_t *axis, int accdec_mode, int acc_time, int dec_time);
  269. void axis_pp_change_speed (axis_object_t *axis, int rel,
  270. int position, int target_speed,long slowpos);
  271. void axis_change_speed_direct(axis_object_t *axis, int target_speed);
  272. #endif