JAxis.h 17 KB

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