// HSI_Motion.cpp : 定义 DLL 的初始化例程。 #include "stdafx.h" #include "HSI.h" #include "HSI_Sevenocean_EF3.h" #include "HSI_Motion.h" #include "logger.h" #include "SevenOcean\CMMIO_SERIAL.h" #include "version.h" #include #include #include using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #endif //=========================================================================== HSI_Motion *g_pHSI_Motion = nullptr; CLogger extern *g_pLogger = nullptr; HANDLE hCom;//串口句柄 const int WSA_MAJOR_VERSION = 2; const int WSA_MINOR_VERSION = 2; #define WSA_VERSION MAKEWORD(WSA_MAJOR_VERSION, WSA_MINOR_VERSION) #define SOCKADDR_LEN sizeof(SOCKADDR_IN) //=========================================================================== HANDLE HSI_Motion::m_Thread_Id = NULL; HANDLE HSI_Motion::m_Thread_Mutex = NULL; HANDLE HSI_Motion::g_RW_Data_Mutex = NULL; HANDLE HSI_Motion::g_WR_ToMove_Mutex = NULL; HANDLE HSI_Motion::g_Lock_JogAndTrigger = NULL; HANDLE HSI_Motion::m_hTriggerEvent; HANDLE HSI_Motion::m_Thread_IdIO = NULL; HANDLE HSI_Motion::m_Thread_MutexIO = NULL; HANDLE HSI_Motion::m_hTriggerEventIO; HANDLE HSI_Motion::m_Thread_IdData = NULL; HANDLE HSI_Motion::m_Thread_MutexData = NULL; HANDLE HSI_Motion::m_hTriggerEventData; HANDLE HSI_Motion::m_Thread_IdProbe = NULL; HANDLE HSI_Motion::m_Thread_MutexProbe = NULL; HANDLE HSI_Motion::m_hTriggerEventProbe; HANDLE HSI_Motion::m_Thread_IdJOGStop = NULL; HANDLE HSI_Motion::m_Thread_MutexJOGStop = NULL; HANDLE HSI_Motion::m_hTriggerEventJOGStop; int HSI_Motion::m_Thread_StateJOGStop = THREAD_PAUSED; int HSI_Motion::m_Thread_State = THREAD_PAUSED; int HSI_Motion::m_Thread_StateIO = THREAD_PAUSED; int HSI_Motion::m_Thread_StateData = THREAD_PAUSED; int HSI_Motion::m_Thread_StateProbe = THREAD_PAUSED; int HSI_Motion::bRunGlueDispenser = THREAD_PAUSED; //=========================================================================== HANDLE HSI_Motion::m_ThreadTCP_Id = NULL; int HSI_Motion::m_ThreadTCP_State = TCPIP_THREAD_PAUSED; SOCKET m_socket[4] = { 0 }; //=========================================================================== HSI_Motion::HSI_Motion() { TRACE0("HSI_Motion Constructor!\n"); sEvenProp.Init(); sEvenProp.EventCallbackID = 0; sEvenProp.EventResponse = HSI_EVENT_FUNCTION_OK; CurrentMotionState = E_SO7_MOTION_NONE; CurrentReadDataType = E_DATA_TYPE_NONE; GluerunCount = 0; m_IsExMotion = 2; g_IsClose = false; setLightFlag = false; m_bISUseMoreLights = 0; m_Jog_Auto_Focus = 1; m_StartInputPort = 1; iaxisNum = 0; iScanMotionType = 0; iTriggleNum = 0; iMotionDirection = 1; m_InputStatus = 0; m_ForStatus = 0; m_setPositionDelay = 0; m_setPositionPrecision = 0; m_IsUse_HSICompensation = 0; m_Compensation_Pluse = 20; m_IsHardLimit = 7; m_IsEnableAxis = 7; m_IsHavePattern = 15; m_IsUseExternalTrigger = 1; m_IsUseSixRingEightArea = 0; m_IsUseTwentySixLight = 0; m_IsUseEF3 = 0; m_IsUseRocker = 0; m_IsCloseRocker = 0; m_DeviceType = 0; m_iJoyStick = 0; m_IsProbe = 0; m_ProbeAllAxis = 3; m_ProbeReturnPos = 10.0; m_ProbeReturnSpeed = 40; m_IsHomeEncPos = 0; m_IsHomePrfPos = 1; m_IsIOFuntion = 0; m_IsStartInput = 0; m_IsUsePPS = false; m_MSTRunFlag = false; m_SendDataLength = 64; m_LightType = 1; m_IsUseFourthSpeed = 0; m_ETIPort = 1; m_EF3LightType = 1; m_IbinCount = 0; m_IsUseJerk = 0; t_start = 0; t_end = 0; m_isOKGlint = 0; m_selectedIndex = 0; m_setPositionNum = 5; m_axisStatus = 0; m_axisAlarmStatus = 0; m_EF3COMPort = 2; m_AxisHomeDirection = 15; m_PositionA = 0.0; m_ForSoft = 0; m_SaveAxisNum = 0; m_SaveAxisSpeed = 0; bSaveSpeedFlag = false; m_IsUseManualRunin = 0; fourthAxisFlag = false; bCircleRun = false;//圆弧插补 m_UseAxisNum = 1; jogAxisNum = 0; jogDirFlag = false; jogMoving = false; jogspeed = 0; set_start = 0; set_end = 0; m_iSpeedType = 0; m_axisDirX = 0;//探针运动时X轴的运动方向 m_axisDirY = 0;//探针运动时Y轴的运动方向 m_axisDirZ = 0;//探针运动时Z轴的运动方向 m_probeSeekSpeed = 0; bUseGlueDispenser = false; m_iGlueStartSpeed = 1; m_iGlueDriveSpeed = 1; m_iGlueAccSpeed = 1; GlueDispenserindexNum = 0; m_isUseAport = 0;//A串口 m_portAnum = 0; m_isUseBport = 0;//B串口 m_portBnum = 0; m_bEmergencyState = false; SpCompleteTStart = 0; SpCompleteTEnd = 0; SpTimeCount = 0; SetPotionRunEnd = false; PntToPntDistance = 0.0; m_IsLightDebug = 0; for (int i = 0; i < 4; i++) { m_IsOpenTCPIP[i] = ""; m_tcpCntFlag[i] = false; m_Led8MotionFlag[i] = false; } for (int i = 0; i < 4; i++) { m_rockerHStartSpeed[i] = 5; m_rockerHDriveSpeed[i] = 20; m_rockerLStartSpeed[i] = 2; m_rockerLDriveSpeed[i] = 10; m_rockerDSpeed[i] = 100; m_rockerASpeed[i] = 100; begin_position[i] = 0; } for (size_t i = 0; i < 8; i++) { m_SixEightSubArea[i] = 0; } CTime tm = CTime::GetCurrentTime(); CString csTime = tm.Format("%Y-%m-%d");//显示年月日 CString dir = L"\\Log\\" + csTime += L".SO7_EF3.Log"; g_pLogger = new CLogger(dir); g_pLogger2 = new CLogger(L"\\Log\\EF3_SumTime.Log"); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { m_JogDriveSpeed[j][i] = 10; //表示5个档位 m_JogStartSpeed[j][i] = 10; m_JogAccLine[j][i] = 5; m_JogAccCurve[j][i] = 0; m_JogDecLine[j][i] = 5; m_JogDecCurve[j][i] = 0; } m_Home_Machine_Axis[i] = 1; m_Home_Pos_Axis[i] = 0; } m_Home_Machine_Axis[4] = 0; for (int i = 0; i < 5; i++) { m_N_Work_Limit[i] = -40; m_P_Work_Limit[i] = 160; m_Resolution[i] = 0.0004; m_Home_AddJogGears[i] = 4; m_Home_DecJogGears[i] = 3; m_SetPotion_StartSpeed[i] = 20; m_SetPotion_DriveSpeed[i] = 20; m_SetPotion_Line[i] = 150; m_SetPotion_Buffer[i] = 40; m_SetPotion_AccCurve[i] = 0; m_SetPotion_DecCurve[i] = 0; m_SpeedAdjustPeriod[i] = 1; m_SpeedMax[i] = 150; m_precisionCount[i] = 5; m_precisionTime[i] = 350; m_Home_Time[i] = 1500; m_SetPotion_Count[i] = 200; m_PosThread[i] = 0; m_PosNow[i] = 0; m_LogIsOpen[i] = 0; m_StopJogMode[i] = 0; m_LockPos[i] = 0.0; m_EncPos[i] = 0; m_PrfPos[i] = 0; m_PosForAllAxis[i] = 0.0; targetpos_n[i] = 0; targetpos_l[i] = 0; m_ProbeCapturePos[i] = 0; iCircleRunPnt[i] = 0; m_ijk[i] = 0; } GetAppPath(m_AppPath); m_LogIsOpen[0] = GetPrivateProfileInt(L"LOG", L"LOG_IS_OPEN_0", 0, m_AppPath + _T("\\Config\\EF3_Motion.ini")); g_pLogger->IsEnabledLog = m_LogIsOpen[0] == 1 ? true : false; m_Set_XYZA_Reserve = 0; m_motorType = 0; m_AxisHex[0] = 0; m_direct_pos = 0; m_AxisHex[1] = AXIS_X; m_AxisHex[2] = AXIS_Y; m_AxisHex[3] = AXIS_Z; m_AxisHex[4] = AXIS_U; for (int i = 0; i < 64; i++) { m_cSendData[i] = 0; } m_cSendData[0] = 2; m_cSendData[1] = 2; m_cSendData[2] = 2; m_cSendData[3] = 48; m_cSendData[4] = 4; m_cSendData[6] = 4; m_bConnected = false; first = true; LightSend = 0; OrderSend = 0; IOSend = 0; for (int i = 0; i < 64; i++) { lightdata[i] = 0; IOdata[i] = 0; Orderdata[i] = 0; IOCheck[i] = 0; TempData[i] = 0; } IOCheck[0] = 0x01; IOCheck[1] = 0x04; memset(tReciveData, 0x00, TCPIP_MAX_DAT_SIZE); g_RW_Data_Mutex = CreateMutex(NULL, FALSE, NULL); g_WR_ToMove_Mutex = CreateMutex(NULL, FALSE, NULL); g_Lock_JogAndTrigger = CreateMutex(NULL, FALSE, NULL); } //=========================================================================== HSI_Motion::~HSI_Motion() { TRACE0("HSI_Motion Destructor!\n"); } //=========================================================================== bool HSI_Motion::PortInit(int iSerialComPort, int iBuadRate) { if (hCom == NULL) { char buf[10]; sprintf_s(buf, "COM%d", iSerialComPort); CString comName(buf); hCom = CreateFile(comName, GENERIC_READ | GENERIC_WRITE, //允许读和写 0, //独占方式,串口必须为0 NULL, OPEN_EXISTING, //打开而不是创建,串口必须为打开 0, //同步方式,同步执行时,函数直到操作完成后才返回 NULL);//串口必须为NULL if (hCom != (HANDLE)-1) { PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); } SetupComm(hCom, 1024, 1024); DCB dcb; FillMemory(&dcb, sizeof(dcb), 0); dcb.DCBlength = sizeof(dcb); BuildCommDCB(L"2400,n,8,1", &dcb); if (!SetCommState(hCom, &dcb)) { return false;//Setting Error!!!! } //设置读写超时时间 COMMTIMEOUTS to; memset(&to, 0, sizeof(to)); to.ReadIntervalTimeout = 100; to.ReadTotalTimeoutMultiplier = 10; to.ReadTotalTimeoutConstant = 10; SetCommTimeouts(hCom, &to); PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); } return true; } //=========================================================================== HSI_STATUS HSI_Motion::IsSupported(UINT &Types) { auto rStatus = HSI_STATUS_NORMAL; Types = 1; return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly) { auto rStatus = HSI_STATUS_NORMAL; hWnd = _hWnd; bOfflineOnly = _bOfflineOnly; if (!bOfflineOnly) { CString GoogolMotionConfigFile(_T("")); if (!g_pHSI_Motion) { g_pHSI_Motion = new HSI_Motion(); } if (CurrentHomeMachineState == E_EF3_HOME_ING) { g_pLogger->SendAndFlushWithTime(L"[Startup] Going Home\n"); return HSI_STATUS_NORMAL; } g_pLogger->SendAndFlushWithTime(L"[Startup] In\n"); g_pLogger->SendAndFlushWithTime(L"[Startup] EF3 HSI.dll version = %s, date = %s\n", HSI_VERSION_CSTRING, HSI_FILE_CSDESCRIPTION); GoogolMotionConfigFile = m_AppPath + _T("\\Config\\EF3_Config.ini"); Load_EF3_Config_Inifile(GoogolMotionConfigFile); GoogolMotionConfigFile = m_AppPath + _T("\\Config\\EF3_Motion.ini"); Load_EF3_Motion_Inifile(GoogolMotionConfigFile); if (m_IsUseEF3 == 1) { if (!m_bConnected) { m_SO7_Serial.SetPort(m_EF3COMPort, 115200, 0, 8, 1, 0); if (!m_SO7_Serial.Open()) { g_pLogger->SendAndFlushWithTime(L"[Startup] m_SO7_Serial.Open is false,connected failed\n"); sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "EF3控制器打开失败,串口"); EventCallback(sEvenProp); return HSI_STATUS_FAILED; } m_SO7_Serial.SetTimeouts(1000, 1000); m_bConnected = true; } else { g_pLogger->SendAndFlushWithTime(L"[Startup] Serial is opened\n"); } } //AbortMotion(); m_cSendData[0] = CT_ORDER; m_cSendData[1] = CT_STOP; m_cSendData[2] = AXIS_XYZU; m_StopJogMode[1] == 0 ? m_cSendData[3] = 0X4A : m_cSendData[3] = 0X05; m_StopJogMode[2] == 0 ? m_cSendData[3] = 0X4A : m_cSendData[3] = 0X05; m_StopJogMode[3] == 0 ? m_cSendData[3] = 0X4A : m_cSendData[3] = 0X05; m_StopJogMode[4] == 0 ? m_cSendData[3] = 0X4A : m_cSendData[3] = 0X05; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); if (m_DeviceType == 3) { m_cSendData[0] = CT_TURNTABLE; m_cSendData[1] = CT_RTSTOP; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); m_Thread_StateData = HSI_THREAD_RUNNING; SetEvent(m_hTriggerEventData); } if (bUseGlueDispenser) { bUseGlueDispenser = false; m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_GLUEDISPENSER_STOP; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); } g_pLogger->SendAndFlushWithTime(L"[Startup] Connected scuuess\n"); if (HSI_STATUS_FAILED == DriverAlarmStatus()) { g_pLogger->SendAndFlushWithTime(L"[Startup] DriverAlarmStatus HSI_STATUS_FAILED\n"); //return HSI_STATUS_FAILED; } //无效软限位 m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AXIS_XYZU; m_cSendData[3] = SOFT_LIMIT_POS_NEG; m_cSendData[4] = 0; m_cSendData[5] = 0; m_cSendData[6] = 0; m_cSendData[7] = 0; m_cSendData[8] = 0; m_cSendData[9] = 0; m_cSendData[10] = 0; m_cSendData[11] = 0; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength);//初始化防止第一次无效 Sleep(5); m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); g_pLogger->SendAndFlushWithTime(L"[Startup] Limit no Enable\n"); //设置方向4个轴的方向,按位 m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AXIS_X; m_cSendData[3] = ENC_POS_DIR; m_cSendData[4] = m_Set_XYZA_Reserve; m_cSendData[5] = m_setPositionDelay; m_cSendData[6] = m_setPositionPrecision; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(10); m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MDATA_INIT; m_cSendData[2] = m_motorType & 0xff; //电机类型(步进电机或伺服电机) m_cSendData[3] = m_IsUseExternalTrigger; //是否启用外触发功能 m_cSendData[4] = m_IsUseSixRingEightArea; //是否启用六环八区灯功能 m_cSendData[5] = m_IsHardLimit; m_cSendData[6] = m_IsEnableAxis; m_cSendData[7] = m_IsProbe; //是否启用探针 m_cSendData[8] = m_EF3LightType; //5V高频灯光配置 m_cSendData[9] = m_IsUseRocker; //是否启用摇杆 m_cSendData[10] = m_IsHavePattern; //光栅 m_cSendData[11] = m_AxisHomeDirection; //轴回家方向 m_cSendData[12] = m_IsCollectPos; //是否从串口打印位置 m_cSendData[16] = m_IsLightDebug; //是否不回家也能调试灯光 if (m_IsStartInput == 1 && m_IsUseRocker == 2) { m_cSendData[14] = m_StartInputPort >> 8 & 0xff; //外部启动端口号 H m_cSendData[15] = m_StartInputPort & 0xff; //外部启动端口号 L } m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(10); ////步进电机补偿值设定 //if (m_motorType == 0) //{ // m_cSendData[0] = CT_MOTOR; // m_cSendData[1] = CT_MDATA_COM; // for (int i = 1, j = 2; i < 5; i++) // { // m_cSendData[j++] = (m_SpeedMax[i] & 0xff); // m_cSendData[j++] = ((m_SpeedMax[i] >> 8) & 0xff); // m_cSendData[j++] = ((m_SpeedMax[i] >> 16) & 0xff); // m_cSendData[j++] = ((m_SpeedMax[i] >> 24) & 0xff); // } // m_WriteByte = Send_Command(0,(const char*)m_cSendData, m_SendDataLength); // g_pLogger->SendAndFlushWithTime(L"[Startup] Set Encoder Dir\n"); //} //多光源板 if (m_bISUseMoreLights > 0) { for (int i = 0; i < m_bISUseMoreLights; i++) { if (m_tcpCntFlag[i]) { continue; } USES_CONVERSION; char* ip = T2A(m_IsOpenTCPIP[i]); u_short port = 8088; TCPIP_RETURN_CODE rCode = TCPConnect(i, ip, port); if (rCode != TCPIP_CONNECT_OK) { g_pLogger->SendAndFlushWithTime(L"[Startup] m_SO7_Serial.Open is false,connected failed\n"); sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "光源板打开网口失败"); EventCallback(sEvenProp); return HSI_STATUS_FAILED; } m_tcpCntFlag[i] = true; } Create_Thread(); for (int i = 0; i < m_bISUseMoreLights; i++) { if (m_Led8MotionFlag[i]) { m_selectedIndex = i; Orderdata[0] = 0x01; Orderdata[1] = 0x05; Orderdata[2] = m_LightType; OrderSend++; Orderdata[0] = 0x01; Orderdata[1] = 0x06; Orderdata[2] = 0x00; OrderSend++; } } } //摇杆速度设置 if (m_IsUseRocker == 1) { m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_ROCKER; int j = 2; for (int i = 0; i < 3; i++) { m_cSendData[j++] = (m_rockerHStartSpeed[i] & 0xff); m_cSendData[j++] = ((m_rockerHStartSpeed[i] >> 8) & 0xff); m_cSendData[j++] = (m_rockerHDriveSpeed[i] & 0xff); m_cSendData[j++] = ((m_rockerHDriveSpeed[i] >> 8) & 0xff); m_cSendData[j++] = (m_rockerASpeed[i] & 0xff); m_cSendData[j++] = ((m_rockerASpeed[i] >> 8) & 0xff); } for (int i = 0; i < 3; i++) { m_cSendData[j++] = (m_rockerLStartSpeed[i] & 0xff); m_cSendData[j++] = ((m_rockerLStartSpeed[i] >> 8) & 0xff); m_cSendData[j++] = (m_rockerLDriveSpeed[i] & 0xff); m_cSendData[j++] = ((m_rockerLDriveSpeed[i] >> 8) & 0xff); m_cSendData[j++] = (m_rockerDSpeed[i] & 0xff); m_cSendData[j++] = ((m_rockerDSpeed[i] >> 8) & 0xff); } m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); g_pLogger->SendAndFlushWithTime(L"[Startup] Set Rocker Success\n"); } //摇杆2下载档位 if (m_IsUseRocker == 2) { SetAllGears(); Sleep(5); g_pLogger->SendAndFlushWithTime(L"[Startup] Set Gears Success\n"); } CreateThread(); SetEvent(m_hTriggerEvent); m_Thread_State = HSI_THREAD_PAUSED; g_pLogger->SendAndFlushWithTime(L"[Startup] SetpositionXyz Enable\n"); CreateThreadData(); SetEvent(m_hTriggerEventData); m_Thread_StateData = HSI_THREAD_RUNNING; g_pLogger->SendAndFlushWithTime(L"[Startup] Read EF3 Status Run\n"); if (m_DeviceType != 3) { CreateThreadJOGStop(); SetEvent(m_hTriggerEventJOGStop); m_Thread_StateJOGStop = HSI_THREAD_PAUSED; } if (m_IsIOFuntion == 1) { m_Thread_StateIO = HSI_THREAD_RUNNING; CreateThreadIO(); SetEvent(m_hTriggerEventIO); g_pLogger->SendAndFlushWithTime(L"[Startup] m_IsIOFuntion Enable\n"); SetDIO(HSI_MOTION_OUTPUT_CH1, 0xfffff); } if (m_IsProbe == 1) { CreateThreadProbe(); m_Thread_StateProbe = HSI_THREAD_RUNNING; SetEvent(m_hTriggerEventProbe); g_pLogger->SendAndFlushWithTime(L"[Startup] m_IsProbe Enable\n"); } g_pLogger->SendAndFlushWithTime(L"[Startup] Out\n"); } else { g_pLogger->SendAndFlushWithTime(L"[Startup] No enable controller\n"); rStatus = HSI_STATUS_FAILED; } return rStatus; } //=============================获取EF3固件版本=============================== HSI_STATUS HSI_Motion::GetFirmwareVersion(byte *version) { m_Thread_StateData = HSI_THREAD_PAUSED; Sleep(3); int waite_count = 0; unsigned char senddata[64] = { 0 }; senddata[0] = 0x04; senddata[1] = 0x03; m_SO7_Serial.m_RecvData[0] = 0; m_WriteByte = Send_Command(0, (const char*)senddata, m_SendDataLength); Sleep(30); m_SO7_Serial.m_RecvData[0] = 0; m_WriteByte = Send_Command(0, (const char*)senddata, m_SendDataLength); Sleep(30); m_SO7_Serial.m_RecvData[0] = 0; m_WriteByte = Send_Command(0, (const char*)senddata, m_SendDataLength); Sleep(30); while ((m_SO7_Serial.m_RecvData[0] != 3) && (m_SO7_Serial.m_RecvData[0] != 2)) { waite_count++; if (waite_count > 100) break; Sleep(1); } if (waite_count > 100) { waite_count = 0; m_WriteByte = Send_Command(0, (const char*)senddata, m_SendDataLength); while ((m_SO7_Serial.m_RecvData[0] != 3) && (m_SO7_Serial.m_RecvData[0] != 2)) { waite_count++; if (waite_count > 100) break; Sleep(1); } } if (waite_count > 100) { version[0] = 't'; version[1] = 'i'; version[2] = 'm'; version[3] = 'e'; version[4] = 'o'; version[5] = 'u'; version[6] = 't'; } else { for (int i = 0; i < 20; i++) { version[i] = m_SO7_Serial.m_RecvData[i]; } } m_Thread_StateData = HSI_THREAD_RUNNING; SetEvent(m_hTriggerEventData); //触发事件,其中hEvent表示句柄,返回值:如果操作成功,则返回非零值,否则为0。 return HSI_STATUS_NORMAL; } //================================回家======================================= HSI_STATUS HSI_Motion::HomeMachine(bool bHomed) { auto rStatus = HSI_STATUS_NORMAL; if (!bHomed) { g_pLogger->SendAndFlushWithTime(L"[HomeMachine] bHomed No Need Reture\n"); return HSI_STATUS_NORMAL; } if (m_IsUseEF3 == 0) { return HSI_STATUS_NORMAL; } if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[HomeMachine] In\n"); //判断是否需要回家 bool home(false); IsHomed(home); if (home == true) { g_pLogger->SendAndFlushWithTime(L"[HomeMachine] IsHomed No Need Go Home\n"); return HSI_STATUS_NORMAL; } sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_FUNCTION; sEvenProp.EventID = HSI_EVENT_MOTION_DCC_HOME; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_CANCEL; EventCallback(sEvenProp); if (sEvenProp.EventCallbackID == HSI_EVENT_RESPONSE_CANCEL) { g_pLogger->SendAndFlushWithTime(L"[HomeMachine] Cancel\n"); return HSI_STATUS_NORMAL; } if (m_bEmergencyState) { AfxMessageBox(_T("急停或安全门或安全光幕触发!")); return HSI_STATUS_FAILED; } CurrentHomeMachineState = E_EF3_HOME_ING; int GetHomePos[5] = { 0 }; if (m_SO7_Serial.m_RecvData[0] == 2) { if (m_IsHavePattern & 0x01 == 0x01) GetHomePos[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]); else GetHomePos[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]); if (m_IsHavePattern & 0x02) GetHomePos[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]); else GetHomePos[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]); if (m_IsHavePattern & 0x04) GetHomePos[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]); else GetHomePos[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]); if (m_IsHavePattern & 0x08) GetHomePos[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]); else GetHomePos[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]); //GetHomePos[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]); //GetHomePos[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]); //GetHomePos[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]); //GetHomePos[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]); } if (HSI_STATUS_NORMAL != HomeFindIndex()) { return HSI_STATUS_FAILED; } int SavePos[5] = { 0 }; if (m_SO7_Serial.m_RecvData[0] == 2) { SavePos[1] = (m_SO7_Serial.m_RecvData[41] << 24 | m_SO7_Serial.m_RecvData[42] << 16 | m_SO7_Serial.m_RecvData[43] << 8 | m_SO7_Serial.m_RecvData[44]); SavePos[2] = (m_SO7_Serial.m_RecvData[45] << 24 | m_SO7_Serial.m_RecvData[46] << 16 | m_SO7_Serial.m_RecvData[47] << 8 | m_SO7_Serial.m_RecvData[48]); SavePos[3] = (m_SO7_Serial.m_RecvData[49] << 24 | m_SO7_Serial.m_RecvData[50] << 16 | m_SO7_Serial.m_RecvData[51] << 8 | m_SO7_Serial.m_RecvData[52]); SavePos[4] = (m_SO7_Serial.m_RecvData[53] << 24 | m_SO7_Serial.m_RecvData[54] << 16 | m_SO7_Serial.m_RecvData[55] << 8 | m_SO7_Serial.m_RecvData[56]); } double PrinfPos[5] = { 0 }; PrinfPos[1] = SavePos[1] * m_Resolution[1]; PrinfPos[2] = SavePos[2] * m_Resolution[2]; PrinfPos[3] = SavePos[3] * m_Resolution[3]; PrinfPos[4] = SavePos[4] * m_Resolution[4]; g_pLogger->SendAndFlushWithTime(L"[HomeMachine] SavePos[1] = %d,SavePos[2] = %d,SavePos[3] = %d,SavePos[4] = %d\n", SavePos[1], SavePos[2], SavePos[3], SavePos[4]); g_pLogger->SendAndFlushWithTime(L"[HomeMachine] PrinfPos[1] = %.4f,PrinfPos[2] = %.4f,PrinfPos[3] = %.4f,PrinfPos[4] = %.4f\n", PrinfPos[1], PrinfPos[2], PrinfPos[3], PrinfPos[4]); int LastPos[5] = { 0 }; if (m_SO7_Serial.m_RecvData[0] == 2) { LastPos[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]); LastPos[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]); LastPos[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]); LastPos[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_Thread_State = HSI_THREAD_RUNNING; g_pLogger->SendAndFlushWithTime(L"[HomeMachine] SetPositionXyz\n"); double PrinfMovePos[5] = { 0 }; PrinfMovePos[1] = (GetHomePos[1] - SavePos[1])*m_Resolution[1]; PrinfMovePos[2] = (GetHomePos[2] - SavePos[2])*m_Resolution[2]; PrinfMovePos[3] = (GetHomePos[3] - SavePos[3])*m_Resolution[3]; PrinfMovePos[4] = (GetHomePos[4] - SavePos[4])*m_Resolution[4]; g_pLogger->SendAndFlushWithTime(L"[HomeMachine] SetPos[1] = %.4fmm,SetPos[2] = %.4fmm,SetPos[3] = %.4fmm,SetPos[4] = %.4fmm\n", PrinfMovePos[1], PrinfMovePos[2], PrinfMovePos[3], PrinfMovePos[4]); if (m_DeviceType == 0 || m_DeviceType == 1) { for (short i = 1; i < 5; i++) { if (m_Home_Machine_Axis[i] == 0) { PrinfMovePos[i] = GetHomePos[i] * m_Resolution[i]; } } Sleep(20); SetPositionXyza(0, PrinfMovePos[1], PrinfMovePos[2], PrinfMovePos[3], PrinfMovePos[4], HSI_MOTION_MOVE_WAIT, 0); } CurrentHomeMachineState = E_EF3_HOME_FINISHED; for (int AxisTypes = 1; AxisTypes <= 8;) { if (CurrentHomeMachineState == E_EF3_HOME_FINISHED) { byte AxisNumber = (byte)AxisConvertIndex(AxisTypes); m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = SOFT_LIMIT_POS_NEG; m_cSendData[4] = (int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) & 0xff; m_cSendData[5] = ((int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 8) & 0xff; m_cSendData[6] = ((int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 16) & 0xff; m_cSendData[7] = ((int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 24) & 0xff; m_cSendData[8] = (int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) & 0xff; m_cSendData[9] = ((int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 8) & 0xff; m_cSendData[10] = ((int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 16) & 0xff; m_cSendData[11] = ((int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 24) & 0xff; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(10); AxisTypes = 2 * AxisTypes; g_pLogger->SendAndFlushWithTime(L"[HomeMachine] 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]); } } //SetPositionXyz(0, -10,-10,-10, HSI_MOTION_MOVE_NOWAIT, 0); //Sleep(100); //SetPositionXyz(0, PrinfMovePos[1], PrinfMovePos[2], PrinfMovePos[3], HSI_MOTION_MOVE_NOWAIT, 0); g_pLogger->SendAndFlushWithTime(L"[HomeMachine] Out\n"); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::HomeJog(short AxisNumber, short Dir, bool Wait) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[HomeJog] In\n"); g_pLogger->SendAndFlushWithTime(L"[HomeJog] Out\n"); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::HomeFindIndex() { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[HomeFindIndex] In\n"); int AxisTypes = 1; int AxisAll = 0; g_IsClose = false; g_pLogger->SendAndFlushWithTime(L"[HomeFindIndex] Limit no Enable\n"); ZeroPos(true); for (short i = 1; i < 5; i++) { if (m_Home_Machine_Axis[i] == 1) { AxisTypes = IndexConvertAxis(i); //无效软限位 m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = SOFT_LIMIT_POS_NEG; m_cSendData[4] = 0; m_cSendData[5] = 0; m_cSendData[6] = 0; m_cSendData[7] = 0; m_cSendData[8] = 0; m_cSendData[9] = 0; m_cSendData[10] = 0; m_cSendData[11] = 0; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(10); int DriveSpeed(1); int StartSpeed(1); int AccLine(1); int DecLine(1); int AccCurve(1); int DecCurve(1); m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = HOME_LIMIT_SPEED_ACC_DEC; HomeJogGearsChoice(i, m_Home_AddJogGears[i], DriveSpeed, StartSpeed, AccLine, DecLine, AccCurve, DecCurve); m_cSendData[4] = (StartSpeed & 0xff); m_cSendData[5] = ((StartSpeed >> 8) & 0xff); m_cSendData[6] = ((StartSpeed >> 16) & 0xff); m_cSendData[7] = ((StartSpeed >> 24) & 0xff); m_cSendData[8] = (DriveSpeed & 0xff); m_cSendData[9] = ((DriveSpeed >> 8) & 0xff); m_cSendData[10] = ((DriveSpeed >> 16) & 0xff); m_cSendData[11] = ((DriveSpeed >> 24) & 0xff); m_cSendData[12] = (AccCurve & 0xff); m_cSendData[13] = ((AccCurve >> 8) & 0xff); m_cSendData[14] = ((AccCurve >> 16) & 0xff); m_cSendData[15] = ((AccCurve >> 24) & 0xff); m_cSendData[16] = (AccLine & 0xff); m_cSendData[17] = ((AccLine >> 8) & 0xff); m_cSendData[18] = ((AccLine >> 16) & 0xff); m_cSendData[19] = ((AccLine >> 24) & 0xff); m_cSendData[20] = (DecCurve & 0xff); m_cSendData[21] = ((DecCurve >> 8) & 0xff); m_cSendData[22] = ((DecCurve >> 16) & 0xff); m_cSendData[23] = ((DecCurve >> 24) & 0xff); m_cSendData[24] = (DecLine & 0xff); m_cSendData[25] = ((DecLine >> 8) & 0xff); m_cSendData[26] = ((DecLine >> 16) & 0xff); m_cSendData[27] = ((DecLine >> 24) & 0xff); m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); g_pLogger->SendAndFlushWithTime(L"[HomeFindIndex] m_Home_Speed_High Go Limit\n"); Sleep(10); m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = HOME_ORG_SPEED_ACC_DEC; HomeJogGearsChoice(i, m_Home_DecJogGears[i], DriveSpeed, StartSpeed, AccLine, DecLine, AccCurve, DecCurve); m_cSendData[4] = (StartSpeed & 0xff); m_cSendData[5] = ((StartSpeed >> 8) & 0xff); m_cSendData[6] = ((StartSpeed >> 16) & 0xff); m_cSendData[7] = ((StartSpeed >> 24) & 0xff); m_cSendData[8] = (DriveSpeed & 0xff); m_cSendData[9] = ((DriveSpeed >> 8) & 0xff); m_cSendData[10] = ((DriveSpeed >> 16) & 0xff); m_cSendData[11] = ((DriveSpeed >> 24) & 0xff); m_cSendData[12] = (AccCurve & 0xff); m_cSendData[13] = ((AccCurve >> 8) & 0xff); m_cSendData[14] = ((AccCurve >> 16) & 0xff); m_cSendData[15] = ((AccCurve >> 24) & 0xff); m_cSendData[16] = (AccLine & 0xff); m_cSendData[17] = ((AccLine >> 8) & 0xff); m_cSendData[18] = ((AccLine >> 16) & 0xff); m_cSendData[19] = ((AccLine >> 24) & 0xff); m_cSendData[20] = (DecCurve & 0xff); m_cSendData[21] = ((DecCurve >> 8) & 0xff); m_cSendData[22] = ((DecCurve >> 16) & 0xff); m_cSendData[23] = ((DecCurve >> 24) & 0xff); m_cSendData[24] = (DecLine & 0xff); m_cSendData[25] = ((DecLine >> 8) & 0xff); m_cSendData[26] = ((DecLine >> 16) & 0xff); m_cSendData[27] = ((DecLine >> 24) & 0xff); m_cSendData[28] = (m_Home_Time[i] & 0xff); m_cSendData[29] = ((m_Home_Time[i] >> 8) & 0xff); m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); g_pLogger->SendAndFlushWithTime(L"[HomeFindIndex] m_Home_Speed_High Go Limit and find index signal\n"); Sleep(10); AxisAll += (1 << (i - 1)); } } m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_GOHOME; m_cSendData[2] = AxisAll; m_cSendData[3] = 0x53; m_cSendData[4] = m_motorType & 0xff; m_cSendData[5] = 0x0f; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); g_pLogger->SendAndFlushWithTime(L"[HomeFindIndex] Starting, AxisAll = %d\n", AxisAll); Sleep(1000); int Count = 0; do { DoEvents(); if (g_IsClose) { g_IsClose = false; return HSI_STATUS_FAILED; } Sleep(1); if (m_SO7_Serial.m_RecvData[0] == 2) { if (m_SO7_Serial.m_RecvData[38] & 16) { g_pLogger->SendAndFlushWithTime(L"[HomeFindIndex] Go Home Motion Done\n"); break; } } if (m_bEmergencyState) { AfxMessageBox(_T("急停或安全门或安全光幕触发!")); return HSI_STATUS_FAILED; } if (Count > 25000) { g_pLogger->SendAndFlushWithTime(L"[HomeFindIndex] Go Home Timeout HSI_STATUS_FAILED\n"); AbortMotion(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "回家超时"); EventCallback(sEvenProp); return HSI_STATUS_FAILED; } Count++; } while (true); char MessageHome[100] = ""; bool bHomed = true; if ((m_SO7_Serial.m_RecvData[38] & 0x01) == 0 && m_Home_Machine_Axis[1] == 1) { strcat_s(MessageHome, 30, "1、"); bHomed = false; } if ((m_SO7_Serial.m_RecvData[38] & 0x02) == 0 && m_Home_Machine_Axis[2] == 1) { strcat_s(MessageHome, 30, "2、"); bHomed = false; } if ((m_SO7_Serial.m_RecvData[38] & 0x04) == 0 && m_Home_Machine_Axis[3] == 1) { strcat_s(MessageHome, 30, "3、"); bHomed = false; } if ((m_SO7_Serial.m_RecvData[38] & 0x08) == 0 && m_Home_Machine_Axis[4] == 1) { strcat_s(MessageHome, 30, "4、"); bHomed = false; } if (!bHomed) { sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcat_s(MessageHome, 100, "轴回家失败!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, MessageHome); EventCallback(sEvenProp); return HSI_STATUS_FAILED; } g_pLogger->SendAndFlushWithTime(L"[HomeFindIndex] Go Home Success\n"); g_pLogger->SendAndFlushWithTime(L"[HomeFindIndex] Out\n"); } return rStatus; } //=========================================================================== void HSI_Motion::HomeJogGearsChoice(int AxisTypes, int JogGears, int &DriveSpeed, int &StartSpeed, int &AccLine, int &DecLine, int &AccCurve, int &DecCurve) { DriveSpeed = m_JogDriveSpeed[AxisTypes][4 - JogGears]; StartSpeed = m_JogStartSpeed[AxisTypes][4 - JogGears]; AccLine = m_JogAccLine[AxisTypes][4 - JogGears]; DecLine = m_JogDecLine[AxisTypes][4 - JogGears]; AccCurve = m_JogAccCurve[AxisTypes][4 - JogGears]; DecCurve = m_JogDecCurve[AxisTypes][4 - JogGears]; } //=========================================================================== HSI_STATUS HSI_Motion::GetAppPath(CString &Path) { auto rStatus = HSI_STATUS_NORMAL; Path = _T(""); if (Path.IsEmpty()) { CString tmpPath; GetModuleFileName(NULL, tmpPath.GetBuffer(255), 255); tmpPath.ReleaseBuffer(); tmpPath.TrimRight(); int nLastSlash = tmpPath.ReverseFind('\\'); if (nLastSlash >= 0) tmpPath = tmpPath.Left(nLastSlash); else tmpPath.Empty(); Path = tmpPath; } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::IsHomed(bool &bHomed) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[IsHomed] In\n"); short isHomed[5] = { 1, 1, 1, 1, 1 }; //int Count = 0; //if (bHomed == true)//定位是增大判断精度 //{ // Count = 1000; //} //所有轴都不需要回家 if (m_Home_Machine_Axis[1] == 0 && m_Home_Machine_Axis[2] == 0 && m_Home_Machine_Axis[3] == 0 && m_Home_Machine_Axis[4] == 0) { g_pLogger->SendAndFlushWithTime(L"[IsHomed] No Axis Go Home E_GTS_HOME_FINISHED\n"); CurrentHomeMachineState = E_EF3_HOME_FINISHED; bHomed = true; return HSI_STATUS_NORMAL; } //判断是否需要回家 int Delay = 0; while (m_SO7_Serial.m_RecvData[0] != 2) { DoEvents(); Sleep(1); if (m_SO7_Serial.m_RecvData[0] == 2) { g_pLogger->SendAndFlushWithTime(L"[IsHomed] normal break Delay = %d\n", Delay); break; } if (Delay > 300) { g_pLogger->SendAndFlushWithTime(L"[IsHomed] timeout break Delay = %d\n", Delay); break; } Delay++; } for (short i = 1; i < 5; i++) { if (m_Home_Machine_Axis[i] == 1) { if (m_SO7_Serial.m_RecvData[0] == 2) { isHomed[i] = (m_SO7_Serial.m_RecvData[38] & m_AxisHex[i] ? 1 : 0); } else { isHomed[i] = 0; } } } if (isHomed[1] == 1 && isHomed[2] == 1 && isHomed[3] == 1 && isHomed[4] == 1) { g_pLogger->SendAndFlushWithTime(L"[IsHomed] E_GTS_HOME_FINISHED\n"); CurrentHomeMachineState = E_EF3_HOME_FINISHED; bHomed = true; } else { g_pLogger->SendAndFlushWithTime(L"[IsHomed] Is No Go Home E_GTS_HOME_NONE\n"); CurrentHomeMachineState = E_EF3_HOME_NONE; bHomed = false; } g_pLogger->SendAndFlushWithTime(L"[IsHomed] Out\n"); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::ZeroPos(bool bZeroPos) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[ZeroPos] In\n"); if (bZeroPos == true) { m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AXIS_X; m_cSendData[3] = POS_CLEAR; Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(8); m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AXIS_Y; m_cSendData[3] = POS_CLEAR; Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(8); m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AXIS_Z; m_cSendData[3] = POS_CLEAR; Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(8); m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AXIS_U; m_cSendData[3] = POS_CLEAR; Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(8); g_pLogger->SendAndFlushWithTime(L"[ZeroPos] All Pos ZeroPos\n"); } m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AXIS_X; m_cSendData[3] = HOME_CLEAR; Send_Command(0, (const char*)m_cSendData, m_SendDataLength); g_pLogger->SendAndFlushWithTime(L"[ZeroPos] All HomeFlag ZeroPos\n"); g_pLogger->SendAndFlushWithTime(L"[ZeroPos] Out\n"); } return rStatus; } //===============================JOG模式============================================ 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); } 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 = (byte)AxisConvertIndex(AxisTypes); jogAxisNum = AxisNumber; jogDirFlag = bJOGDir; m_Thread_State = HSI_THREAD_PAUSED; if (CurrentHomeMachineState == E_EF3_HOME_FINISHED) { m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = SOFT_LIMIT_POS_NEG; m_cSendData[4] = (int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) & 0xff;//正限位 m_cSendData[5] = ((int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 8) & 0xff; m_cSendData[6] = ((int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 16) & 0xff; m_cSendData[7] = ((int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 24) & 0xff; m_cSendData[8] = (int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) & 0xff; //负限位 m_cSendData[9] = ((int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 8) & 0xff; m_cSendData[10] = ((int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 16) & 0xff; m_cSendData[11] = ((int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 24) & 0xff; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); 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 { //无效软限位 m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = SOFT_LIMIT_POS_NEG; m_cSendData[4] = 0; m_cSendData[5] = 0; m_cSendData[6] = 0; m_cSendData[7] = 0; m_cSendData[8] = 0; m_cSendData[9] = 0; m_cSendData[10] = 0; m_cSendData[11] = 0; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); g_pLogger->SendAndFlushWithTime(L"[Jog] Limit No Enable\n"); } if (m_Home_Machine_Axis[AxisNumber] == 0) { return rStatus; } 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)); if (m_DeviceType != 3) { if (AxisTypes == AXIS_X && m_motorType & 0x01) { if (!bJOGDir)//负方向 { RemainPul = (int)(now_pos[1] / m_Resolution[1]) - (int)(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 = (int)(m_P_Work_Limit[1] / m_Resolution[1]) - (int)(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 = (int)(now_pos[2] / m_Resolution[2]) - (int)(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 = (int)(m_P_Work_Limit[2] / m_Resolution[2]) - (int)(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 = (int)(now_pos[3] / m_Resolution[3]) - (int)(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 = (int)(m_P_Work_Limit[3] / m_Resolution[3]) - (int)(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; } } } } if (AxisTypes == AXIS_U && m_motorType & 0x08) { if (!bJOGDir)//负方向 { RemainPul = (int)(now_pos[4] / m_Resolution[4]) - (int)(m_N_Work_Limit[4] / m_Resolution[4]); 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 = (int)(m_P_Work_Limit[4] / m_Resolution[4]) - (int)(now_pos[4] / m_Resolution[4]); limitSDPul = (DriveSpeed - StartSpeed) * 13; if ((RemainPul < limitSDPul * 2) && (RemainPul>0)) { float SpeedRatio = limitSDPul * 2 / RemainPul; DriveSpeed = DriveSpeed / SpeedRatio; if (DriveSpeed < StartSpeed) { DriveSpeed = StartSpeed; } } } } } m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = JOG_SPEED_ACC_DEC; m_cSendData[4] = (StartSpeed & 0xff); m_cSendData[5] = ((StartSpeed >> 8) & 0xff); m_cSendData[6] = ((StartSpeed >> 16) & 0xff); m_cSendData[7] = ((StartSpeed >> 24) & 0xff); m_cSendData[8] = (DriveSpeed & 0xff); m_cSendData[9] = ((DriveSpeed >> 8) & 0xff); m_cSendData[10] = ((DriveSpeed >> 16) & 0xff); m_cSendData[11] = ((DriveSpeed >> 24) & 0xff); m_cSendData[12] = (AccCurve & 0xff); m_cSendData[13] = ((AccCurve >> 8) & 0xff); m_cSendData[14] = ((AccCurve >> 16) & 0xff); m_cSendData[15] = ((AccCurve >> 24) & 0xff); m_cSendData[16] = (AccLine & 0xff); m_cSendData[17] = ((AccLine >> 8) & 0xff); m_cSendData[18] = ((AccLine >> 16) & 0xff); m_cSendData[19] = ((AccLine >> 24) & 0xff); m_cSendData[20] = (DecCurve & 0xff); m_cSendData[21] = ((DecCurve >> 8) & 0xff); m_cSendData[22] = ((DecCurve >> 16) & 0xff); m_cSendData[23] = ((DecCurve >> 24) & 0xff); m_cSendData[24] = (DecLine & 0xff); m_cSendData[25] = ((DecLine >> 8) & 0xff); m_cSendData[26] = ((DecLine >> 16) & 0xff); m_cSendData[27] = ((DecLine >> 24) & 0xff); jogspeed = DriveSpeed; if ((StartSpeed < 250) && (DriveSpeed < 6)) { m_IsUseJerk = 1; } else { m_IsUseJerk = 0; } m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); m_cSendData[0] = CT_MOTOR; if (AxisNumber == 1 || AxisNumber == 2) { if (!bJOGDir)//方向 { m_cSendData[1] = CT_START_JOG_NEG; } else { m_cSendData[1] = CT_START_JOG_POS; } } else { if (bJOGDir)//方向 { m_cSendData[1] = CT_START_JOG_POS; } else { m_cSendData[1] = CT_START_JOG_NEG; } } m_cSendData[2] = AxisTypes; m_cSendData[3] = 0x53; t_start = GetTickCount(); m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); jogMoving = true; g_pLogger->SendAndFlushWithTime(L"[Jog] Out,bJOGDir = %d\n", bJOGDir); } return rStatus; } //JOG模式 //=========================================================================== HSI_STATUS HSI_Motion::JoyStick(UINT AxisTypes, long Speed) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { if (m_DeviceType != 3) { 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 = (byte)AxisConvertIndex(AxisTypes); jogAxisNum = AxisNumber; jogDirFlag = bJOGDir; m_Thread_State = HSI_THREAD_PAUSED; if (CurrentHomeMachineState == E_EF3_HOME_FINISHED) { m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = SOFT_LIMIT_POS_NEG; m_cSendData[4] = (int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) & 0xff; m_cSendData[5] = ((int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 8) & 0xff; m_cSendData[6] = ((int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 16) & 0xff; m_cSendData[7] = ((int)(m_P_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 24) & 0xff; m_cSendData[8] = (int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) & 0xff; m_cSendData[9] = ((int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 8) & 0xff; m_cSendData[10] = ((int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 16) & 0xff; m_cSendData[11] = ((int)(m_N_Work_Limit[AxisNumber] / m_Resolution[AxisNumber]) >> 24) & 0xff; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); 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 { //无效软限位 m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = SOFT_LIMIT_POS_NEG; m_cSendData[4] = 0; m_cSendData[5] = 0; m_cSendData[6] = 0; m_cSendData[7] = 0; m_cSendData[8] = 0; m_cSendData[9] = 0; m_cSendData[10] = 0; m_cSendData[11] = 0; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); g_pLogger->SendAndFlushWithTime(L"[Jog] Limit No Enable\n"); } if (m_Home_Machine_Axis[AxisNumber] == 0) { return rStatus; } 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); long lSpeed = abs(Speed); if (!abs(SpeedPercentJoyStick(AxisNumber, lSpeed, DriveSpeed, StartSpeed, AccLine, DecLine, AccCurve, DecCurve))) { return rStatus; } if (m_DeviceType != 3) { if (AxisTypes == AXIS_X && m_motorType & 0x01) { if (!bJOGDir)//负方向 { RemainPul = (int)(now_pos[1] / m_Resolution[1]) - (int)(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 = (int)(m_P_Work_Limit[1] / m_Resolution[1]) - (int)(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 = (int)(now_pos[2] / m_Resolution[2]) - (int)(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 = (int)(m_P_Work_Limit[2] / m_Resolution[2]) - (int)(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 = (int)(now_pos[3] / m_Resolution[3]) - (int)(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 = (int)(m_P_Work_Limit[3] / m_Resolution[3]) - (int)(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; } } } } if (AxisTypes == AXIS_U && m_motorType & 0x08) { if (!bJOGDir)//负方向 { RemainPul = (int)(now_pos[4] / m_Resolution[4]) - (int)(m_N_Work_Limit[4] / m_Resolution[4]); 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 = (int)(m_P_Work_Limit[4] / m_Resolution[4]) - (int)(now_pos[4] / m_Resolution[4]); limitSDPul = (DriveSpeed - StartSpeed) * 13; if ((RemainPul < limitSDPul * 2) && (RemainPul>0)) { float SpeedRatio = limitSDPul * 2 / RemainPul; DriveSpeed = DriveSpeed / SpeedRatio; if (DriveSpeed < StartSpeed) { DriveSpeed = StartSpeed; } } } } } m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_MOTOR_SET; m_cSendData[2] = AxisTypes; m_cSendData[3] = JOG_SPEED_ACC_DEC; m_cSendData[4] = (StartSpeed & 0xff); m_cSendData[5] = ((StartSpeed >> 8) & 0xff); m_cSendData[6] = ((StartSpeed >> 16) & 0xff); m_cSendData[7] = ((StartSpeed >> 24) & 0xff); m_cSendData[8] = (DriveSpeed & 0xff); m_cSendData[9] = ((DriveSpeed >> 8) & 0xff); m_cSendData[10] = ((DriveSpeed >> 16) & 0xff); m_cSendData[11] = ((DriveSpeed >> 24) & 0xff); m_cSendData[12] = (AccCurve & 0xff); m_cSendData[13] = ((AccCurve >> 8) & 0xff); m_cSendData[14] = ((AccCurve >> 16) & 0xff); m_cSendData[15] = ((AccCurve >> 24) & 0xff); m_cSendData[16] = (AccLine & 0xff); m_cSendData[17] = ((AccLine >> 8) & 0xff); m_cSendData[18] = ((AccLine >> 16) & 0xff); m_cSendData[19] = ((AccLine >> 24) & 0xff); m_cSendData[20] = (DecCurve & 0xff); m_cSendData[21] = ((DecCurve >> 8) & 0xff); m_cSendData[22] = ((DecCurve >> 16) & 0xff); m_cSendData[23] = ((DecCurve >> 24) & 0xff); m_cSendData[24] = (DecLine & 0xff); m_cSendData[25] = ((DecLine >> 8) & 0xff); m_cSendData[26] = ((DecLine >> 16) & 0xff); m_cSendData[27] = ((DecLine >> 24) & 0xff); jogspeed = DriveSpeed; if ((StartSpeed < 250) && (DriveSpeed < 6)) { m_IsUseJerk = 1; } else { m_IsUseJerk = 0; } m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); m_cSendData[0] = CT_MOTOR; if (AxisNumber == 1 || AxisNumber == 2) { if (!bJOGDir)//方向 { m_cSendData[1] = CT_START_JOG_NEG; } else { m_cSendData[1] = CT_START_JOG_POS; } } else { if (bJOGDir)//方向 { m_cSendData[1] = CT_START_JOG_POS; } else { m_cSendData[1] = CT_START_JOG_NEG; } } m_cSendData[2] = AxisTypes; m_cSendData[3] = 0x53; t_start = GetTickCount(); m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); jogMoving = true; g_pLogger->SendAndFlushWithTime(L"[Jog] Out,bJOGDir = %d\n", bJOGDir); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::StopJog() { 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) { WaitForSingleObject(g_Lock_JogAndTrigger, INFINITE); auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { byte AxisNumber = (byte)IndexConvertAxis(AxisTypes); 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] = AxisNumber; 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; for (int i = 0; i < 5; i++) { m_WriteByte = Send_Command(0, (const char*)m_SendJogData, m_SendDataLength); Sleep(5); } } else { m_SendJogData[0] = CT_MOTOR; m_SendJogData[1] = CT_STOP; m_SendJogData[2] = AxisNumber; 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; for (int i = 0; i < 5; i++) { m_WriteByte = Send_Command(0, (const char*)m_SendJogData, m_SendDataLength); Sleep(5); } } m_Thread_StateJOGStop = HSI_THREAD_PAUSED; g_pLogger->SendAndFlushWithTime(L"[StopJog] Out\n"); ReleaseMutex(g_Lock_JogAndTrigger); } return rStatus; } //=========================================================================== int HSI_Motion::P2P(short AxisNumber, long Pos, double Speed, double Acc) { if (g_pHSI_Motion) { } return 0; } //=========================================================================== //运动控制部分 //=========================================================================== 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; } //=========================================================================== HSI_STATUS HSI_Motion::GetPositionXyz(UINT AxisTypes, double &PositionX, double &PositionY, double &PositionZ, double &Time) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(AxisTypes); //读取3个轴的位置 CString tempStr; if (g_pHSI_Motion) { if (m_SO7_Serial.m_RecvData[0] == 2) { 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_PosForAllAxis[1] = PositionX; m_PosForAllAxis[2] = PositionY; m_PosForAllAxis[3] = PositionZ; } else { PositionX = m_EncPos[1]; PositionY = m_EncPos[2]; PositionZ = m_EncPos[3]; m_PosForAllAxis[1] = m_EncPos[1]; 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; } //=========================================================================== HSI_STATUS HSI_Motion::GetEncoderXyz(long *lEncoderVal) { auto rStatus = HSI_STATUS_NORMAL; //读取3个轴的编码器值 if (g_pHSI_Motion) { if (m_SO7_Serial.m_RecvData[0] == 2) { if (m_DeviceType != 1) { if (m_IsHavePattern & 0x01) lEncoderVal[0] = (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]); else lEncoderVal[0] = (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]); if (m_IsHavePattern & 0x02) lEncoderVal[1] = (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]); else lEncoderVal[1] = (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]); if (m_IsHavePattern & 0x04) lEncoderVal[2] = (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]); else lEncoderVal[2] = (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]); } else { lEncoderVal[0] = (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]); lEncoderVal[1] = (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]); lEncoderVal[2] = (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]); } } else { auto rStatus = HSI_STATUS_FAILED; g_pLogger->SendAndFlushWithTime(L"[GetEncoderXyz] failed\n"); } } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::GetPositionXyzaProbe(UINT AxisTypes, double &PositionX, double &PositionY, double &PositionZ, double &PositionA) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(AxisTypes); if (g_pHSI_Motion) { PositionX = m_LockPos[1]; PositionY = m_LockPos[2]; PositionZ = m_LockPos[3]; PositionA = m_LockPos[4]; } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double PositionY, double PositionZ, HSI_MOTION_MOVE_TYPE eType, double dFlyRadius) { WaitForSingleObject(g_WR_ToMove_Mutex, INFINITE); auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] In\n"); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] Pos[1] = %.4f,Pos[2] = %.4f,Pos[3] = %.4f\n", PositionX, PositionY, PositionZ); unsigned char send_pos_data[64] = { 0 }; axis_start = 0; unsigned char direct_pos = 0; unsigned char xyzAxis = 0; if (CurrentMotionState != E_SO7_MOTION_MOVETO) { CurrentMotionState = E_SO7_MOTION_MOVETO; LimitOver(HSI_MOTION_AXIS_X, PositionX); LimitOver(HSI_MOTION_AXIS_Y, PositionY); LimitOver(HSI_MOTION_AXIS_Z, PositionZ); LimitOver(HSI_MOTION_AXIS_R, m_PositionA); m_PosThread[1] = PositionX; m_PosThread[2] = PositionY; m_PosThread[3] = PositionZ; m_PosThread[4] = m_PositionA; targetpos_n[1] = PositionX; targetpos_n[2] = PositionY; targetpos_n[3] = PositionZ; targetpos_n[4] = m_PositionA; int Pos_t[5] = { 0 }; int Pos_n[5] = { 0 }; int Pos[5] = { 0 }; int NowPos[5] = { 0 }; int target_pos[5] = { 0 }; if (m_SO7_Serial.m_RecvData[0] == 2) { if (m_DeviceType != 1) { if (m_IsHavePattern & 0x01 == 0x01) NowPos[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]); else NowPos[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]); if (m_IsHavePattern & 0x02) NowPos[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]); else NowPos[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]); if (m_IsHavePattern & 0x04) NowPos[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]); else NowPos[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]); if (m_IsHavePattern & 0x08) NowPos[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]); else NowPos[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]); } else { NowPos[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]); NowPos[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]); NowPos[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]); NowPos[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]); } //NowPos[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]); //NowPos[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]); //NowPos[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]); //NowPos[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]); Pos_t[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]); Pos_t[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]); Pos_t[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]); Pos_t[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]); } else { Pos_t[1] = NowPos[1] = (int)(m_EncPos[1] / m_Resolution[1]); Pos_t[2] = NowPos[2] = (int)(m_EncPos[2] / m_Resolution[2]); Pos_t[3] = NowPos[3] = (int)(m_EncPos[3] / m_Resolution[3]); Pos_t[4] = NowPos[4] = (int)(m_EncPos[4] / m_Resolution[4]); } if (m_motorType & 0x01) //步进电机 Pos[1] = (int)(PositionX / m_Resolution[1]) - NowPos[1]; else Pos[1] = (int)(PositionX / m_Resolution[1]) - Pos_t[1]; if (m_motorType & 0x02) //步进电机 Pos[2] = (int)(PositionX / m_Resolution[2]) - NowPos[2]; else Pos[2] = (int)(PositionY / m_Resolution[2]) - Pos_t[2]; if (m_motorType & 0x04) //步进电机 Pos[3] = (int)(PositionX / m_Resolution[3]) - NowPos[3]; else Pos[3] = (int)(PositionZ / m_Resolution[3]) - Pos_t[3]; if (m_motorType & 0x08) //步进电机 Pos[4] = (int)(PositionX / m_Resolution[4]) - NowPos[4]; else Pos[4] = (int)(m_PositionA / m_Resolution[4]) - Pos_t[4]; /*if (m_motorType==1) { if (m_IsUse_HSICompensation) { } else { Pos[1] = (int)(PositionX / m_Resolution[1]) - NowPos[1]; Pos[2] = (int)(PositionY / m_Resolution[2]) - NowPos[2]; Pos[3] = (int)(PositionZ / m_Resolution[3]) - NowPos[3]; Pos[4] = (int)(m_PositionA / m_Resolution[4]) - NowPos[4]; } } else { Pos_n[1] = (int)(targetpos_n[1] / m_Resolution[1]) - NowPos[1]; Pos_n[2] = (int)(targetpos_n[2] / m_Resolution[2]) - NowPos[2]; Pos_n[3] = (int)(targetpos_n[3] / m_Resolution[3]) - NowPos[3]; Pos_t[1] = (int)(targetpos_n[1] / m_Resolution[1]) - (int)(targetpos_l[1] / m_Resolution[1]); Pos_t[2] = (int)(targetpos_n[2] / m_Resolution[2]) - (int)(targetpos_l[2] / m_Resolution[1]); Pos_t[3] = (int)(targetpos_n[3] / m_Resolution[3]) - (int)(targetpos_l[3] / m_Resolution[1]); if (m_IsUse_HSICompensation) { for (int k = 1; k < 4; k++) { if (abs(Pos_n[k] - Pos_t[k]) > m_Compensation_Pluse) { Pos[k] = Pos_n[k]; } else { Pos[k] = Pos_t[k]; } if (abs(Pos[k]) < m_Compensation_Pluse) { Pos[k] = 0; } } } else { Pos[1] = (int)(PositionX / m_Resolution[1]) - NowPos[1]; Pos[2] = (int)(PositionY / m_Resolution[2]) - NowPos[2]; Pos[3] = (int)(PositionZ / m_Resolution[3]) - NowPos[3]; Pos[4] = (int)(m_PositionA / m_Resolution[4]) - NowPos[4]; } }*/ target_pos[1] = (int)(PositionX / m_Resolution[1]); target_pos[2] = (int)(PositionY / m_Resolution[2]); target_pos[3] = (int)(PositionZ / m_Resolution[3]); target_pos[4] = (int)(m_PositionA / m_Resolution[4]); begin_position[1] = target_pos[1]; begin_position[2] = target_pos[2]; begin_position[3] = target_pos[3]; begin_position[4] = target_pos[4]; float scale[4] = { 0 }; int Stepdriverspeed[5] = { 0 }; int StepStartspeed[5] = { 0 }; int StepAcc[5] = { 0 }; //if (Pos[1] > 0) direct_pos |= 0x01; //if (Pos[2] > 0) direct_pos |= 0x02; //if (Pos[3] > 0) direct_pos |= 0x04; if (abs(Pos[1]) > 2) axis_start |= 0x01; if (abs(Pos[2]) > 2) axis_start |= 0x02; if (abs(Pos[3]) > 2) axis_start |= 0x04; int MaxPos = abs(Pos[1]); for (int i = 2; i < 5; i++) { if (MaxPos < abs(Pos[i])) { MaxPos = abs(Pos[i]); } } //MaxPos = abs(MaxPos); scale[0] = abs(Pos[1]) / (float)MaxPos; scale[1] = abs(Pos[2]) / (float)MaxPos; scale[2] = abs(Pos[3]) / (float)MaxPos; scale[3] = abs(Pos[4]) / (float)MaxPos; g_pLogger->SendAndFlushWithTime(L"[SetPositionXyzNowPos] Pos[1] = %.4f,Pos[2] = %.4f,Pos[3] = %.4f,Pos[4] = %.4f\n", NowPos[1] * m_Resolution[1], NowPos[2] * m_Resolution[2], NowPos[3] * m_Resolution[3], NowPos[4] * m_Resolution[4]); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyzTagPos] Pos[1] = %.4f,Pos[2] = %.4f,Pos[3] = %.4f,Pos[4] = %.4f\n", PositionX, PositionY, PositionZ, m_PositionA); int stepinterpolation = 0x03; //if (!m_motorType) //{ // /*if ((stepinterpolation & 0x01) && m_IsUseManualRunin) // { // Stepdriverspeed[1] = m_SetPotion_DriveSpeed[1] * scale[0]; // if (Stepdriverspeed[1] < m_SetPotion_StartSpeed[1]) // { // Stepdriverspeed[1] = m_SetPotion_StartSpeed[1]; // } // } // else // { // Stepdriverspeed[1] = m_SetPotion_DriveSpeed[1]; // } // if ((stepinterpolation & 0x02) && m_IsUseManualRunin) // { // Stepdriverspeed[2] = m_SetPotion_DriveSpeed[2] * scale[1]; // if (Stepdriverspeed[2] < m_SetPotion_StartSpeed[2]) // { // Stepdriverspeed[2] = m_SetPotion_StartSpeed[2]; // } // } // else // { // Stepdriverspeed[2] = m_SetPotion_DriveSpeed[2]; // } // if ((stepinterpolation & 0x04) && m_IsUseManualRunin) // { // Stepdriverspeed[3] = m_SetPotion_DriveSpeed[3] * scale[2]; // if (Stepdriverspeed[3] < m_SetPotion_StartSpeed[3]) // { // Stepdriverspeed[3] = m_SetPotion_DriveSpeed[3]; // } // } // else // { // Stepdriverspeed[3] = m_SetPotion_DriveSpeed[3]; // } // if ((stepinterpolation & 0x08) && m_IsUseManualRunin) // { // Stepdriverspeed[4] = m_SetPotion_DriveSpeed[4] * scale[3]; // if (Stepdriverspeed[4] < m_SetPotion_StartSpeed[4]) // { // Stepdriverspeed[4] = m_SetPotion_DriveSpeed[4]; // } // } // else // { // Stepdriverspeed[4] = m_SetPotion_DriveSpeed[4]; // }*/ // for (int i = 1; i < 3; i++) // { // if (abs(Pos[i]) < m_stepPosition_Load[0]) // { // StepStartspeed[i] = m_stepPosition_L_speed[0]; // Stepdriverspeed[i] = m_stepPosition_H_speed[0]; // StepAcc[i] = m_stepPosition_acc[0]; // } // else if (abs(Pos[i]) < m_stepPosition_Load[1]) // { // StepStartspeed[i] = m_stepPosition_L_speed[1]; // Stepdriverspeed[i] = m_stepPosition_H_speed[1]; // StepAcc[i] = m_stepPosition_acc[1]; // } // else if (abs(Pos[i]) < m_stepPosition_Load[2]) // { // StepStartspeed[i] = m_stepPosition_L_speed[2]; // Stepdriverspeed[i] = m_stepPosition_H_speed[2]; // StepAcc[i] = m_stepPosition_acc[2]; // } // else if (abs(Pos[i]) < m_stepPosition_Load[3]) // { // StepStartspeed[i] = m_stepPosition_L_speed[3]; // Stepdriverspeed[i] = m_stepPosition_H_speed[3]; // StepAcc[i] = m_stepPosition_acc[3]; // } // else if (abs(Pos[i]) < m_stepPosition_Load[4]) // { // StepStartspeed[i] = m_stepPosition_L_speed[4]; // Stepdriverspeed[i] = m_stepPosition_H_speed[4]; // StepAcc[i] = m_stepPosition_acc[4]; // } // else if (abs(Pos[i]) < m_stepPosition_Load[5]) // { // StepStartspeed[i] = m_stepPosition_L_speed[5]; // Stepdriverspeed[i] = m_stepPosition_H_speed[5]; // StepAcc[i] = m_stepPosition_acc[5]; // } // else if (abs(Pos[i]) < m_stepPosition_Load[6]) // { // StepStartspeed[i] = m_stepPosition_L_speed[6]; // Stepdriverspeed[i] = m_stepPosition_H_speed[6]; // StepAcc[i] = m_stepPosition_acc[6]; // } // else if (abs(Pos[i]) < m_stepPosition_Load[7]) // { // StepStartspeed[i] = m_stepPosition_L_speed[7]; // Stepdriverspeed[i] = m_stepPosition_H_speed[7]; // StepAcc[i] = m_stepPosition_acc[7]; // } // else if (abs(Pos[i]) < m_stepPosition_Load[8]) // { // StepStartspeed[i] = m_stepPosition_L_speed[8]; // Stepdriverspeed[i] = m_stepPosition_H_speed[8]; // StepAcc[i] = m_stepPosition_acc[8]; // } // else if (abs(Pos[i]) < m_stepPosition_Load[9]) // { // StepStartspeed[i] = m_stepPosition_L_speed[9]; // Stepdriverspeed[i] = m_stepPosition_H_speed[9]; // StepAcc[i] = m_stepPosition_acc[9]; // } // else // { // StepStartspeed[i] = m_SetPotion_StartSpeed[i]; // Stepdriverspeed[i] = m_SetPotion_DriveSpeed[i]; // StepAcc[i] = m_SetPotion_Line[i]; // } // } // StepStartspeed[3] = m_SetPotion_StartSpeed[3]; // StepAcc[3] = m_SetPotion_Line[3]; // Stepdriverspeed[3] = m_SetPotion_DriveSpeed[3]; //} int axisCount = 4; if (fourthAxisFlag) { fourthAxisFlag = false; if (Pos[4] > 0) direct_pos |= 0x08; if (abs(Pos[4]) > 20) axis_start |= 0x08; axisCount = 5; xyzAxis = AXIS_XYZU; } else xyzAxis = AXIS_XYZ; for (int i = 1; i < axisCount; i++) { int time_out_send = 0; send_pos_data[0] = CT_MOTOR; send_pos_data[1] = CT_MOTOR_SET; send_pos_data[2] = 1 << (i - 1); send_pos_data[3] = POSITION_SPEED_ACC_DEC_POS; /*if (m_motorType == 1) {*/ send_pos_data[4] = (m_SetPotion_StartSpeed[i] & 0xff); send_pos_data[5] = ((m_SetPotion_StartSpeed[i] >> 8) & 0xff); send_pos_data[6] = ((m_SetPotion_StartSpeed[i] >> 16) & 0xff); send_pos_data[7] = ((m_SetPotion_StartSpeed[i] >> 24) & 0xff); if ((xyzAxis == AXIS_XYZU) && (m_IsUseFourthSpeed == 1)) { send_pos_data[8] = (m_SetPotion_DriveSpeed[4] & 0xff); send_pos_data[9] = ((m_SetPotion_DriveSpeed[4] >> 8) & 0xff); send_pos_data[10] = ((m_SetPotion_DriveSpeed[4] >> 16) & 0xff); send_pos_data[11] = ((m_SetPotion_DriveSpeed[4] >> 24) & 0xff); } else { send_pos_data[8] = (m_SetPotion_DriveSpeed[i] & 0xff); send_pos_data[9] = ((m_SetPotion_DriveSpeed[i] >> 8) & 0xff); send_pos_data[10] = ((m_SetPotion_DriveSpeed[i] >> 16) & 0xff); send_pos_data[11] = ((m_SetPotion_DriveSpeed[i] >> 24) & 0xff); } send_pos_data[12] = (m_SetPotion_Line[i] & 0xff); send_pos_data[13] = ((m_SetPotion_Line[i] >> 8) & 0xff); send_pos_data[14] = ((m_SetPotion_Line[i] >> 16) & 0xff); send_pos_data[15] = ((m_SetPotion_Line[i] >> 24) & 0xff); send_pos_data[16] = (m_SetPotion_Buffer[i] & 0xff); send_pos_data[17] = ((m_SetPotion_Buffer[i] >> 8) & 0xff); send_pos_data[18] = ((m_SetPotion_Buffer[i] >> 16) & 0xff); send_pos_data[19] = ((m_SetPotion_Buffer[i] >> 24) & 0xff); send_pos_data[28] = (target_pos[i] & 0xff); send_pos_data[29] = ((target_pos[i] >> 8) & 0xff); send_pos_data[30] = ((target_pos[i] >> 16) & 0xff); send_pos_data[31] = ((target_pos[i] >> 24) & 0xff); send_pos_data[32] = (Pos[i] & 0xff); send_pos_data[33] = ((Pos[i] >> 8) & 0xff); send_pos_data[34] = ((Pos[i] >> 16) & 0xff); send_pos_data[35] = ((Pos[i] >> 24) & 0xff); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] m_SetPotion_StartSpeed[%d] = %d,m_SetPotion_DriveSpeed[%d] = %d\n", i, m_SetPotion_StartSpeed[i], i, m_SetPotion_DriveSpeed[i]); //send_pos_data[32] = 0x21; /*}*/ /*else { send_pos_data[4] = (StepStartspeed[i] & 0xff); send_pos_data[5] = ((StepStartspeed[i] >> 8) & 0xff); send_pos_data[6] = ((StepStartspeed[i] >> 16) & 0xff); send_pos_data[7] = ((StepStartspeed[i] >> 24) & 0xff); send_pos_data[8] = (Stepdriverspeed[i] & 0xff); send_pos_data[9] = ((Stepdriverspeed[i] >> 8) & 0xff); send_pos_data[10] = ((Stepdriverspeed[i] >> 16) & 0xff); send_pos_data[11] = ((Stepdriverspeed[i] >> 24) & 0xff); send_pos_data[12] = (StepAcc[i] & 0xff); send_pos_data[13] = ((StepAcc[i] >> 8) & 0xff); send_pos_data[14] = ((StepAcc[i] >> 16) & 0xff); send_pos_data[15] = ((StepAcc[i] >> 24) & 0xff); send_pos_data[16] = (m_SetPotion_Buffer[i] & 0xff); send_pos_data[17] = ((m_SetPotion_Buffer[i] >> 8) & 0xff); send_pos_data[18] = ((m_SetPotion_Buffer[i] >> 16) & 0xff); send_pos_data[19] = ((m_SetPotion_Buffer[i] >> 24) & 0xff); send_pos_data[28] = (target_pos[i] & 0xff); send_pos_data[29] = ((target_pos[i] >> 8) & 0xff); send_pos_data[30] = ((target_pos[i] >> 16) & 0xff); send_pos_data[31] = ((target_pos[i] >> 24) & 0xff); send_pos_data[32] = (Pos[i] & 0xff); send_pos_data[33] = ((Pos[i] >> 8) & 0xff); send_pos_data[34] = ((Pos[i] >> 16) & 0xff); send_pos_data[35] = ((Pos[i] >> 24) & 0xff); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] m_SetPotion_StartSpeed[%d] = %d,m_SetPotion_DriveSpeed[%d] = %d\n", i, m_SetPotion_StartSpeed[i], i, m_SetPotion_DriveSpeed[i]); }*/ m_WriteByte = Send_Command(0, (const char*)send_pos_data, m_SendDataLength); Sleep(6); } while (m_SO7_Serial.m_RecvData[39]) { send_pos_data[0] = CT_ORDER; send_pos_data[1] = CT_POSFLAG_CLEAR; m_WriteByte = Send_Command(0, (const char*)send_pos_data, m_SendDataLength); Sleep(10); } Sleep(10); //启动插补和定位功能 /* if (m_motorType == 1) { send_pos_data[0] = CT_MOTOR; send_pos_data[1] = CT_START_POSITION; send_pos_data[2] = xyzAxis; send_pos_data[3] = 0x53; send_pos_data[4] = INTERPOLATION; } else {*/ send_pos_data[0] = CT_MOTOR; send_pos_data[1] = CT_START_POSITION; send_pos_data[2] = axis_start; send_pos_data[3] = 0x53; send_pos_data[4] = m_motorType & 0xff; /* }*/ for (int j = 1; j < axisCount; j++) { send_pos_data[9 + 4 * (j - 1)] = (target_pos[j] & 0xff); send_pos_data[10 + 4 * (j - 1)] = ((target_pos[j] >> 8) & 0xff); send_pos_data[11 + 4 * (j - 1)] = ((target_pos[j] >> 16) & 0xff); send_pos_data[12 + 4 * (j - 1)] = ((target_pos[j] >> 24) & 0xff); } //send_pos_data[25] = direct_pos; int stepmotoracc = 0; stepmotoracc = CaculateStepMotorACC(Pos[1], m_SetPotion_Line[1], 10); send_pos_data[25] = stepmotoracc; stepmotoracc = CaculateStepMotorACC(Pos[2], m_SetPotion_Line[2], 10); send_pos_data[26] = stepmotoracc; stepmotoracc = CaculateStepMotorACC(Pos[3], m_SetPotion_Line[3], 10); send_pos_data[27] = stepmotoracc; stepmotoracc = CaculateStepMotorACC(Pos[4], m_SetPotion_Line[4], 10); /*send_pos_data[25] = m_SetPotion_Line[1]; send_pos_data[26] = m_SetPotion_Line[2]; send_pos_data[27] = m_SetPotion_Line[3]; send_pos_data[28] = m_SetPotion_Line[4];*/ send_pos_data[29] = m_SpeedAdjustPeriod[1]; send_pos_data[30] = m_SpeedAdjustPeriod[2]; send_pos_data[31] = m_SpeedAdjustPeriod[3]; send_pos_data[32] = m_SpeedAdjustPeriod[4]; for (size_t i = 1; i < 5; i++) { Stepdriverspeed[i] = m_SetPotion_DriveSpeed[i] * m_Resolution[i] * 50; } send_pos_data[33] = (Stepdriverspeed[1] >> 8) & 0xff; send_pos_data[34] = Stepdriverspeed[1] & 0xff; send_pos_data[35] = (Stepdriverspeed[2] >> 8) & 0xff; send_pos_data[36] = Stepdriverspeed[2] & 0xff; send_pos_data[37] = (Stepdriverspeed[3] >> 8) & 0xff; send_pos_data[38] = Stepdriverspeed[3] & 0xff; send_pos_data[39] = (Stepdriverspeed[4] >> 8) & 0xff; send_pos_data[40] = Stepdriverspeed[4] & 0xff; if (bCircleRun) { bCircleRun = false; send_pos_data[1] = CT_CIRCLERUN_POSITION; send_pos_data[2] = 0x03; send_pos_data[4] = CIRCLER; for (size_t i = 1; i < 3; i++) { iCircleRunPnt[i] = iCircleRunPnt[i] - NowPos[i]; send_pos_data[26 + 4 * (i - 1)] = (iCircleRunPnt[i] & 0xff); send_pos_data[27 + 4 * (i - 1)] = ((iCircleRunPnt[i] >> 8) & 0xff); send_pos_data[28 + 4 * (i - 1)] = ((iCircleRunPnt[i] >> 16) & 0xff); send_pos_data[29 + 4 * (i - 1)] = ((iCircleRunPnt[i] >> 24) & 0xff); } } g_IsClose = false; m_WriteByte = Send_Command(0, (const char*)send_pos_data, m_SendDataLength); set_start = GetTickCount(); Sleep(3);// if (eType == HSI_MOTION_MOVE_NOWAIT) { g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] Nowait SetEvent\n"); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] Nowait move!\n"); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] Out Success Nowait\n"); m_IsExMotion = 0; bRunGlueDispenser = HSI_THREAD_PAUSED; m_Thread_State = HSI_THREAD_RUNNING; SetEvent(m_hTriggerEvent); } if (eType == HSI_MOTION_MOVE_WAIT) { g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] Out Success Wait Mode\n"); m_Thread_State = HSI_THREAD_RUNNING; m_IsExMotion = 0; UpdateMotionState(); m_Thread_State = HSI_THREAD_PAUSED; } } else { g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] HSI_STATUS_MOTION_MOVING\n"); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] Out\n"); rStatus = HSI_STATUS_MOTION_MOVING; } g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] Out\n"); targetpos_l[1] = PositionX; targetpos_l[2] = PositionY; targetpos_l[3] = PositionZ; } ReleaseMutex(g_WR_ToMove_Mutex); return rStatus; } //=========================================================================== int HSI_Motion::CaculateStepMotorACC(int pos, int maxacc, int minacc) { double mpos = (double)abs(pos) / 1000; int acc = (mpos * mpos) / 20 + mpos / 2 + 8; if (acc < minacc) acc = minacc; if (acc > maxacc) acc = maxacc; return acc; } //=========================================================================== HSI_STATUS HSI_Motion::SetPositionXyza(UINT AxisTypes, double PositionX, double PositionY, double PositionZ, double PositionA, HSI_MOTION_MOVE_TYPE eType, double dFlyRadius) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[SetPositionXyza] SetPositionXyza\n"); fourthAxisFlag = true; m_PositionA = PositionA; rStatus = SetPositionXyz(AxisTypes, PositionX, PositionY, PositionZ, eType, dFlyRadius); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetPositionXyzCache(UINT AxisTypes, HSI_MOTION_MOVE_TYPE eType, int DataCount, Point *CacheData) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"SetPositionXyzCache : start\n"); g_pLogger->SendAndFlushWithTime(L"SetPositionXyzCache : end\n"); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetCircleInterpolate(double PositionX, double PositionY, double PositionZ) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"SetCircleInterpolate : start\n"); bCircleRun = true; iCircleRunPnt[1] = (int)(PositionX / m_Resolution[1]); iCircleRunPnt[2] = (int)(PositionY / m_Resolution[2]); iCircleRunPnt[3] = (int)(PositionZ / m_Resolution[3]); g_pLogger->SendAndFlushWithTime(L"SetCircleInterpolate : end\n"); } return rStatus; } //===========================探针接口================================================ void HSI_Motion::ProbeRetractManDist(int RetractManDist) { if (g_pHSI_Motion) { m_cSendData[0] = 0x01; m_cSendData[1] = 23; m_cSendData[2] = (RetractManDist >> 24 & 0xff); m_cSendData[3] = ((RetractManDist >> 16) & 0xff); m_cSendData[4] = ((RetractManDist >> 8) & 0xff); m_cSendData[5] = ((RetractManDist)& 0xff); m_cSendData[6] = (m_ProbeReturnSpeed >> 8) & 0xff; m_cSendData[7] = m_ProbeReturnSpeed & 0xff; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(10); } } HSI_STATUS HSI_Motion::JogProbe(UINT AxisTypes, double Speed) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { while (m_SO7_Serial.m_RecvData[57]) { m_cSendData[0] = CT_ORDER; m_cSendData[1] = CT_POSFLAG_CLEAR; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(10); } unsigned char send_probe_data[64] = { 0 }; unsigned char motionAxis = 0; unsigned char motionDir = 0; for (size_t i = 0; i < 3; i++) { if ((i == 0) && (m_axisDirX != 0) || (i == 1) && (m_axisDirY != 0) || (i == 2) && (m_axisDirZ != 0)) { if ((m_axisDirX == 1) && (i == 0)) { motionAxis |= 0x01; motionDir |= 0x01; } else if ((i == 0) && (m_axisDirX == 2)) { motionAxis |= 0x01; } if ((m_axisDirY == 1) && (i == 1)) { motionAxis |= 0x02; motionDir |= 0x02; } else if ((i == 1) && (m_axisDirY == 2)) { motionAxis |= 0x02; } if ((m_axisDirZ == 1) && (i == 2)) { motionAxis |= 0x04; motionDir |= 0x04; } else if ((i == 2) && (m_axisDirZ == 2)) { motionAxis |= 0x04; } int DriveSpeed(1); int StartSpeed(1); int AccLine(1); int DecLine(1); int AccCurve(1); int DecCurve(1); int JogSpeed(1); byte AxisNumber = (byte)IndexConvertAxis(i + 1); m_Thread_State = HSI_THREAD_PAUSED; JogSpeed = abs(SpeedPercent(AxisNumber, Speed, DriveSpeed, StartSpeed, AccLine, DecLine, AccCurve, DecCurve)); send_probe_data[0] = CT_MOTOR; send_probe_data[1] = CT_MOTOR_SET; send_probe_data[2] = AxisNumber; send_probe_data[3] = JOG_SPEED_ACC_DEC; send_probe_data[4] = (StartSpeed & 0xff); send_probe_data[5] = ((StartSpeed >> 8) & 0xff); send_probe_data[6] = ((StartSpeed >> 16) & 0xff); send_probe_data[7] = ((StartSpeed >> 24) & 0xff); send_probe_data[8] = (m_probeSeekSpeed & 0xff); send_probe_data[9] = ((m_probeSeekSpeed >> 8) & 0xff); send_probe_data[10] = ((m_probeSeekSpeed >> 16) & 0xff); send_probe_data[11] = ((m_probeSeekSpeed >> 24) & 0xff); send_probe_data[12] = (AccCurve & 0xff); send_probe_data[13] = ((AccCurve >> 8) & 0xff); send_probe_data[14] = ((AccCurve >> 16) & 0xff); send_probe_data[15] = ((AccCurve >> 24) & 0xff); send_probe_data[16] = (AccLine & 0xff); send_probe_data[17] = ((AccLine >> 8) & 0xff); send_probe_data[18] = ((AccLine >> 16) & 0xff); send_probe_data[19] = ((AccLine >> 24) & 0xff); send_probe_data[20] = (DecCurve & 0xff); send_probe_data[21] = ((DecCurve >> 8) & 0xff); send_probe_data[22] = ((DecCurve >> 16) & 0xff); send_probe_data[23] = ((DecCurve >> 24) & 0xff); send_probe_data[24] = (DecLine & 0xff); send_probe_data[25] = ((DecLine >> 8) & 0xff); send_probe_data[26] = ((DecLine >> 16) & 0xff); send_probe_data[27] = ((DecLine >> 24) & 0xff); m_WriteByte = Send_Command(0, (const char*)send_probe_data, m_SendDataLength); Sleep(5); } } send_probe_data[0] = CT_MOTOR; send_probe_data[1] = CT_START_LATCH; send_probe_data[2] = motionAxis; send_probe_data[3] = motionDir; int returnPos = m_ProbeReturnPos / m_Resolution[AxisTypes]; send_probe_data[4] = (returnPos >> 8) & 0xff; send_probe_data[5] = returnPos & 0xff; send_probe_data[6] = (m_ProbeReturnSpeed >> 8) & 0xff; send_probe_data[7] = m_ProbeReturnSpeed & 0xff; m_WriteByte = Send_Command(0, (const char*)send_probe_data, m_SendDataLength); Sleep(3);// } return rStatus; } //=============================读取配置============================================== HSI_STATUS HSI_Motion::Load_EF3_Motion_Inifile(CString GoogolIniFile) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { CString csAppPath = GoogolIniFile; USES_CONVERSION; CString temp = L""; CString strGear[5] = { L"GEAR0_", L"GEAR1_", L"GEAR2_", L"GEAR3_", L"GEAR4_" }; CString axisNum[5] = { L"0", L"1", L"2", L"3", L"4" }; //判断Log目录是否存在,不存在就创建 if (CreateDirectory(m_AppPath + L"\\Log", NULL)) { g_pLogger->SendAndFlushWithTime(L"[Load_EF3_Motion_Inifile] Create Log Directory\n"); CreateDirectory(m_AppPath + L"\\Log", NULL); } if (GetFileAttributes(GoogolIniFile) == -1) { g_pLogger->SendAndFlushWithTime(L"[Load_EF3_Motion_Inifile] EF3_Motion.ini file no find\n"); sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "EF3_Motion.ini文件不存在!"); EventCallback(sEvenProp); return HSI_STATUS_FAILED; } m_motorType = GetPrivateProfileInt(L"MOTORTYPE", L"SERVOMOTOR", 1, csAppPath); for (int i = 1; i < 5; i++) { m_precisionCount[i] = GetPrivateProfileInt(L"PRECISION", L"PRECISION_COUNT_" + axisNum[i], 14000, csAppPath); m_precisionTime[i] = (long)GetPrivateProfileInt(L"PRECISION", L"PRECISION_TIME_" + axisNum[i], 14000, csAppPath); GetPrivateProfileString(L"RESOLUTION", L"SCALE_RESOLUTION_" + axisNum[i], L"0.0004", temp.GetBufferSetLength(50), 50, csAppPath); m_Resolution[i] = (atof(T2A(temp))); GetPrivateProfileString(L"LIMIT", L"NEG_WORKING_LIMIT_" + axisNum[i], L"-40", temp.GetBufferSetLength(50), 50, csAppPath); m_N_Work_Limit[i] = (atof(T2A(temp))); GetPrivateProfileString(L"LIMIT", L"POS_WORKING_LIMIT_" + axisNum[i], L"160", temp.GetBufferSetLength(50), 50, csAppPath); m_P_Work_Limit[i] = (atof(T2A(temp))); m_Home_Time[i] = (long)GetPrivateProfileInt(L"HOME", L"HOME_TIME_" + axisNum[i], 1500, csAppPath); m_Home_AddJogGears[i] = GetPrivateProfileInt(L"HOME", L"HOME_ADD_JOGCHOICE_" + axisNum[i], 100, csAppPath); m_Home_DecJogGears[i] = GetPrivateProfileInt(L"HOME", L"HOME_DEC_JOGCHOICE_" + axisNum[i], 100, csAppPath); m_SetPotion_Count[i] = GetPrivateProfileInt(L"SET_POSITION_SPEED", L"SET_POSITION_COUNT_" + axisNum[i], 10, csAppPath); m_SetPotion_DriveSpeed[i] = GetPrivateProfileInt(L"SET_POSITION_SPEED", L"SET_POTION_DRIVESPEED_" + axisNum[i], 100, csAppPath); m_SetPotion_DriveSpeed[i] = m_SetPotion_DriveSpeed[i] / (m_Resolution[i] * 50); m_SetPotion_Line[i] = GetPrivateProfileInt(L"SET_POSITION_SPEED", L"SET_POTION_LINE_" + axisNum[i], 100, csAppPath); m_SetPotion_StartSpeed[i] = GetPrivateProfileInt(L"SET_POSITION_SPEED", L"SET_POTION_STARTSPEED_" + axisNum[i], 100, csAppPath); m_SetPotion_StartSpeed[i] = m_SetPotion_StartSpeed[i] / (m_Resolution[i] * 500); m_SetPotion_Buffer[i] = GetPrivateProfileInt(L"SET_POSITION_SPEED", L"SET_POTION_BUFFER_" + axisNum[i], 105, csAppPath); m_LogIsOpen[i] = GetPrivateProfileInt(L"LOG", L"LOG_IS_OPEN_" + axisNum[i], 0, csAppPath); m_Home_Machine_Axis[i] = GetPrivateProfileInt(L"HOME", L"HOME_MACHINE_AXIS_" + axisNum[i], 0, csAppPath); m_Home_Pos_Axis[i] = GetPrivateProfileInt(L"HOME", L"HOME_POS_AXIS_" + axisNum[i], 0, csAppPath); m_StopJogMode[i] = GetPrivateProfileInt(L"JOG_SPEED", L"JOG_STOP_MODE_" + axisNum[i], 0, csAppPath); m_SpeedAdjustPeriod[i] = GetPrivateProfileInt(L"SET_POSITION_SPEED", L"SPEED_ADJUSTMENT_" + axisNum[i], 1, csAppPath); m_SpeedMax[i] = GetPrivateProfileInt(L"SET_POSITION_SPEED", L"SPEED_RUNMAX_" + axisNum[i], 150, csAppPath); } for (int i = 0; i < 5; i++) { for (int j = 1; j < 5; j++) { GetPrivateProfileString(L"JOG_SPEED", L"JOG_DRIVESPEED_" + strGear[i] + axisNum[j], L"10", temp.GetBufferSetLength(50), 10, csAppPath); float speed = (atof(T2A(temp))); //m_JogDriveSpeed[j][i] = GetPrivateProfileInt(L"JOG_SPEED", L"JOG_DRIVESPEED_" , 10, csAppPath); m_JogDriveSpeed[j][i] = speed / (m_Resolution[j] * 50); GetPrivateProfileString(L"JOG_SPEED", L"JOG_STARTSPEED_" + strGear[i] + axisNum[j], L"10", temp.GetBufferSetLength(50), 10, csAppPath); speed = (atof(T2A(temp))); //m_JogStartSpeed[j][i] = GetPrivateProfileInt(L"JOG_SPEED", L"JOG_STARTSPEED_" + strGear[i] + axisNum[j], 10, csAppPath); m_JogStartSpeed[j][i] = speed / (m_Resolution[j] * 50); m_JogAccLine[j][i] = GetPrivateProfileInt(L"JOG_SPEED", L"JOG_LINE_" + strGear[i] + axisNum[j], 10, csAppPath); m_JogDecLine[j][i] = GetPrivateProfileInt(L"JOG_SPEED", L"JOG_LINE_" + strGear[i] + axisNum[j], 10, csAppPath); } } m_Jog_Auto_Focus = m_JogDriveSpeed[3][4]; m_Home_Machine_Axis[1] = GetPrivateProfileInt(L"HOME", L"HOME_MACHINE_AXIS_1", 1, csAppPath); m_Home_Machine_Axis[2] = GetPrivateProfileInt(L"HOME", L"HOME_MACHINE_AXIS_2", 1, csAppPath); m_Home_Machine_Axis[3] = GetPrivateProfileInt(L"HOME", L"HOME_MACHINE_AXIS_3", 1, csAppPath); m_Home_Machine_Axis[4] = GetPrivateProfileInt(L"HOME", L"HOME_MACHINE_AXIS_4", 1, csAppPath); m_IsHomeEncPos = GetPrivateProfileInt(L"HOME", L"IS_HOME_ENC_POS", 0, csAppPath); m_IsHomePrfPos = GetPrivateProfileInt(L"HOME", L"IS_HOME_PRF_POS", 1, csAppPath); m_Set_XYZA_Reserve = GetPrivateProfileInt(L"SET_XYZ", L"SET_XYZ_RESERVE", 2, csAppPath); m_setPositionDelay = GetPrivateProfileInt(L"SETPOSITION", L"SETPOSITION_DELAY", 1, csAppPath); m_setPositionPrecision = GetPrivateProfileInt(L"SETPOSITION", L"SETPPSITION_PRECISION", 1, csAppPath); m_setPositionNum = GetPrivateProfileInt(L"SETPOSITION", L"SETPOSITION_NUMBER", 1, csAppPath); //两块四路光源板 m_isUseAport = GetPrivateProfileInt(L"COMPORT", L"IS_COM_PORT_A", 0, csAppPath); m_portAnum = GetPrivateProfileInt(L"COMPORT", L"COM_PORT_A", 0, csAppPath); m_isUseBport = GetPrivateProfileInt(L"COMPORT", L"IS_COM_PORT_B", 0, csAppPath); m_portBnum = GetPrivateProfileInt(L"COMPORT", L"COM_PORT_B", 0, csAppPath); m_iGlueStartSpeed = GetPrivateProfileInt(L"GLUEDISPENSER", L"DISPENSER_STARTSPEED", 0, csAppPath); m_iGlueStartSpeed = m_iGlueStartSpeed / (m_Resolution[1] * 500); m_iGlueDriveSpeed = GetPrivateProfileInt(L"GLUEDISPENSER", L"DISPENSER_DRIVESPEED", 0, csAppPath); m_iGlueDriveSpeed = m_iGlueDriveSpeed / (m_Resolution[1] * 50); m_iGlueAccSpeed = GetPrivateProfileInt(L"GLUEDISPENSER", L"DISPENSER_ACCSPEED", 0, csAppPath); m_LogIsOpen[0] = GetPrivateProfileInt(L"LOG", L"LOG_IS_OPEN_0", 0, csAppPath); g_pLogger->IsEnabledLog = m_LogIsOpen[0] == 1 ? true : false; m_iSpeedType = GetPrivateProfileInt(L"SET_SPEED", L"SPEEDTYPE", 0, csAppPath); CString comNum[5] = { L"0", L"1", L"2", L"3" }; for (int i = 0; i < 4; i++) { GetPrivateProfileString(L"ROCKER_SPEED", L"ROCKER_HSTARTSPEED_" + comNum[i], L"5", temp.GetBufferSetLength(50), 10, csAppPath); float speed = (atof(T2A(temp))); m_rockerHStartSpeed[i] = speed / (m_Resolution[i] * 50); GetPrivateProfileString(L"ROCKER_SPEED", L"ROCKER_HDRIVESPEED_" + comNum[i], L"20", temp.GetBufferSetLength(50), 10, csAppPath); speed = (atof(T2A(temp))); m_rockerHDriveSpeed[i] = speed / (m_Resolution[i] * 50); GetPrivateProfileString(L"ROCKER_SPEED", L"ROCKER_LSTARTSPEED_" + comNum[i], L"2", temp.GetBufferSetLength(50), 10, csAppPath); speed = (atof(T2A(temp))); m_rockerLStartSpeed[i] = speed / (m_Resolution[i] * 50); GetPrivateProfileString(L"ROCKER_SPEED", L"ROCKER_LDRIVESPEED_" + comNum[i], L"10", temp.GetBufferSetLength(50), 10, csAppPath); speed = (atof(T2A(temp))); m_rockerLDriveSpeed[i] = speed / (m_Resolution[i] * 50); GetPrivateProfileString(L"ROCKER_SPEED", L"ROCKER_ASPEED_" + comNum[i], L"100", temp.GetBufferSetLength(50), 10, csAppPath); m_rockerASpeed[i] = (atoi(T2A(temp))); GetPrivateProfileString(L"ROCKER_SPEED", L"ROCKER_DSPEED_" + comNum[i], L"100", temp.GetBufferSetLength(50), 10, csAppPath); m_rockerDSpeed[i] = (atoi(T2A(temp))); } CString strAxis[10] = { L"0", L"1", L"2", L"3", L"4", L"5", L"6", L"7", L"8", L"9" }; for (int i = 0; i < 10; i++) { m_stepPosition_L_speed[i] = GetPrivateProfileInt(L"STEPMOTORPOSITIONINIT", L"StepPositionLSpeed_" + strAxis[i], 1, csAppPath); m_stepPosition_L_speed[i] = m_stepPosition_L_speed[i] / (m_Resolution[1] * 50); m_stepPosition_H_speed[i] = GetPrivateProfileInt(L"STEPMOTORPOSITIONINIT", L"StepPositionHSpeed_" + strAxis[i], 1, csAppPath); m_stepPosition_H_speed[i] = m_stepPosition_H_speed[i] / (m_Resolution[1] * 50); m_stepPosition_Load[i] = GetPrivateProfileInt(L"STEPMOTORPOSITIONINIT", L"StepPositionLoad_" + strAxis[i], 1, csAppPath); m_stepPosition_Load[i] = m_stepPosition_Load[i] / (m_Resolution[1]); m_stepPosition_acc[i] = GetPrivateProfileInt(L"STEPMOTORPOSITIONINIT", L"StepPositionAcc_" + strAxis[i], 1, csAppPath); } CString SubArea[8] = { L"0", L"1", L"2", L"3", L"4", L"5", L"6", L"7" }; for (int i = 0; i < 8; i++) { m_SixEightSubArea[i] = GetPrivateProfileInt(L"SIXEIGHTSUBAREA", L"SIXEIGHT_SUBARE_" + SubArea[i], 0, csAppPath); } } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::Load_EF3_Config_Inifile(CString GoogolIniFile) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { CString csAppPath = GoogolIniFile; USES_CONVERSION; CString temp; if (GetFileAttributes(GoogolIniFile) == -1) { g_pLogger->SendAndFlushWithTime(L"[Load_EF3_Config_Inifile] EF3_Config.ini file no find\n"); sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "EF3_Config.ini文件不存在!"); EventCallback(sEvenProp); return HSI_STATUS_FAILED; } m_IsUseEF3 = GetPrivateProfileInt(L"EF3", L"IS_USEEF3", 0, csAppPath); m_ForSoft = GetPrivateProfileInt(L"SOFTWARE", L"USE_SOFTWARE", 0, csAppPath); m_IsUse_HSICompensation = GetPrivateProfileInt(L"ASIX", L"IS_USE_HSICOMPENSATION", 0, csAppPath); m_Compensation_Pluse = GetPrivateProfileInt(L"ASIX", L"COMPENSATE_PLUSE", 20, csAppPath); m_IsHardLimit = GetPrivateProfileInt(L"ASIX", L"IS_HARD_LIMIT", 7, csAppPath); m_IsEnableAxis = GetPrivateProfileInt(L"ASIX", L"ISENABLE_AXIS", 7, csAppPath); m_IsHavePattern = GetPrivateProfileInt(L"ASIX", L"ISHAVE_AXISPATTERN", 15, csAppPath); m_AxisHomeDirection = GetPrivateProfileInt(L"ASIX", L"AXIS_HOMEDIRECTION", 15, csAppPath); m_IsUseManualRunin = GetPrivateProfileInt(L"ASIX", L"IS_USEMANUALRUNIN", 0, csAppPath); m_IsUseExternalTrigger = GetPrivateProfileInt(L"FUNCTION", L"IS_USEEXTERNALTRIGGER", 1, csAppPath); m_IsUseSixRingEightArea = GetPrivateProfileInt(L"FUNCTION", L"IS_USESIXRINGEIGHTAREA", 0, csAppPath); m_IsUseTwentySixLight = GetPrivateProfileInt(L"FUNCTION", L"IS_USETWENTYSIXLIGHT", 0, csAppPath); m_EF3LightType = GetPrivateProfileInt(L"FUNCTION", L"IS_LIGHTTYPE", 1, csAppPath); m_IsCollectPos = GetPrivateProfileInt(L"FUNCTION", L"IS_COLLECT_POS", 0, csAppPath); m_IsLightDebug = GetPrivateProfileInt(L"FUNCTION", L"IS_LIGHT_DEBUG", 0, csAppPath); m_IsIOFuntion = GetPrivateProfileInt(L"IO", L"IS_IO_FUNTION", 0, csAppPath); m_IsStartInput = GetPrivateProfileInt(L"IO", L"IS_START_INPUT", 0, csAppPath); m_StartInputPort = GetPrivateProfileInt(L"IO", L"START_INPUT_PORT", 1, csAppPath); m_IsProbe = GetPrivateProfileInt(L"PROBE", L"IS_PROBE", 0, csAppPath); m_ProbeAllAxis = GetPrivateProfileInt(L"PROBE", L"PROBE_All_AXIS", 3, csAppPath); m_ProbeReturnSpeed = GetPrivateProfileInt(L"PROBE", L"PROBE_RETURN_SPEED", 40, csAppPath); m_ProbeReturnSpeed = m_ProbeReturnSpeed * 50; GetPrivateProfileString(L"PROBE", L"PROBE_RETURN_POS", L"10.0", temp.GetBufferSetLength(50), 50, csAppPath); m_ProbeReturnPos = atof(T2A(temp)); m_IsUseRocker = GetPrivateProfileInt(L"ROCKER", L"IS_USEROCKER", 0, csAppPath); m_IsCloseRocker = GetPrivateProfileInt(L"ROCKER", L"IS_CLOSEROCKER", 0, csAppPath); m_bISUseMoreLights = GetPrivateProfileInt(L"IPADDRESS", L"IS_USENUM", 0, csAppPath); m_LightType = GetPrivateProfileInt(L"LIGHTCONTROL", L"IS_LIGHTTYPE", 1, csAppPath); m_IsUseFourthSpeed = GetPrivateProfileInt(L"FOURTHSPEED", L"IS_USEFOURTHSPEED", 1, csAppPath); m_isOKGlint = GetPrivateProfileInt(L"LIGHTCONTROL", L"IS_OKGLINT", 0, csAppPath); m_ETIPort = GetPrivateProfileInt(L"LIGHTCONTROL", L"IS_ETIPORT", 0, csAppPath); m_DeviceType = GetPrivateProfileInt(L"DEVICE", L"DEVICE_TYPE", 1, csAppPath); m_UseAxisNum = GetPrivateProfileInt(L"DEVICE", L"USE_AXISNUM", 0, csAppPath); m_iJoyStick = GetPrivateProfileInt(L"JOYSTICK", L"JOY_STICK_TYPE", 0, csAppPath); CString comNum[5] = { L"0", L"1", L"2", L"3" }; for (int i = 0; i < 4; i++) { GetPrivateProfileString(L"IPADDRESS", L"IP_ADDRESS_" + comNum[i], L"192.168.0.1", temp.GetBufferSetLength(50), 50, csAppPath); m_IsOpenTCPIP[i] = temp; temp = temp.Trim(); int iNext = temp.Find(':'); CString ss = temp.Mid(0, iNext); if (ss == "8") { m_Led8MotionFlag[i] = true; } m_IsOpenTCPIP[i] = temp.Mid(iNext + 1, temp.GetLength() - iNext); } m_EF3COMPort = GetPrivateProfileInt(L"EF3COM", L"COMPORT", 0, csAppPath); } return rStatus; } //===============================读取/设置光栅尺精度============================================ HSI_STATUS HSI_Motion::GetScaleResolution(double &_ScaleX, double &_ScaleY, double &_ScaleZ) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { _ScaleX = m_Resolution[1]; _ScaleY = m_Resolution[2]; _ScaleZ = m_Resolution[3]; } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetScaleResolution(double _ScaleX, double _ScaleY, double _ScaleZ) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { m_Resolution[1] = (int)(_ScaleX * 10000); m_Resolution[2] = (int)(_ScaleY * 10000); m_Resolution[3] = (int)(_ScaleZ * 10000); } return rStatus; } //============================回调定位完成=============================================== void HSI_Motion::SendMsgMotionFinished() { sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_FUNCTION; sEvenProp.EventID = HSI_EVENT_MOVE_POINT; sEvenProp.EventResponse = HSI_EVENT_FUNCTION_OK; EventCallback(sEvenProp); } //=============================回调探针运行============================================== void HSI_Motion::SendMsgProbeFinished() { sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_FUNCTION; sEvenProp.EventID = HSI_EVENT_MOTION_PROBE; sEvenProp.EventResponse = HSI_EVENT_FUNCTION_OK; EventCallback(sEvenProp); } //=========================================================================== void HSI_Motion::UpdateMotionState() { if (g_pHSI_Motion && m_IsExMotion == 0) { g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] In\n"); while (m_Thread_State == HSI_THREAD_RUNNING) { g_IsClose = false; bool interpolationflag = false; bool timeoutflag = false; int timeStart = GetTickCount(); // bool singleaxisflag_x = false; // bool singleaxisflag_y = false; // bool singleaxisflag_z = false; // bool singleaxisflag_a = false; do { if (g_IsClose) { g_IsClose = false; break; } if (m_SO7_Serial.m_RecvData[0] == 2) { if ((m_SO7_Serial.m_RecvData[39] & 0x10)) { m_SO7_Serial.m_RecvData[39] = 0; SpCompleteTStart = GetTickCount(); interpolationflag = true; break; } //else if ((m_SO7_Serial.m_RecvData[39] == 0x07))//axis_start else if ((m_SO7_Serial.m_RecvData[39] == axis_start)/* &&(m_motorType == 0)*/) { m_SO7_Serial.m_RecvData[39] = 0; SpCompleteTStart = GetTickCount(); interpolationflag = true; break; } else if (m_SO7_Serial.m_RecvData[39] & 0x20) { m_SO7_Serial.m_RecvData[39] = 0; timeoutflag = true; break; } } Sleep(1); int timeEnd = GetTickCount(); if (timeStart - timeEnd > 10 * 1000) { timeoutflag = true; break; } } while (true); g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] Nowait Run End\n"); unsigned int tempPrecision[5] = { 0, m_precisionCount[1], m_precisionCount[2], m_precisionCount[3], m_precisionCount[4] }; tempPrecision[1] = m_Home_Machine_Axis[1] == 0 ? 10000000 : m_precisionCount[1]; tempPrecision[2] = m_Home_Machine_Axis[2] == 0 ? 10000000 : m_precisionCount[2]; tempPrecision[3] = m_Home_Machine_Axis[3] == 0 ? 10000000 : m_precisionCount[3]; tempPrecision[4] = m_Home_Machine_Axis[4] == 0 ? 10000000 : m_precisionCount[4]; int i = 0, j = 0; unsigned long Count = 0; double prfpos[5] = { 0 }; //GetPositionEncPrfMulti(1, m_EncPos, m_PrfPos, 4); //double EncPos[5] = { 0.0 }; // double ProPulse[5] = { 0.0 }; if (interpolationflag&&m_motorType) { while (Count < m_SetPotion_Count[1])//到位次数判断 { Sleep(2); GetPositionXyz(HSI_MOTION_AXIS_ALL, prfpos[1], prfpos[2], prfpos[3], prfpos[0]); if ((fabs(m_PosThread[1] - prfpos[1]) <= tempPrecision[1] * m_Resolution[1]) && (fabs(m_PosThread[2] - prfpos[2]) <= tempPrecision[2] * m_Resolution[2]) && (fabs(m_PosThread[3] - prfpos[3]) <= tempPrecision[3] * m_Resolution[3]) && (fabs(m_PosThread[4] - m_PosForAllAxis[4]) <= tempPrecision[4] * m_Resolution[4])) { i++; if (m_SetPotion_Count[1] > m_setPositionNum) { j = m_setPositionNum; } else { j = m_SetPotion_Count[1]; } if (i == j) { set_end = GetTickCount(); break; } } else { } Count++; g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] m_SetPotion_Count = %d\n", Count); } //if (Count == m_SetPotion_Count[1]) //超时退出 //{ // if (g_IsClose == false) // { // g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] Nowait Timeout\n"); // sEvenProp.Init(); // sEvenProp.EventType = HSI_EVENT_ERROR; // sEvenProp.EventID = HSI_EVENT_MOTION; // sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; // strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Nowait_HSI定位超时!"); // EventCallback(sEvenProp); // } // else // { // g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] Nowait Timeout Is AbortMotion\n"); // } //} } if (interpolationflag) { SpCompleteTEnd = GetTickCount(); SpTimeCount = SpCompleteTEnd - SpCompleteTStart; double dis = pow(m_PrfPos[1] - m_EncPos[1], 2.0) + pow(m_PrfPos[2] - m_EncPos[2], 2.0) + pow(m_PrfPos[3] - m_EncPos[3], 2.0); if (dis > 0) { PntToPntDistance = sqrt(dis); } else { PntToPntDistance = 0.0; } SetPotionRunEnd = true; } g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] m_PosThread[1] = %.4f,m_PosThread[2] = %.4f,m_PosThread[3] = %.4f\n", m_PosThread[1], m_PosThread[2], m_PosThread[3]); g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] Pos[1] = %.4f,Pos[2] = %.4f,Pos[3] = %.4f\n", prfpos[1], prfpos[2], prfpos[3]); if (timeoutflag) { g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] Nowait Timeout\n"); sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Nowait_EF3定位超时!"); EventCallback(sEvenProp); } switch (CurrentMotionState) { case E_SO7_MOTION_MOVETO: { g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] Nowait CurrentMotionState E_SO7_MOTION_MOVETO\n"); m_Thread_State = HSI_THREAD_PAUSED; CurrentMotionState = E_SO7_MOTION_NONE; m_IsExMotion = 2; SendMsgMotionFinished(); break; } default: { g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] Nowait CurrentMotionState default\n"); break; } } } g_pLogger->SendAndFlushWithTime(L"[UpdateMotionState] Out\n"); } } //=========================================================================== void HSI_Motion::UpdateMotionStateEx() { if (g_pHSI_Motion && m_IsExMotion == 1) { g_pLogger->SendAndFlushWithTime(L"[UpdateMotionStateEx] In\n"); g_pLogger->SendAndFlushWithTime(L"[UpdateMotionStateEx] Out\n"); } } //=========================================================================== void HSI_Motion::UpdateMotionStateIO() { if (g_pHSI_Motion) { int StartFlag = 0; UINT recvData = 0; while (m_Thread_StateIO == HSI_THREAD_RUNNING) { //1个脚踏开关 Sleep(3); GetDIO(HSI_MOTION_INPUT_CH1, m_InputStatus); if (m_IsStartInput == 1) { if ((m_InputStatus & m_StartInputPort) == 0) { StartFlag = 1; } else if (StartFlag == 1 && (m_InputStatus & m_StartInputPort) == m_StartInputPort) { if (m_isOKGlint == 1) { memset(m_cSendData, 0x00, 63); m_cSendData[0] = 0x02; m_cSendData[1] = 0x02; m_cSendData[2] = 0x01; m_cSendData[6] = 0x04; m_cSendData[7] = 0xff; m_cSendData[8] = 0xff; m_cSendData[9] = 0xff; m_cSendData[10] = 0xff; m_cSendData[14] = 0xff; m_WriteByte = Send_Command(1, (const char*)m_cSendData, m_SendDataLength); Sleep(5); } g_pLogger->SendAndFlushWithTime(L"[UpdateMotionStateIO] One Foot Switch Trigger\n"); StartFlag = 0; sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_NOTIFY; sEvenProp.EventID = HSI_NOTIFY_PROGRAM_EXECUTION_START; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; EventCallback(sEvenProp); } } if ((m_axisStatus & 0xAA) == 0xAA) { if (!m_bEmergencyState) { Sleep(100); GetDIO(HSI_MOTION_INPUT_CH1, m_InputStatus); if ((m_axisStatus & 0xAA) == 0xAA) { sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_NOTIFY; sEvenProp.EventID = HSI_NOTIFY_EMERGENCY_STATE; sEvenProp.EventData[0] = 1; m_bEmergencyState = true; EventCallback(sEvenProp); } } } else { if (m_bEmergencyState) { Sleep(100); GetDIO(HSI_MOTION_INPUT_CH1, m_InputStatus); if ((m_axisStatus & 0xAA) != 0xAA) { sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_NOTIFY; sEvenProp.EventID = HSI_NOTIFY_EMERGENCY_STATE; sEvenProp.EventData[0] = 0; m_bEmergencyState = false; EventCallback(sEvenProp); } } } } } } //=========================================================================== void HSI_Motion::UpdateMotionStateData() { while (m_Thread_StateData == HSI_THREAD_RUNNING) { if (m_bConnected) { Sleep(3); m_cSendData[0] = CT_ORDER; m_cSendData[1] = MOTORPOSITION; Send_Command(0, (const char*)m_cSendData, m_SendDataLength); } else { } } } //=========================================================================== void HSI_Motion::UpdateMotionStateProbe() { if (g_pHSI_Motion) { bool hitFlag = false; while (m_Thread_StateProbe == HSI_THREAD_RUNNING) { Sleep(3); if (g_IsClose) { g_IsClose = false; break; } if (m_SO7_Serial.m_RecvData[57] == 0) { hitFlag = true; } else if (m_SO7_Serial.m_RecvData[57] == 1) { //AbortMotion(); //Beep(300,1000); //printf("\a"); // m_SO7_Serial.m_RecvData[57] = 0; m_LockPos[1] = (m_SO7_Serial.m_RecvData[41] << 24 | m_SO7_Serial.m_RecvData[42] << 16 | m_SO7_Serial.m_RecvData[43] << 8 | m_SO7_Serial.m_RecvData[44])*m_Resolution[1]; m_LockPos[2] = (m_SO7_Serial.m_RecvData[45] << 24 | m_SO7_Serial.m_RecvData[46] << 16 | m_SO7_Serial.m_RecvData[47] << 8 | m_SO7_Serial.m_RecvData[48])*m_Resolution[2]; m_LockPos[3] = (m_SO7_Serial.m_RecvData[49] << 24 | m_SO7_Serial.m_RecvData[50] << 16 | m_SO7_Serial.m_RecvData[51] << 8 | m_SO7_Serial.m_RecvData[52])*m_Resolution[3]; m_LockPos[4] = (m_SO7_Serial.m_RecvData[53] << 24 | m_SO7_Serial.m_RecvData[54] << 16 | m_SO7_Serial.m_RecvData[55] << 8 | m_SO7_Serial.m_RecvData[56])*m_Resolution[4]; continue; } else if (m_SO7_Serial.m_RecvData[57] == 2) { Sleep(400); m_LockPos[1] = 0.0; m_LockPos[2] = 0.0; m_LockPos[3] = 0.0; m_LockPos[4] = 0.0; //m_SO7_Serial.m_RecvData[57] == 0; continue; } else if (m_SO7_Serial.m_RecvData[57] == 3 && hitFlag) { Sleep(200); hitFlag = false; double ProbeHitCompletePos[4] = { 0 }; GetPositionXyz(0, ProbeHitCompletePos[0], ProbeHitCompletePos[1], ProbeHitCompletePos[2], ProbeHitCompletePos[3]); m_ijk[0] = ProbeHitCompletePos[0]; m_ijk[1] = ProbeHitCompletePos[1]; m_ijk[2] = ProbeHitCompletePos[2]; g_pLogger->SendAndFlushWithTime(L"[UpdateMotionStateProbe] Probe hit\n"); SendMsgProbeFinished(); } } } } //=========================================================================== void HSI_Motion::DoEvents() { MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { __try { DispatchMessage(&msg); TranslateMessage(&msg); } __except (EXCEPTION_EXECUTE_HANDLER) { g_pLogger->SendAndFlushWithTime(msg.message + L"----------DoEvents---------- : Exception"); sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DoEvents_异常"); EventCallback(sEvenProp); } if (g_IsClose) { break; } } } //=========================================================================== HSI_STATUS HSI_Motion::DriverAlarmStatus() { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[DriverAlarmStatus] In\n"); g_pLogger->SendAndFlushWithTime(L"[DriverAlarmStatus] Out\n"); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::FirstHome() { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[FirstHome] In\n"); g_pLogger->SendAndFlushWithTime(L"[FirstHome] Out\n"); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SpecialMotorHome(short AxisNum) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[SpecialMotorHome] In\n"); g_pLogger->SendAndFlushWithTime(L"[SpecialMotorHome] Out\n"); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SpecialMotorMove(short AxisNumber, double Position) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[SpecialMotorMove] In\n"); g_pLogger->SendAndFlushWithTime(L"[SpecialMotorMove] Out\n"); } return rStatus; } //========================IO=================================================== HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { if (m_SO7_Serial.m_RecvData[0] == 2) { if (IOChannel == HSI_MOTION_INPUT_LIMIT_SWITCH) { _Status = m_SO7_Serial.m_RecvData[33]; } if (IOChannel == HSI_MOTION_INPUT_ALARM) { _Status = m_SO7_Serial.m_RecvData[40]; } if (IOChannel == HSI_MOTION_INPUT_CH1) //获取通用输入 { _Status = m_SO7_Serial.m_RecvData[34]; _Status = (m_SO7_Serial.m_RecvData[35] | (_Status << 8)) & 0xffff; } if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出 { _Status = m_SO7_Serial.m_RecvData[36]; _Status = (m_SO7_Serial.m_RecvData[37] | (_Status << 8)) & 0xffff; } m_axisStatus = m_SO7_Serial.m_RecvData[58]; m_axisAlarmStatus = m_SO7_Serial.m_RecvData[59]; } else if (m_bISUseMoreLights > 0) { if (m_Led8MotionFlag[m_selectedIndex]) { if (tReciveData[0] == 0x05) { _Status = tReciveData[2]; } } else { if (tReciveData[0] == 0x05) { _Status = tReciveData[1] << 24 | tReciveData[1] << 16 | tReciveData[3] << 8 | tReciveData[4]; } } } else { g_pLogger->SendAndFlushWithTime(L"[GetDIO] failed\n"); } } 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); } } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::GetAxisStatus(int* _Status) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { _Status[0] = m_axisStatus; _Status[1] = m_axisAlarmStatus; } return rStatus; } //=============================暂停和关闭============================================== HSI_STATUS HSI_Motion::AbortMotion() { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_IsClose = true; g_pLogger->SendAndFlushWithTime(L"[AbortMotion] In\n"); m_cSendData[0] = CT_ORDER; m_cSendData[1] = CT_STOP; m_cSendData[2] = AXIS_XYZU; m_StopJogMode[1] == 0 ? m_cSendData[3] = 0X4A : m_cSendData[3] = 0X05; m_StopJogMode[2] == 0 ? m_cSendData[3] = 0X4A : m_cSendData[3] = 0X05; m_StopJogMode[3] == 0 ? m_cSendData[3] = 0X4A : m_cSendData[3] = 0X05; m_StopJogMode[4] == 0 ? m_cSendData[3] = 0X4A : m_cSendData[3] = 0X05; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); if (m_DeviceType == 3) { m_cSendData[0] = CT_TURNTABLE; m_cSendData[1] = CT_RTSTOP; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); m_Thread_StateData = HSI_THREAD_RUNNING; SetEvent(m_hTriggerEventData); } if (bUseGlueDispenser) { bUseGlueDispenser = false; m_cSendData[0] = CT_MOTOR; m_cSendData[1] = CT_GLUEDISPENSER_STOP; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); } g_pLogger->SendAndFlushWithTime(L"[AbortMotion] Out\n"); } return rStatus; } //===============================关闭============================================ HSI_STATUS HSI_Motion::Shutdown() { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[Shutdown] In\n"); g_IsClose = true; SetDIO(HSI_MOTION_OUTPUT_CH1, 0xffff); if (m_bConnected) { CloseHandle(hCom); hCom = nullptr; //m_SO7_Serial.Close(); } if (m_IsCloseRocker == 0) { memset(m_cSendData, 0x00, 64); m_cSendData[0] = CT_SOFTSTOP; m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); } if (m_bISUseMoreLights > 0) { for (size_t i = 0; i < m_bISUseMoreLights; i++) { if (m_Led8MotionFlag[i]) { m_selectedIndex = i; Orderdata[0] = 0x01; Orderdata[1] = 0x07; Orderdata[2] = 0x00; OrderSend++; } Sleep(20); } DisConnect(); } AbortMotion(); m_bConnected = false; CurrentMotionState = E_SO7_MOTION_NONE; CurrentHomeMachineState = E_EF3_HOME_NONE; m_Thread_StateData = HSI_THREAD_EXIT; m_Thread_StateData = HSI_THREAD_EXIT; m_Thread_StateIO = HSI_THREAD_EXIT; m_Thread_State = HSI_THREAD_EXIT; m_Thread_StateJOGStop = HSI_THREAD_EXIT; SendMsgMotionFinished(); CloseThread(); CloseThreadIO(); CloseThreadData(); CloseThreadProbe(); CloseThreadJOGStop(); ReleaseMutex(g_RW_Data_Mutex); CloseHandle(g_RW_Data_Mutex); ReleaseMutex(g_WR_ToMove_Mutex); CloseHandle(g_WR_ToMove_Mutex); g_pLogger->SendAndFlushWithTime(L"[Shutdown] Out\n"); } return rStatus; } //==============================触发灯光============================================= HSI_STATUS HSI_Motion::SetTriggerLight(int triggleNum, int delayLighting, int delayLightBefor, int triggleMode, double* Intensities) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { setLightFlag = true; unsigned char m_SetTriggerLightData[64] = { 0 }; m_SetTriggerLightData[0] = CT_LIGHT; m_SetTriggerLightData[1] = 0x03; m_SetTriggerLightData[2] = triggleNum; int num = triggleNum / 3; int i = 0; for (i = 0; i < num; i++) { m_SetTriggerLightData[3] = i; int z = 4; for (int j = 24 * i; j < 24 * (i + 1); ++j) { m_SetTriggerLightData[z++] = ((int(Intensities[j] * 11.2)) >> 8) & 0xff; m_SetTriggerLightData[z++] = (int(Intensities[j] * 11.2)) & 0xff; } m_SetTriggerLightData[z++] = delayLighting & 0xff; m_SetTriggerLightData[z++] = triggleMode & 0xff; m_SetTriggerLightData[z] = delayLightBefor & 0xff; m_WriteByte = Send_Command(0, (const char*)m_SetTriggerLightData, m_SendDataLength); Sleep(1); } if ((num > 0) && (triggleNum % 3 != 0)) { m_SetTriggerLightData[3] = i; int z = 4; for (int j = 24 * i; j < 8 * triggleNum; ++j) { m_SetTriggerLightData[z++] = ((int(Intensities[j] * 11.2)) >> 8) & 0xff; m_SetTriggerLightData[z++] = (int(Intensities[j] * 11.2)) & 0xff; } m_SetTriggerLightData[52] = delayLighting & 0xff; m_SetTriggerLightData[53] = triggleMode & 0xff; m_SetTriggerLightData[54] = delayLightBefor & 0xff; m_WriteByte = Send_Command(0, (const char*)m_SetTriggerLightData, m_SendDataLength); Sleep(1); } else if (num == 0) { m_SetTriggerLightData[3] = 0; int z = 4; for (int j = 0; j < 8 * triggleNum; ++j) { m_SetTriggerLightData[z++] = ((int(Intensities[j] * 11.2)) >> 8) & 0xff; m_SetTriggerLightData[z++] = (int(Intensities[j] * 11.2)) & 0xff; } m_SetTriggerLightData[52] = delayLighting & 0xff; m_SetTriggerLightData[53] = triggleMode & 0xff; m_SetTriggerLightData[54] = delayLightBefor & 0xff; m_WriteByte = Send_Command(0, (const char*)m_SetTriggerLightData, m_SendDataLength); Sleep(1); } } return rStatus; } //=============================硬件触发拍照============================================== HSI_STATUS HSI_Motion::DCCPPStartPoint(double *startPoint) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { m_IsUsePPS = true; begin_position[1] = (int)(startPoint[1] / m_Resolution[1]); begin_position[2] = (int)(startPoint[2] / m_Resolution[2]); begin_position[3] = (int)(startPoint[3] / m_Resolution[3]); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::DCCScanSetData(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType, UINT lTrigNumber, double* dTrigDis) { WaitForSingleObject(g_WR_ToMove_Mutex, INFINITE); auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { //触发的位置为相对位置,用法一般是移动到起点位置,再开始设置触发位置(相对位置),最终设置终点位置 g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] In\n"); int axisNum; unsigned char m_SendDCCData[64] = { 0 }; m_SendDCCData[0] = CT_MOTOR; m_SendDCCData[1] = CT_TRIGGER_DATA; m_SendDCCData[2] = 0x01; iTriggleNum = lTrigNumber; double limit = 0.0; //memset(m_cSendData,0,64); if (AxisTypes & HSI_MOTION_AXIS_X) { iaxisNum = AXIS_X; axisNum = 1; } else if (AxisTypes & HSI_MOTION_AXIS_Y) { iaxisNum = AXIS_Y; axisNum = 2; } else if (AxisTypes & HSI_MOTION_AXIS_Z) { iaxisNum = AXIS_Z; axisNum = 3; } else { iaxisNum = AXIS_X; axisNum = 1; } switch (eType) { case HSI_SCAN_MOTION_SPEC_LOCA: { if (dTrigDis[0] > 0.0001) { iMotionDirection = 0; } else { iMotionDirection = 1; } switch (iaxisNum) { case AXIS_X: { if (!m_IsUsePPS) { begin_position[1] = begin_position[1] + dTrigDis[0] / m_Resolution[axisNum]; } else { if (iMotionDirection == 0) { begin_position[1] = begin_position[1] - 20; } else { begin_position[1] = begin_position[1] + 20; } } if (iMotionDirection == 0) { limit = 1000.0; } else { limit = -1000.0; } break; } case AXIS_Y: { if (!m_IsUsePPS) { begin_position[2] = begin_position[2] + dTrigDis[0] / m_Resolution[axisNum]; } else { if (iMotionDirection == 0) { begin_position[2] = begin_position[2] - 20; } else { begin_position[2] = begin_position[2] + 20; } } if (iMotionDirection == 0) { limit = 1000.0; } else { limit = -1000.0; } break; } case AXIS_Z: { if (!m_IsUsePPS) { begin_position[3] = begin_position[3] + dTrigDis[0] / m_Resolution[axisNum]; } else { if (iMotionDirection == 0) { begin_position[3] = begin_position[3] - 20; } else { begin_position[3] = begin_position[3] + 20; } } if (iMotionDirection == 0) { limit = 1000.0; } else { limit = -1000.0; } break; } default: break; } iScanMotionType = HSI_SCAN_MOTION_SPEC_LOCA; if (lTrigNumber > 100) { return HSI_STATUS_FAILED; } else { int num = lTrigNumber / 14; int i = 0; for (i = 0; i < num; i++) { m_SendDCCData[3] = i; for (size_t j = 14 * i, z = 4; j < 14 * (i + 1); ++j) { m_SendDCCData[z++] = ((long)(dTrigDis[j] / m_Resolution[axisNum])) & 0xff; m_SendDCCData[z++] = (((long)(dTrigDis[j] / m_Resolution[axisNum])) >> 8) & 0xff; m_SendDCCData[z++] = (((long)(dTrigDis[j] / m_Resolution[axisNum])) >> 16) & 0xff; m_SendDCCData[z++] = ((long)(dTrigDis[j] / m_Resolution[axisNum])) >> 24; } m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, m_SendDataLength); Sleep(1); } if ((num > 0) && (lTrigNumber % 14 != 0)) { m_SendDCCData[3] = i; int j = 0, z = 0; for (j = 14 * i, z = 4; j < lTrigNumber; ++j) { m_SendDCCData[z++] = ((long)(dTrigDis[j] / m_Resolution[axisNum])) & 0xff; m_SendDCCData[z++] = (((long)(dTrigDis[j] / m_Resolution[axisNum])) >> 8) & 0xff; m_SendDCCData[z++] = (((long)(dTrigDis[j] / m_Resolution[axisNum])) >> 16) & 0xff; m_SendDCCData[z++] = ((long)(dTrigDis[j] / m_Resolution[axisNum])) >> 24; } m_SendDCCData[z++] = ((long)(limit / m_Resolution[axisNum])) & 0xff; m_SendDCCData[z++] = (((long)(limit / m_Resolution[axisNum])) >> 8) & 0xff; m_SendDCCData[z++] = (((long)(limit / m_Resolution[axisNum])) >> 16) & 0xff; m_SendDCCData[z++] = ((long)(limit / m_Resolution[axisNum])) >> 24; m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, m_SendDataLength); Sleep(10); } else if (num == 0) { m_SendDCCData[3] = 0; int j = 0, z = 0; for (j = 0, z = 4; j < lTrigNumber; ++j) { m_SendDCCData[z++] = ((long)(dTrigDis[j] / m_Resolution[axisNum])) & 0xff; m_SendDCCData[z++] = (((long)(dTrigDis[j] / m_Resolution[axisNum])) >> 8) & 0xff; m_SendDCCData[z++] = (((long)(dTrigDis[j] / m_Resolution[axisNum])) >> 16) & 0xff; m_SendDCCData[z++] = ((long)(dTrigDis[j] / m_Resolution[axisNum])) >> 24; } m_SendDCCData[z++] = ((long)(limit / m_Resolution[axisNum])) & 0xff; m_SendDCCData[z++] = (((long)(limit / m_Resolution[axisNum])) >> 8) & 0xff; m_SendDCCData[z++] = (((long)(limit / m_Resolution[axisNum])) >> 16) & 0xff; m_SendDCCData[z++] = ((long)(limit / m_Resolution[axisNum])) >> 24; m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, m_SendDataLength); Sleep(10); } } break; } case HSI_SCAN_MOTION_EQ_DIS: { if (dTrigDis[0] > 0.0001) { iMotionDirection = 0; } else { iMotionDirection = 1; } switch (iaxisNum) { case AXIS_X: { if (!m_IsUsePPS) { begin_position[1] = begin_position[1] + dTrigDis[0] / m_Resolution[axisNum]; } else { if (iMotionDirection == 0) { begin_position[1] = begin_position[1] - 20; } else { begin_position[1] = begin_position[1] + 20; } } if (iMotionDirection == 0) { limit = 1000; } else { limit = -1000; } break; } case AXIS_Y: { if (!m_IsUsePPS) { begin_position[2] = begin_position[2] + dTrigDis[0] / m_Resolution[axisNum]; } else { if (iMotionDirection == 0) { begin_position[2] = begin_position[2] - 20; } else { begin_position[2] = begin_position[2] + 20; } } if (iMotionDirection == 0) { limit = 1000; } else { limit = -1000; } break; } case AXIS_Z: { if (!m_IsUsePPS) { begin_position[3] = begin_position[3] + dTrigDis[0] / m_Resolution[axisNum]; } else { if (iMotionDirection == 0) { begin_position[3] = begin_position[3] - 20; } else { begin_position[3] = begin_position[3] + 20; } } if (iMotionDirection == 0) { limit = 1000; } else { limit = -1000; } break; } default: break; } iScanMotionType = HSI_SCAN_MOTION_EQ_DIS; m_SendDCCData[3] = 0x00; m_SendDCCData[4] = ((long)(dTrigDis[0] / m_Resolution[axisNum])) & 0xff; m_SendDCCData[5] = (((long)(dTrigDis[0] / m_Resolution[axisNum])) >> 8) & 0xff; m_SendDCCData[6] = (((long)(dTrigDis[0] / m_Resolution[axisNum])) >> 16) & 0xff; m_SendDCCData[7] = ((long)(dTrigDis[0] / m_Resolution[axisNum])) >> 24; m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, m_SendDataLength); Sleep(10); break; } case HSI_SCAN_MOTION_EQ_DIS_II: { if (dTrigDis[1] > 0.0001) { iMotionDirection = 0; } else { iMotionDirection = 1; } switch (iaxisNum) { case AXIS_X: { if (!m_IsUsePPS) { begin_position[1] = begin_position[1] + dTrigDis[0] / m_Resolution[axisNum]; } else { if (iMotionDirection == 0) { begin_position[1] = begin_position[1] - 20; } else { begin_position[1] = begin_position[1] + 20; } } if (iMotionDirection == 0) { limit = 1000; } else { limit = -1000; } break; } case AXIS_Y: { if (!m_IsUsePPS) { begin_position[2] = begin_position[2] + dTrigDis[0] / m_Resolution[axisNum]; } else { if (iMotionDirection == 0) { begin_position[2] = begin_position[2] - 20; } else { begin_position[2] = begin_position[2] + 20; } } if (iMotionDirection == 0) { limit = 1000; } else { limit = -1000; } break; } case AXIS_Z: { if (!m_IsUsePPS) { begin_position[3] = begin_position[3] + dTrigDis[0] / m_Resolution[axisNum]; } else { if (iMotionDirection == 0) { begin_position[3] = begin_position[3] - 20; } else { begin_position[3] = begin_position[3] + 20; } } if (iMotionDirection == 0) { limit = 1000; } else { limit = -1000; } break; } default: break; } iScanMotionType = HSI_SCAN_MOTION_EQ_DIS_II; m_SendDCCData[3] = 0x00; int i = 0, j = 0; for (i = 0, j = 4; i < 2; ++i) { m_SendDCCData[j++] = ((long)(dTrigDis[i] / m_Resolution[axisNum])) & 0xff; m_SendDCCData[j++] = (((long)(dTrigDis[i] / m_Resolution[axisNum])) >> 8) & 0xff; m_SendDCCData[j++] = (((long)(dTrigDis[i] / m_Resolution[axisNum])) >> 16) & 0xff; m_SendDCCData[j++] = ((long)(dTrigDis[i] / m_Resolution[axisNum])) >> 24; } m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, m_SendDataLength); Sleep(10); break; } default: break; } g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] Out\n"); } ReleaseMutex(g_WR_ToMove_Mutex); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::DCCScanStart() { WaitForSingleObject(g_WR_ToMove_Mutex, INFINITE); auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { if (!setLightFlag) { unsigned char m_SetTriggerLightData[64] = { 0 }; m_SetTriggerLightData[0] = CT_LIGHT; m_SetTriggerLightData[1] = 0x03; m_SetTriggerLightData[53] = 0; m_WriteByte = Send_Command(0, (const char*)m_SetTriggerLightData, m_SendDataLength); Sleep(1); } setLightFlag = false; g_pLogger->SendAndFlushWithTime(L"[DCCScanStart] In\n"); unsigned char m_SendDCCData[64] = { 0 }; m_SendDCCData[0] = CT_MOTOR; m_SendDCCData[1] = CT_TRIGGER_DATA; m_SendDCCData[2] = 0x00; m_SendDCCData[3] = iaxisNum; m_SendDCCData[4] = iScanMotionType; m_SendDCCData[5] = ((iTriggleNum)& 0xff); m_SendDCCData[6] = (iTriggleNum >> 8) & 0xff; m_SendDCCData[7] = iMotionDirection; switch (iaxisNum) { case AXIS_X: m_SendDCCData[8] = begin_position[1] & 0xff; m_SendDCCData[9] = (begin_position[1] >> 8) & 0xff; m_SendDCCData[10] = (begin_position[1] >> 16) & 0xff; m_SendDCCData[11] = (begin_position[1] >> 24) & 0xff; m_SendDCCData[12] = m_SetPotion_DriveSpeed[1] & 0xff; m_SendDCCData[13] = (m_SetPotion_DriveSpeed[1] >> 8) & 0xff; break; case AXIS_Y: m_SendDCCData[8] = begin_position[2] & 0xff; m_SendDCCData[9] = (begin_position[2] >> 8) & 0xff; m_SendDCCData[10] = (begin_position[2] >> 16) & 0xff; m_SendDCCData[11] = (begin_position[2] >> 24) & 0xff; m_SendDCCData[12] = m_SetPotion_DriveSpeed[2] & 0xff; m_SendDCCData[13] = (m_SetPotion_DriveSpeed[2] >> 8) & 0xff; break; case AXIS_Z: m_SendDCCData[8] = begin_position[3] & 0xff; m_SendDCCData[9] = (begin_position[3] >> 8) & 0xff; m_SendDCCData[10] = (begin_position[3] >> 16) & 0xff; m_SendDCCData[11] = (begin_position[3] >> 24) & 0xff; m_SendDCCData[12] = m_SetPotion_DriveSpeed[3] & 0xff; m_SendDCCData[13] = (m_SetPotion_DriveSpeed[3] >> 8) & 0xff; break; default: break; } m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, m_SendDataLength); Sleep(2); g_pLogger->SendAndFlushWithTime(L"[DCCScanStart] Out\n"); m_IsUsePPS = false; } ReleaseMutex(g_WR_ToMove_Mutex); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::DCCScanStop() { WaitForSingleObject(g_WR_ToMove_Mutex, INFINITE); auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[DCCScanStop] In\n"); unsigned char m_SendDCCData[64] = { 0 }; m_SendDCCData[0] = CT_MOTOR; m_SendDCCData[1] = CT_TRIGGER_DATA; m_SendDCCData[2] = 0x02; m_SendDCCData[3] = iaxisNum; m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, m_SendDataLength); g_pLogger->SendAndFlushWithTime(L"[DCCScanStop] Out\n"); } ReleaseMutex(g_WR_ToMove_Mutex); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::DCCForLightPlate() { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[DCCForLightPlate] In\n"); memset(m_cSendData, 0x00, 63); m_cSendData[0] = 0x02; m_cSendData[1] = 0x02; m_cSendData[2] = 0x01; m_cSendData[6] = 0x04; m_cSendData[7] = 0xff; m_cSendData[8] = 0xff; m_cSendData[9] = 0xff; m_cSendData[10] = 0xff; m_cSendData[14] = 0x00; m_WriteByte = Send_Command(1, (const char*)m_cSendData, m_SendDataLength); Sleep(5); memset(m_cSendData, 0x00, 63); m_cSendData[0] = 0x02; m_cSendData[1] = 0x02; m_cSendData[2] = 0x01; m_cSendData[6] = 0x04; m_cSendData[7] = 0xff; m_cSendData[8] = 0xff; m_cSendData[9] = 0xff; m_cSendData[10] = 0xff; m_cSendData[14] = m_ETIPort & 0xff; m_WriteByte = Send_Command(1, (const char*)m_cSendData, m_SendDataLength); Sleep(5); g_pLogger->SendAndFlushWithTime(L"[DCCForLightPlate] Out\n"); } return rStatus; } //===============================转盘============================================ HSI_STATUS HSI_Motion::StartPlcJob(int* CamerasDis, int* BinsDis, int SubArea, int filterTime1, int filterTime2, int pluseSumDis) { g_pLogger->SendAndFlushWithTime(L"[StartPlcJob] In\n"); auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { m_Thread_StateData = HSI_THREAD_PAUSED; if (m_EncPos[2] < 0) { sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "开始前请确认当前位置大于零!"); EventCallback(sEvenProp); return HSI_STATUS_FAILED; } m_Thread_StateData = HSI_THREAD_PAUSED; m_IbinCount = 0; m_cSendData[0] = CT_TURNTABLE; m_cSendData[1] = CT_RTSET; int index = 2; for (size_t i = 0; i < 4; i++) { m_cSendData[index++] = ((CamerasDis[i] >> 24) & 0xff); m_cSendData[index++] = ((CamerasDis[i] >> 16) & 0xff); m_cSendData[index++] = ((CamerasDis[i] >> 8) & 0xff); m_cSendData[index++] = (CamerasDis[i] & 0xff); } for (size_t i = 0; i < 5; i++) { m_cSendData[index++] = ((BinsDis[i] >> 24) & 0xff); m_cSendData[index++] = ((BinsDis[i] >> 16) & 0xff); m_cSendData[index++] = ((BinsDis[i] >> 8) & 0xff); m_cSendData[index++] = (BinsDis[i] & 0xff); } m_cSendData[index++] = SubArea; m_cSendData[index++] = ((filterTime1 >> 8) & 0xff); m_cSendData[index++] = (filterTime1 & 0xff); m_cSendData[index++] = ((filterTime2 >> 8) & 0xff); m_cSendData[index++] = (filterTime2 & 0xff); m_cSendData[index++] = ((pluseSumDis >> 24) & 0xff); m_cSendData[index++] = ((pluseSumDis >> 16) & 0xff); m_cSendData[index++] = ((pluseSumDis >> 8) & 0xff); m_cSendData[index++] = (pluseSumDis & 0xff); m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); Sleep(5); Jog(m_UseAxisNum, 0.1); } g_pLogger->SendAndFlushWithTime(L"[StartPlcJob] Out\n"); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SendBinResult(int* BinResult) { g_pLogger->SendAndFlushWithTime(L"[SendBinResult] In\n"); auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { m_IbinCount++; m_cSendData[0] = CT_TURNTABLE; m_cSendData[1] = CT_BINSDATA; int temp = 0; switch (BinResult[0]) { case 1: temp = 0x01; break; case 2: temp = 0x02; break; case 3: temp = 0x04; break; case 4: temp = 0x08; break; default: temp = 0x00; break; } m_cSendData[2] = temp; m_cSendData[3] = ((m_IbinCount >> 24) & 0xff); m_cSendData[4] = ((m_IbinCount >> 16) & 0xff); m_cSendData[5] = ((m_IbinCount >> 8) & 0xff); m_cSendData[6] = (m_IbinCount & 0xff); m_WriteByte = Send_Command(0, (const char*)m_cSendData, m_SendDataLength); g_pLogger->SendAndFlushWithTime(L"[GetSpeedXyz] m_IbinCount = %d\n", m_IbinCount); Sleep(5); } g_pLogger->SendAndFlushWithTime(L"[SendBinResult] out\n"); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::GetTriggleCount(int *nCount, int& nArea) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { if (m_SO7_Serial.m_RecvData[0] == 3) { nArea = m_SO7_Serial.m_RecvData[1]; nCount[0] = m_SO7_Serial.m_RecvData[2] << 24 | m_SO7_Serial.m_RecvData[3] << 16 | m_SO7_Serial.m_RecvData[4] << 8 | m_SO7_Serial.m_RecvData[5]; nCount[1] = m_SO7_Serial.m_RecvData[6] << 24 | m_SO7_Serial.m_RecvData[7] << 16 | m_SO7_Serial.m_RecvData[8] << 8 | m_SO7_Serial.m_RecvData[9]; nCount[2] = m_SO7_Serial.m_RecvData[10] << 24 | m_SO7_Serial.m_RecvData[11] << 16 | m_SO7_Serial.m_RecvData[12] << 8 | m_SO7_Serial.m_RecvData[13]; nCount[3] = m_SO7_Serial.m_RecvData[14] << 24 | m_SO7_Serial.m_RecvData[15] << 16 | m_SO7_Serial.m_RecvData[16] << 8 | m_SO7_Serial.m_RecvData[17]; nCount[4] = m_SO7_Serial.m_RecvData[18] << 24 | m_SO7_Serial.m_RecvData[19] << 16 | m_SO7_Serial.m_RecvData[20] << 8 | m_SO7_Serial.m_RecvData[21]; nCount[5] = m_SO7_Serial.m_RecvData[22] << 24 | m_SO7_Serial.m_RecvData[23] << 16 | m_SO7_Serial.m_RecvData[24] << 8 | m_SO7_Serial.m_RecvData[25]; nCount[6] = m_SO7_Serial.m_RecvData[26] << 24 | m_SO7_Serial.m_RecvData[27] << 16 | m_SO7_Serial.m_RecvData[28] << 8 | m_SO7_Serial.m_RecvData[29]; nCount[7] = m_SO7_Serial.m_RecvData[30] << 24 | m_SO7_Serial.m_RecvData[31] << 16 | m_SO7_Serial.m_RecvData[32] << 8 | m_SO7_Serial.m_RecvData[33]; nCount[8] = m_SO7_Serial.m_RecvData[34] << 24 | m_SO7_Serial.m_RecvData[35] << 16 | m_SO7_Serial.m_RecvData[36] << 8 | m_SO7_Serial.m_RecvData[37]; nCount[9] = m_SO7_Serial.m_RecvData[38] << 24 | m_SO7_Serial.m_RecvData[39] << 16 | m_SO7_Serial.m_RecvData[40] << 8 | m_SO7_Serial.m_RecvData[41]; g_pLogger->SendAndFlushWithTime(L"[GetTriggleCount] nArea = %d\n", nArea); } } return rStatus; } //=========================================================================== //点胶 //=========================================================================== HSI_STATUS HSI_Motion::GluePPSpnts(int* ppsDir, double* gluePPSPos, int* delayLightBefore, int* lightTime, double* lightData, int num) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { unsigned char send_gluePPS_data[64] = { 0 }; send_gluePPS_data[0] = CT_GLUEDISPENSER; send_gluePPS_data[1] = 0x01; //擦除指令 m_WriteByte = Send_Command(0, (const char*)send_gluePPS_data, m_SendDataLength); Sleep(200); int posIndex = 0; int loadFeet[4]; int j = 0; int c = 0; //触发计数 int dirType = 0; int saveDir = 0; int duanNum = 0; double triggerPnt[4]; double savePPSPnt[4]; GlueDispenserindexNum = 0; #pragma region 拍照点 for (size_t i = 0; i < num; i++) { if (i == 0) { dirType = ppsDir[0]; saveDir = dirType; j = 7; } else { dirType = ppsDir[i]; } if (dirType != saveDir) { //-> send_gluePPS_data[0] = CT_GLUEDISPENSER; send_gluePPS_data[1] = 0x02; send_gluePPS_data[2] = GlueDispenserindexNum; send_gluePPS_data[3] = duanNum; send_gluePPS_data[4] = c; int axisNum = 0; int dirnum = 0; switch (saveDir) { case 0: { axisNum = 1; dirnum = 2; break; } case 1: { axisNum = 1; dirnum = 1; break; } case 2: { axisNum = 2; dirnum = 2; break; } case 3: { axisNum = 2; dirnum = 1; break; } default: break; } send_gluePPS_data[5] = axisNum; send_gluePPS_data[6] = dirnum; m_WriteByte = Send_Command(0, (const char*)send_gluePPS_data, m_SendDataLength); Sleep(20); GlueDispenserindexNum++; duanNum = 0; saveDir = dirType; c = 0; j = 7; } switch (dirType) { case 0: { c++; loadFeet[0] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); loadFeet[1] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); loadFeet[2] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); send_gluePPS_data[j++] = (loadFeet[0] & 0xff); send_gluePPS_data[j++] = ((loadFeet[0] >> 8) & 0xff); send_gluePPS_data[j++] = ((loadFeet[0] >> 16) & 0xff); send_gluePPS_data[j++] = ((loadFeet[0] >> 24) & 0xff); break; } case 1: { c++; loadFeet[0] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); loadFeet[1] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); loadFeet[2] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); send_gluePPS_data[j++] = (loadFeet[0] & 0xff); send_gluePPS_data[j++] = ((loadFeet[0] >> 8) & 0xff); send_gluePPS_data[j++] = ((loadFeet[0] >> 16) & 0xff); send_gluePPS_data[j++] = ((loadFeet[0] >> 24) & 0xff); break; } case 2: { c++; loadFeet[0] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); loadFeet[1] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); loadFeet[2] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); send_gluePPS_data[j++] = (loadFeet[1] & 0xff); send_gluePPS_data[j++] = ((loadFeet[1] >> 8) & 0xff); send_gluePPS_data[j++] = ((loadFeet[1] >> 16) & 0xff); send_gluePPS_data[j++] = ((loadFeet[1] >> 24) & 0xff); break; } case 3: { c++; loadFeet[0] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); loadFeet[1] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); loadFeet[2] = (int)(gluePPSPos[posIndex++] / m_Resolution[1]); send_gluePPS_data[j++] = (loadFeet[1] & 0xff); send_gluePPS_data[j++] = ((loadFeet[1] >> 8) & 0xff); send_gluePPS_data[j++] = ((loadFeet[1] >> 16) & 0xff); send_gluePPS_data[j++] = ((loadFeet[1] >> 24) & 0xff); break; } default: break; } if (c == 12) { //-> send_gluePPS_data[0] = CT_GLUEDISPENSER; send_gluePPS_data[1] = 0x02; send_gluePPS_data[2] = GlueDispenserindexNum; send_gluePPS_data[3] = duanNum; send_gluePPS_data[4] = c; int axisNum = 0; int dirnum = 0; switch (saveDir) { case 0: { axisNum = 1; dirnum = 2; break; } case 1: { axisNum = 1; dirnum = 1; break; } case 2: { axisNum = 2; dirnum = 2; break; } case 3: { axisNum = 2; dirnum = 1; break; } default: break; } send_gluePPS_data[5] = axisNum; send_gluePPS_data[6] = dirnum; m_WriteByte = Send_Command(0, (const char*)send_gluePPS_data, m_SendDataLength); Sleep(20); duanNum++; saveDir = dirType; c = 0; j = 7; } } if (c != 0) { send_gluePPS_data[0] = CT_GLUEDISPENSER; send_gluePPS_data[1] = 0x02; send_gluePPS_data[2] = GlueDispenserindexNum; send_gluePPS_data[3] = duanNum; send_gluePPS_data[4] = c; int axisNum = 0; int dirnum = 0; switch (saveDir) { case 0: { axisNum = 1; dirnum = 2; break; } case 1: { axisNum = 1; dirnum = 1; break; } case 2: { axisNum = 2; dirnum = 2; break; } case 3: { axisNum = 2; dirnum = 1; break; } default: break; } send_gluePPS_data[5] = axisNum; send_gluePPS_data[6] = dirnum; m_WriteByte = Send_Command(0, (const char*)send_gluePPS_data, m_SendDataLength); Sleep(20); } #pragma endregion unsigned char send_data_light2[64] = { 0 }; unsigned char send_data_delay[64] = { 0 }; c = 0; GlueDispenserindexNum = 0; int ldIndex = 0; int light1 = 0; int light2 = 0; int indexCount = 0; dirType = 0; saveDir = 0; j = 3; int k = 4; int d = 4; for (size_t i = 0; i < num; i++) { if (i == 0) { dirType = ppsDir[0]; saveDir = dirType; j = 4; } else { dirType = ppsDir[i]; } if (dirType != saveDir) { send_gluePPS_data[0] = CT_GLUEDISPENSER; send_gluePPS_data[1] = 0x03; send_gluePPS_data[2] = GlueDispenserindexNum; send_gluePPS_data[3] = 0; m_WriteByte = Send_Command(0, (const char*)send_gluePPS_data, m_SendDataLength); Sleep(20); send_data_light2[0] = CT_GLUEDISPENSER; send_data_light2[1] = 0x03; send_data_light2[2] = GlueDispenserindexNum; send_data_light2[3] = 1; m_WriteByte = Send_Command(0, (const char*)send_data_light2, m_SendDataLength); Sleep(20); send_data_delay[0] = CT_GLUEDISPENSER; send_data_delay[1] = 0x03; send_data_delay[2] = GlueDispenserindexNum; send_data_delay[3] = 2; m_WriteByte = Send_Command(0, (const char*)send_data_delay, m_SendDataLength); Sleep(20); c = 0; j = 4; k = 4; d = 4; indexCount = 0; GlueDispenserindexNum++; } light1 = (int)(lightData[ldIndex++] * 1120); light2 = (int)(lightData[ldIndex++] * 1120); //send_gluePPS_data[j++] = (delayLightBefore[i] & 0xff); //send_gluePPS_data[j++] = ((delayLightBefore[i] >> 8) & 0xff); send_gluePPS_data[j++] = (light1 & 0xff); send_gluePPS_data[j++] = ((light1 >> 8) & 0xff); send_data_light2[k++] = (light2 & 0xff); send_data_light2[k++] = ((light2 >> 8) & 0xff); send_data_delay[d++] = (lightTime[i] & 0xff); c++; if (c == 30) { send_gluePPS_data[0] = CT_GLUEDISPENSER; send_gluePPS_data[1] = 0x03; send_gluePPS_data[2] = GlueDispenserindexNum; send_gluePPS_data[3] = 0; m_WriteByte = Send_Command(0, (const char*)send_gluePPS_data, m_SendDataLength); Sleep(20); send_data_light2[0] = CT_GLUEDISPENSER; send_data_light2[1] = 0x03; send_data_light2[2] = GlueDispenserindexNum; send_data_light2[3] = 1; m_WriteByte = Send_Command(0, (const char*)send_data_light2, m_SendDataLength); Sleep(20); send_data_delay[0] = CT_GLUEDISPENSER; send_data_delay[1] = 0x03; send_data_delay[2] = GlueDispenserindexNum; send_data_delay[3] = 2; m_WriteByte = Send_Command(0, (const char*)send_data_delay, m_SendDataLength); Sleep(20); c = 0; j = 4; k = 4; d = 4; indexCount++; GlueDispenserindexNum++; } } if (c != 0) { send_gluePPS_data[0] = CT_GLUEDISPENSER; send_gluePPS_data[1] = 0x03; send_gluePPS_data[2] = GlueDispenserindexNum; send_gluePPS_data[3] = 0; m_WriteByte = Send_Command(0, (const char*)send_gluePPS_data, m_SendDataLength); Sleep(20); send_data_light2[0] = CT_GLUEDISPENSER; send_data_light2[1] = 0x03; send_data_light2[2] = GlueDispenserindexNum; send_data_light2[3] = 1; m_WriteByte = Send_Command(0, (const char*)send_data_light2, m_SendDataLength); Sleep(20); send_data_delay[0] = CT_GLUEDISPENSER; send_data_delay[1] = 0x03; send_data_delay[2] = GlueDispenserindexNum; send_data_delay[3] = 2; m_WriteByte = Send_Command(0, (const char*)send_data_delay, m_SendDataLength); Sleep(20); GlueDispenserindexNum++; } } return rStatus; } HSI_STATUS HSI_Motion::GlueDispenser(int* index, int* cirdirection, double* gluePos, int num) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { GluerunCount = 0; unsigned char send_glue_data[64] = { 0 }; send_glue_data[0] = CT_ORDER; send_glue_data[1] = CT_GLUEDISPENSER_CLEAR; send_glue_data[2] = 0x02; m_WriteByte = Send_Command(0, (const char*)send_glue_data, m_SendDataLength); Sleep(200); int posIndex = 0; int loadFeet[4]; double startGluepos[4]; double endGluepos[4]; double saveGluepos[4]; int circlepnt[4]; unsigned char glueaxis = 0; for (size_t i = 0; i < num; i++) { switch (index[i]) { case 0: { glueaxis = 0; if (i == 0) { GluerunCount++; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)(endGluepos[0] / m_Resolution[1]); loadFeet[1] = (int)(endGluepos[1] / m_Resolution[2]); loadFeet[2] = (int)(endGluepos[2] / m_Resolution[3]); loadFeet[3] = (int)(endGluepos[3] / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[3] = glueaxis; send_glue_data[4] = 0x01; send_glue_data[5] = 0x00; int j = 6; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } send_glue_data[0] = CT_MOTOR; send_glue_data[1] = CT_GLUEDISPENSER_SET; int len = j - 3; send_glue_data[2] = len; m_WriteByte = Send_Command(0, (const char*)send_glue_data, m_SendDataLength); Sleep(20); } else { GluerunCount++; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; startGluepos[0] = saveGluepos[0]; startGluepos[1] = saveGluepos[1]; startGluepos[2] = saveGluepos[2]; startGluepos[3] = saveGluepos[3]; saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)((endGluepos[0] - startGluepos[0]) / m_Resolution[1]); loadFeet[1] = (int)((endGluepos[1] - startGluepos[1]) / m_Resolution[2]); loadFeet[2] = (int)((endGluepos[2] - startGluepos[2]) / m_Resolution[3]); loadFeet[3] = (int)((endGluepos[3] - startGluepos[3]) / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[3] = glueaxis; send_glue_data[4] = 0x01; send_glue_data[5] = 0x00; int j = 6; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } send_glue_data[0] = CT_MOTOR; send_glue_data[1] = CT_GLUEDISPENSER_SET; int len = j - 3; send_glue_data[2] = len; m_WriteByte = Send_Command(0, (const char*)send_glue_data, m_SendDataLength); Sleep(20); } break; } case 1: { if (i == 0) { GluerunCount++; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)(endGluepos[0] / m_Resolution[1]); loadFeet[1] = (int)(endGluepos[1] / m_Resolution[2]); loadFeet[2] = (int)(endGluepos[2] / m_Resolution[3]); loadFeet[3] = (int)(endGluepos[3] / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[3] = glueaxis; send_glue_data[4] = 0x01; send_glue_data[5] = 0x00; int j = 6; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } GluerunCount++; glueaxis = 0; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; startGluepos[0] = saveGluepos[0]; startGluepos[1] = saveGluepos[1]; startGluepos[2] = saveGluepos[2]; startGluepos[3] = saveGluepos[3]; saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)((endGluepos[0] - startGluepos[0]) / m_Resolution[1]); loadFeet[1] = (int)((endGluepos[1] - startGluepos[1]) / m_Resolution[2]); loadFeet[2] = (int)((endGluepos[2] - startGluepos[2]) / m_Resolution[3]); loadFeet[3] = (int)((endGluepos[3] - startGluepos[3]) / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[j++] = glueaxis; send_glue_data[j++] = 0x02; send_glue_data[j++] = 0x01; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } send_glue_data[0] = CT_MOTOR; send_glue_data[1] = CT_GLUEDISPENSER_SET; int len = j - 3; send_glue_data[2] = len; m_WriteByte = Send_Command(0, (const char*)send_glue_data, m_SendDataLength); Sleep(20); } else { GluerunCount++; glueaxis = 0; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; startGluepos[0] = saveGluepos[0]; startGluepos[1] = saveGluepos[1]; startGluepos[2] = saveGluepos[2]; startGluepos[3] = saveGluepos[3]; saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)((endGluepos[0] - startGluepos[0]) / m_Resolution[1]); loadFeet[1] = (int)((endGluepos[1] - startGluepos[1]) / m_Resolution[2]); loadFeet[2] = (int)((endGluepos[2] - startGluepos[2]) / m_Resolution[3]); loadFeet[3] = (int)((endGluepos[3] - startGluepos[3]) / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[3] = glueaxis; send_glue_data[4] = 0x02; send_glue_data[5] = 0x00; int j = 6; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } GluerunCount++; glueaxis = 0; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; startGluepos[0] = saveGluepos[0]; startGluepos[1] = saveGluepos[1]; startGluepos[2] = saveGluepos[2]; startGluepos[3] = saveGluepos[3]; saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)((endGluepos[0] - startGluepos[0]) / m_Resolution[1]); loadFeet[1] = (int)((endGluepos[1] - startGluepos[1]) / m_Resolution[2]); loadFeet[2] = (int)((endGluepos[2] - startGluepos[2]) / m_Resolution[3]); loadFeet[3] = (int)((endGluepos[3] - startGluepos[3]) / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[j++] = glueaxis; send_glue_data[j++] = 0x02; send_glue_data[j++] = 0x01; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } send_glue_data[0] = CT_MOTOR; send_glue_data[1] = CT_GLUEDISPENSER_SET; int len = j - 3; send_glue_data[2] = len; m_WriteByte = Send_Command(0, (const char*)send_glue_data, m_SendDataLength); Sleep(20); } break; } case 3: { if (i == 0) { GluerunCount++; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)(endGluepos[0] / m_Resolution[1]); loadFeet[1] = (int)(endGluepos[1] / m_Resolution[2]); loadFeet[2] = (int)(endGluepos[2] / m_Resolution[3]); loadFeet[3] = (int)(endGluepos[3] / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[3] = glueaxis; send_glue_data[4] = 0x01; send_glue_data[5] = 0x00; int j = 6; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } GluerunCount++; glueaxis = 0; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; startGluepos[0] = saveGluepos[0]; startGluepos[1] = saveGluepos[1]; startGluepos[2] = saveGluepos[2]; startGluepos[3] = saveGluepos[3]; circlepnt[0] = (int)((gluePos[posIndex++] - startGluepos[0]) / m_Resolution[1]); circlepnt[1] = (int)((gluePos[posIndex++] - startGluepos[1]) / m_Resolution[2]); circlepnt[2] = (int)((gluePos[posIndex++] - startGluepos[2]) / m_Resolution[3]); circlepnt[3] = (int)((gluePos[posIndex++] - startGluepos[3]) / m_Resolution[4]); saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)((endGluepos[0] - startGluepos[0]) / m_Resolution[1]); loadFeet[1] = (int)((endGluepos[1] - startGluepos[1]) / m_Resolution[2]); loadFeet[2] = (int)((endGluepos[2] - startGluepos[2]) / m_Resolution[3]); loadFeet[3] = (int)((endGluepos[3] - startGluepos[3]) / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[j++] = 0x03; if (cirdirection[i] == 0) { send_glue_data[j++] = 0x04; } else { send_glue_data[j++] = 0x03; } send_glue_data[j++] = 0x01; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (circlepnt[k] & 0xff); send_glue_data[j++] = ((circlepnt[k] >> 8) & 0xff); send_glue_data[j++] = ((circlepnt[k] >> 16) & 0xff); send_glue_data[j++] = ((circlepnt[k] >> 24) & 0xff); } send_glue_data[0] = CT_MOTOR; send_glue_data[1] = CT_GLUEDISPENSER_SET; int len = j - 3; send_glue_data[2] = len; m_WriteByte = Send_Command(0, (const char*)send_glue_data, m_SendDataLength); Sleep(20); } else { GluerunCount++; glueaxis = 0; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; startGluepos[0] = saveGluepos[0]; startGluepos[1] = saveGluepos[1]; startGluepos[2] = saveGluepos[2]; startGluepos[3] = saveGluepos[3]; saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)((endGluepos[0] - startGluepos[0]) / m_Resolution[1]); loadFeet[1] = (int)((endGluepos[1] - startGluepos[1]) / m_Resolution[2]); loadFeet[2] = (int)((endGluepos[2] - startGluepos[2]) / m_Resolution[3]); loadFeet[3] = (int)((endGluepos[3] - startGluepos[3]) / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[3] = glueaxis; send_glue_data[4] = 0x02; send_glue_data[5] = 0x00; int j = 6; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } GluerunCount++; glueaxis = 0; endGluepos[0] = gluePos[posIndex++]; endGluepos[1] = gluePos[posIndex++]; endGluepos[2] = gluePos[posIndex++]; endGluepos[3] = gluePos[posIndex++]; startGluepos[0] = saveGluepos[0]; startGluepos[1] = saveGluepos[1]; startGluepos[2] = saveGluepos[2]; startGluepos[3] = saveGluepos[3]; circlepnt[0] = (int)((gluePos[posIndex++] - startGluepos[0]) / m_Resolution[1]); circlepnt[1] = (int)((gluePos[posIndex++] - startGluepos[1]) / m_Resolution[2]); circlepnt[2] = (int)((gluePos[posIndex++] - startGluepos[2]) / m_Resolution[3]); circlepnt[3] = (int)((gluePos[posIndex++] - startGluepos[3]) / m_Resolution[4]); saveGluepos[0] = endGluepos[0]; saveGluepos[1] = endGluepos[1]; saveGluepos[2] = endGluepos[2]; saveGluepos[3] = endGluepos[3]; loadFeet[0] = (int)((endGluepos[0] - startGluepos[0]) / m_Resolution[1]); loadFeet[1] = (int)((endGluepos[1] - startGluepos[1]) / m_Resolution[2]); loadFeet[2] = (int)((endGluepos[2] - startGluepos[2]) / m_Resolution[3]); loadFeet[3] = (int)((endGluepos[3] - startGluepos[3]) / m_Resolution[4]); if (abs(loadFeet[0]) > 20) glueaxis |= 0x01; if (abs(loadFeet[1]) > 20) glueaxis |= 0x02; if (abs(loadFeet[2]) > 20) glueaxis |= 0x04; if (abs(loadFeet[3]) > 20) glueaxis |= 0x08; send_glue_data[j++] = 0x03; if (cirdirection[i] == 0) { send_glue_data[j++] = 0x04; } else { send_glue_data[j++] = 0x03; } send_glue_data[j++] = 0x01; for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (loadFeet[k] & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 8) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 16) & 0xff); send_glue_data[j++] = ((loadFeet[k] >> 24) & 0xff); } for (size_t k = 0; k < 4; k++) { send_glue_data[j++] = (circlepnt[k] & 0xff); send_glue_data[j++] = ((circlepnt[k] >> 8) & 0xff); send_glue_data[j++] = ((circlepnt[k] >> 16) & 0xff); send_glue_data[j++] = ((circlepnt[k] >> 24) & 0xff); } send_glue_data[0] = CT_MOTOR; send_glue_data[1] = CT_GLUEDISPENSER_SET; int len = j - 3; send_glue_data[2] = len; m_WriteByte = Send_Command(0, (const char*)send_glue_data, m_SendDataLength); Sleep(20); } break; } default: break; } } /*send_glue_data[0] = CT_MOTOR; send_glue_data[1] = CT_GLUEDISPENSER_START; send_glue_data[2] = runCount;*/ } return rStatus; } HSI_STATUS HSI_Motion::GlueDispenserStart(double xOffset, double yOffset, double qOffset) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { int xSkew = xOffset / m_Resolution[1]; int ySkew = yOffset / m_Resolution[2]; int qSkew = qOffset / m_Resolution[1]; unsigned char send_glue_data[64] = { 0 }; send_glue_data[0] = CT_MOTOR; send_glue_data[1] = CT_GLUEDISPENSER_START; send_glue_data[2] = GlueDispenserindexNum + 1; send_glue_data[3] = GluerunCount; send_glue_data[4] = (m_SetPotion_StartSpeed[1] & 0xff); send_glue_data[5] = ((m_SetPotion_StartSpeed[1] >> 8) & 0xff); send_glue_data[6] = (m_SetPotion_DriveSpeed[1] & 0xff); send_glue_data[7] = ((m_SetPotion_DriveSpeed[1] >> 8) & 0xff); send_glue_data[8] = (m_SetPotion_Line[1] & 0xff); send_glue_data[9] = ((m_SetPotion_Line[1] >> 8) & 0xff); send_glue_data[10] = (xSkew & 0xff); send_glue_data[11] = ((xSkew >> 8) & 0xff); send_glue_data[12] = (ySkew & 0xff); send_glue_data[13] = ((ySkew >> 8) & 0xff); send_glue_data[14] = (qSkew & 0xff); send_glue_data[15] = ((qSkew >> 8) & 0xff); g_pLogger->SendAndFlushWithTime(L"[GlueDispenser] m_SetPotion_StartSpeed = %d, m_SetPotion_DriveSpeed = %d,m_SetPotion_Line = %d \n", m_SetPotion_StartSpeed[1], m_SetPotion_DriveSpeed[1], m_SetPotion_Line[1]); m_WriteByte = Send_Command(0, (const char*)send_glue_data, m_SendDataLength); Sleep(5); g_IsClose = false; bUseGlueDispenser = true; m_Thread_State = HSI_THREAD_RUNNING; bRunGlueDispenser = HSI_THREAD_RUNNING; SetEvent(m_hTriggerEvent); } return rStatus; } void HSI_Motion::GluedispenserDone()//涂胶机完成 { if (bRunGlueDispenser == HSI_THREAD_RUNNING) { Sleep(100); int timeStart = GetTickCount(); do { if (g_IsClose) { g_IsClose = false; break; } if (m_SO7_Serial.m_RecvData[0] == 2) { if ((m_SO7_Serial.m_RecvData[60] & 0x0f)) { g_pLogger->SendAndFlushWithTime(L"[GluedispenserDone] Run End Normal\n");//涂胶机完成 m_SO7_Serial.m_RecvData[60] = 0; break; } } Sleep(1); int timeEnd = GetTickCount(); if (timeStart - timeEnd > 10 * 1000) { g_pLogger->SendAndFlushWithTime(L"[GluedispenserDone] Run End Abnormal\n"); break; } } while (true); bRunGlueDispenser = HSI_THREAD_PAUSED; sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_FUNCTION; sEvenProp.EventID = HSI_EVENT_MOTION_DISPENSER; sEvenProp.EventResponse = HSI_EVENT_FUNCTION_OK; EventCallback(sEvenProp); } } //=========================================================================== HSI_STATUS HSI_Motion::GetPntsDistance(double& pDistance, int& spTimeCount) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { if (SetPotionRunEnd) { g_pLogger->SendAndFlushWithTime(L"[GetPntsDistance] PTPDistance = %.4f,spTimeCount = %d\n", PntToPntDistance, SpTimeCount); SetPotionRunEnd = false; pDistance = PntToPntDistance; spTimeCount = SpTimeCount; } else { pDistance = -100; spTimeCount = -1; } } return rStatus; } //========================运动控制参数读取及设置=================================================== int HSI_Motion::SpeedPercent(int AxisNum, double &Speed, int &DirveSpeed, int &StartSpeed, int &AccLine, int &DecLine, int &AccCurve, int &DecCurve) { int MovetoSpeedGear = 0; int flag = 1; if (fabs(Speed) > 1.01) { MovetoSpeedGear = 0; } else if (fabs(Speed) > 0.81) { DirveSpeed = m_JogDriveSpeed[AxisNum][0]; StartSpeed = m_JogStartSpeed[AxisNum][0]; AccLine = m_JogAccLine[AxisNum][0]; DecLine = m_JogDecLine[AxisNum][0]; AccCurve = m_JogAccCurve[AxisNum][0]; DecCurve = m_JogDecCurve[AxisNum][0]; } else if (fabs(Speed) > 0.61) { DirveSpeed = m_JogDriveSpeed[AxisNum][1]; StartSpeed = m_JogStartSpeed[AxisNum][1]; AccLine = m_JogAccLine[AxisNum][1]; DecLine = m_JogDecLine[AxisNum][1]; AccCurve = m_JogAccCurve[AxisNum][1]; DecCurve = m_JogDecCurve[AxisNum][1]; } else if (fabs(Speed) > 0.41) { DirveSpeed = m_JogDriveSpeed[AxisNum][2]; StartSpeed = m_JogStartSpeed[AxisNum][2]; AccLine = m_JogAccLine[AxisNum][2]; DecLine = m_JogDecLine[AxisNum][2]; AccCurve = m_JogAccCurve[AxisNum][2]; DecCurve = m_JogDecCurve[AxisNum][2]; } else if (fabs(Speed) > 0.21) { DirveSpeed = m_JogDriveSpeed[AxisNum][3]; StartSpeed = m_JogStartSpeed[AxisNum][3]; AccLine = m_JogAccLine[AxisNum][3]; DecLine = m_JogDecLine[AxisNum][3]; AccCurve = m_JogAccCurve[AxisNum][3]; DecCurve = m_JogDecCurve[AxisNum][3]; } else if (fabs(Speed) > 0.01) { DirveSpeed = m_JogDriveSpeed[AxisNum][4]; StartSpeed = m_JogStartSpeed[AxisNum][4]; AccLine = m_JogAccLine[AxisNum][4]; DecLine = m_JogDecLine[AxisNum][4]; AccCurve = m_JogAccCurve[AxisNum][4]; DecCurve = m_JogDecCurve[AxisNum][4]; } else { MovetoSpeedGear = 0; } Speed = MovetoSpeedGear * flag; return (int)Speed; } //==========================JoyStick运动控制参数读取及设置================================================= bool HSI_Motion::SpeedPercentJoyStick(int AxisNum, long &Speed, int &DirveSpeed, int &StartSpeed, int &AccLine, int &DecLine, int &AccCurve, int &DecCurve) { Speed = Speed > 1000 ? 1000 : Speed; double dSpeedRate = (double)Speed / 1000; DirveSpeed = m_JogDriveSpeed[AxisNum][0] * (dSpeedRate*dSpeedRate); if (DirveSpeed >m_JogDriveSpeed[AxisNum][1]) { DirveSpeed = m_JogDriveSpeed[AxisNum][0]; StartSpeed = m_JogStartSpeed[AxisNum][0]; AccLine = m_JogAccLine[AxisNum][0]; DecLine = m_JogDecLine[AxisNum][0]; AccCurve = m_JogAccCurve[AxisNum][0]; DecCurve = m_JogDecCurve[AxisNum][0]; } else if (DirveSpeed >m_JogDriveSpeed[AxisNum][2]) { StartSpeed = m_JogStartSpeed[AxisNum][1]; AccLine = m_JogAccLine[AxisNum][1]; DecLine = m_JogDecLine[AxisNum][1]; AccCurve = m_JogAccCurve[AxisNum][1]; DecCurve = m_JogDecCurve[AxisNum][1]; } else if (DirveSpeed >m_JogDriveSpeed[AxisNum][3]) { StartSpeed = m_JogStartSpeed[AxisNum][2]; AccLine = m_JogAccLine[AxisNum][2]; DecLine = m_JogDecLine[AxisNum][2]; AccCurve = m_JogAccCurve[AxisNum][2]; DecCurve = m_JogDecCurve[AxisNum][2]; } else if (DirveSpeed >m_JogDriveSpeed[AxisNum][4]) { StartSpeed = m_JogStartSpeed[AxisNum][3]; AccLine = m_JogAccLine[AxisNum][3]; DecLine = m_JogDecLine[AxisNum][3]; AccCurve = m_JogAccCurve[AxisNum][3]; DecCurve = m_JogDecCurve[AxisNum][3]; } else if (DirveSpeed == 0) { return false; } else { StartSpeed = m_JogStartSpeed[AxisNum][4]; AccLine = m_JogAccLine[AxisNum][4]; DecLine = m_JogDecLine[AxisNum][4]; AccCurve = m_JogAccCurve[AxisNum][4]; DecCurve = m_JogDecCurve[AxisNum][4]; } return true; } //=========================================================================== HSI_STATUS HSI_Motion::GetSpeedXyz(int AxisNum, double &Speed) { g_pLogger->SendAndFlushWithTime(L"[GetSpeedXyz] In\n"); auto rStatus = HSI_STATUS_NORMAL; short AxisNumber = AxisConvertIndex(AxisNum); if (1==m_iSpeedType) { Speed = m_SetPotion_DriveSpeed[AxisNumber] * (m_Resolution[AxisNumber] * 50); } else { Speed = m_SetPotion_DriveSpeed[AxisNumber]; } g_pLogger->SendAndFlushWithTime(L"[GetSpeedXyz] Out\n"); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetSpeedXyz(double Speed) { auto rStatus = HSI_STATUS_NORMAL; g_pLogger->SendAndFlushWithTime(L"[SetSpeedXyz] In\n"); if (Speed >= -1 && Speed <= 0) { g_pLogger->SendAndFlushWithTime(L"[SetSpeedXyz] Speed = %f, m_Jog_Auto_Focus = %f\n", Speed, m_Jog_Auto_Focus); m_JogDriveSpeed[3][4] = (int)fabs(Speed * m_Jog_Auto_Focus); g_pLogger->SendAndFlushWithTime(L"[SetSpeedXyz] m_Jog_SpeedZ[3][4] = %f\n", m_JogDriveSpeed[3][4]); } else { g_pLogger->SendAndFlushWithTime(L"[SetSpeedXyz] Speed = %f\n", Speed); if (1 == m_iSpeedType) { m_SetPotion_DriveSpeed[1] = (int)(Speed / (m_Resolution[1] * 50)); if (m_SetPotion_DriveSpeed[1] > 1000 / (m_Resolution[1] * 50)) { m_SetPotion_DriveSpeed[1] = 1000 / (m_Resolution[1] * 50); } if (m_SetPotion_DriveSpeed[1] < 0) { m_SetPotion_DriveSpeed[1] = 0; } } else { m_SetPotion_DriveSpeed[1] = (int)Speed; if (m_SetPotion_DriveSpeed[1] > 1000 / (m_Resolution[1] * 50)) { m_SetPotion_DriveSpeed[1] = 1000 / (m_Resolution[1] * 50); } if (m_SetPotion_DriveSpeed[1] < 0) { m_SetPotion_DriveSpeed[1] = 0; } } } g_pLogger->SendAndFlushWithTime(L"[SetSpeedXyz] Out\n"); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::GetFocusSpeed(double &Speed) { g_pLogger->SendAndFlushWithTime(L"[GetFocusSpeed] In\n"); auto rStatus = HSI_STATUS_NORMAL; if (1==m_iSpeedType) { Speed = m_JogDriveSpeed[3][4] * (m_Resolution[3] * 50); } else { Speed = m_JogDriveSpeed[3][4]; } g_pLogger->SendAndFlushWithTime(L"[GetFocusSpeed] Out\n"); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetFocusSpeed(double Speed) { auto rStatus = HSI_STATUS_NORMAL; g_pLogger->SendAndFlushWithTime(L"[SetFocusSpeed] In\n"); g_pLogger->SendAndFlushWithTime(L"[SetFocusSpeed] Speed = %f, m_Jog_Auto_Focus = %f\n", Speed, m_Jog_Auto_Focus); if (1==m_iSpeedType) { m_JogDriveSpeed[3][4] = Speed / (m_Resolution[3] * 50); } else { m_JogDriveSpeed[3][4] = Speed; } g_pLogger->SendAndFlushWithTime(L"[SetFocusSpeed] m_Jog_SpeedZ[3][4] = %f\n", m_JogDriveSpeed[4][3]); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::GetAccelerationXyz(double &AccelX, double &AccelY, double &AccelZ) { auto rStatus = HSI_STATUS_NORMAL; return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetAccelerationXyz(double AccelX, double AccelY, double AccelZ) { auto rStatus = HSI_STATUS_NORMAL; return rStatus; } //=========================================================================== double HSI_Motion::LimitOver(UINT AxisTypes, double &LimitPos) { short AxisNumber = AxisConvertIndex(AxisTypes); if (g_pHSI_Motion) { switch (AxisNumber) { case 1: //轴1 { if (LimitPos >= m_P_Work_Limit[1]) { LimitPos = m_P_Work_Limit[1] - 5 * m_Resolution[1]; } if (LimitPos <= m_N_Work_Limit[1]) { LimitPos = m_N_Work_Limit[1] + 5 * m_Resolution[1]; } break; } case 2: { if (LimitPos >= m_P_Work_Limit[2]) { LimitPos = m_P_Work_Limit[2] - 5 * m_Resolution[2]; } if (LimitPos <= m_N_Work_Limit[2]) { LimitPos = m_N_Work_Limit[2] + 5 * m_Resolution[2]; } break; } case 3: { if (LimitPos >= m_P_Work_Limit[3]) { LimitPos = m_P_Work_Limit[3] - 5 * m_Resolution[3]; } if (LimitPos <= m_N_Work_Limit[3]) { LimitPos = m_N_Work_Limit[3] + 5 * m_Resolution[3]; } break; } case 4: { if (LimitPos >= m_P_Work_Limit[4]) { LimitPos = m_P_Work_Limit[4] - 5 * m_Resolution[4]; } if (LimitPos <= m_N_Work_Limit[4]) { LimitPos = m_N_Work_Limit[4] + 5 * m_Resolution[4]; } break; } default: break; } } return LimitPos; } //=========================================================================== short HSI_Motion::AxisConvertIndex(UINT AxisTypes) { short AxisNumber(0); switch (AxisTypes) { case HSI_MOTION_AXIS_X: { AxisNumber = 0x01; break; } case HSI_MOTION_AXIS_Y: { AxisNumber = 0x02; break; } case HSI_MOTION_AXIS_Z: { AxisNumber = 0x03; break; } case HSI_MOTION_AXIS_R: { AxisNumber = 0x04; break; } default: { g_pLogger->SendAndFlushWithTime(L"AxisConvertIndex failed,AxisTypes = %d,AxisNumber = %d\n", AxisTypes, AxisNumber); break; } } return AxisNumber; } //=========================================================================== short HSI_Motion::IndexConvertAxis(int Index) { short AxisNumber(0); switch (Index) { case 1: { AxisNumber = AXIS_X; break; } case 2: { AxisNumber = AXIS_Y; break; } case 3: { AxisNumber = AXIS_Z; break; } case 4: { AxisNumber = AXIS_U; break; } default: { g_pLogger->SendAndFlushWithTime(L"IndexConvertAxis failed,Index = %d,AxisTypes = %d\n", Index, AxisNumber); break; } } return AxisNumber; } //=========================================================================== HSI_STATUS HSI_Motion::IsSupportedEx(UINT AxisTypes, UINT &Types) { auto rStatus = HSI_STATUS_NORMAL; Types = 1; short AxisNumber = AxisConvertIndex(AxisTypes); if (AxisNumber < 1 && AxisNumber > 4) { rStatus = HSI_STATUS_NOT_SUPPORTED; } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::StartupEx(UINT AxisTypes, bool bHome) { auto rStatus = HSI_STATUS_NORMAL; g_pLogger->SendAndFlushWithTime(L"[StartupEx] In\n"); g_pLogger->SendAndFlushWithTime(L"[StartupEx] Out\n"); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::GetScaleResolutionEx(UINT AxisTypes, double &Scale) { auto rStatus = HSI_STATUS_NORMAL; short AxisNumber = AxisConvertIndex(AxisTypes); if (g_pHSI_Motion) { Scale = m_Resolution[AxisNumber]; } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetScaleResolutionEx(UINT AxisTypes, double Scale) { auto rStatus = HSI_STATUS_NORMAL; short AxisNumber = AxisConvertIndex(AxisTypes); if (g_pHSI_Motion) { m_Resolution[AxisNumber] = (int)(Scale * 10000); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::GetPositionEx(UINT AxisTypes, double &Position, double &Time) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(AxisTypes); if (g_pHSI_Motion) { double position[4] = { 0.0 }; short AxisNumber = AxisConvertIndex(AxisTypes); Position = m_PosForAllAxis[AxisNumber]; } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetPositionEx(UINT AxisTypes, double Position, HSI_MOTION_MOVE_TYPE eType, double dSpeedGear) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(AxisTypes); if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[SetPositionEx] In\n"); short AxisNumber = AxisConvertIndex(AxisTypes); double Time = 0.0; double position[5] = { 0.0 }; for (size_t i = 0; i < 5; i++) { position[i] = m_PosForAllAxis[i]; } position[AxisNumber] = Position; SetPositionXyza(AxisTypes, position[1], position[2], position[3], position[4], eType, dSpeedGear); g_pLogger->SendAndFlushWithTime(L"[SetPositionEx] Out\n"); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetPositionStep(UINT AxisTypes, double Position, HSI_MOTION_MOVE_TYPE eType, double dSpeedGear) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::GetSpeedEx(UINT AxisTypes, double &Speed) { auto rStatus = HSI_STATUS_NORMAL; g_pLogger->SendAndFlushWithTime(L"[GetSpeedEx] In\n"); short AxisNumber = AxisConvertIndex(AxisTypes); if (AxisNumber >= 1 && AxisNumber <= 4) { if (m_motorType == 1) { if (1==m_iSpeedType) { Speed = m_SetPotion_DriveSpeed[1] * (m_Resolution[1] * 50); } else { Speed = m_SetPotion_DriveSpeed[1]; } } else { if (1==m_iSpeedType) { Speed = m_SetPotion_DriveSpeed[AxisNumber] * (m_Resolution[AxisNumber] * 50); } else { Speed = m_SetPotion_DriveSpeed[AxisNumber]; } } } g_pLogger->SendAndFlushWithTime(L"[GetSpeedEx] Out\n"); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetSpeedEx(UINT AxisTypes, double Speed) { auto rStatus = HSI_STATUS_NORMAL; g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] In\n"); short AxisNumber = AxisConvertIndex(AxisTypes); if (Speed <= 0) { m_SetPotion_DriveSpeed[AxisNumber] = 0; } if (1==m_iSpeedType) { if (Speed >= 65000 * (m_Resolution[AxisNumber] * 50)) { m_SetPotion_DriveSpeed[AxisNumber] = 65000; } } else { if (Speed >= 65000) { m_SetPotion_DriveSpeed[AxisNumber] = 65000; } } if (AxisNumber >= 1 && AxisNumber <= 4) { if (m_ForSoft == 1) { if (m_motorType == 1) { if (1==m_iSpeedType) { m_SetPotion_DriveSpeed[1] = (int)Speed/(m_Resolution[1] * 50); } else { m_SetPotion_DriveSpeed[1] = (int)Speed; } } else { g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] AxisNumber = %d,Speed = %f \n", AxisNumber, Speed); //if (!bSaveSpeedFlag) //{ // bSaveSpeedFlag = true; // m_SaveAxisNum = AxisNumber; // m_SaveAxisSpeed = m_SetPotion_DriveSpeed[AxisNumber]; // g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] m_SaveAxisNum = %d,m_SaveAxisSpeed = %d \n", m_SaveAxisNum, m_SaveAxisSpeed); //} //if (bSaveSpeedFlag && ((int)Speed == m_SetPotion_DriveSpeed[1] * (m_Resolution[1] * 50))) //{ // bSaveSpeedFlag = false; // m_SetPotion_DriveSpeed[m_SaveAxisNum] = m_SaveAxisSpeed; // return rStatus; //} if (1==m_iSpeedType) { m_SetPotion_DriveSpeed[AxisNumber] = (int)(Speed / (m_Resolution[AxisNumber] * 50)); } else { m_SetPotion_DriveSpeed[AxisNumber] = (int)Speed; } g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] AxisNumber = %d\n", AxisNumber); } } else { if (m_motorType == 1) { m_SetPotion_DriveSpeed[AxisNumber] = (int)(Speed / (m_Resolution[AxisNumber] * 50)); } else { m_SetPotion_DriveSpeed[AxisNumber] = (int)(Speed / (m_Resolution[AxisNumber] * 50)); } } } g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] Out\n"); return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::GetAccelerationEx(UINT AxisTypes, double &Accel) { auto rStatus = HSI_STATUS_NORMAL; short AxisNumber = AxisConvertIndex(AxisTypes); if (AxisNumber >= 1 && AxisNumber <= 4) { if (m_motorType == 1) { Accel = m_SetPotion_StartSpeed[1] * (m_Resolution[1] * 500); } else { Accel = m_SetPotion_StartSpeed[AxisNumber] * (m_Resolution[AxisNumber] * 500); } } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetAccelerationEx(UINT AxisTypes, double Accel) { auto rStatus = HSI_STATUS_NORMAL; short AxisNumber = AxisConvertIndex(AxisTypes); if (Accel <= 0) { m_SetPotion_StartSpeed[AxisNumber] = 1; } if (AxisNumber >= 1 && AxisNumber <= 4) { if (m_motorType == 1) { m_SetPotion_StartSpeed[AxisNumber] = (int)(Accel / (m_Resolution[AxisNumber] * 500)); } else { m_SetPotion_StartSpeed[AxisNumber] = (int)(Accel / (m_Resolution[AxisNumber] * 500)); } } return rStatus; } //=========================================================================== VOID HSI_Motion::EventCallback(sHSIEventProperties& sEventProp) { WaitForSingleObject(m_Thread_Mutex, INFINITE); if (g_pHSI_Sevenocean_EF3) { g_pHSI_Sevenocean_EF3->EventCallback(sEventProp); } ReleaseMutex(m_Thread_Mutex); } //=========================================================================== void HSI_Motion::CreateThread() { if (m_Thread_Id == NULL) { m_Thread_State = HSI_THREAD_RUNNING; m_hTriggerEvent = CreateEvent(NULL, FALSE, NULL, NULL); m_Thread_Id = ::CreateThread( (LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)m_Thread, (LPVOID)this, 0, NULL); m_Thread_Mutex = CreateMutex(NULL, FALSE, NULL); TRACE("CreateThread!\n"); } } //=========================================================================== void HSI_Motion::CloseThread() { m_Thread_State = HSI_THREAD_EXIT; Sleep(20); SetEvent(m_hTriggerEvent); if (m_Thread_Id) { DWORD dwCode = STILL_ACTIVE; while (dwCode == STILL_ACTIVE) { GetExitCodeThread(m_Thread_Id, &dwCode); Sleep(1); } } SetEvent(m_hTriggerEvent); CloseHandle(m_hTriggerEvent); m_Thread_State = HSI_THREAD_EXIT; ReleaseMutex(m_Thread_Mutex); CloseHandle(m_Thread_Mutex); m_Thread_Id = NULL; m_hTriggerEvent = NULL; m_Thread_Mutex = NULL; TRACE("CloseThread!\n"); } //=========================================================================== unsigned __stdcall HSI_Motion::m_Thread(LPVOID pThis) { HSI_Motion* _This = (HSI_Motion*)pThis; for (;;) { TRACE("m_Thread!\n"); if (m_Thread_State == THREAD_EXIT) ExitThread(0); WaitForSingleObject(m_hTriggerEvent, INFINITE); switch (m_Thread_State) { case HSI_THREAD_RUNNING: { TRACE("HSI_THREAD_RUNNING.\r\n"); if (bRunGlueDispenser == HSI_THREAD_RUNNING) _This->GluedispenserDone(); else { _This->UpdateMotionState(); _This->UpdateMotionStateEx(); } break; } case HSI_THREAD_PAUSED: { TRACE("HSI_THREAD_PAUSED.\r\n"); break; } case HSI_THREAD_EXIT: { TRACE("HSI_THREAD_EXIT.\r\n"); ExitThread(0); break; } default: break; } } } //=========================================================================== void HSI_Motion::CreateThreadProbe() { if (m_Thread_IdProbe == NULL) { m_Thread_StateProbe = HSI_THREAD_RUNNING; m_hTriggerEventProbe = CreateEvent(NULL, FALSE, NULL, NULL); m_Thread_IdProbe = ::CreateThread( (LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)m_ThreadProbe, (LPVOID)this, 0, NULL); m_Thread_MutexProbe = CreateMutex(NULL, FALSE, NULL); TRACE("CreateThread!\n"); } } //=========================================================================== void HSI_Motion::CloseThreadProbe() { m_Thread_StateProbe = HSI_THREAD_EXIT; Sleep(20); SetEvent(m_hTriggerEventProbe); if (m_Thread_IdProbe) { DWORD dwCode = STILL_ACTIVE; while (dwCode == STILL_ACTIVE) { GetExitCodeThread(m_Thread_IdProbe, &dwCode); Sleep(1); } } SetEvent(m_hTriggerEventProbe); CloseHandle(m_hTriggerEventProbe); m_Thread_StateProbe = HSI_THREAD_EXIT; ReleaseMutex(m_Thread_MutexProbe); CloseHandle(m_Thread_MutexProbe); m_Thread_IdProbe = NULL; m_hTriggerEventProbe = NULL; m_Thread_MutexProbe = NULL; TRACE("CloseThread!\n"); } //=========================================================================== unsigned __stdcall HSI_Motion::m_ThreadProbe(LPVOID pThis) { HSI_Motion* _This = (HSI_Motion*)pThis; for (;;) { TRACE("m_Thread!\n"); if (m_Thread_StateProbe == THREAD_EXIT) ExitThread(0); WaitForSingleObject(m_hTriggerEventProbe, INFINITE); switch (m_Thread_StateProbe) { case HSI_THREAD_RUNNING: { TRACE("HSI_THREAD_RUNNING.\r\n"); _This->UpdateMotionStateProbe(); break; } case HSI_THREAD_PAUSED: { TRACE("HSI_THREAD_PAUSED.\r\n"); break; } case HSI_THREAD_EXIT: { TRACE("HSI_THREAD_EXIT.\r\n"); ExitThread(0); break; } default: break; } } } //=========================================================================== void HSI_Motion::CreateThreadIO() { if (m_Thread_IdIO == NULL) { m_Thread_StateIO = HSI_THREAD_RUNNING; m_hTriggerEventIO = CreateEvent(NULL, FALSE, NULL, NULL); m_Thread_IdIO = ::CreateThread( (LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)m_ThreadIO, (LPVOID)this, 0, NULL); m_Thread_MutexIO = CreateMutex(NULL, FALSE, NULL); TRACE("CreateThreadIO!\n"); } } //=========================================================================== void HSI_Motion::CloseThreadIO() { m_Thread_StateIO = HSI_THREAD_EXIT; Sleep(20); SetEvent(m_hTriggerEventIO); if (m_Thread_IdIO) { DWORD dwCode = STILL_ACTIVE; while (dwCode == STILL_ACTIVE) { GetExitCodeThread(m_Thread_IdIO, &dwCode); Sleep(1); } } SetEvent(m_hTriggerEventIO); CloseHandle(m_hTriggerEventIO); m_Thread_StateIO = HSI_THREAD_EXIT; ReleaseMutex(m_Thread_MutexIO); CloseHandle(m_Thread_MutexIO); m_Thread_IdIO = NULL; m_hTriggerEventIO = NULL; m_Thread_MutexIO = NULL; TRACE("CloseThreadIO!\n"); } //=========================================================================== unsigned __stdcall HSI_Motion::m_ThreadIO(LPVOID pThis) { HSI_Motion* _This = (HSI_Motion*)pThis; for (;;) { TRACE("m_ThreadIO!\n"); if (m_Thread_StateIO == THREAD_EXIT) ExitThread(0); WaitForSingleObject(m_hTriggerEventIO, INFINITE); switch (m_Thread_StateIO) { case HSI_THREAD_RUNNING: { TRACE("HSI_THREAD_RUNNING.\r\n"); _This->UpdateMotionStateIO(); break; } case HSI_THREAD_PAUSED: { TRACE("HSI_THREAD_PAUSED.\r\n"); break; } case HSI_THREAD_EXIT: { TRACE("HSI_THREAD_EXIT.\r\n"); ExitThread(0); break; } default: break; } } } //=========================================================================== void HSI_Motion::CreateThreadData() { if (m_Thread_IdData == NULL) { m_Thread_StateData = HSI_THREAD_RUNNING; m_hTriggerEventData = CreateEvent(NULL, FALSE, NULL, NULL); m_Thread_IdData = ::CreateThread( (LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)m_ThreadData, (LPVOID)this, 0, NULL); m_Thread_MutexData = CreateMutex(NULL, FALSE, NULL); TRACE("CreateThreadData!\n"); } } //=========================================================================== void HSI_Motion::CloseThreadData() { m_Thread_StateData = HSI_THREAD_EXIT; Sleep(20); SetEvent(m_hTriggerEventData); if (m_Thread_IdData) { DWORD dwCode = STILL_ACTIVE; while (dwCode == STILL_ACTIVE) { GetExitCodeThread(m_Thread_IdData, &dwCode); Sleep(1); } } SetEvent(m_hTriggerEventData); CloseHandle(m_hTriggerEventData); m_Thread_StateData = HSI_THREAD_EXIT; ReleaseMutex(m_Thread_MutexData); CloseHandle(m_Thread_MutexData); m_Thread_IdData = NULL; m_hTriggerEventData = NULL; m_Thread_MutexData = NULL; TRACE("CloseThreadData!\n"); } //=========================================================================== unsigned __stdcall HSI_Motion::m_ThreadData(LPVOID pThis) { HSI_Motion* _This = (HSI_Motion*)pThis; for (;;) { TRACE("m_ThreadData!\n"); if (m_Thread_StateData == THREAD_EXIT) ExitThread(0); WaitForSingleObject(m_hTriggerEventData, INFINITE); switch (m_Thread_StateData) { case HSI_THREAD_RUNNING: { TRACE("HSI_THREAD_RUNNING.\r\n"); _This->UpdateMotionStateData();//获取最新位置命令 break; } case HSI_THREAD_PAUSED: { TRACE("HSI_THREAD_PAUSED.\r\n"); break; } case HSI_THREAD_EXIT: { TRACE("HSI_THREAD_EXIT.\r\n"); ExitThread(0); break; } default: break; } } } //=========================================================================== //JOG运行到软限位的运动调节 //=========================================================================== void HSI_Motion::UpdateMotionStateJOGStop() { unsigned char send_JogLimt_data[64] = { 0 }; UINT axis = 0; double posx = 0.0; double posy = 0.0; double posz = 0.0; double post = 0.0; int slowdowndistance = 0; while (m_Thread_StateJOGStop == HSI_THREAD_RUNNING) { while (jogMoving) { slowdowndistance = jogspeed * 13; Sleep(3); GetPositionXyz(axis, posx, posy, posz, post); switch (jogAxisNum) { case 1: { if (jogDirFlag) { double limitx = m_P_Work_Limit[1]; if ((limitx - posx) / m_Resolution[1] < slowdowndistance) { send_JogLimt_data[0] = 0x01; send_JogLimt_data[1] = 0x14; send_JogLimt_data[2] = 0x01; m_WriteByte = Send_Command(0, (const char*)send_JogLimt_data, m_SendDataLength); Sleep(5); jogMoving = false; } } else { double limitx = m_N_Work_Limit[1]; if ((posx - limitx) / m_Resolution[1] < slowdowndistance) { send_JogLimt_data[0] = 0x01; send_JogLimt_data[1] = 0x14; send_JogLimt_data[2] = 0x01; m_WriteByte = Send_Command(0, (const char*)send_JogLimt_data, m_SendDataLength); Sleep(5); jogMoving = false; } } } break; case 2: { if (jogDirFlag) { double limity = m_P_Work_Limit[2]; if ((limity - posy) / m_Resolution[2] < slowdowndistance) { send_JogLimt_data[0] = 0x01; send_JogLimt_data[1] = 0x14; send_JogLimt_data[2] = 0x02; m_WriteByte = Send_Command(0, (const char*)send_JogLimt_data, m_SendDataLength); Sleep(5); jogMoving = false; } } else { double limity = m_N_Work_Limit[2]; if ((posy - limity) / m_Resolution[2] < slowdowndistance) { send_JogLimt_data[0] = 0x01; send_JogLimt_data[1] = 0x14; send_JogLimt_data[2] = 0x02; m_WriteByte = Send_Command(0, (const char*)send_JogLimt_data, m_SendDataLength); Sleep(5); jogMoving = false; } } } break; case 3: { if (jogDirFlag) { double limitz = m_P_Work_Limit[3]; if ((limitz - posz) / m_Resolution[3] < slowdowndistance) { send_JogLimt_data[0] = 0x01; send_JogLimt_data[1] = 0x14; send_JogLimt_data[2] = 0x04; m_WriteByte = Send_Command(0, (const char*)send_JogLimt_data, m_SendDataLength); Sleep(5); jogMoving = false; } } else { double limitz = m_N_Work_Limit[3]; if ((posz - limitz) / m_Resolution[3] < slowdowndistance) { send_JogLimt_data[0] = 0x01; send_JogLimt_data[1] = 0x14; send_JogLimt_data[2] = 0x04; m_WriteByte = Send_Command(0, (const char*)send_JogLimt_data, m_SendDataLength); Sleep(5); jogMoving = false; } } } break; case 4: { //第四轴未添加 } break; default: break; } } Sleep(2); } } //=========================================================================== void HSI_Motion::CreateThreadJOGStop() //JOG运行到软限位的运动调节 { if (m_Thread_IdJOGStop == NULL) { m_Thread_StateJOGStop = HSI_THREAD_RUNNING; m_hTriggerEventJOGStop = CreateEvent(NULL, FALSE, NULL, NULL); m_Thread_IdJOGStop = ::CreateThread( (LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)m_ThreadJOGStop, (LPVOID)this, 0, NULL); m_Thread_MutexJOGStop = CreateMutex(NULL, FALSE, NULL); TRACE("CreateThreadJOGStop!\n"); } } //=========================================================================== void HSI_Motion::CloseThreadJOGStop() { m_Thread_StateJOGStop = HSI_THREAD_EXIT; Sleep(20); SetEvent(m_hTriggerEventJOGStop); if (m_Thread_IdData) { DWORD dwCode = STILL_ACTIVE; while (dwCode == STILL_ACTIVE) { GetExitCodeThread(m_Thread_IdJOGStop, &dwCode); Sleep(1); } } SetEvent(m_hTriggerEventJOGStop); CloseHandle(m_hTriggerEventJOGStop); m_Thread_StateJOGStop = HSI_THREAD_EXIT; ReleaseMutex(m_Thread_MutexJOGStop); CloseHandle(m_Thread_MutexJOGStop); m_Thread_IdJOGStop = NULL; m_hTriggerEventJOGStop = NULL; m_Thread_MutexJOGStop = NULL; TRACE("CloseThreadJOGStop!\n"); } //=========================================================================== unsigned __stdcall HSI_Motion::m_ThreadJOGStop(LPVOID pThis) //JOG运行到软限位的运动调节 { HSI_Motion* _This = (HSI_Motion*)pThis; for (;;) { TRACE("m_ThreadJOGStop!\n"); if (m_Thread_StateData == THREAD_EXIT) ExitThread(0); WaitForSingleObject(m_hTriggerEventJOGStop, INFINITE); switch (m_Thread_StateJOGStop) { case HSI_THREAD_RUNNING: { TRACE("HSI_THREAD_RUNNING.\r\n"); _This->UpdateMotionStateJOGStop(); break; } case HSI_THREAD_PAUSED: { TRACE("HSI_THREAD_PAUSED.\r\n"); break; } case HSI_THREAD_EXIT: { TRACE("HSI_THREAD_EXIT.\r\n"); ExitThread(0); break; } default: break; } } } //=========================================================================== //无用 HSI_STATUS HSI_Motion::IOStep(bool RunSts) { auto rStatus = HSI_STATUS_NORMAL; m_MSTRunFlag = RunSts; if (g_pHSI_Motion) { } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::IOprogram(byte* SendData, int length) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { Send_Command(0, (const char*)SendData, m_SendDataLength); } return rStatus; } HSI_STATUS HSI_Motion::FindOriginTest(bool type) { auto rStatus = HSI_STATUS_NORMAL; byte findorigdata[64] = { 0 }; findorigdata[0] = 0x04; if (type == true) { findorigdata[1] = 0x18; findorigdata[2] = (byte)(m_Resolution[1] * 10000); Send_Command(0, (const char*)findorigdata, 64); } else { findorigdata[1] = 0x19; findorigdata[2] = (byte)(m_Resolution[1] * 10000); Send_Command(0, (const char*)findorigdata, 64); } return rStatus; } //=========================================================================== BOOL HSI_Motion::Send_Command(int com, const char* _SendData, DWORD SendDataLength) { BOOL rStatus = TRUE; WaitForSingleObject(g_RW_Data_Mutex, INFINITE); if (m_bConnected && (m_IsUseEF3 == 1) && (com == 0)) { int iWriteByte = m_SO7_Serial.Send(_SendData, 64); if (iWriteByte == 0) { int iError = GetLastError(); g_pLogger->SendAndFlushWithTime(L"[Send_Command] GetLastError = %d\n", iError); if (iError == 1167) { g_pLogger->SendAndFlushWithTime(L"[Send_Command] GetLastError is 1167,EF3 device is no connect\n"); m_Thread_StateData = THREAD_PAUSED; if (m_bConnected == true && g_IsClose == false) { g_pLogger->SendAndFlushWithTime(L"[Send_Command] GetLastError is 1167,EF3 device is no connect\n"); sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "EF3控制器已断开连接"); EventCallback(sEvenProp); } } g_pLogger->SendAndFlushWithTime(L"[Send_Command] m_SO7_Serial[%d].Send failed\n", com); rStatus = FALSE; } // Sleep(5); // m_SO7_Serial.OnReceive(); } ReleaseMutex(g_RW_Data_Mutex); return rStatus; }; ///////////////////////////////////////////////////////////////////////// #pragma region //网口通信8路 26路光源板通信 #pragma warning(disable:4996) TCPIP_RETURN_CODE HSI_Motion::TCPConnect(int index, char* Address, u_short port) { TCPIP_RETURN_CODE rCode = TCPIP_CONNECT_OK; if (!m_tcpCntFlag[index]) { int retVal(0), errorCode(0); first = true; retVal = Init_Winsock(); if (!retVal) { return TCPIP_INIT_WINSOCK_ERROR; } m_socket[index] = socket(AF_INET, SOCK_STREAM, 0); if (m_socket[index] == INVALID_SOCKET) { rCode = TCPIP_INVAILD_SOCKET; } else { int iMode = 1; int i = 0; int retVal = ioctlsocket(m_socket[index], FIONBIO, (u_long FAR*)&iMode);//非阻塞连接 if (retVal == SOCKET_ERROR) { closesocket(m_socket[index]); WSACleanup(); return TCPIP_INIT_WINSOCK_ERROR; } SOCKADDR_IN addSrv; addSrv.sin_addr.S_un.S_addr = inet_addr(Address); addSrv.sin_family = AF_INET; addSrv.sin_port = htons(port); while (true) { retVal = connect(m_socket[index], (SOCKADDR*)&addSrv, sizeof(SOCKADDR)); if (retVal) { errorCode = WSAGetLastError(); if (errorCode == WSAEWOULDBLOCK) { i++; if (i > 400) break; Sleep(5); continue; } else if (errorCode == WSAEISCONN) { break; } else { first = true; closesocket(m_socket[index]); WSACleanup(); rCode = (TCPIP_RETURN_CODE)errorCode; return rCode; } } } iMode = 0; retVal = ioctlsocket(m_socket[index], FIONBIO, (u_long FAR*)&iMode);//设置阻塞 if (retVal == SOCKET_ERROR) { closesocket(m_socket[index]); WSACleanup(); return TCPIP_INIT_WINSOCK_ERROR; } } } return rCode; } void HSI_Motion::DisConnect() { if (m_socket) { if (LightSend != 0 || IOSend != 0 || OrderSend != 0) { Sleep(20); } first = true; Exit_Thread(); WSACleanup(); for (size_t i = 0; i < m_bISUseMoreLights; i++) { closesocket(m_socket[i]); m_socket[i] = NULL; } } } unsigned __stdcall HSI_Motion::m_ThreadSendTCP(LPVOID pThis) { HSI_Motion* _This = (HSI_Motion*)pThis; for (;;) { TRACE("m_Thread!\n"); Sleep(2); if (m_ThreadTCP_State == TCPIP_THREAD_EXIT) ExitThread(0); switch (m_ThreadTCP_State) { case TCPIP_THREAD_RUNNING: { TRACE("TCPIP_THREAD_RUNNING.\r\n"); _This->TCPSend(); break; } case TCPIP_THREAD_PAUSED: { break; } case TCPIP_THREAD_EXIT: { ExitThread(0); break; } default: break; } }; } TCPIP_RETURN_CODE HSI_Motion::TCPSend() { if (m_tcpCntFlag[m_selectedIndex]) { bool recvFlag = false; int bytesSend = 0; if (LightSend > 0) { g_pLogger->SendAndFlushWithTime(L"[TCPSend] LightSend = %d,m_selectedIndex = %d\n", LightSend, m_selectedIndex); LightSend--; bytesSend = send(m_socket[m_selectedIndex], (const char*)lightdata, 64, 0); for (size_t i = 0; i < 64; i++) { TempData[i] = lightdata[i]; } } else if (IOSend > 0) { IOSend--; bytesSend = send(m_socket[m_selectedIndex], (const char*)IOdata, 64, 0); for (size_t i = 0; i < 64; i++) { TempData[i] = IOdata[i]; } } else if (OrderSend > 0) { OrderSend--; bytesSend = send(m_socket[m_selectedIndex], (const char*)Orderdata, 64, 0); for (size_t i = 0; i < 64; i++) { TempData[i] = Orderdata[i]; } } else { if (m_Led8MotionFlag[m_selectedIndex]) { //g_pLogger->SendAndFlushWithTime(L"[TCPSend] IOCheck8\n"); IOCheck[0] = 0x01; IOCheck[1] = 0x04; } else { //g_pLogger->SendAndFlushWithTime(L"[TCPSend] IOCheck26\n"); IOCheck[0] = 0x01; IOCheck[1] = 0x01; } bytesSend = send(m_socket[m_selectedIndex], (const char*)IOCheck, 64, 0); for (size_t i = 0; i < 64; i++) { TempData[i] = IOCheck[i]; } } if (bytesSend == SOCKET_ERROR) { bytesSend = WSAGetLastError(); if (bytesSend == WSAEWOULDBLOCK || bytesSend == WSAENOTSOCK) { Sleep(2); bytesSend = send(m_socket[m_selectedIndex], (const char*)TempData, 64, 0); //have to wait for the next receive event } else { g_pLogger->SendAndFlushWithTime(L"[TCPSend] ERROR1 bytesSend = %d\n", bytesSend); sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "光源板已断开连接"); EventCallback(sEvenProp); m_ThreadTCP_State = TCPIP_THREAD_EXIT; closesocket(m_socket[m_selectedIndex]); WSACleanup(); return TCPIP_CONNECT_STATUS_UNKNOWN; } } //ZeroMemory(tReciveData, TCPIP_MAX_DAT_SIZE); int bytesReceived = 0; int num = 0; bytesReceived = recv(m_socket[m_selectedIndex], (char *)tReciveData, TCPIP_MAX_DAT_SIZE, 0); if (bytesReceived == SOCKET_ERROR) { bytesReceived = WSAGetLastError(); if (bytesReceived == WSAEWOULDBLOCK || bytesReceived == WSAENOTSOCK) { //ZeroMemory(tReciveData, TCPIP_MAX_DAT_SIZE); bytesReceived = recv(m_socket[m_selectedIndex], (char *)tReciveData, TCPIP_MAX_DAT_SIZE, 0); if (bytesReceived == SOCKET_ERROR) { recvFlag = false; } else { recvFlag = true; } //if (num > 5) //{ // break; //} //Sleep(1); //num++; ////have to wait for the next receive event //continue; } else { g_pLogger->SendAndFlushWithTime(L"[TCPReceived] ERROR1 bytesReceived = %d\n", bytesReceived); sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "光源板已断开连接"); EventCallback(sEvenProp); m_ThreadTCP_State = TCPIP_THREAD_EXIT; closesocket(m_socket[m_selectedIndex]); WSACleanup(); return TCPIP_CONNECT_STATUS_UNKNOWN; } } else { recvFlag = true; } if (!recvFlag) { bytesSend = send(m_socket[m_selectedIndex], (const char*)TempData, 64, 0); if (bytesSend == SOCKET_ERROR) { bytesSend = WSAGetLastError(); if (bytesSend == WSAEWOULDBLOCK) { bytesSend = send(m_socket[m_selectedIndex], (const char*)TempData, 64, 0); if (bytesSend == SOCKET_ERROR) { g_pLogger->SendAndFlushWithTime(L"[TCPSend] ERROR2\n"); } //have to wait for the next receive event } } bytesReceived = recv(m_socket[m_selectedIndex], (char *)tReciveData, TCPIP_MAX_DAT_SIZE, 0); if (bytesReceived == SOCKET_ERROR) { bytesReceived = WSAGetLastError(); if (bytesReceived == WSAEWOULDBLOCK) { //ZeroMemory(tReciveData, TCPIP_MAX_DAT_SIZE); bytesReceived = recv(m_socket[m_selectedIndex], (char *)tReciveData, TCPIP_MAX_DAT_SIZE, 0); if (bytesReceived == SOCKET_ERROR) { g_pLogger->SendAndFlushWithTime(L"[TCPReceived] ERROR2\n"); } } } } Sleep(5); } return TCPIP_CONNECT_OK; } void HSI_Motion::Create_Thread() { if (!m_ThreadTCP_Id) { m_ThreadTCP_State = TCPIP_THREAD_RUNNING; m_ThreadTCP_Id = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)m_ThreadSendTCP, (LPVOID)this, 0, NULL); } } void HSI_Motion::Exit_Thread() { m_ThreadTCP_State = TCPIP_THREAD_EXIT; if (m_ThreadTCP_Id) { DWORD dwCode = STILL_ACTIVE; while (dwCode == STILL_ACTIVE) { GetExitCodeThread(m_ThreadTCP_Id, &dwCode); Sleep(1); } } m_ThreadTCP_State = TCPIP_THREAD_EXIT; m_ThreadTCP_Id = NULL; } int HSI_Motion::Init_Winsock() { int nRet; if (first) { WSADATA stWSAData; /* WinSock DLL Info */ nRet = WSAStartup(WSA_VERSION, &stWSAData); if (nRet) { return FALSE; } first = false; } return TRUE; } #pragma endregion ////////////////////////////////////////////////////////////////////////// //=========================================================================== HSI_STATUS HSI_Motion::CollectPos(bool isEnable, MOTOR_AXISCHOOES_CMD axis, short cycle) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { unsigned char send_glue_data[64] = { 0 }; send_glue_data[0] = 0x01; send_glue_data[1] = 0x1E; send_glue_data[2] = isEnable ? 1 : 2; send_glue_data[3] = ((cycle >> 8) & 0xff); send_glue_data[4] = (cycle & 0xff); send_glue_data[5] = axis; Send_Command(0, (const char*)send_glue_data, 64); } return rStatus; } //=========================================================================== HSI_STATUS HSI_Motion::SetAllGears() { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { for (size_t i = 1; i < 5; i++) { unsigned char send_glue_data[64] = { 0 }; send_glue_data[0] = 0x01; send_glue_data[1] = 0x01; send_glue_data[2] = 0x01 << (i - 1); //轴号 send_glue_data[3] = 0x08; for (size_t j = 0; j < 5; j++) { send_glue_data[4 + 6 * j] = ((m_JogStartSpeed[i][4 - j] >> 8) & 0xff); send_glue_data[5 + 6 * j] = (m_JogStartSpeed[i][4 - j] & 0xff); send_glue_data[6 + 6 * j] = ((m_JogDriveSpeed[i][4 - j] >> 8) & 0xff); send_glue_data[7 + 6 * j] = (m_JogDriveSpeed[i][4 - j] & 0xff); send_glue_data[8 + 6 * j] = ((m_JogAccLine[i][4 - j] >> 8) & 0xff); send_glue_data[9 + 6 * j] = (m_JogAccLine[i][4 - j] & 0xff); } Send_Command(0, (const char*)send_glue_data, 64); Sleep(10); } } return rStatus; } //===========================================================================