From 196419beba806c94fc8416184ffd6f2a11993ca3 Mon Sep 17 00:00:00 2001 From: "zhengxuan.zhang" Date: Tue, 1 Nov 2022 11:50:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=BC=80=E9=A2=84=E7=95=99=E5=87=BD?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=AE=9A=E4=BD=8DMetus?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HSI_HexagonMI_EF3/HSI.cpp | 1 + HSI_HexagonMI_EF3/HSI.h | 42 +++++++++---------- HSI_HexagonMI_EF3/HSI_Motion.cpp | 70 +++++++++++++++++++++++++++++-- HSI_HexagonMI_EF3/HSI_Motion.h | 43 +++++++------------ HSI_HexagonMI_EF3/version.h | 4 +- SerialAssistant/README.md | Bin 8192 -> 2644 bytes 6 files changed, 106 insertions(+), 54 deletions(-) diff --git a/HSI_HexagonMI_EF3/HSI.cpp b/HSI_HexagonMI_EF3/HSI.cpp index d644871..e1004b6 100644 --- a/HSI_HexagonMI_EF3/HSI.cpp +++ b/HSI_HexagonMI_EF3/HSI.cpp @@ -377,6 +377,7 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_SUPPORTED(UINT& Types) } #pragma endregion +#define USE_Motion_API #ifdef USE_Motion_API #pragma region 后续考虑 diff --git a/HSI_HexagonMI_EF3/HSI.h b/HSI_HexagonMI_EF3/HSI.h index a0e8c74..de4612b 100644 --- a/HSI_HexagonMI_EF3/HSI.h +++ b/HSI_HexagonMI_EF3/HSI.h @@ -430,28 +430,28 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_DIO(UINT IOChannel, UINT& _Status); HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_DIO(UINT IOChannel, UINT _Status); HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_SUPPORTED(UINT &Types); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SPEED_XYZ(double &Speed); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SPEED_XYZ(double Speed); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ACCELERATION_XYZ(double &AccelX, double &AccelY, double &AccelZ); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_ACCELERATION_XYZ(double AccelX, double AccelY, double AccelZ); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SPEED_R(double &Speed); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SPEED_R(double Speed); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ACCELERATION_R(double &AccelR); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_ACCELERATION_R(double AccelR); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SCALE_RESOLUTION(double &ScaleX, double &ScaleY, double &ScaleZ); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SCALE_RESOLUTION(double ScaleX, double ScaleY, double ScaleZ); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_DEADBAND(double &DeadbandX, double &DeadbandY, double &DeadbandZ, double &DeadbandR); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_REFRESH_DEADBAND(double &Deadband); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_POSITIONPROBE(UINT AxisTypes, double &PositionX, double &PositionY, double &PositionZ, double &PositionA); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ENCODER_XYZ(long *lEncVal); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_XYZ_CACHE(UINT AxisTypes, HSI_MOTION_MOVE_TYPE eType, int DataCount, Point *CacheData); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_POSITION_R(UINT AxisTypes, double &PositionR, double &Time); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_R(UINT AxisTypes, double PositionR, HSI_MOTION_AXIS_R_MOVE_TYPE DirectionType, bool bWait); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_PLAN_SCAN(double *pdStartPosX, double *pdStartPosY, double *pdStartPosZ, double *pdEndPosX, double *pdEndPosY, double *pdEndPosZ, double *pdStepDis, bool *pbTrig, int iCount); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SPEED_XYZ(double &Speed); +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SPEED_XYZ(double Speed); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ACCELERATION_XYZ(double &AccelX, double &AccelY, double &AccelZ); +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_ACCELERATION_XYZ(double AccelX, double AccelY, double AccelZ); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SPEED_R(double &Speed); +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SPEED_R(double Speed); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ACCELERATION_R(double &AccelR); +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_ACCELERATION_R(double AccelR); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SCALE_RESOLUTION(double &ScaleX, double &ScaleY, double &ScaleZ); +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SCALE_RESOLUTION(double ScaleX, double ScaleY, double ScaleZ); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_DEADBAND(double &DeadbandX, double &DeadbandY, double &DeadbandZ, double &DeadbandR); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_REFRESH_DEADBAND(double &Deadband); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_POSITIONPROBE(UINT AxisTypes, double &PositionX, double &PositionY, double &PositionZ, double &PositionA); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ENCODER_XYZ(long *lEncVal); +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_XYZ_CACHE(UINT AxisTypes, HSI_MOTION_MOVE_TYPE eType, int DataCount, Point *CacheData); +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_POSITION_R(UINT AxisTypes, double &PositionR, double &Time); +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_R(UINT AxisTypes, double PositionR, HSI_MOTION_AXIS_R_MOVE_TYPE DirectionType, bool bWait); +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_PLAN_SCAN(double *pdStartPosX, double *pdStartPosY, double *pdStartPosZ, double *pdEndPosX, double *pdEndPosY, double *pdEndPosZ, double *pdStepDis, bool *pbTrig, int iCount); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_DCC_SCAN_SET_DATA(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType, UINT lTrigNumber, double* dTrigDis); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_DCC_SCAN_START(); -//HSI_API HSI_STATUS WINAPI HSI_MOTION_DCC_SCAN_STOP(); +HSI_API HSI_STATUS WINAPI HSI_MOTION_DCC_SCAN_SET_DATA(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType, UINT lTrigNumber, double* dTrigDis); +HSI_API HSI_STATUS WINAPI HSI_MOTION_DCC_SCAN_START(); +HSI_API HSI_STATUS WINAPI HSI_MOTION_DCC_SCAN_STOP(); //HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_SUPPORTED_EX(UINT AxisTypes, UINT &Types); diff --git a/HSI_HexagonMI_EF3/HSI_Motion.cpp b/HSI_HexagonMI_EF3/HSI_Motion.cpp index f057664..0df3ef9 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 %s\n",ErrorStr); } } else @@ -1843,7 +1843,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:[%d]\n", AxisTypes, Speed); + g_pLogger->SendAndFlushWithTime(L"[Jog] aixs: [%d] speed:[%lf]\n", AxisTypes, Speed); if (g_pHSI_Motion) { if (m_DeviceType != 3) //非转盘设备 @@ -4671,7 +4671,13 @@ HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status) return rStatus; } //=========================================================================== -HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status) +/** + * \brief + * \param IOChannel + * \param _Status + * \return + */ +HSI_STATUS HSI_Motion::SetDIOOld(UINT IOChannel, UINT _Status) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) @@ -4724,7 +4730,65 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status) } return rStatus; } +HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status) +{ + auto rStatus = HSI_STATUS_NORMAL; + if (g_pHSI_Motion) + { + if (m_bISUseMoreLights > 0 && (m_ForStatus != _Status)) + { + if (m_Led8MotionFlag[m_selectedIndex]) + { + m_ForStatus = _Status; + IOdata[0] = 0x02; + IOdata[1] = 0x02; + IOdata[2] = 0x01; + IOdata[6] = 0x04; + IOdata[7] = 0xff; + IOdata[8] = 0xff; + IOdata[9] = 0xff; + IOdata[10] = 0xff; + IOdata[14] = _Status & 0xff; + IOSend++; + } + else + { + m_ForStatus = _Status; + IOdata[0] = 0x02; + IOdata[1] = 0x02; + IOdata[2] = 0x01; + IOdata[3] = 0x36; + IOdata[4] = 0x04; + IOdata[7] = 0xff; + IOdata[8] = 0xff; + IOdata[9] = 0xff; + IOdata[10] = 0xff; + IOdata[11] = (_Status >> 24) & 0xff; + IOdata[12] = (_Status >> 16) & 0xff; + IOdata[13] = (_Status >> 8) & 0xff; + IOdata[14] = _Status & 0xff; + IOSend++; + } + } + if ((IOChannel == HSI_MOTION_OUTPUT_CH1)/* && (m_ForStatus != _Status)*/) + { + m_ForStatus = _Status; + m_cSendData[0] = CT_PORT; + m_cSendData[1] = 0x02; + m_cSendData[2] = (_Status >> 8) & 0xff; + m_cSendData[3] = _Status & 0xff; + m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); + Sleep(5); + } + } + //-----------TEST Begin------------------ + _Status = 0; + + + //-----------TEST End------------------ + return rStatus; +} //=========================================================================== HSI_STATUS HSI_Motion::GetAxisStatus(int* _Status) { diff --git a/HSI_HexagonMI_EF3/HSI_Motion.h b/HSI_HexagonMI_EF3/HSI_Motion.h index 17064e7..b7cb9bb 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.h +++ b/HSI_HexagonMI_EF3/HSI_Motion.h @@ -28,39 +28,28 @@ enum E_SO7_MOTION_TYPE enum E_EF3_HOME_STATUS { - E_EF3_HOME_NONE, - //0表示从未回过回原点 - E_EF3_HOME_ING, - //1表示正在回原点 - E_EF3_HOME_FINISHED, - //2表示已经回过原点 + E_EF3_HOME_NONE,//0表示从未回过回原点 + E_EF3_HOME_ING,//1表示正在回原点 + E_EF3_HOME_FINISHED,//2表示已经回过原点 }; enum FUN_CMD //第一级指令 { - CT_MOTOR = 0x01, - //MOTOR - CT_LIGHT, - //LIGHT - CT_PORT, - //PORT - CT_ORDER, - //ORDER - CT_SOFTSTOP, - //STOP - CT_GLUEDISPENSER, - //点胶 + CT_MOTOR = 0x01,//MOTOR + CT_LIGHT,//LIGHT + CT_PORT,//PORT + CT_ORDER,//ORDER + CT_SOFTSTOP,//STOP + CT_GLUEDISPENSER,//点胶 CT_TURNTABLE, }; enum MOTOR_CMD //第二级指令 { CT_MOTOR_SET = 0x01, - CT_START_JOG_POS, - // + CT_START_JOG_POS,// CT_START_JOG_NEG, - CT_START_POSITION, - //_POS, + CT_START_POSITION,//_POS, CT_STOP, CT_GOHOME, CT_TRIGGER_DATA, @@ -74,12 +63,11 @@ enum MOTOR_CMD // CT_GLUEDISPENSER_SET, CT_GLUEDISPENSER_CLEAR, CT_GLUEDISPENSER_START, - CT_GLUEDISPENSER_STOP, - //转盘时启用 + CT_GLUEDISPENSER_STOP,//转盘时启用 CT_RTSET, CT_BINSDATA, - CT_RTSTOP, - // CT_MOTOR_UPDATE, // up date all the aixs + CT_RTSTOP,// + CT_MOTOR_UPDATE, // up date all the aixs }; enum MOTOR_START_POSOTION // @@ -286,6 +274,7 @@ public: * \return */ HSI_STATUS SetDIO(UINT IOChannel, UINT _Status); + HSI_STATUS SetDIOOld(UINT IOChannel, UINT _Status); HSI_STATUS GetAxisStatus(int* _Status); HSI_STATUS GetAppPath(CString& Path); /** @@ -645,8 +634,6 @@ private: }; extern HSI_Motion* g_pHSI_Motion; - - extern void ErrorsHandler(const char* ErrorMessage, BOOL fCloseComm); //ACS 错误打印 #endif diff --git a/HSI_HexagonMI_EF3/version.h b/HSI_HexagonMI_EF3/version.h index 83a2d8f..219d53b 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.21 / 18:06 " -#define HSI_FILE_CSDESCRIPTION _T("2022.10.21 / 18:06 ") +#define HSI_FILE_DESCRIPTION "2022.11.01 / 11:45 " +#define HSI_FILE_CSDESCRIPTION _T("2022.11.01 / 11:45 ") diff --git a/SerialAssistant/README.md b/SerialAssistant/README.md index 68a66eec83b295f5a6005dde19d37938036e53b3..bc85c00c3a05aedc12e0bac3003e5afe0bc84eca 100644 GIT binary patch literal 2644 zcmZ`*OK;mo5WeeIsPH9ekk(3@0=*PSgBA_YLjeQrr3VG5Q3P-uz)sOi|BTGWQ54n| zDUy;%QM4r5qNo=wQmY5-_z^$j*lp}URqDv-exevFcItz?+MWGocINwLG~)l^yRXN_ zr|#XIxHUa}@4?+kzc8n@$-gG?UBC3_^Z7>ni8of(sFSpBWW;}CH1L`JJm6$+d}`GF zWQBfwKRz{m@BXAe@X;sKV#J@E)mMBU`mL|5m|@HKOtIXEr|eSG+|=8~D#IGPiegz;ew@528Vt)Kr5N$mN9K{OMUXgc7@ufQ{Kpud23L#|}xDY5HjT zjxT@x*?O7~U{3$}UGu7ArYmM?laU*aG>;%m&OPB3eFYCHZBT&0o#Y?swdfmp-t1|c zwqg=BF2b1&|HU0Tg6j)v+~s1b6VAxg=$SnbfP<4TF)=PW>`2w zHsYryXYJJ@CXwb#hbjBk*zG%avIh*CI#%X0MZVSehoZzv)-eS)q_E|v-I~IyrHw)l zj)rO&=-05Q57qF-r5YkLqAKd32{NS>YR+=Vd1)r?oE{?tbwyejIq1GE$gn}_Ozn~- ztfED4WzL$up zbD1J4p~$iAe0M=`R)rleC$MB#krP$nubLu-pIJndPZ(C&Sb8PVvb#8E1={tx|TV>tu@!4~AHMEZpeqO4T%ihSa@G&m-f zxn&&GBCvE(g5Qi!Ox*YXc7JN(rw@WagZ%}xw`3VYZ1rQHXc|RDlkrf!DBsG+?K$z& z;OMQs1J$l(Y1LaoC2uJ-Wy8S=MU!({YL}{#hG=r!Gi5`4;;K|$q^g_2ex?{=d^C^f zdGVPlCjC0)-Kp>mu%8HXfTMKwzK+aY1=7U7PjrR~jd`A52YL8@uZ16c%dNIQST@LebQ*x^CL#6tWiLaD@pE?tC@*V0`NB zJ%uEMayZ#@rv?y|}pG~!D~WMgusNyn8zX7x)M3pBeG#1 zphXhPOKMbDe29J0>`yrK&QLVjwA&$0h?cf#*cd$WVxgCkMD={c2QE-7aI;S_>1=3( zj9#LcH<01IUmI4}^8H}l(qmZL79&H?e7MxinpiFEET$}GdB39cy9T9#yDBpz>8=_? zZR4i}&LO9K7b?e32ke|r=+qX3hCQ@>%xgNokAxFt{`bV1WL(n@B?G6(5wryh2(~|! z&dUwJl^U#R?Tl}_%7+%-wRcuc&UhH> R)s)nmi>G)yUP1Zb`wv}u>frzY literal 8192 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