JAxis.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. #ifndef JAXIS_H
  2. #define JAXIS_H
  3. #define WIN32_LEAN_AND_MEAN
  4. #include <string>
  5. #include <map>
  6. #include "AxisPara.h"
  7. #include <Windows.h>
  8. //使用类型擦除方式
  9. #include <any>
  10. /*
  11. * 接口设计原则
  12. * 1、只定义外部接口,Axis内部使用接口不计入
  13. * 2、底层的、单一完整的功能接口
  14. * 3、都为用户单位User Units
  15. * 4、函数均为非模态,若实现方式不是下到运动控制卡中执行,则需要开线程执行
  16. * 5、尽量与特定品牌特性分离
  17. * 7、轴配置参数、回零参数、限位参数等保存在数据库中
  18. * 8、构造时赋予的轴编号或轴名称为外部对轴的唯一标识
  19. * 9、单一基础功能,组合功能在上层AxisManager中做
  20. */
  21. //返回值定义
  22. #define AXIS_CMD_SUCCESS 0
  23. //轴错误指令
  24. #define AXIS_CMD_ERROR_INSTRUCTION 1
  25. //轴参数错误
  26. #define AXIS_CMD_ERROR_PARAMETER 2
  27. //处于错误的运动模式
  28. #define AXIS_CMD_ERROR_MOTION_MODE 3
  29. //轴处于禁止的状态
  30. #define AXIS_CMD_ERROR_FORBID_STATE 4
  31. //硬件错误
  32. #define AXIS_CMD_ERROR_DRIVE_FAULT 5
  33. //硬件禁止
  34. #define AXIS_CMD_ERROR_DRIVE_INHIBIT 6
  35. //轴伺服未使能
  36. #define AXIS_CMD_ERROR_DRIVE_DISABLE 7
  37. //轴伺服未软使能
  38. #define AXIS_CMD_ERROR_SOFT_DISABLE 8
  39. //轴未回过零
  40. #define AXIS_CMD_ERROR_NOT_HOMED 9
  41. //轴触发负硬限位
  42. #define AXIS_CMD_ERROR_HARD_NEG_LIMIT 10
  43. //轴触发正硬限位
  44. #define AXIS_CMD_ERROR_HARD_POS_LIMIT 11
  45. //轴触发负软限位
  46. #define AXIS_CMD_ERROR_SOFT_NEG_LIMIT 12
  47. //轴触发正软限位
  48. #define AXIS_CMD_ERROR_SOFT_POS_LIMIT 13
  49. //错误的轴类型
  50. #define AXIS_CMD_ERROR_AXISTYPE 14
  51. //超过轴运动的允许时间
  52. #define AXIS_CMD_ERROR_TIME_OVER 15
  53. //轴正在运动无法设置
  54. #define AXIS_CMD_ERROR_MOVING 16
  55. //轴中没有此运动模式
  56. #define AXIS_CMD_ERROR_NO_MOTION_MODE 17
  57. //轴中跟随误差超限
  58. #define AXIS_CMD_ERROR_TRACE_LIMIT 18
  59. //轴获取回零时位置误差超限(10次大循环,没有连续两次编码器位置在误差内的)
  60. #define AXIS_CMD_ERROR_ENC_DIFF 19
  61. //轴回零方式不存在
  62. #define AXIS_CMD_ERROR_WRONG_HOME_METHOD 20
  63. //坐标系中轴数量不足
  64. #define AXIS_CMD_ERROR_LACK_AXIS 21
  65. //坐标系中包含的轴错误
  66. #define AXIS_CMD_ERROR_WRONG_AXIS 22
  67. //输入参数类型错误
  68. #define AXIS_CMD_ERROR_WRONG_VAR_TYPE 23
  69. //发送消息失败
  70. #define AXIS_CMD_ERROR_MSG_FAULT 24
  71. #define AXIS_HOME_ERROR_NO_HOME 1001
  72. #define AXIS_HOME_ERROR_NO_INDEX 1002
  73. //.....
  74. #define ELMO_COMPARE_POS1 "ui[1]"
  75. #define ELMO_FEEDBACK_POS "px"
  76. #define ELMO_COMPARE_ENABLE "ui[2]"
  77. #define ELMO_STOP_SIGNAL "ob[2]"
  78. enum AxisStopMode
  79. {
  80. AXIS_SMOOTH_STOP = 0,//平滑停止
  81. AXIS_ABRUPT_STOP = 1,//急停
  82. };
  83. enum AxisMotionMode
  84. {
  85. AXIS_MODE_TRAP = 0,//点位运动模式
  86. AXIS_MODE_JOG = 1,//Jog模式
  87. AXIS_MODE_PT = 2,//PT模式
  88. AXIS_MODE_GEAR = 3,//电子齿轮模式
  89. AXIS_MODE_FOLLOW = 4,//Follow模式(电子凸轮)
  90. AXIS_MODE_COORDINATE = 5,//插补模式//INTERPOLATION
  91. AXIS_MODE_PVT = 6,//PVT模式
  92. AXIS_MODE_FORCE = 7,//力轴模式
  93. };
  94. struct AxisStatus
  95. {
  96. bool bInitOK = false; // 初始化成功
  97. bool bDriveFaulted = false; // 伺服报警
  98. bool bInhibitedFaulted = false; // 轴禁止故障
  99. bool bTrackError = false; // 跟随误差越限
  100. bool bPosHardLimitEnable = false;//正限位使能
  101. bool bNegHardLimitEnable = false;//负限位使能
  102. bool bPosHardLimit = false; // 正硬限位触发
  103. bool bNegHardLimit = false; // 负硬限位触发
  104. bool bNegSoftLimitEnable = false;// 负软限位使能
  105. bool bPosSoftLimitEnable = false;// 正软限位使能
  106. bool bPosSoftLimit = false; // 正软限位触发
  107. bool bNegSoftLimit = false; // 负软限位触发
  108. bool bSmoothStop = false;// 平滑停止标志
  109. bool bAbruptStop = false; // 急停标志
  110. bool bDriveEnabled = false; // 伺服使能
  111. bool bSoftEnabled = false; // 软使能
  112. bool bHomed = false; // 已寻过零标志
  113. bool bMoving = false; // 规划器运动标志
  114. bool bArrival = false; // 电机到位标志
  115. AxisMotionMode eMotionMode = AXIS_MODE_TRAP;//运动模式
  116. AxisStopMode eStopMode = AXIS_SMOOTH_STOP;//默认为平滑停止
  117. };
  118. struct MotionStatus
  119. {
  120. /*所有单位都是 user units*/
  121. double m_dTargetPos = 0.0;//目标运动位置
  122. double m_dMoveDistance = 0.0;//最近一次运动距离
  123. double m_dTargetVel = 0.0;//目标预计速度
  124. double m_dTargetAcc = 0.0;//目标预计加速度
  125. double m_dTargetDec = 0.0;//目标预计减速度
  126. double m_dTargetJerk = 0.0;//目标预计Jerk
  127. };
  128. struct AxisIOStatus
  129. {
  130. bool bHomeSensorInput = false;
  131. bool bPosLimitSensorInput = false;
  132. bool bNegLimitSensorInput = false;
  133. bool bAxisInhibitedInput = false;//急停输入,Safety Torque Off
  134. bool bDriveEnableOutput = false;
  135. bool bDriveFaultResetOutput = false;
  136. };
  137. struct AxisHomeStatus
  138. {
  139. bool bHomeRunning = false; // false—已停止运动,true-正在回原点
  140. bool bHomeDone = false; // false—回零未完成,true-回零完成
  141. bool bHomeError = false; // false—回零未出错,true-回零出错
  142. int nHomeStage = 0; // 回原点运动的阶段
  143. int nErrorCode = 0; // 回原点过程的发生的错误码
  144. double dCapturePos = 0.0; // 捕获到Home或Index时刻的编码器位置,user units
  145. double dTargetPos = 0.0; // 需要运动到的目标位置(原点位置或者原点位置+偏移量),user units
  146. };
  147. class JAxis
  148. {
  149. public:
  150. JAxis(){};
  151. virtual ~JAxis(){};
  152. public:
  153. //获取轴ID
  154. virtual int GetAxisId() = 0;
  155. //获取轴名称
  156. virtual std::string GetAxisName() = 0;
  157. public:
  158. /*-------------------------
  159. * 轴配置
  160. --------------------------*/
  161. //轴初始化
  162. virtual int Init(AxisData* Data/*,int nFormerAxis*/,HANDLE hCtrlComm) = 0;
  163. //轴硬件使能
  164. virtual int AxisOn() = 0;
  165. //轴断硬件使能
  166. virtual int AxisOff() = 0;
  167. //状态清除/故障
  168. virtual int ClearStatus() = 0;
  169. //电气硬限位使能
  170. virtual int EnableHardLimit(bool bEnableNeg, bool bEnablePos) = 0;
  171. //软件限位使能
  172. virtual int EnableSoftLimit(bool bEnableNeg, bool bEnablePos) = 0;
  173. //到位检查使能
  174. //确认
  175. virtual int EnableArrivalCheck(bool bEnable) = 0;
  176. //设置当前规划位置值
  177. virtual int SetCurrentProfilePos(double dPos) = 0;
  178. //设置当前实际位置值
  179. virtual int SetCurrentActualPos(double dPos) = 0;
  180. //设置当前规划和实际位置值
  181. virtual int SetCurrentPos(double dPos) = 0;
  182. //设置当前规划和实际位置值为0(即被动回零)
  183. virtual int ZeroCurrentPos() = 0;
  184. /*-------------------------
  185. * 轴参数设置
  186. --------------------------*/
  187. // //设置轴单个参数(TODO-通用参数读写接口需要优化)
  188. // virtual int SetParameter(std::string strPrmName, double dValue) = 0;
  189. // //获取轴单个参数(TODO-通用参数读写接口需要优化)
  190. // virtual int GetParameter(std::string strPrmName, double& dValue) = 0;
  191. // //获取轴所有参数副本(TODO-通用参数读写接口需要优化)
  192. // virtual int GetAllParameters(std::map<std::string, double>& prmsMap) = 0;
  193. //获取轴数据结构体指针
  194. virtual const AxisData* GetAxisData() const /*{return m_stData;}*/ = 0;
  195. //设置轴数据结构体中的数据(新增)
  196. virtual int SetAxisData(AxisData* data) = 0;
  197. //获取轴当前的轴类型,如Servo,Forcer,Step;其实没有意义,需要删除2024/11/25
  198. virtual AxisType GetAxisType() = 0;
  199. //设置到位误差及整定时间
  200. virtual int SetArrivalBand(double dErrorBand, double dSettingTime) = 0;
  201. //设置软限位
  202. virtual int SetSoftLimit(double dNegLimit, double dPosLimit) = 0;
  203. //获取轴硬件编号
  204. virtual int GetAxisNo() = 0;
  205. //获取到位误差及整定时间
  206. virtual int GetArrivalBand(double& dErrorBand, double& dSettingTime) = 0;
  207. //获取软限位及软行程
  208. virtual int GetSoftLimit(double& dSoftLimitNeg, double& dSoftLimitPos, double& dSoftTravelRange) = 0;
  209. //获取最大速度设置
  210. virtual int GetMaxVelocity(double& dMaxVel) = 0;
  211. //获取最大加/减速度设置
  212. virtual int GetMaxAcceleration(double& dMaxAcc, double& dMaxDec) = 0;
  213. //获取最大Jerk设置
  214. virtual int GetMaxJerk(double& dMaxJerk) = 0;
  215. /*-------------------------
  216. * 运动Buffer参数获取与设置
  217. --------------------------*/
  218. virtual int SetBufferParamF(int nBufferNo,std::string sParamFName,double dDoubleParam)=0;
  219. virtual int SetBufferParam(int nBufferNo,std::string sParamName,int nIntParam)=0;
  220. virtual int GetBufferParamF(int nBufferNo,std::string sParamFName,double& dDoubleParam)=0;
  221. virtual int GetBufferParam(int nBufferNo,std::string sParamName,int& nIntParam )=0;
  222. //运行驱动器中的脚本
  223. virtual int RunBuffer(int nBufferNo)=0;
  224. /*-------------------------
  225. * 轴运动
  226. --------------------------*/
  227. //串口通讯写入参数值(USB),默认为GBK编解码
  228. //默认数据位8,校验位None,停止位1
  229. //模板类型
  230. // template <typename T>
  231. virtual int WriteSerialValue(std::string sSerial,std::any tValue)=0;
  232. //virtual int WriteSerialValue(std::string sSerial)=0;
  233. virtual int WriteSockValue(std::string sSerial,std::any tValue)=0;
  234. //设置软使能状态
  235. virtual int SetAxisSoftEnable(bool bEnable) = 0;
  236. //设置停止减速度
  237. virtual int SetStopDec(double dSmoothStopDec, double dAbruptStopDec) = 0;
  238. virtual int SetStopDecR(double dSmoothStopRatio,double dAbruptStopRatio) = 0;
  239. //运动停止(同时停止寻零)
  240. virtual int Stop(AxisStopMode eStopMode = AXIS_SMOOTH_STOP) = 0;
  241. //设置轴运动模式
  242. virtual int SetMotionMode(AxisMotionMode eMode) = 0;
  243. //ACS所有运动参数相关设置,单位均为um/s->um/s而非um/s->cnt/ms
  244. //设置目标Acc/Dec参数,user units
  245. virtual int SetTargetAccDec(double dAcc, double dDec) = 0;
  246. virtual int SetTargetAccDecR(double dAccRatio,double dDecRatio) = 0;
  247. //设置目标Jerk参数,user units
  248. virtual int SetTargetJerk(double dJerk) = 0;
  249. virtual int SetTargetJerkR(double dJerkRatio) = 0;
  250. //设置目标速度(直接速度),user units
  251. virtual int SetTargetVel(double dVel) = 0;
  252. virtual int SetTargetVelR(double dVelRatio) = 0;
  253. //超时会返回错误码,直接停止并退出
  254. //启动绝对位移运动,user units
  255. virtual int MoveAbs(double dPos,double dTime = 0) = 0;
  256. virtual int MoveAbs(double dPos,double dTime,double dPassPos) = 0;
  257. virtual int MoveAbsR(double dPos,double dVelRatio,double dTime = 0) = 0;
  258. virtual int MoveAbsR(double dPos,double dVelRatio,double dTime,double dPassPos) = 0;
  259. //启动相对位移运动,user units
  260. virtual int MoveRel(double dDist,double dTime = 0) = 0;
  261. virtual int MoveRel(double dDist,double dTime,double dPassDist) = 0;
  262. virtual int MoveRelR(double dDist,double dVelRatio,double dTime = 0) = 0;
  263. virtual int MoveRelR(double dDist,double dVelRatio,double dTime,double dPassDist) = 0;
  264. //启动Jog运动,user units
  265. virtual int Jog(double dVel) = 0;
  266. virtual int JogR(double dVelRatio) = 0;
  267. //启动力轴力矩模式运动
  268. //千分之最大电流;Slope/上升时间 ms;停止时间 ms
  269. virtual int MoveForce(int nTorqueRatio,int nReachTime = 50,int nStopTime = 10) = 0;
  270. //启动本轴作为从轴的齿轮运动
  271. virtual int MoveGear() = 0;
  272. //设置从轴的齿轮比(只有齿轮运动模式才有)
  273. //主轴齿数,从轴齿数,离合区;单位均为pulse
  274. virtual int SetGearRatio(long nMEven,long nSEven,long nMasterSlope = 0 ) = 0;
  275. //设置本从轴的主轴
  276. virtual int SetGearMaster(const JAxis* pMaster) = 0;
  277. //运动过程中改变运动速度,user units
  278. virtual int ChangeVel(double dVel) = 0;
  279. virtual int ChangeVelR(double dRatio) = 0;
  280. //启动寻零运动(时间大于0则在时间内等待)
  281. virtual int GoHome(double dTime = 0) = 0;
  282. /*-------------------------
  283. * 轴状态
  284. --------------------------*/
  285. //获取轴运动模式
  286. virtual int GetMotionMode(AxisMotionMode& axisMotionMode) = 0;
  287. //获取轴状态
  288. virtual int GetAxisStatus(AxisStatus& axisStatus) = 0;
  289. //轴是否已经初始化过
  290. virtual bool IsInitOK() = 0;
  291. //硬件故障
  292. virtual bool IsHardwareFaulted() = 0;
  293. //sto输出极切断
  294. virtual bool IsInhibitedFaulted() = 0;
  295. //是否轴已使能
  296. virtual bool IsDriveEnabled() = 0;
  297. //是否轴已软使能
  298. virtual bool IsSoftEnabled() = 0;
  299. //轴是否回过零
  300. virtual bool IsHomed() = 0;
  301. //是否轴正在运动
  302. virtual bool IsMoving() = 0;
  303. //是否轴已到达预设位置
  304. virtual bool IsArrival() = 0;
  305. //
  306. //virtual bool WaitArrival() = 0;
  307. //获取IO状态
  308. virtual int GetIOStatus(AxisIOStatus& axisIOStatus) = 0;
  309. //获取寻零运动状态
  310. virtual int GetHomeStatus(AxisHomeStatus& axisHomeStatus) = 0;
  311. //获取硬限位使能配置状态
  312. virtual int GetHardLimitEnableStatus(bool& bEnabledNeg, bool& bEnabledPos) = 0;
  313. //获取软限位使能配置状态
  314. virtual int GetSoftLimitEnableStatus(bool& bEnabledNeg, bool& bEnabledPos) = 0;
  315. //获取到位检查使能配置状态
  316. virtual int GetArrivalCheckEnableStatus(bool& bEnabled) = 0;
  317. /*-------------------------
  318. * 轴过程数据
  319. --------------------------*/
  320. //获取目标位置数据,user units
  321. virtual int GetTargetPos(double& dTargetPos) = 0;
  322. //获取目标速度数据,user units
  323. virtual int GetTargetVel(double& dTargetVel) = 0;
  324. //获取目标Acc/Dec数据,user units
  325. virtual int GetTargetAccDec(double& dTargetAcc, double& dTargetDec) = 0;
  326. //获取目标Jerk数据,user units
  327. virtual int GetTargetJerk(double& dTargetJerk) = 0;
  328. //获取实时规划位置,user units
  329. virtual int GetProfilePos(double& dProfilePos) = 0;
  330. //获取实时规划速度,user units
  331. virtual int GetProfileVel(double& dProfileVel) = 0;
  332. //获取实时规划加速度,user units
  333. virtual int GetProfileAcc(double& dProfileAcc) = 0;
  334. //获取实时规划力矩(电流),user units
  335. virtual int GetProfileTorque(double& dProfileTorque) = 0;
  336. //获取实时实际位置,user units
  337. virtual int GetActualPos(double& dActualPos) = 0;
  338. //获取实时实际速度,user units
  339. virtual int GetActualVel(double& dActualVel) = 0;
  340. //获取实时实际加速度,user units
  341. virtual int GetActualAcc(double& dActualAcc) = 0;
  342. //获取实时位置误差,user units
  343. virtual int GetPosError(double& dPosError) = 0;
  344. //获取实时实际力矩(电流),user units
  345. virtual int GetActualTorque(double& dActualTorque) = 0;
  346. //! 切换到单轴运动模式
  347. virtual bool CrdMotion2PTPMotion(bool bCrd2Single)=0;
  348. //对于错误码返回值的解释
  349. virtual std::string ErrCodeTransfer(int nRtn){return "";};
  350. // protected:
  351. //! 单位转换,用户单位(um)转换成轴单位(pulse),(无偏置适用速度相关转换)
  352. virtual long User2Driver(double um,bool bWithHomeOffset = 0)=0;
  353. //! 单位转换,轴单位(pulse)转换成用户单位(um),(无偏置适用速度相关转换)
  354. virtual double Driver2User(double driverPulse,bool bWithHomeOffset = 0) = 0;
  355. //获取对应品牌的轴Index(不同品牌的逻辑不同,与m_stData中存储的轴Index不同)
  356. virtual int GetAxisIndex() const= 0;
  357. protected:
  358. //!当前不同回零方式
  359. //!IO回零
  360. virtual int IO2HomeMethod() = 0;
  361. //!Home捕获回零
  362. virtual int Home2HomeMethod() = 0;
  363. //!Index捕获回零
  364. virtual int Index2HomeMethod() = 0;
  365. //!直接回零,绝对值编码器
  366. virtual int Direct2HomeMethod() = 0;
  367. //!负向 + INDEX捕获回零
  368. virtual int NegIndex2HomeMethod() = 0;
  369. //!正向 + INDEX捕获回零
  370. virtual int PosIndex2HomeMethod() = 0;
  371. //!判断Home开关是否正被触发
  372. virtual bool CheckHomeSensor() = 0;
  373. protected:
  374. //轴类型:伺服,力,步进
  375. AxisType m_nAxisType;
  376. //定义的轴状态
  377. AxisIOStatus m_stIOStatus;
  378. AxisHomeStatus m_stHomeStatus;
  379. AxisStatus m_stAxisStatus;
  380. MotionStatus m_stMotionStatus;
  381. //当前轴的状态
  382. //需要为指针形式
  383. AxisData* m_stData;
  384. };
  385. #endif // JAXIS_H