6843 lines
214 KiB
C++
6843 lines
214 KiB
C++
// 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 <math.h>
|
|
#include <fstream>
|
|
#include <iomanip>
|
|
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<double>(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;
|
|
}
|
|
//===========================================================================
|