Files
LM-Middleware/HSI_HexagonMI_EF3/HSI_Motion.h
T

536 lines
17 KiB
C++

#ifndef HSI_MOTION_INCLUDED_
#define HSI_MOTION_INCLUDED_
#pragma once
#include "logger.h"
#include "SevenOcean\CMMIO_SERIAL.H"
#define TCPIP_THREAD_RUNNING 0
#define TCPIP_THREAD_PAUSED 1
#define TCPIP_THREAD_EXIT -1
#define TCPIP_MAX_DAT_SIZE 1024
#define THREAD_PAUSED 1
#define THREAD_EXIT -1
#define MAX_BUFF_SIZE 0x200
const double SCALE_UNITS = 1000.0;
static CLogger* g_pLogger;
static CLogger* g_pLogger2;
static bool g_IsClose;//用于DoEvents()的退出,而不异常
enum E_SO7_MOTION_TYPE
{
E_SO7_MOTION_NONE,
E_SO7_MOTION_JOG,
E_SO7_MOTION_MOVETO,
E_SO7_MOTION
};
enum E_EF3_HOME_STATUS
{
E_EF3_HOME_NONE,//0表示从未回过回原点
E_EF3_HOME_ING,//1表示正在回原点
E_EF3_HOME_FINISHED,//2表示已经回过原点
};
enum FUN_CMD //第一级指令
{
CT_MOTOR = 0x01, //MOTOR
CT_LIGHT, //LIGHT
CT_PORT, //PORT
CT_ORDER, //ORDER
CT_SOFTSTOP, //STOP
CT_GLUEDISPENSER, //点胶
CT_TURNTABLE,
};
enum MOTOR_CMD //第二级指令
{
CT_MOTOR_SET = 0x01,
CT_START_JOG_POS, //
CT_START_JOG_NEG,
CT_START_POSITION, //_POS,
CT_STOP,
CT_GOHOME,
CT_TRIGGER_DATA,
CT_SIX_LIGHT,
CT_MDATA_INIT,
CT_MDATA_COM,
CT_POSFLAG_CLEAR,
CT_START_LATCH,
CT_ROCKER,
CT_CIRCLERUN_POSITION,
CT_GLUEDISPENSER_SET,
CT_GLUEDISPENSER_CLEAR,
CT_GLUEDISPENSER_START,
CT_GLUEDISPENSER_STOP,
//转盘时启用
CT_RTSET,
CT_BINSDATA,
CT_RTSTOP,
// CT_MOTOR_UPDATE, // up date all the aixs
};
enum MOTOR_START_POSOTION //
{
INTERPOLATION = 0x61,//插补
GANGED = 0x41,//独立
CIRCLER = 0x64,
CIRCLEL = 0x65,
};
enum MOTOR_AXISCHOOES_CMD //第三级指令
{
AXIS_X = 0x01,
AXIS_Y = 0x02,
AXIS_Z = 0x04,
AXIS_U = 0x08,
AXIS_XY = 0x03,
AXIS_XZ = 0x05,
AXIS_XU = 0x09,
AXIS_YZ = 0x06,
AXIS_YU = 0x0a,
AXIS_ZU = 0x0c,
AXIS_XYZ = 0x07,
AXIS_XYU = 0x0b,
AXIS_XZU = 0x0d,
AXIS_YZU = 0x0e,
AXIS_XYZU = 0x0f,
};
enum MOTOR_SET_KIND //第四级指令
{
JOG_SPEED_ACC_DEC,
POSITION_SPEED_ACC_DEC_POS,
HOME_LIMIT_SPEED_ACC_DEC,
HOME_ORG_SPEED_ACC_DEC,
SOFT_LIMIT_POS_NEG,
POS_CLEAR,
HOME_CLEAR,
ENC_POS_DIR,
};
enum CMD_ORDER
{
IOSTATE,
MOTORPOSITION,
MOTORSTATE
};
enum E_SO7_MOTION_READ_TYPE
{
E_DATA_TYPE_NONE,
E_DATA_TYPE_GET_POS,
E_DATA_TYPE_IO,
};
typedef enum {
TCPIP_CONNECT_OK = 0,
TCPIP_INIT_WINSOCK_ERROR,
TCPIP_INVAILD_SOCKET,
TCPIP_INVAILD_IP_ADDRESS,
TCPIP_INVAILD_PORT_NUMBER,
TCPIP_CONNECT_SERVER_FAILED,
TCPIP_SEND_REVC_ASYNC,
TCPIP_TIMEOUT,
TCPIP_WSAEWOULDBLOCK = 10035,
TCPIP_CONNECT_STATUS_UNKNOWN
} TCPIP_RETURN_CODE;
class HSI_Motion : public HSI
{
public:
HSI_Motion();
~HSI_Motion();
HSI_STATUS IsSupported(UINT &Types);
virtual HSI_STATUS Startup(HWND _hWnd, bool _bOfflineOnly);
HSI_STATUS GetFirmwareVersion(byte *version);
HSI_STATUS HomeMachine(bool bHomed);
HSI_STATUS HomeJog(short AxisNumber, short Dir, bool Wait = false);
HSI_STATUS HomeFindIndex();
HSI_STATUS ZeroPos(bool bZeroPos);
HSI_STATUS IsHomed(bool &bHomed);
HSI_STATUS GetSpeedXyz(int AxisNum, double &Speed);
HSI_STATUS SetSpeedXyz(double Speed);
HSI_STATUS GetFocusSpeed(double &Speed);
HSI_STATUS SetFocusSpeed(double Speed);
HSI_STATUS GetAccelerationXyz(double &AccelX, double &AccelY, double &AccelZ);
HSI_STATUS SetAccelerationXyz(double AccelX, double AccelY, double AccelZ);
HSI_STATUS GetSpeedR(double &Speed);
HSI_STATUS SetSpeedR(double Speed);
HSI_STATUS GetScaleResolution(double &_ScaleX, double &_ScaleY, double &_ScaleZ);
HSI_STATUS SetScaleResolution(double _ScaleX, double _ScaleY, double _ScaleZ);
HSI_STATUS GetDeadBand(double &DeadbandX, double &DeadbandY, double &DeadbandZ, double &DeadbandR);
HSI_STATUS GetRefreshDeadBand(double &Deadband);
HSI_STATUS Jog(UINT AxisTypes, double Speed);
HSI_STATUS JoyStick(UINT AxisTypes, long Speed);
HSI_STATUS StopJog();
HSI_STATUS StopJogEx(UINT AxisTypes);
HSI_STATUS GetPositionEncPrfMulti(UINT AxisTypes, double *EncPos, double *PrfPos, int Count);
HSI_STATUS GetPositionXyz(UINT AxisTypes, double &PositionX, double &PositionY, double &PositionZ, double &Time);
HSI_STATUS GetPositionXyzaProbe(UINT AxisTypes, double &PositionX, double &PositionY, double &PositionZ, double &PositionA);
HSI_STATUS GetEncoderXyz(long *lEncoderVal);
HSI_STATUS JogProbe(UINT AxisTypes, double Speed);
void ProbeRetractManDist(int RetractManDist);
int CaculateStepMotorACC(int pos, int maxacc, int minacc);
HSI_STATUS SetPositionXyz(UINT AxisTypes, double PositionX, double PositionY, double PositionZ, HSI_MOTION_MOVE_TYPE eType, double dFlyRadius);
HSI_STATUS SetPositionXyza(UINT AxisTypes, double PositionX, double PositionY, double PositionZ, double PositionA, HSI_MOTION_MOVE_TYPE eType, double dFlyRadius);
HSI_STATUS SetPositionXyzCache(UINT AxisTypes, HSI_MOTION_MOVE_TYPE eType, int DataCount, Point *CacheData);
HSI_STATUS GetPositionR(UINT AxisTypes, double &PositionR, double &Time);
HSI_STATUS SetPositionR(UINT AxisTypes, double PositionR, HSI_MOTION_AXIS_R_MOVE_TYPE DirectionType, bool bWait);
HSI_STATUS SetCircleInterpolate(double PositionX, double PositionY, double PositionZ);
HSI_STATUS Load_EF3_Motion_Inifile(CString GoogolIniFile);
HSI_STATUS Load_EF3_Config_Inifile(CString GoogolIniFile);
HSI_STATUS AbortMotion();
HSI_STATUS GetDIO(UINT IOChannel, UINT& _Status);
HSI_STATUS SetDIO(UINT IOChannel, UINT _Status);
HSI_STATUS GetAxisStatus(int* _Status);
HSI_STATUS GetAppPath(CString &Path);
virtual HSI_STATUS Shutdown();
HSI_STATUS IsSupportedEx(UINT AxisTypes, UINT &Types);
HSI_STATUS StartupEx(UINT AxisTypes, bool bHome);
HSI_STATUS GetScaleResolutionEx(UINT AxisTypes, double &Scale);
HSI_STATUS SetScaleResolutionEx(UINT AxisTypes, double Scale);
HSI_STATUS GetPositionEx(UINT AxisTypes, double &Position, double &Time);
HSI_STATUS SetPositionStep(UINT AxisTypes, double Position, HSI_MOTION_MOVE_TYPE eType, double dSpeedGear);
HSI_STATUS SetPositionEx(UINT AxisTypes, double Position, HSI_MOTION_MOVE_TYPE eType, double dSpeedGear);
HSI_STATUS GetSpeedEx(UINT AxisTypes, double &Speed);
HSI_STATUS SetSpeedEx(UINT AxisTypes, double Speed);
HSI_STATUS GetAccelerationEx(UINT AxisTypes, double &Accel);
HSI_STATUS SetAccelerationEx(UINT AxisTypes, double Accel);
HSI_STATUS SetTriggerLight(int triggleNum, int delayLighting, int delayLightBefor,int triggleMode, double* Intensities);
HSI_STATUS DCCPPStartPoint(double *startPoint);
HSI_STATUS DCCScanSetData(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType, UINT lTrigNumber, double* dTrigDis);
HSI_STATUS DCCScanStart();
HSI_STATUS DCCScanStop();
HSI_STATUS DCCForLightPlate();
HSI_STATUS IOStep(bool RunSts);
HSI_STATUS IOprogram(byte* SendData,int length);
HSI_STATUS FindOriginTest(bool state);
HSI_STATUS StartPlcJob(int* CamerasDis, int* BinsDis, int SubArea,int filterTime1, int filterTime2,int pluseSumDis);
HSI_STATUS SendBinResult(int* BinResult);
HSI_STATUS GetTriggleCount(int* nCount, int& nArea);
HSI_STATUS GluePPSpnts(int* ppsDir, double* gluePPSPos, int* delayLightBefore, int* lightTime, double* lightData, int num);
HSI_STATUS GlueDispenser(int* index, int* cirdirection , double* gluePos, int num);
HSI_STATUS GlueDispenserStart(double xOffset, double yOffset, double qOffset);
HSI_STATUS GetPntsDistance(double& ptpDistance,int& spTimeCount);
public:
static int m_Thread_State;
static HANDLE m_Thread_Id;
static HANDLE m_Thread_Mutex;
static HANDLE m_hTriggerEvent;
//用于IO发消息的线程
static int m_Thread_StateIO;
static HANDLE m_Thread_IdIO;
static HANDLE m_Thread_MutexIO;
static HANDLE m_hTriggerEventIO;
//读取EF3的数据状态
static int m_Thread_StateData;
static HANDLE m_Thread_IdData;
static HANDLE m_Thread_MutexData;
static HANDLE m_hTriggerEventData;
//读取EF3的探针状态
static int m_Thread_StateProbe;
static HANDLE m_Thread_IdProbe;
static HANDLE m_Thread_MutexProbe;
static HANDLE m_hTriggerEventProbe;
//点胶运行状态
static int bRunGlueDispenser;
//读取EF3的JOG stop 的状态
static int m_Thread_StateJOGStop;
static HANDLE m_Thread_IdJOGStop;
static HANDLE m_Thread_MutexJOGStop;
static HANDLE m_hTriggerEventJOGStop;
static HANDLE g_RW_Data_Mutex;
static HANDLE g_WR_ToMove_Mutex;
static HANDLE g_Lock_JogAndTrigger;
double m_Resolution[5];//从1开始,0不用
double m_N_Work_Limit[5]; //负限位
double m_P_Work_Limit[5]; //正限位
int m_Home_AddJogGears[5];
int m_Home_DecJogGears[5];
int m_Home_Time[5];
int m_SetPotion_Count[5];
//定位参数
int m_SetPotion_StartSpeed[5];
int m_SetPotion_DriveSpeed[5];
int m_SetPotion_Line[5];
int m_SetPotion_Buffer[5];
int m_SetPotion_AccCurve[5];
int m_SetPotion_DecCurve[5];
int m_SpeedAdjustPeriod[5];
int m_SpeedMax[5];
int m_stepPosition_L_speed[10];
int m_stepPosition_H_speed[10];
int m_stepPosition_Load[10];
int m_stepPosition_acc[10];
double m_PositionA;//第四轴的地位位置
//jog 参数
int m_JogDriveSpeed[5][5];//5:轴号,从1开始;5:档位
int m_JogStartSpeed[5][5];
int m_JogAccLine[5][5];
int m_JogDecLine[5][5];
int m_JogAccCurve[5][5];
int m_JogDecCurve[5][5];
int m_Jog_Auto_Focus;//变焦使用的速度
int m_LogIsOpen[5];//是否打开记录,0为打开,非0为关闭
unsigned int m_precisionCount[5];
unsigned int m_precisionTime[5];
int m_StopJogMode[5];//JOG模式采用急停还是平滑停止
double m_PosThread[5];//SetpositionXyz的目标位置
int m_PosNow[5];//调用SetpositionXyz时,读取当前位置
double targetpos_n[5];
double targetpos_l[5];
short m_AxisThread;
int m_IsExMotion; //0是xyz用的,1是单轴用的,2都不用
int m_Home_Machine_Axis[5];//用于启动时需要回原点的轴号选择
int m_Home_Pos_Axis[5];//记住关闭电源时的位置,用于判断是否还需要回原点
int m_IsHomeEncPos; //是否启动实际位置判断是否回家,默认0,1启用,0关闭
int m_IsHomePrfPos; //是否启动规划位置判断是否回家,默认1,1启用,0关闭
int m_IsIOFuntion;//是否启动IO功能,1为打开,0为关闭
int m_IsStartInput;//是否启用脚踏开关功能,1为启用,0为关闭,默认0
UINT m_StartInputPort;//外部输入按钮启动程序
UINT m_InputStatus;
UINT m_ForStatus;
int m_Set_XYZA_Reserve;//XYZA轴方向
int m_motorType;//电机类型 1为伺服电机 0为步进电机
int m_setPositionDelay;//设置定位超时
int m_setPositionPrecision;//设置定位精度
int m_setPositionNum;
CString m_AppPath;
//MST软件运行标志,trueMST软件已经启动,falseMST软件停止
bool m_MSTRunFlag;
int m_IsUse_HSICompensation;//是否启用HSI进行定位补偿 0为不启用 1为启用 默认为0
int m_Compensation_Pluse;//补偿脉冲数
int m_IsHardLimit; //设备轴硬限位设置 为0表示所有轴都为软限位 1为X轴为硬限位 2为Y轴 3为XY轴 4为Z轴 7为XYZ轴 默认为7
int m_IsEnableAxis; //设备启用轴设置 为0表示所有轴不启用 1为X轴启用 2为Y轴启用 3为XY轴启用 4为Z轴启用 7为XYZ轴启用 默认为7
int m_IsUseExternalTrigger; //是否启用外触发功能 0为不启用 1为启用 默认为1
int m_IsUseSixRingEightArea; //是否启用六环八区灯功能 0为不启用 1为启用 2为二环八区灯 默认为0
int m_SixEightSubArea[8]; //六环八区分区功能
int m_IsUseTwentySixLight;//是否启用26路灯光 0为不启用 1位启用 默认为0
int m_IsUseEF3;//是否启用EF3
int m_DeviceType;//设备类型,0为通用设备,1为三激光, 2为大视野,3为转盘设备 默认为0
int m_UseAxisNum;//转盘设备使用轴号
int m_IbinCount;//记录获取到的分bin数
bool m_IsUsePPS;
int m_iJoyStick;//遥感类型:0:无 1:老式摇杆
int m_bISUseMoreLights;
int m_EF3LightType;
int m_LightType;
int m_IsUseFourthSpeed;
CString m_IsOpenTCPIP[4];//可提供的tcp通信的ip
bool m_tcpCntFlag[4];
int m_selectedIndex;
bool m_Led8MotionFlag[4];//是否为8路光源板
int m_IsHavePattern;//是否有光栅
int m_AxisHomeDirection;//轴回家时的方向
int m_IsUseJerk;//是否启用急停 0为不启用 1为启用
DWORD t_start;//获取jog运行的开始时间
DWORD t_end;//获取jog运行的结束时间
DWORD set_start;//获取定位运行开始时间
DWORD set_end;//获取定位运行结束时间
//是否启用探针捕获功能,1启用,默认0关闭
int m_IsProbe;
//探针触发时,锁存的轴号,默认3表示锁存XYZ共3轴,4表示XYZA共4轴
int m_ProbeAllAxis;
long m_ProbeCapturePos[5];//锁存各轴的位置
double m_ProbeReturnPos;//探针触发时,调试时返回的距离mm,点击启动按钮时不起作用,默认10.0mm
int m_ProbeReturnSpeed;//探针触发后,轴的回退速度
int m_isOKGlint; //是否开启ok/ng 闪烁
int m_ETIPort;//外部触发拍照输入端口号
int m_axisStatus;//运动各轴的状态
int m_axisAlarmStatus;//轴报警状态
int m_EF3COMPort;//EF3板com口,默认为2
int m_ForSoft;//针对使用软件 0为MST 1为Metus
int m_IsUseManualRunin;//是否开启手动插补(只针对步进电机)
int m_IsUseRocker; //是否启用摇杆 0为不启用 1为启用旧摇杆,2为新摇杆, 默认为0
int m_IsCollectPos; //是否通过串口打印位置,与摇杆2互斥
int m_IsCloseRocker;
int m_IsLightDebug;//是否不回家也能调试灯光 0为不启用 1为启用 默认为0
int m_rockerHStartSpeed[4];//摇杆XYZ轴高初始速度
int m_rockerHDriveSpeed[4];//摇杆XYZ轴高驱动速度
int m_rockerLStartSpeed[4];//摇杆XYZ轴低初始速度
int m_rockerLDriveSpeed[4];//摇杆XYZ轴低驱动速度
int m_rockerASpeed[4]; //XYZ轴加减速1
int m_rockerDSpeed[4]; //XYZ轴加减速2
int m_SaveAxisNum;//保存轴号
int m_SaveAxisSpeed;//保存速度
bool bSaveSpeedFlag;
bool fourthAxisFlag;
bool bCircleRun;//圆弧插补
int iCircleRunPnt[5];//圆弧插补时的圆心位置
int jogAxisNum;//jog运动的轴号
int jogspeed;
bool jogMoving;
bool jogDirFlag;
bool m_bEmergencyState;
bool bUseGlueDispenser;//是否开启点胶
int m_iGlueStartSpeed;
int m_iGlueDriveSpeed;
int m_iGlueAccSpeed;
int GlueDispenserindexNum;//点胶段数
int GluerunCount;
int m_iSpeedType;
int m_axisDirX;//探针运动时X轴的运动方向
int m_axisDirY;//探针运动时Y轴的运动方向
int m_axisDirZ;//探针运动时Z轴的运动方向
int m_probeSeekSpeed;
int m_isUseAport;//A串口
int m_portAnum;
int m_isUseBport;//B串口
int m_portBnum;
int SpCompleteTStart;
int SpCompleteTEnd;
int SpTimeCount;
bool SetPotionRunEnd;
double PntToPntDistance;
double m_LockPos[5];
double m_ijk[5];
int m_AxisHex[5];
bool setLightFlag;
double m_EncPos[5];
double m_PrfPos[5];
double m_PosForAllAxis[5];//记录4轴位置
bool m_bConnected;
int m_SendDataLength;
unsigned char m_cSendData[64];
unsigned char m_direct_pos;
unsigned char axis_start;
CPSerial m_SO7_Serial;
DWORD m_WriteByte;
BOOL Send_Command(int com, const char* _SendData, DWORD _SendDataLength);
BOOL Receive_Data();
bool PortInit(int iSerialComPort, int iBuadRate);
char m_RecvData[MAX_RECIEVE_BUFFER_SIZE];
DWORD m_RecvDataSize;
E_EF3_HOME_STATUS CurrentHomeMachineState;
//刷新探针状态
static unsigned __stdcall m_ThreadProbe(LPVOID pThis);
void CreateThreadProbe();
void CloseThreadProbe();
void UpdateMotionStateProbe();
//刷新位置状态
static unsigned __stdcall m_Thread(LPVOID pThis);
void CreateThread();
void CloseThread();
void UpdateMotionState();
void UpdateMotionStateEx();
void GluedispenserDone();
//IO发消息使用
static unsigned __stdcall m_ThreadIO(LPVOID pThis);
void CreateThreadIO();
void CloseThreadIO();
void UpdateMotionStateIO();
//读取EF3的数据状态
static unsigned __stdcall m_ThreadData(LPVOID pThis);
void CreateThreadData();
void CloseThreadData();
void UpdateMotionStateData();
//读取EF3的JOG位置 以便停止JOG运动
static unsigned __stdcall m_ThreadJOGStop(LPVOID pThis);
void CreateThreadJOGStop();
void CloseThreadJOGStop();
void UpdateMotionStateJOGStop();
void SendMsgMotionFinished();
void SendMsgProbeFinished();
VOID EventCallback(sHSIEventProperties& sEventProp);
int SpeedPercent(int AxisNum, double &Speed,int &DriveSpeed,int &StartSpeed, int &AccLine, int &DecLine,int &AccCurve,int &DecCurve);
bool SpeedPercentJoyStick(int AxisNum, long &Speed, int &DriveSpeed, int &StartSpeed, int &AccLine, int &DecLine, int &AccCurve, int &DecCurve);
void HomeJogGearsChoice(int AxisType, int JogGears, int &DriveSpeed, int &StartSpeed, int &AccLine, int &DecLine, int &AccCurve, int &DecCurve);
short AxisConvertIndex(UINT AxisTypes);
short IndexConvertAxis(int Index);
double LimitOver(UINT AxisTypes, double &LimitPos);
int P2P(short AxisNumber, long Pos, double Speed, double Acc);
void DoEvents();
HSI_STATUS DriverAlarmStatus();
HSI_STATUS FirstHome();
HSI_STATUS SpecialMotorHome(short AxisNum);
HSI_STATUS SpecialMotorMove(short AxisNum, double Position);
private:
UINT ActiveAxis;
int iaxisNum;
int iScanMotionType;
int iTriggleNum;
int iMotionDirection;
int begin_position[5]; //外触发到初始点需要发送的脉冲数
HINSTANCE m_Hinst;
E_SO7_MOTION_TYPE CurrentMotionState;
E_SO7_MOTION_READ_TYPE CurrentReadDataType;
//网口通信添加
private:
TCPIP_RETURN_CODE TCPConnect(int index,char* Address, u_short port);
void DisConnect();
static unsigned __stdcall m_ThreadSendTCP(LPVOID pThis);
static HANDLE m_ThreadTCP_Id;
static int m_ThreadTCP_State;
TCPIP_RETURN_CODE TCPSend();
unsigned char tReciveData[TCPIP_MAX_DAT_SIZE];
bool first;
unsigned char IOdata[64];
unsigned char Orderdata[64];
unsigned char IOCheck[64];
unsigned char TempData[64];
int OrderSend;
int IOSend;
private:
void Create_Thread();
void Exit_Thread();
int Init_Winsock();
public:
unsigned char lightdata[64];
int LightSend;
public:
HSI_STATUS CollectPos(bool isEnable, MOTOR_AXISCHOOES_CMD axis, short cycle); //位置采集打开/关闭
private:
HSI_STATUS SetAllGears(); //下发所有档位数据
};
extern HSI_Motion *g_pHSI_Motion;
#endif