From b7fef58da8633681822f5ec9fb7564dbf1d83353 Mon Sep 17 00:00:00 2001 From: "zhengxuan.zhang" Date: Tue, 1 Nov 2022 20:20:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=BF=90=E5=8A=A8=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=92=8C=E9=85=8D=E7=BD=AE=E8=BF=90=E5=8A=A8=EF=BC=8C?= =?UTF-8?q?=E6=A1=A3=E4=BD=8D=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HSI_HexagonMI_EF3/HSI_Motion.cpp | 315 +++++++++++++++--- HSI_HexagonMI_EF3/HSI_Motion.h | 11 +- HSI_HexagonMI_EF3/logger.cpp | 1 + HSI_HexagonMI_EF3/logger.h | 4 + HSI_HexagonMI_EF3/version.h | 4 +- HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs | 12 +- .../bin/Debug/Config/EF1_Motion.ini | 88 ++--- .../bin/Debug/Config/EF3_Config.ini | Bin 7670 -> 7670 bytes 8 files changed, 335 insertions(+), 100 deletions(-) diff --git a/HSI_HexagonMI_EF3/HSI_Motion.cpp b/HSI_HexagonMI_EF3/HSI_Motion.cpp index 5342081..d60d5b8 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.cpp +++ b/HSI_HexagonMI_EF3/HSI_Motion.cpp @@ -92,7 +92,7 @@ void ErrorsHandler() { ErrorStr[Received] = '\0'; printf("Motion Error: %d [%s]\n", ErrorCode, ErrorStr); - g_pLogger->SendAndFlushWithTime(L"[ACS Motion] Motion Error %s\n",ErrorStr); + g_pLogger->SendAndFlushWithTime(L"[ACS Motion] Motion Error %d%S\n", ErrorCode,ErrorStr); } } else @@ -460,8 +460,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly) { //尝试打开ACS控制器 g_pLogger->SendAndFlushWithTime(L"[ACS Motion] In\n"); - g_pLogger->SendAndFlushWithTime( - L"[ACS Motion] Wait for opening of communication with the controller... \n"); + g_pLogger->SendAndFlushWithTime(L"[ACS Motion] Wait for opening of communication with the controller... \n"); #ifdef OFFLINE //如果定义离线模式 handleACS = acsc_OpenCommSimulator(); @@ -501,7 +500,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly) //获取ACS 控制器版本号, 待测试,2.70 - /*char Firmware[256]; + char Firmware[256]; int Received; if (!acsc_GetFirmwareVersion(handleACS, Firmware, 255, &Received, nullptr)) { @@ -509,13 +508,17 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly) ErrorsHandler(); } Firmware[Received-1] = '\0'; - g_pLogger->SendAndFlushWithTime(L"[ACS Motion] ACS Controller Version: %s\n", Firmware);*/ + //printf("%s", Firmware); + + //https://www.cnblogs.com/MichaelOwen/articles/2128771.html + //g_pLogger->SendAndFlushWithTime(L"%s%s\n", _T("[ACS Motion] ACS Controller Version: "), L"你好"); + g_pLogger->SendAndFlushWithTime(L"[ACS Motion] ACS Controller Version: %S\n", Firmware); //获取SPiiPlus C Library version unsigned int Ver = acsc_GetLibraryVersion(); - printf("SPiiPlus C Library version is %d.%d.%d.%d\n", HIBYTE(HIWORD(Ver)), LOBYTE(HIWORD(Ver)), + /* printf("SPiiPlus C Library version is %d.%d.%d.%d\n", HIBYTE(HIWORD(Ver)), LOBYTE(HIWORD(Ver)), HIBYTE(LOWORD(Ver)), - LOBYTE(LOWORD(Ver))); + LOBYTE(LOWORD(Ver)));*/ g_pLogger->SendAndFlushWithTime(L"[ACS Motion] SPiiPlus C Library version is %d.%d.%d.%d\n", HIBYTE(HIWORD(Ver)), LOBYTE(HIWORD(Ver)), HIBYTE(LOWORD(Ver)), LOBYTE(LOWORD(Ver))); @@ -1843,7 +1846,7 @@ HSI_STATUS HSI_Motion::JogOld(UINT AxisTypes, double Speed) HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed) { auto rStatus = HSI_STATUS_NORMAL; - g_pLogger->SendAndFlushWithTime(L"[Jog] aixs: [%d] speed:[%lf]\n", AxisTypes, Speed); + g_pLogger->SendAndFlushWithTime(L"[Jog] aixs: [%d] SpeedGear: [%lf]\n", AxisTypes, Speed); if (g_pHSI_Motion) { if (m_DeviceType != 3) //非转盘设备 @@ -1851,7 +1854,13 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed) m_Thread_StateJOGStop = HSI_THREAD_RUNNING; SetEvent(m_hTriggerEventJOGStop); } - + int DriveSpeed(1); + int StartSpeed(1); + int AccLine(1); + int DecLine(1); + int AccCurve(1); + int DecCurve(1); + int JogSpeed(1); bool bJOGDir = Speed > 0 ? true : false; //运动方向 byte AxisNumber = static_cast(AxisConvertIndex(AxisTypes));//Jog jogAxisNum = AxisNumber; @@ -1861,42 +1870,176 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed) if (CurrentHomeMachineState == E_EF3_HOME_FINISHED) { //软限位 + g_pLogger->SendAndFlushWithTime( + L"[Jog] Limit Enable, m_P_Work_Limit[AxisNumber] = %f,m_N_Work_Limit[AxisNumber] = %f\n", + m_P_Work_Limit[AxisNumber], m_N_Work_Limit[AxisNumber]); } else { //无效软限位 + g_pLogger->SendAndFlushWithTime(L"[Jog] Limit No Enable\n"); } - //是否回过家 - //if (m_Home_Machine_Axis[AxisNumber] == 0) - //{ - // return rStatus; - //} - - // 是否启用急停 - //if ((StartSpeed < 250) && (DriveSpeed < 6)) - //{ - // m_IsUseJerk = 1; - //} - //else - //{ - // m_IsUseJerk = 0; - //} + //是否回过家判断 + if (m_Home_Machine_Axis[AxisNumber] == 0) + { + return rStatus; + } //设置 JOG运动参数 加减速 JOG_SPEED_ACC_DEC + double now_pos[5] = { 0 }; + double Prf_pos[5] = { 0 }; + double limitpos[4] = { 0 }; + int RemainPul = 0; + int limitSDPul = 0; + double time; + /*GetPositionXyz(1, now_pos[0], now_pos[1], now_pos[2], time);*/ + GetPositionEncPrfMulti(1, now_pos, Prf_pos, 1); + + JogSpeed = abs(SpeedPercent(AxisNumber, Speed, DriveSpeed, StartSpeed, AccLine, DecLine, AccCurve, DecCurve)); + + g_pLogger->SendAndFlushWithTime(L"[Jog] StartSpeed: [%d], DriveSpeed: [%d], AccCurve: [%d], AccLine: [%d], DecCurve: [%d], DecLine: [%d]\n", StartSpeed, DriveSpeed, AccCurve, AccLine, DecCurve, DecLine); + + if (m_DeviceType != 3) + { + if (AxisTypes == AXIS_X /*&& m_motorType & 0x01*/) + { + if (!bJOGDir) //负方向 + { + RemainPul = static_cast(now_pos[1] / m_Resolution[1]) - static_cast(m_N_Work_Limit[1] / + m_Resolution[1]); + limitSDPul = (DriveSpeed - StartSpeed) * 13; + if ((RemainPul < limitSDPul * 2) && (RemainPul > 0)) + { + float SpeedRatio = limitSDPul * 2 / RemainPul; + DriveSpeed = DriveSpeed / SpeedRatio; + if (DriveSpeed < StartSpeed) + { + DriveSpeed = StartSpeed; + } + } + } + else + { + RemainPul = static_cast(m_P_Work_Limit[1] / m_Resolution[1]) - static_cast(now_pos[1] / + m_Resolution[1]); + limitSDPul = (DriveSpeed - StartSpeed) * 13; + if ((RemainPul < limitSDPul * 2) && (RemainPul > 0)) + { + float SpeedRatio = limitSDPul * 2 / RemainPul; + DriveSpeed = DriveSpeed / SpeedRatio; + if (DriveSpeed < StartSpeed) + { + DriveSpeed = StartSpeed; + } + } + } + } + else if (AxisTypes == AXIS_Y /*&& m_motorType & 0x02*/) + { + if (!bJOGDir) //负方向 + { + RemainPul = static_cast(now_pos[2] / m_Resolution[2]) - static_cast(m_N_Work_Limit[2] / + m_Resolution[2]); + limitSDPul = (DriveSpeed - StartSpeed) * 13; + if ((RemainPul < limitSDPul * 2) && (RemainPul > 0)) + { + float SpeedRatio = 1 + limitSDPul * 2 / RemainPul; + DriveSpeed = DriveSpeed / SpeedRatio; + if (DriveSpeed < StartSpeed) + { + DriveSpeed = StartSpeed; + } + } + } + else + { + RemainPul = static_cast(m_P_Work_Limit[2] / m_Resolution[2]) - static_cast(now_pos[2] / + m_Resolution[2]); + limitSDPul = (DriveSpeed - StartSpeed) * 13; + if ((RemainPul < limitSDPul * 2) && (RemainPul > 0)) + { + float SpeedRatio = limitSDPul * 2 / RemainPul; + DriveSpeed = DriveSpeed / SpeedRatio; + if (DriveSpeed < StartSpeed) + { + DriveSpeed = StartSpeed; + } + } + } + } + if (AxisTypes == AXIS_Z /*&& m_motorType & 0x04*/) + { + if (!bJOGDir) //负方向 + { + RemainPul = static_cast(now_pos[3] / m_Resolution[3]) - static_cast(m_N_Work_Limit[3] / + m_Resolution[3]); + limitSDPul = (DriveSpeed - StartSpeed) * 13; + if ((RemainPul < limitSDPul * 2) && (RemainPul > 0)) + { + float SpeedRatio = limitSDPul * 2 / RemainPul; + DriveSpeed = DriveSpeed / SpeedRatio; + if (DriveSpeed < StartSpeed) + { + DriveSpeed = StartSpeed; + } + } + } + else + { + RemainPul = static_cast(m_P_Work_Limit[3] / m_Resolution[3]) - static_cast(now_pos[3] / + m_Resolution[3]); + limitSDPul = (DriveSpeed - StartSpeed) * 13; + if ((RemainPul < limitSDPul * 2) && (RemainPul > 0)) + { + float SpeedRatio = limitSDPul * 2 / RemainPul; + DriveSpeed = DriveSpeed / SpeedRatio; + if (DriveSpeed < StartSpeed) + { + DriveSpeed = StartSpeed; + } + } + } + } + } + + //速度限制 + g_pLogger->SendAndFlushWithTime(L"[Jog] StartSpeed: [%d], DriveSpeed: [%d], AccCurve: [%d], AccLine: [%d], DecCurve: [%d], DecLine: [%d]\n", StartSpeed, DriveSpeed, AccCurve, AccLine, DecCurve, DecLine); + + // 急停判断 + if ((StartSpeed < 250) && (DriveSpeed < 6)) + { + m_IsUseJerk = 1; + } + else + { + m_IsUseJerk = 0; + } + + //打印当前轴的速度 + double motionParam[5] = { 0 }; + GetMotorParam(jogAxisNum, motionParam); + g_pLogger->SendAndFlushWithTime( + L"[Jog] Axis= %d, Velocity = %.2f, Acceleration= %.2f, Deceleration= %.2f, KillDeceleration= %.2f, Jerk= %.2f\n", + jogAxisNum, motionParam[0], motionParam[1], motionParam[2], motionParam[3], motionParam[4]); //开始JOG运动 - int acsDirection = bJOGDir ? ACSC_POSITIVE_DIRECTION : ACSC_NEGATIVE_DIRECTION; //正方向,或 负方向 - if (!acsc_Jog(handleACS, 0, jogAxisNum, acsDirection, nullptr)) + if (!bJOGDir) + { + StartSpeed = StartSpeed * (-1); // Negative direction : Using - (minus) velocity + } + //int acsDirection = bJOGDir ? ACSC_POSITIVE_DIRECTION : ACSC_NEGATIVE_DIRECTION; //正方向,或 负方向 + if (!acsc_Jog(handleACS, 0, jogAxisNum, StartSpeed, nullptr)) { printf("[Jog] 轴[%d] [%s] 方向移动失败", AxisTypes, bJOGDir? "正" : "负"); - g_pLogger->SendAndFlushWithTime(L"[Jog] aixs:[%d] JOGDir:[%s] Jog move failed\n", AxisTypes, bJOGDir ? "P" : "N"); + g_pLogger->SendAndFlushWithTime(L"[Jog] failed, Aixs:[%d] JOGDir:[%S]\n", AxisTypes, bJOGDir ? "Positive" : "Negative"); ErrorsHandler(); } + jogMoving = true; - g_pLogger->SendAndFlushWithTime(L"[Jog] Out, bJOGDir = %s\n", bJOGDir? "positive":"negative"); + g_pLogger->SendAndFlushWithTime(L"[Jog] Out, StartSpeed = %d\n", StartSpeed); } return rStatus; } @@ -2375,14 +2518,14 @@ int HSI_Motion::P2P(short AxisNumber, long Pos, double Speed, double Acc) //=========================================================================== //运动控制部分 //=========================================================================== -HSI_STATUS HSI_Motion::GetPositionEncPrfMulti(UINT AxisTypes, double* EncPos, double* PrfPos, int Count) +HSI_STATUS HSI_Motion::GetPositionEncPrfMultiOld(UINT AxisTypes, double* EncPos, double* PrfPos, int Count) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(AxisTypes); CString tempStr; if (g_pHSI_Motion) { - //g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] In\n"); + g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] In\n"); if (m_SO7_Serial.m_RecvData[0] == 2) { EncPos[1] = (m_SO7_Serial.m_RecvData[1] << 24 | m_SO7_Serial.m_RecvData[2] << 16 | m_SO7_Serial.m_RecvData[ @@ -2442,11 +2585,81 @@ HSI_STATUS HSI_Motion::GetPositionEncPrfMulti(UINT AxisTypes, double* EncPos, do PrfPos[4] = m_PrfPos[4]; g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] failed\n"); } - //g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] Out\n"); + g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] Out\n"); } return rStatus; } +HSI_STATUS HSI_Motion::GetPositionEncPrfMulti(UINT AxisTypes, double* EncPos, double* PrfPos, int Count) +{ + auto rStatus = HSI_STATUS_NORMAL; + UNREFERENCED_PARAMETER(AxisTypes); + CString tempStr; + if (g_pHSI_Motion) + { + g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] In\n"); + if (m_SO7_Serial.m_RecvData[0] == 2) + { + EncPos[1] = (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]; + EncPos[2] = (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]; + EncPos[3] = (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]; + EncPos[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]; + PrfPos[1] = (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]; + PrfPos[2] = (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]; + PrfPos[3] = (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]; + PrfPos[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]; + + if (m_IsHavePattern & 0x01) + m_EncPos[1] = EncPos[1]; + else + m_EncPos[1] = PrfPos[1]; + if (m_IsHavePattern & 0x02) + m_EncPos[2] = EncPos[2]; + else + m_EncPos[2] = PrfPos[2]; + if (m_IsHavePattern & 0x04) + m_EncPos[3] = EncPos[3]; + else + m_EncPos[3] = PrfPos[3]; + if (m_IsHavePattern & 0x08) + m_EncPos[4] = EncPos[4]; + else + m_EncPos[4] = PrfPos[4]; + + m_PrfPos[1] = PrfPos[1]; + m_PrfPos[2] = PrfPos[2]; + m_PrfPos[3] = PrfPos[3]; + m_PrfPos[4] = PrfPos[4]; + + //begin_position[1] = EncPos[1] / m_Resolution[1]; + //begin_position[2] = EncPos[2] / m_Resolution[1]; + //begin_position[3] = EncPos[3] / m_Resolution[1]; + //begin_position[4] = EncPos[4] / m_Resolution[1]; + } + else + { + EncPos[1] = m_EncPos[1]; + EncPos[2] = m_EncPos[2]; + EncPos[2] = m_EncPos[3]; + EncPos[4] = m_EncPos[4]; + PrfPos[1] = m_PrfPos[1]; + PrfPos[2] = m_PrfPos[2]; + PrfPos[2] = m_PrfPos[3]; + PrfPos[4] = m_PrfPos[4]; + g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] failed\n"); + } + g_pLogger->SendAndFlushWithTime(L"[GetPositionEncPrfMulti] Out\n"); + } + return rStatus; +} //=========================================================================== /** * \brief 获取轴当前运动位置 @@ -3283,11 +3496,12 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P PositionY, PositionZ);*/ //打印轴当前运动参数 - double* motionParam[5] = {0}; - GetMotorParam(ACSC_AXIS_0, motionParam); + byte AxisNumber = static_cast(AxisConvertIndex(AxisTypes));//轴号换算 + double motionParam[5] = {0}; + GetMotorParam(AxisNumber, motionParam); g_pLogger->SendAndFlushWithTime( - L"[SetPositionXyz] axis= %d, GetVelocity = %d,GetAcceleration= %d,GetDeceleration= %d, GetKillDeceleration= %d, GetJerk= %d\n", - AXIS_X, motionParam[0], motionParam[1], motionParam[2], motionParam[3], motionParam[4]); + L"[SetPositionXyz] Axis= %.2f, Velocity = %.2f, Acceleration= %.2f, Deceleration= %.2f, KillDeceleration= %.2f, Jerk= %.2f\n", + jogAxisNum, motionParam[0], motionParam[1], motionParam[2], motionParam[3], motionParam[4]); //设置轴运动速度,TO-DO @@ -3377,42 +3591,46 @@ int HSI_Motion::CaculateStepMotorACC(int pos, int maxacc, int minacc) //void func2(uchar* s); //利用指针返回数组 //uchar* func1(); //利用指针函数返回数组 //void func0(uchar*& r); //利用引用返回数组 -HSI_STATUS HSI_Motion::GetMotorParam(int AXIS, double* motionParam[5]) +HSI_STATUS HSI_Motion::GetMotorParam(int AXIS, double motionParam[5]) { auto rStatus = HSI_STATUS_NORMAL; if (handleACS != ACSC_INVALID) { + g_pLogger->SendAndFlushWithTime(L"[GetMotorParam] In\n"); + //依次是 速度、加速度、减速、杀死速度、抖动 - if (!acsc_GetVelocity(handleACS, AXIS, motionParam[0], nullptr)) + if (!acsc_GetVelocity(handleACS, AXIS, motionParam+0, nullptr)) { g_pLogger->SendAndFlushWithTime(L"[GetMotorParam] acsc_GetVelocity error\n"); rStatus = HSI_ACS_ERROR; ErrorsHandler(); } - if (!acsc_GetAcceleration(handleACS, AXIS, motionParam[1], nullptr)) + + if (!acsc_GetAcceleration(handleACS, AXIS, motionParam+1, nullptr)) { g_pLogger->SendAndFlushWithTime(L"[GetMotorParam] acsc_GetAcceleration error\n"); rStatus = HSI_ACS_ERROR; ErrorsHandler(); } - if (!acsc_GetDeceleration(handleACS, AXIS, motionParam[2], nullptr)) + if (!acsc_GetDeceleration(handleACS, AXIS, motionParam+2, nullptr)) { g_pLogger->SendAndFlushWithTime(L"[GetMotorParam] acsc_GetDeceleration error\n"); rStatus = HSI_ACS_ERROR; ErrorsHandler(); } - if (!acsc_GetKillDeceleration(handleACS, AXIS, motionParam[3], nullptr)) + if (!acsc_GetKillDeceleration(handleACS, AXIS, motionParam+3, nullptr)) { g_pLogger->SendAndFlushWithTime(L"[GetMotorParam] acsc_GetKillDeceleration error\n"); rStatus = HSI_ACS_ERROR; ErrorsHandler(); } - if (!acsc_GetJerk(handleACS, AXIS, motionParam[4], nullptr)) + if (!acsc_GetJerk(handleACS, AXIS, motionParam+4, nullptr)) { g_pLogger->SendAndFlushWithTime(L"[GetMotorParam] acsc_GetJerk error\n"); rStatus = HSI_ACS_ERROR; ErrorsHandler(); } + g_pLogger->SendAndFlushWithTime(L"[GetMotorParam] Out\n"); } return rStatus; @@ -6967,14 +7185,14 @@ short HSI_Motion::AxisConvertIndex(UINT AxisTypes) AxisNumber = 0x04; break; } - //case HSI_MOTION_AXIS_R: - // { - // AxisNumber = 0x04; - // break; - // } + case HSI_MOTION_AXIS_R: + { + AxisNumber = 0x04; + break; + } default: { - g_pLogger->SendAndFlushWithTime(L"AxisConvertIndex failed,AxisTypes = %d,AxisNumber = %d\n", AxisTypes, + g_pLogger->SendAndFlushWithTime(L"[AxisConvertIndex] failed, AxisTypes = %d,AxisNumber = %d\n", AxisTypes, AxisNumber); break; } @@ -7074,6 +7292,7 @@ HSI_STATUS HSI_Motion::GetPositionEx(UINT AxisTypes, double& Position, double& T double position[4] = {0.0}; short AxisNumber = AxisConvertIndex(AxisTypes); Position = m_PosForAllAxis[AxisNumber]; + g_pLogger->SendAndFlushWithTime(L"[GetPositionEx] Position: %d\n", Position); } return rStatus; } @@ -7329,6 +7548,7 @@ HSI_STATUS HSI_Motion::GetAccelerationEx(UINT AxisTypes, double& Accel) Accel = m_SetPotion_StartSpeed[AxisNumber] * (m_Resolution[AxisNumber] * 500); } } + g_pLogger->SendAndFlushWithTime(L"[GetAccelerationEx] Accel = %d\n", Accel); return rStatus; } @@ -7352,6 +7572,7 @@ HSI_STATUS HSI_Motion::SetAccelerationEx(UINT AxisTypes, double Accel) m_SetPotion_StartSpeed[AxisNumber] = static_cast(Accel / (m_Resolution[AxisNumber] * 500)); } } + g_pLogger->SendAndFlushWithTime(L"[SetAccelerationEx] Accel = %d\n", m_SetPotion_StartSpeed[AxisNumber]); return rStatus; } diff --git a/HSI_HexagonMI_EF3/HSI_Motion.h b/HSI_HexagonMI_EF3/HSI_Motion.h index ac0e555..5574e0d 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.h +++ b/HSI_HexagonMI_EF3/HSI_Motion.h @@ -205,7 +205,16 @@ public: HSI_STATUS StopJog(); HSI_STATUS StopJogOld(); HSI_STATUS StopJogEx(UINT AxisTypes); + /** + * \brief + * \param AxisTypes + * \param EncPos + * \param PrfPos + * \param Count + * \return + */ HSI_STATUS GetPositionEncPrfMulti(UINT AxisTypes, double* EncPos, double* PrfPos, int Count); + HSI_STATUS GetPositionEncPrfMultiOld(UINT AxisTypes, double* EncPos, double* PrfPos, int Count); /** * \brief 获取轴当前位置 * \param AxisTypes 轴号 @@ -229,7 +238,7 @@ public: * \param motionParam * \return */ - HSI_STATUS HSI_Motion::GetMotorParam(int AXIS, double* motionParam[5]); + HSI_STATUS HSI_Motion::GetMotorParam(int AXIS, double motionParam[5]); /** * \brief 运行到指定位置 diff --git a/HSI_HexagonMI_EF3/logger.cpp b/HSI_HexagonMI_EF3/logger.cpp index 8b9d971..33a994a 100644 --- a/HSI_HexagonMI_EF3/logger.cpp +++ b/HSI_HexagonMI_EF3/logger.cpp @@ -65,6 +65,7 @@ void CLogger::SendAndFlush(LPCTSTR format, ...) LeaveCriticalSection(&m_lockLogger); } +//https://www.educative.io/answers/what-is-vswprintfs-in-c void CLogger::SendAndFlushWithTime(LPCTSTR format, ...) { EnterCriticalSection(&m_lockLogger); diff --git a/HSI_HexagonMI_EF3/logger.h b/HSI_HexagonMI_EF3/logger.h index 2a3f801..a488c13 100644 --- a/HSI_HexagonMI_EF3/logger.h +++ b/HSI_HexagonMI_EF3/logger.h @@ -27,6 +27,10 @@ class CLogger public: CLogger(CString m_Name) { + //璁剧疆涓枃鐜 + //setlocale(LC_ALL, "Chinese-simplified"); + setlocale(LC_ALL, "en_US.UTF-8"); + IsEnabledLog = false; m_File = nullptr; CString Path = _T(""); // Speed optimization - noticed slow in GlowCode diff --git a/HSI_HexagonMI_EF3/version.h b/HSI_HexagonMI_EF3/version.h index a3dab91..a07bec4 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.11.01 / 12:05 " -#define HSI_FILE_CSDESCRIPTION _T("2022.11.01 / 12:05 ") +#define HSI_FILE_DESCRIPTION "2022.11.01 / 20:15 " +#define HSI_FILE_CSDESCRIPTION _T("2022.11.01 / 20:15 ") diff --git a/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs b/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs index e37e7b5..8106e27 100644 --- a/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs +++ b/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs @@ -430,12 +430,12 @@ namespace HSI_SEVENOCEAN_EF1_CsTest.HSI public enum HSI_MOTION_AXIS_TYPE { - //HSI_MOTION_AXIS_X = 0x0001, // This is the default "Sensor level" X Axis - use on single X axis machines - //HSI_MOTION_AXIS_Y = 0x0002, // This is the default "Sensor level" Y Axis - use on single Y axis machines - //HSI_MOTION_AXIS_Z = 0x0004, // This is the default "Sensor level" Z Axis - use on single Z axis machines - HSI_MOTION_AXIS_X = 0x0001, //对应ACS 0轴 X - HSI_MOTION_AXIS_Y = 0x0000, //对应ACS 1轴 Y - HSI_MOTION_AXIS_Z = 0x0004, //对应ACS 4轴 Z + //HSI_MOTION_AXIS_X = 0x0001, //对应ACS 0轴 X + //HSI_MOTION_AXIS_Y = 0x0000, //对应ACS 1轴 Y + //HSI_MOTION_AXIS_Z = 0x0004, //对应ACS 4轴 Z + HSI_MOTION_AXIS_X = 0x0001, // This is the default "Sensor level" X Axis - use on single X axis machines + HSI_MOTION_AXIS_Y = 0x0002, // This is the default "Sensor level" Y Axis - use on single Y axis machines + HSI_MOTION_AXIS_Z = 0x0004, // This is the default "Sensor level" Z Axis - use on single Z axis machines HSI_MOTION_AXIS_R = 0x0008, // This is the default "Sensor level" R Axis - use on single R axis machines HSI_MOTION_AXIS_X1 = 0x0010, // This is the 1st X Axis - use on multiple axis machines when specific axis needed HSI_MOTION_AXIS_Y1 = 0x0020, // This is the 1st Y Axis - use on multiple axis machines when specific axis needed diff --git a/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF1_Motion.ini b/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF1_Motion.ini index cab782f..cdbc655 100644 --- a/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF1_Motion.ini +++ b/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF1_Motion.ini @@ -1,26 +1,26 @@ [JOG_SPEED] -JOG速度(pulse/ms) +JOG閫熷害(pulse/ms) JOG_SPEED_0=200.0 JOG_SPEED_1=150.0 JOG_SPEED_2=50 JOG_SPEED_3=10 JOG_SPEED_4=1 -;JOG加速度(pulse/ms^2) +;JOG鍔犻熷害(pulse/ms^2) JOG_ACC_0=2.0 JOG_ACC_1=2.0 JOG_ACC_2=2.0 JOG_ACC_3=1.0 JOG_ACC_4=1.0 -;JOG减速度(pulse/ms^2) +;JOG鍑忛熷害(pulse/ms^2) JOG_DEC_0=2.0 JOG_DEC_1=2.0 JOG_DEC_2=2.0 JOG_DEC_3=1.0 JOG_DEC_4=1.0 -;JOG模式采用急停还是平滑停止,0是平滑停止1为急停,默认0 +;JOG妯″紡閲囩敤鎬ュ仠杩樻槸骞虫粦鍋滄,0鏄钩婊戝仠姝1涓烘ュ仠锛岄粯璁0 JOG_STOP_MODE_1=0 JOG_STOP_MODE_2=0 JOG_STOP_MODE_3=0 @@ -91,12 +91,12 @@ JOG_SPEED_GEAR4_4=1.0 JOG_ACC_GEAR4_4=1.0 JOG_DEC_GEAR4_4=1.0 -;0:都使用(正常情况) 1:只使用灯,而不使用控制器;默认0 +;0:閮戒娇鐢(姝e父鎯呭喌) 1:鍙娇鐢ㄧ伅锛岃屼笉浣跨敤鎺у埗鍣;榛樿0 [USE_LIGHT] ONLY_USE_LIGHT=0 [RESOLUTION] -;光栅尺的分辨率(mm) +;鍏夋爡灏虹殑鍒嗚鲸鐜(mm) SCALE_RESOLUTION_1=0.0004 SCALE_RESOLUTION_2=0.0004 SCALE_RESOLUTION_3=0.0004 @@ -107,7 +107,7 @@ SCALE_RESOLUTION_7=0.0004 SCALE_RESOLUTION_8=0.0004 [LIMIT] -;负限位(mm),必须是负数 +;璐熼檺浣(mm)锛屽繀椤绘槸璐熸暟 NEG_WORKING_LIMIT_1=-260.0 NEG_WORKING_LIMIT_2=-40.0 NEG_WORKING_LIMIT_3=-40.0 @@ -117,10 +117,10 @@ NEG_WORKING_LIMIT_6=-40.0 NEG_WORKING_LIMIT_7=-40.0 NEG_WORKING_LIMIT_8=-40.0 -;正限位(mm),必须是正数 -POS_WORKING_LIMIT_1=40.0 -POS_WORKING_LIMIT_2=160.0 -POS_WORKING_LIMIT_3=160.0 +;姝i檺浣(mm)锛屽繀椤绘槸姝f暟 +POS_WORKING_LIMIT_1=10.0 +POS_WORKING_LIMIT_2=200.0 +POS_WORKING_LIMIT_3=200.0 POS_WORKING_LIMIT_4=200.0 POS_WORKING_LIMIT_5=200.0 POS_WORKING_LIMIT_6=200.0 @@ -128,7 +128,7 @@ POS_WORKING_LIMIT_7=200.0 POS_WORKING_LIMIT_8=200.0 [HOME] -;选择需要回家的轴号,改为1 +;閫夋嫨闇瑕佸洖瀹剁殑杞村彿锛屾敼涓1 HOME_MACHINE_AXIS_1=1 HOME_MACHINE_AXIS_2=1 HOME_MACHINE_AXIS_3=1 @@ -138,12 +138,12 @@ HOME_MACHINE_AXIS_6=0 HOME_MACHINE_AXIS_7=0 HOME_MACHINE_AXIS_8=0 -;是否启动实际位置判断是否回家,默认0,1启用,0关闭 +;鏄惁鍚姩瀹為檯浣嶇疆鍒ゆ柇鏄惁鍥炲锛岄粯璁0锛1鍚敤锛0鍏抽棴 IS_HOME_ENC_POS=0 -;是否启动规划位置判断是否回家,默认1,1启用,0关闭 +;鏄惁鍚姩瑙勫垝浣嶇疆鍒ゆ柇鏄惁鍥炲锛岄粯璁1锛1鍚敤锛0鍏抽棴 IS_HOME_PRF_POS=1 -;关闭电源时记住当前的位置,用于判断是否需要回家 +;鍏抽棴鐢垫簮鏃惰浣忓綋鍓嶇殑浣嶇疆锛岀敤浜庡垽鏂槸鍚﹂渶瑕佸洖瀹 HOME_POS_AXIS_1=0 HOME_POS_AXIS_2=0 HOME_POS_AXIS_3=0 @@ -153,7 +153,7 @@ HOME_POS_AXIS_6=0 HOME_POS_AXIS_7=0 HOME_POS_AXIS_8=0 -;回家第一段速度(pulse/ms) +;鍥炲绗竴娈甸熷害(pulse/ms) HOME_HIGH_SPEED_1=200.0 HOME_HIGH_SPEED_2=200.0 HOME_HIGH_SPEED_3=200.0 @@ -163,7 +163,7 @@ HOME_HIGH_SPEED_6=200.0 HOME_HIGH_SPEED_7=200.0 HOME_HIGH_SPEED_8=200.0 -;回家第一段加速度(pulse/ms^2) +;鍥炲绗竴娈靛姞閫熷害(pulse/ms^2) HOME_HIGH_ACC_1=2.0 HOME_HIGH_ACC_2=2.0 HOME_HIGH_ACC_3=2.0 @@ -173,7 +173,7 @@ HOME_HIGH_ACC_6=2.0 HOME_HIGH_ACC_7=2.0 HOME_HIGH_ACC_8=2.0 -;回家第二段速度(pulse/ms) +;鍥炲绗簩娈甸熷害(pulse/ms) HOME_LOW_SPEED_1=180.0 HOME_LOW_SPEED_2=180.0 HOME_LOW_SPEED_3=180.0 @@ -183,7 +183,7 @@ HOME_LOW_SPEED_6=180.0 HOME_LOW_SPEED_7=180.0 HOME_LOW_SPEED_8=180.0 -;回家第二段加速度(pulse/ms^2) +;鍥炲绗簩娈靛姞閫熷害(pulse/ms^2) HOME_LOW_ACC_1=2.0 HOME_LOW_ACC_2=2.0 HOME_LOW_ACC_3=2.0 @@ -193,7 +193,7 @@ HOME_LOW_ACC_6=2.0 HOME_LOW_ACC_7=2.0 HOME_LOW_ACC_8=2.0 -;回家延时时间(ms) +;鍥炲寤舵椂鏃堕棿(ms) HOME_TIME_1=1000 HOME_TIME_2=1000 HOME_TIME_3=1000 @@ -204,7 +204,7 @@ HOME_TIME_7=1000 HOME_TIME_8=1000 [PID] -;PID比例调节,应从0.01递增开始调试 +;PID姣斾緥璋冭妭,搴斾粠0.01閫掑寮濮嬭皟璇 PID_KP_1=1.20 PID_KP_2=1.20 PID_KP_3=1.20 @@ -215,7 +215,7 @@ PID_KP_7=1.20 PID_KP_8=1.20 [PRECISION] -;超时时间(0.1ms) +;瓒呮椂鏃堕棿(0.1ms) PRECISION_TIME_1=20000 PRECISION_TIME_2=20000 PRECISION_TIME_3=20000 @@ -225,7 +225,7 @@ PRECISION_TIME_6=20000 PRECISION_TIME_7=20000 PRECISION_TIME_8=20000 -;回家误差脉冲个数 +;鍥炲璇樊鑴夊啿涓暟 PRECISION_COUNT_1=8 PRECISION_COUNT_2=8 PRECISION_COUNT_3=8 @@ -236,7 +236,7 @@ PRECISION_COUNT_7=8 PRECISION_COUNT_8=8 [SET_POSITION_SPEED] -;XYZ定位的合成速度(pulse/ms) +;XYZ瀹氫綅鐨勫悎鎴愰熷害(pulse/ms) SET_POTION_SPEED_1=500.0 SET_POTION_SPEED_2=500.0 SET_POTION_SPEED_3=500.0 @@ -246,7 +246,7 @@ SET_POTION_SPEED_6=500.0 SET_POTION_SPEED_7=500.0 SET_POTION_SPEED_8=500.0 -;XYZ定位的合成加速度(pulse/ms^2) +;XYZ瀹氫綅鐨勫悎鎴愬姞閫熷害(pulse/ms^2) SET_POTION_ACC_1=2.5 SET_POTION_ACC_2=2.5 SET_POTION_ACC_3=2.5 @@ -256,7 +256,7 @@ SET_POTION_ACC_6=2.5 SET_POTION_ACC_7=2.5 SET_POTION_ACC_8=2.5 -;XYZ定位的终点速度(pulse/ms) +;XYZ瀹氫綅鐨勭粓鐐归熷害(pulse/ms) SET_POTION_DEC_1=1.0 SET_POTION_DEC_2=1.0 SET_POTION_DEC_3=1.0 @@ -266,7 +266,7 @@ SET_POTION_DEC_6=1.0 SET_POTION_DEC_7=1.0 SET_POTION_DEC_8=1.0 -;XYZ定到位判断次数 +;XYZ瀹氬埌浣嶅垽鏂鏁 SET_POSITION_COUNT_1=240 SET_POSITION_COUNT_2=240 SET_POSITION_COUNT_3=240 @@ -277,20 +277,20 @@ SET_POSITION_COUNT_7=240 SET_POSITION_COUNT_8=240 [COMPORT] -;灯光控制器类型选择 -;0:启用c++调用灯光,不使用STM32 USB控制时,需要把下面的IS_STM32_USB改为0 -;1:wpf直接调用; -;2:DP光源控制器; -;3:旧的6环8区为3(环形可调); -;4:新的6环8区为4(扇区可调); -;5:STM32控制器,IP地址在exe目录下的CameraNum.ini中修改 -;61:OPT光源控制器网络模式(111ms),IP地址在exe目录下的CameraNum.ini中修改,串口模式62(44ms); +;鐏厜鎺у埗鍣ㄧ被鍨嬮夋嫨 +;0:鍚敤c++璋冪敤鐏厜,涓嶄娇鐢⊿TM32 USB鎺у埗鏃讹紝闇瑕佹妸涓嬮潰鐨処S_STM32_USB鏀逛负0 +;1:wpf鐩存帴璋冪敤; +;2:DP鍏夋簮鎺у埗鍣; +;3:鏃х殑6鐜8鍖轰负3(鐜舰鍙皟); +;4:鏂扮殑6鐜8鍖轰负4(鎵囧尯鍙皟); +;5:STM32鎺у埗鍣,IP鍦板潃鍦╡xe鐩綍涓嬬殑CameraNum.ini涓慨鏀 +;61:OPT鍏夋簮鎺у埗鍣ㄧ綉缁滄ā寮(111ms),IP鍦板潃鍦╡xe鐩綍涓嬬殑CameraNum.ini涓慨鏀癸紝涓插彛妯″紡62(44ms); COM_PORT_CPP_WPF=0 -;使用stm32时,是否使用USB通讯,使用该功能时,COM_PORT_CPP_WPF必须等于0 +;浣跨敤stm32鏃讹紝鏄惁浣跨敤USB閫氳锛屼娇鐢ㄨ鍔熻兘鏃讹紝COM_PORT_CPP_WPF蹇呴』绛変簬0 IS_STM32_USB=0 -;是否打开第一个串,1为打开,0为关闭,默认0 +;鏄惁鎵撳紑绗竴涓覆锛1涓烘墦寮锛0涓哄叧闂紝榛樿0 IS_COM_PORT_A=0 COM_PORT_A=2 COM_PORT_A_LED_1=1 @@ -298,7 +298,7 @@ COM_PORT_A_LED_2=1 COM_PORT_A_LED_3=1 COM_PORT_A_LED_4=1 -;是否打开第二个串,1为打开,0为关闭,默认0 +;鏄惁鎵撳紑绗簩涓覆锛1涓烘墦寮锛0涓哄叧闂紝榛樿0 IS_COM_PORT_B=0 COM_PORT_B=6 COM_PORT_B_LED_1=1 @@ -307,17 +307,17 @@ COM_PORT_B_LED_3=1 COM_PORT_B_LED_4=1 [TRRIGER] -;线性点触发的脉冲宽度 +;绾挎х偣瑙﹀彂鐨勮剦鍐插搴 LINEAR_PULSE_WIDTH=500 -;等间距触发的脉冲宽度 +;绛夐棿璺濊Е鍙戠殑鑴夊啿瀹藉害 INTERVAL_PULSE_WIDTH=500 -;手动触发 +;鎵嬪姩瑙﹀彂 HOLD_TIME=150 [LOG] -;是否打开记录,默认0为关闭,1位打开,;LOG_IS_OPEN_0为是否打开记录功能 +;鏄惁鎵撳紑璁板綍锛岄粯璁0涓哄叧闂紝1浣嶆墦寮,;LOG_IS_OPEN_0涓烘槸鍚︽墦寮璁板綍鍔熻兘 LOG_IS_OPEN_0=1 LOG_IS_OPEN_1=1 LOG_IS_OPEN_2=1 @@ -327,9 +327,9 @@ LOG_IS_OPEN_5=0 LOG_IS_OPEN_6=0 LOG_IS_OPEN_7=0 LOG_IS_OPEN_8=0 -;是否启用统计定位函数的时间日志,1:启用,默认0关闭 +;鏄惁鍚敤缁熻瀹氫綅鍑芥暟鐨勬椂闂存棩蹇楋紝1锛氬惎鐢紝榛樿0鍏抽棴 LOG2_IS_OPEN=0 -;定位几次后,计算这几次总共用时mm,默认4次 +;瀹氫綅鍑犳鍚庯紝璁$畻杩欏嚑娆℃诲叡鐢ㄦ椂mm锛岄粯璁4娆 LOG_SUM_COUNT=0 diff --git a/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini b/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini index aeeaa9ab114ad6f379bd3cf57679b2330cbe43d4..ad11e48b22bee06f168c59495bbc9325b4056695 100644 GIT binary patch delta 14 Vcmexn{mptqg$$$d=1Q4bMgTH(1)%@{ delta 14 Vcmexn{mptqg$$#~=1Q4bMgTH<1)=}|