From ec5f857abbba7f55cccfd3eba65790f1e5884dca Mon Sep 17 00:00:00 2001 From: "zhengxuan.zhang" Date: Thu, 13 Oct 2022 18:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0JOG=E8=BF=90=E5=8A=A8=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HSI_HexagonMI_EF3/HSI_Motion.cpp | 208 +++++++++++++++++++++++-------- HSI_HexagonMI_EF3/HSI_Motion.h | 32 +++-- HSI_HexagonMI_EF3/version.h | 4 +- 3 files changed, 185 insertions(+), 59 deletions(-) diff --git a/HSI_HexagonMI_EF3/HSI_Motion.cpp b/HSI_HexagonMI_EF3/HSI_Motion.cpp index 5597a95..ad53140 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.cpp +++ b/HSI_HexagonMI_EF3/HSI_Motion.cpp @@ -439,6 +439,17 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly) m_bACSConnected = true; g_pLogger->SendAndFlushWithTime( L"[ACS Motion] Communication with the controller established success\n"); + + //获取ACS 控制器版本号 + char Firmware[256]; + int Received; + if(!acsc_GetFirmwareVersion(handleACS,Firmware,255,&Received,nullptr)) + { + g_pLogger->SendAndFlushWithTime(L"[ACS Motion] GET ACS Controller Version failed\n"); + } + + g_pLogger->SendAndFlushWithTime(L"[ACS Motion] ACS Controller Version: %s \n",Firmware); + } else { @@ -768,7 +779,12 @@ HSI_STATUS HSI_Motion::GetFirmwareVersion(byte* version) return HSI_STATUS_NORMAL; } -//================================回家======================================= +//=========================================================================== +/** + * \brief 回家 + * \param bHomed + * \return + */ HSI_STATUS HSI_Motion::HomeMachineOld(bool bHomed) { auto rStatus = HSI_STATUS_NORMAL; @@ -1451,11 +1467,11 @@ HSI_STATUS HSI_Motion::ZeroPos(bool bZeroPos) //=========================================================================== /** * \brief JOG模式 - * \param AxisTypes - * \param Speed + * \param AxisTypes 单轴 + * \param Speed 速度,Speed > 0 正移动 * \return */ -HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed) +HSI_STATUS HSI_Motion::JogOld(UINT AxisTypes, double Speed) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) @@ -1743,6 +1759,62 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed) return rStatus; } +HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed) +{ + auto rStatus = HSI_STATUS_NORMAL; + if (g_pHSI_Motion) + { + if (m_DeviceType != 3) + { + m_Thread_StateJOGStop = HSI_THREAD_RUNNING; + SetEvent(m_hTriggerEventJOGStop); + } + + bool bJOGDir = Speed > 0 ? true : false; //运动方向 + byte AxisNumber = static_cast(AxisConvertIndex(AxisTypes)); + jogAxisNum = AxisNumber; + jogDirFlag = bJOGDir; + m_Thread_State = HSI_THREAD_PAUSED; + if (CurrentHomeMachineState == E_EF3_HOME_FINISHED) + { + //软限位 + + } + else + { + //无效软限位 + } + if (m_Home_Machine_Axis[AxisNumber] == 0) + { + return rStatus; + } + + + //设置 JOG运动参数 加减速 JOG_SPEED_ACC_DEC + + // 是否启用急停 + //if ((StartSpeed < 250) && (DriveSpeed < 6)) + //{ + // m_IsUseJerk = 1; + //} + //else + //{ + // m_IsUseJerk = 0; + //} + + //开始JOG运动 + int acsDirection = bJOGDir ? ACSC_POSITIVE_DIRECTION : ACSC_NEGATIVE_DIRECTION; + if (!acsc_Jog(handleACS, 0, AxisTypes, acsDirection, nullptr)) + { + g_pLogger->SendAndFlushWithTime(L"[Jog] [%d] 轴 [%s] 方向移动失败",AxisTypes,bJOGDir?"正":"负"); + } + + jogMoving = true; + g_pLogger->SendAndFlushWithTime(L"[Jog] Out,bJOGDir = %d\n", bJOGDir); + } + return rStatus; +} + //JOG模式 //=========================================================================== HSI_STATUS HSI_Motion::JoyStick(UINT AxisTypes, long Speed) @@ -2039,6 +2111,10 @@ HSI_STATUS HSI_Motion::JoyStick(UINT AxisTypes, long Speed) } //=========================================================================== +/** + * \brief + * \return + */ HSI_STATUS HSI_Motion::StopJog() { WaitForSingleObject(g_Lock_JogAndTrigger, INFINITE); @@ -2085,6 +2161,52 @@ HSI_STATUS HSI_Motion::StopJog() return rStatus; } +HSI_STATUS HSI_Motion::StopJogOld() +{ + WaitForSingleObject(g_Lock_JogAndTrigger, INFINITE); + auto rStatus = HSI_STATUS_NORMAL; + if (g_pHSI_Motion) + { + g_pLogger->SendAndFlushWithTime(L"[StopJog] In\n"); + t_end = GetTickCount(); + g_pLogger->SendAndFlushWithTime(L"[StopJog] t_start = %d, t_end = %d\n", t_start, t_end); + jogMoving = false; + if (t_end - t_start < 100) + { + DWORD t_use = 100 - (t_end - t_start); + g_pLogger->SendAndFlushWithTime(L"[StopJog] PushButtonTime = %d\n", t_use); + Sleep(t_use); + } + unsigned char m_SendJogData[64] = { 0 }; + if (m_IsUseJerk == 0) + { + m_SendJogData[0] = CT_MOTOR; + m_SendJogData[1] = CT_STOP; + m_SendJogData[2] = AXIS_XYZU; + m_StopJogMode[1] == 0 ? m_SendJogData[3] = 0X4A : m_SendJogData[3] = 0X49; + m_StopJogMode[2] == 0 ? m_SendJogData[3] = 0X4A : m_SendJogData[3] = 0X49; + m_StopJogMode[3] == 0 ? m_SendJogData[3] = 0X4A : m_SendJogData[3] = 0X49; + m_StopJogMode[4] == 0 ? m_SendJogData[3] = 0X4A : m_SendJogData[3] = 0X49; + m_WriteByte = Send_Command(0, (const char*)m_SendJogData, m_SendDataLength); + } + else + { + m_SendJogData[0] = CT_MOTOR; + m_SendJogData[1] = CT_STOP; + m_SendJogData[2] = AXIS_XYZU; + m_StopJogMode[1] == 0 ? m_SendJogData[3] = 0X4A : m_SendJogData[3] = 0X49; + m_StopJogMode[2] == 0 ? m_SendJogData[3] = 0X4A : m_SendJogData[3] = 0X49; + m_StopJogMode[3] == 0 ? m_SendJogData[3] = 0X4A : m_SendJogData[3] = 0X49; + m_StopJogMode[4] == 0 ? m_SendJogData[3] = 0X4A : m_SendJogData[3] = 0X49; + m_WriteByte = Send_Command(0, (const char*)m_SendJogData, m_SendDataLength); + } + m_Thread_StateJOGStop = HSI_THREAD_PAUSED; + g_pLogger->SendAndFlushWithTime(L"[StopJog] Out\n"); + ReleaseMutex(g_Lock_JogAndTrigger); + } + return rStatus; +} + //=========================================================================== HSI_STATUS HSI_Motion::StopJogEx(UINT AxisTypes) { @@ -2232,7 +2354,7 @@ HSI_STATUS HSI_Motion::GetPositionEncPrfMulti(UINT AxisTypes, double* EncPos, do * \param PositionX * \param PositionY * \param PositionZ - * \param Time + * \param Time 耗时 * \return */ HSI_STATUS HSI_Motion::GetPositionXyzOld(UINT AxisTypes, double& PositionX, double& PositionY, double& PositionZ, @@ -2312,71 +2434,56 @@ HSI_STATUS HSI_Motion::GetPositionXyz(UINT AxisTypes, double& PositionX, double& double& Time) { auto rStatus = HSI_STATUS_NORMAL; + //UNREFERENCED_PARAMETER(AxisTypes)的意思就是告诉编译器, + // AxisTypes参数我使用过了,别报警告了,仅此而已。 UNREFERENCED_PARAMETER(AxisTypes); //读取3个轴的位置 CString tempStr; + bool bGetPosition = true; + if (g_pHSI_Motion) { - if (m_SO7_Serial.m_RecvData[0] == 2) + if (!acsc_GetFPosition(handleACS, ACSC_AXIS_0, &PositionX, nullptr)) + { + g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] get PositionX failed\n"); + bGetPosition = false; + return HSI_ACS_ERROR; + } + if (!acsc_GetFPosition(handleACS, ACSC_AXIS_1, &PositionY, nullptr)) + { + g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] get PositionY failed\n"); + bGetPosition = false; + return HSI_ACS_ERROR; + } + if (!acsc_GetFPosition(handleACS, ACSC_AXIS_2, &PositionZ, nullptr)) + { + g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] get PositionZ failed\n"); + bGetPosition = false; + return HSI_ACS_ERROR; + } + + if (bGetPosition) //读取成功 { - if (m_DeviceType != 1) - { - if (m_IsHavePattern & 0x01) - PositionX = (m_SO7_Serial.m_RecvData[1] << 24 | m_SO7_Serial.m_RecvData[2] << 16 | m_SO7_Serial. - m_RecvData[3] << 8 | m_SO7_Serial.m_RecvData[4]) * m_Resolution[1]; - else - PositionX = (m_SO7_Serial.m_RecvData[17] << 24 | m_SO7_Serial.m_RecvData[18] << 16 | m_SO7_Serial. - m_RecvData[19] << 8 | m_SO7_Serial.m_RecvData[20]) * m_Resolution[1]; - if (m_IsHavePattern & 0x02) - PositionY = (m_SO7_Serial.m_RecvData[5] << 24 | m_SO7_Serial.m_RecvData[6] << 16 | m_SO7_Serial. - m_RecvData[7] << 8 | m_SO7_Serial.m_RecvData[8]) * m_Resolution[2]; - else - PositionY = (m_SO7_Serial.m_RecvData[21] << 24 | m_SO7_Serial.m_RecvData[22] << 16 | m_SO7_Serial. - m_RecvData[23] << 8 | m_SO7_Serial.m_RecvData[24]) * m_Resolution[2]; - if (m_IsHavePattern & 0x04) - PositionZ = (m_SO7_Serial.m_RecvData[9] << 24 | m_SO7_Serial.m_RecvData[10] << 16 | m_SO7_Serial. - m_RecvData[11] << 8 | m_SO7_Serial.m_RecvData[12]) * m_Resolution[3]; - else - PositionZ = (m_SO7_Serial.m_RecvData[25] << 24 | m_SO7_Serial.m_RecvData[26] << 16 | m_SO7_Serial. - m_RecvData[27] << 8 | m_SO7_Serial.m_RecvData[28]) * m_Resolution[3]; - if (m_IsHavePattern & 0x08) - m_PosForAllAxis[4] = (m_SO7_Serial.m_RecvData[13] << 24 | m_SO7_Serial.m_RecvData[14] << 16 | - m_SO7_Serial.m_RecvData[15] << 8 | m_SO7_Serial.m_RecvData[16]) * m_Resolution[4]; - else - m_PosForAllAxis[4] = (m_SO7_Serial.m_RecvData[29] << 24 | m_SO7_Serial.m_RecvData[30] << 16 | - m_SO7_Serial.m_RecvData[31] << 8 | m_SO7_Serial.m_RecvData[32]) * m_Resolution[4]; - } - else - { - PositionX = (m_SO7_Serial.m_RecvData[1] << 24 | m_SO7_Serial.m_RecvData[2] << 16 | m_SO7_Serial. - m_RecvData[3] << 8 | m_SO7_Serial.m_RecvData[4]) * m_Resolution[1]; - PositionY = (m_SO7_Serial.m_RecvData[21] << 24 | m_SO7_Serial.m_RecvData[22] << 16 | m_SO7_Serial. - m_RecvData[23] << 8 | m_SO7_Serial.m_RecvData[24]) * m_Resolution[2]; - PositionZ = (m_SO7_Serial.m_RecvData[25] << 24 | m_SO7_Serial.m_RecvData[26] << 16 | m_SO7_Serial. - m_RecvData[27] << 8 | m_SO7_Serial.m_RecvData[28]) * m_Resolution[3]; - } m_EncPos[1] = PositionX; m_EncPos[2] = PositionY; m_EncPos[3] = PositionZ; - m_EncPos[4] = m_PosForAllAxis[4]; + m_EncPos[4] = m_PosForAllAxis[4];// m_PosForAllAxis 记录4轴位置 m_PosForAllAxis[1] = PositionX; m_PosForAllAxis[2] = PositionY; m_PosForAllAxis[3] = PositionZ; } - else + else //读取将之前的值进行返回 { PositionX = m_EncPos[1]; PositionY = m_EncPos[2]; PositionZ = m_EncPos[3]; - m_PosForAllAxis[1] = m_EncPos[1]; + m_PosForAllAxis[1] = m_EncPos[1]; // m_PosForAllAxis 记录4轴位置 m_PosForAllAxis[2] = m_EncPos[2]; m_PosForAllAxis[3] = m_EncPos[3]; m_PosForAllAxis[4] = m_EncPos[4]; g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] failed\n"); } - //LARGE_INTEGER tima; - //QueryPerformanceCounter(&tima); - //Time = static_cast(tima.QuadPart); + Time = set_end - set_start; } return rStatus; @@ -6995,10 +7102,11 @@ unsigned __stdcall HSI_Motion::m_ThreadData(LPVOID pThis) } } -//=========================================================================== -//JOG运行到软限位的运动调节 //=========================================================================== +/** + * \brief JOG运行到软限位的运动调节 + */ void HSI_Motion::UpdateMotionStateJOGStop() { unsigned char send_JogLimt_data[64] = {0}; diff --git a/HSI_HexagonMI_EF3/HSI_Motion.h b/HSI_HexagonMI_EF3/HSI_Motion.h index 8ebfb64..921c7fd 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.h +++ b/HSI_HexagonMI_EF3/HSI_Motion.h @@ -164,8 +164,8 @@ public: * \param bHomed * \return */ - HSI_STATUS HomeMachineOld(bool bHomed); HSI_STATUS HomeMachine(bool bHomed); + HSI_STATUS HomeMachineOld(bool bHomed); HSI_STATUS HomeJog(short AxisNumber, short Dir, bool Wait = false); HSI_STATUS HomeFindIndex(); @@ -176,8 +176,8 @@ public: * \param bHomed 是否回家标志位 * \return */ - HSI_STATUS IsHomedOld(bool& bHomed); HSI_STATUS IsHomed(bool& bHomed); + HSI_STATUS IsHomedOld(bool& bHomed); HSI_STATUS GetSpeedXyz(int AxisNum, double& Speed); HSI_STATUS SetSpeedXyz(double Speed); @@ -193,10 +193,22 @@ public: HSI_STATUS GetDeadBand(double& DeadbandX, double& DeadbandY, double& DeadbandZ, double& DeadbandR); HSI_STATUS GetRefreshDeadBand(double& Deadband); - + /** + * \brief + * \param AxisTypes + * \param Speed + * \return + */ HSI_STATUS Jog(UINT AxisTypes, double Speed); + HSI_STATUS JogOld(UINT AxisTypes, double Speed); + HSI_STATUS JoyStick(UINT AxisTypes, long Speed); + /** + * \brief + * \return + */ HSI_STATUS StopJog(); + HSI_STATUS StopJogOld(); HSI_STATUS StopJogEx(UINT AxisTypes); HSI_STATUS GetPositionEncPrfMulti(UINT AxisTypes, double* EncPos, double* PrfPos, int Count); @@ -209,8 +221,9 @@ public: * \param Time * \return */ - HSI_STATUS GetPositionXyzOld(UINT AxisTypes, double& PositionX, double& PositionY, double& PositionZ, double& Time); HSI_STATUS GetPositionXyz(UINT AxisTypes, double& PositionX, double& PositionY, double& PositionZ, double& Time); + HSI_STATUS GetPositionXyzOld(UINT AxisTypes, double& PositionX, double& PositionY, double& PositionZ, double& Time); + HSI_STATUS GetPositionXyzaProbe(UINT AxisTypes, double& PositionX, double& PositionY, double& PositionZ, double& PositionA); HSI_STATUS GetEncoderXyz(long* lEncoderVal); @@ -235,10 +248,10 @@ public: * \param dFlyRadius * \return */ - HSI_STATUS SetPositionXyzOld(UINT AxisTypes, double PositionX, double PositionY, double PositionZ, - HSI_MOTION_MOVE_TYPE eType, double dFlyRadius); HSI_STATUS SetPositionXyz(UINT AxisTypes, double PositionX, double PositionY, double PositionZ, HSI_MOTION_MOVE_TYPE eType, double dFlyRadius); + HSI_STATUS SetPositionXyzOld(UINT AxisTypes, double PositionX, double PositionY, double PositionZ, + HSI_MOTION_MOVE_TYPE eType, double dFlyRadius); HSI_STATUS SetPositionXyza(UINT AxisTypes, double PositionX, double PositionY, double PositionZ, double PositionA, HSI_MOTION_MOVE_TYPE eType, double dFlyRadius); @@ -254,7 +267,12 @@ public: HSI_STATUS SetDIO(UINT IOChannel, UINT _Status); HSI_STATUS GetAxisStatus(int* _Status); HSI_STATUS GetAppPath(CString& Path); + /** + * \brief + * \return + */ HSI_STATUS Shutdown() override; + HSI_STATUS ShutdownOld() override; HSI_STATUS IsSupportedEx(UINT AxisTypes, UINT& Types); HSI_STATUS StartupEx(UINT AxisTypes, bool bHome); @@ -453,7 +471,7 @@ public: bool bCircleRun; //圆弧插补 int iCircleRunPnt[5]; //圆弧插补时的圆心位置 int jogAxisNum; //jog运动的轴号 - int jogspeed; + int jogspeed;//jog 运动的速度 bool jogMoving; bool jogDirFlag; bool m_bEmergencyState; diff --git a/HSI_HexagonMI_EF3/version.h b/HSI_HexagonMI_EF3/version.h index 34ff873..bac2876 100644 --- a/HSI_HexagonMI_EF3/version.h +++ b/HSI_HexagonMI_EF3/version.h @@ -12,5 +12,5 @@ #define HSI_VERSION_REVNUM #define HSI_VERSION_BUILD_DATE _T(__DATE__ ) #define HSI_VERSION_BUILD_TIME _T(__TIME__ ) -#define HSI_FILE_DESCRIPTION "2022.10.13 / 15:29 " -#define HSI_FILE_CSDESCRIPTION _T("2022.10.13 / 15:29 ") +#define HSI_FILE_DESCRIPTION "2022.10.13 / 17:21 " +#define HSI_FILE_CSDESCRIPTION _T("2022.10.13 / 17:21 ")