@@ -214,7 +214,7 @@ HSI_Motion::HSI_Motion()
m_JogDecLine [ j ] [ i ] = 5 ;
m_JogDecCurve [ j ] [ i ] = 0 ;
}
m_Home_Machine_Axis [ i ] = 1 ; //用于启动时需要回原点的轴号选择
m_Home_Machine_Axis [ i ] = 1 ; //用于启动时需要回原点的轴号选择,赋值1表示该轴需要回家
m_Home_Pos_Axis [ i ] = 0 ; //记住关闭电源时的位置,用于判断是否还需要回原点
}
m_Home_Machine_Axis [ 4 ] = 0 ; //用于启动时需要回原点的轴号选择
@@ -437,11 +437,13 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
return HSI_STATUS_FAILED ;
}
m_bACSConnected = true ;
g_pLogger - > SendAndFlushWithTime ( L " [ACS Motion] Communication with the controller established success \n " ) ;
g_pLogger - > SendAndFlushWithTime (
L " [ACS Motion] Communication with the controller established success \n " ) ;
}
else
{
g_pLogger - > SendAndFlushWithTime ( L " [ACS Motion] Communication with the controller is already established successfully! \n " ) ;
g_pLogger - > SendAndFlushWithTime (
L " [ACS Motion] Communication with the controller is already established successfully! \n " ) ;
}
}
@@ -698,7 +700,12 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
return rStatus ;
}
//=============================获取EF3固件版本 ===============================
//============================================ ===============================
/**
* \ brief 获 取 EF3固件版本
* \ param version
* \ return
*/
HSI_STATUS HSI_Motion : : GetFirmwareVersion ( byte * version )
{
m_Thread_StateData = HSI_THREAD_PAUSED ;
@@ -762,7 +769,7 @@ HSI_STATUS HSI_Motion::GetFirmwareVersion(byte* version)
}
//================================回家=======================================
HSI_STATUS HSI_Motion : : HomeMachine ( bool bHomed )
HSI_STATUS HSI_Motion : : HomeMachineOld ( bool bHomed )
{
auto rStatus = HSI_STATUS_NORMAL ;
if ( ! bHomed )
@@ -801,7 +808,8 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed)
AfxMessageBox ( _T ( " 急停或安全门或安全光幕触发! " ) ) ;
return HSI_STATUS_FAILED ;
}
//根据当前位置,保存位置,求解相对运动
//回家后,设置正负限位
CurrentHomeMachineState = E_EF3_HOME_ING ;
int GetHomePos [ 5 ] = { 0 } ;
if ( m_SO7_Serial . m_RecvData [ 0 ] = = 2 )
@@ -835,6 +843,7 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed)
//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 ;
@@ -879,8 +888,8 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed)
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 [ 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 (
@@ -938,6 +947,69 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed)
return rStatus ;
}
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 ;
//运行 ACS 控制器内buffer0 自动回家动作
//回家后,启用正负限位
if ( ! acsc_RunBuffer ( handleACS , 0 , NULL , ACSC_SYNCHRONOUS ) )
{
g_pLogger - > SendAndFlushWithTime ( L " [HomeMachine] ACS Run Buffer 0 error \n " ) ;
return HSI_STATUS_FAILED ;
}
//再次读取回家标志位,或者上个动作完成回调
IsHomed ( home ) ;
if ( home = = true )
{
g_pLogger - > SendAndFlushWithTime ( L " [HomeMachine] Go Home success \n " ) ;
return HSI_STATUS_NORMAL ;
}
g_pLogger - > SendAndFlushWithTime ( L " [HomeMachine] Out \n " ) ;
}
return rStatus ;
}
//===========================================================================
HSI_STATUS HSI_Motion : : HomeJog ( short AxisNumber , short Dir , bool Wait )
{
@@ -952,6 +1024,10 @@ HSI_STATUS HSI_Motion::HomeJog(short AxisNumber, short Dir, bool Wait)
}
//===========================================================================
/**
* \ brief 取 消 限 位 , 设 置 初 始 速 度 , 加 减 速 等 参 数
* \ return
*/
HSI_STATUS HSI_Motion : : HomeFindIndex ( )
{
auto rStatus = HSI_STATUS_NORMAL ;
@@ -1127,6 +1203,7 @@ HSI_STATUS HSI_Motion::HomeFindIndex()
bool bHomed = true ;
if ( ( m_SO7_Serial . m_RecvData [ 38 ] & 0x01 ) = = 0 & & m_Home_Machine_Axis [ 1 ] = = 1 )
{
/* strcat_s 是系统的安全函数,微软在 2005 后建议用一系统所谓安全的函数,这中间就有 strcat_s 取代了 strcat ,原来 strcat 函数,没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串, 容易产生程序崩溃。而strcat_s函数能很好的规避这个问题*/
strcat_s ( MessageHome , 30 , " 1、 " ) ;
bHomed = false ;
}
@@ -1197,7 +1274,7 @@ HSI_STATUS HSI_Motion::GetAppPath(CString& Path)
}
//===========================================================================
HSI_STATUS HSI_Motion : : IsHomed ( bool & bHomed )
HSI_STATUS HSI_Motion : : IsHomedOld ( bool & bHomed )
{
auto rStatus = HSI_STATUS_NORMAL ;
if ( g_pHSI_Motion )
@@ -1268,6 +1345,63 @@ HSI_STATUS HSI_Motion::IsHomed(bool& bHomed)
return rStatus ;
}
HSI_STATUS HSI_Motion : : IsHomed ( bool & bHomed )
{
auto rStatus = HSI_STATUS_NORMAL ;
if ( g_pHSI_Motion & & handleACS ! = ACSC_INVALID )
{
g_pLogger - > SendAndFlushWithTime ( L " [IsHomed] In \n " ) ;
int isHomed [ 5 ] = { 1 , 1 , 1 , 1 , 1 } ;
//所有轴都不需要回家
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 ;
}
// 判断是否需要回家,读取ACS控制器回家标志位,来判断本次上电是否已经回过家
if ( ! acsc_ReadInteger ( handleACS , ACSC_NONE , " ISHOMED " , ACSC_NONE , ACSC_NONE , ACSC_NONE , ACSC_NONE , isHomed ,
NULL ) )
{
g_pLogger - > SendAndFlushWithTime ( L " [IsHomed] ACS Read ISHOMED Flag Error \n " ) ;
CurrentHomeMachineState = E_EF3_HOME_NONE ;
rStatus = HSI_STATUS_FAILED ;
bHomed = false ;
}
g_pLogger - > SendAndFlushWithTime ( L " [IsHomed] ACS Read ISHOMED X:%d Y1:%d Y2:%d Z:%d \n " , isHomed [ 0 ] , isHomed [ 1 ] ,
isHomed [ 2 ] , isHomed [ 3 ] ) ;
//如果各个轴标志位 已经回过家
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 " ) ;
}
else
{
g_pLogger - > SendAndFlushWithTime ( L " [IsHomed] ACS Communication error \n " ) ;
CurrentHomeMachineState = E_EF3_HOME_NONE ;
rStatus = HSI_STATUS_FAILED ;
bHomed = false ;
}
return rStatus ;
}
//===========================================================================
HSI_STATUS HSI_Motion : : ZeroPos ( bool bZeroPos )
{
@@ -1314,7 +1448,13 @@ HSI_STATUS HSI_Motion::ZeroPos(bool bZeroPos)
return rStatus ;
}
//===============================JOG模式 ============================================
//===========================================================================
/**
* \ brief JOG模式
* \ param AxisTypes
* \ param Speed
* \ return
*/
HSI_STATUS HSI_Motion : : Jog ( UINT AxisTypes , double Speed )
{
auto rStatus = HSI_STATUS_NORMAL ;
@@ -2086,8 +2226,90 @@ HSI_STATUS HSI_Motion::GetPositionEncPrfMulti(UINT AxisTypes, double* EncPos, do
}
//===========================================================================
/**
* \ brief 获 取 轴 当 前 运 动 位 置
* \ param AxisTypes
* \ param PositionX
* \ param PositionY
* \ param PositionZ
* \ param Time
* \ return
*/
HSI_STATUS HSI_Motion : : GetPositionXyzOld ( 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 : : GetPositionXyz ( UINT AxisTypes , double & PositionX , double & PositionY , double & PositionZ ,
double & Time )
double & Time )
{
auto rStatus = HSI_STATUS_NORMAL ;
UNREFERENCED_PARAMETER ( AxisTypes ) ;
@@ -2226,8 +2448,18 @@ HSI_STATUS HSI_Motion::GetPositionXyzaProbe(UINT AxisTypes, double& PositionX, d
}
//===========================================================================
HSI_STATUS HSI_Motion : : SetPositionXyz ( UINT AxisTypes , double PositionX , double PositionY , double PositionZ ,
HSI_MOTION_MOVE_TYPE eType , double dFlyRadius )
/**
* \ brief 设 置 多 轴 运 动 到 指 定 位 置
* \ param AxisTypes
* \ param PositionX
* \ param PositionY
* \ param PositionZ
* \ param eType
* \ param dFlyRadius
* \ return
*/
HSI_STATUS HSI_Motion : : SetPositionXyzOld ( 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 ;
@@ -2240,6 +2472,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P
axis_start = 0 ;
unsigned char direct_pos = 0 ;
unsigned char xyzAxis = 0 ;
//如果状态非 运动中,设置为运动中
if ( CurrentMotionState ! = E_SO7_MOTION_MOVETO )
{
CurrentMotionState = E_SO7_MOTION_MOVETO ;
@@ -2266,7 +2499,8 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P
if ( m_SO7_Serial . m_RecvData [ 0 ] = = 2 )
{
if ( m_DeviceType ! = 1 )
//根据设备类型获取现在位置
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 .
@@ -2320,6 +2554,8 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P
}
else
{
/* 编译器隐式执行的任何类型转换都可以由static_cast显式完成。
static_cast可以用来将枚举类型转换成整型 , 或 者 整 型 转 换 成 浮 点 型 */
Pos_t [ 1 ] = NowPos [ 1 ] = static_cast < int > ( m_EncPos [ 1 ] / m_Resolution [ 1 ] ) ;
Pos_t [ 2 ] = NowPos [ 2 ] = static_cast < int > ( m_EncPos [ 2 ] / m_Resolution [ 2 ] ) ;
Pos_t [ 3 ] = NowPos [ 3 ] = static_cast < int > ( m_EncPos [ 3 ] / m_Resolution [ 3 ] ) ;
@@ -2393,12 +2629,12 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P
Pos [ 4 ] = ( int ) ( m_PositionA / m_Resolution [ 4 ] ) - NowPos [ 4 ] ;
}
} */
target_pos [ 1 ] = static_cast < int > ( PositionX / m_Resolution [ 1 ] ) ;
target_pos [ 1 ] = static_cast < int > ( PositionX / m_Resolution [ 1 ] ) ; //计算到目标位置
target_pos [ 2 ] = static_cast < int > ( PositionY / m_Resolution [ 2 ] ) ;
target_pos [ 3 ] = static_cast < int > ( PositionZ / m_Resolution [ 3 ] ) ;
target_pos [ 4 ] = static_cast < int > ( m_PositionA / m_Resolution [ 4 ] ) ;
begin_position [ 1 ] = target_pos [ 1 ] ;
begin_position [ 1 ] = target_pos [ 1 ] ; //将目标位置设置为 开始位置
begin_position [ 2 ] = target_pos [ 2 ] ;
begin_position [ 3 ] = target_pos [ 3 ] ;
begin_position [ 4 ] = target_pos [ 4 ] ;
@@ -2562,7 +2798,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P
//}
int axisCount = 4 ;
if ( fourthAxisFlag )
if ( fourthAxisFlag ) //第4轴
{
fourthAxisFlag = false ;
if ( Pos [ 4 ] > 0 ) direct_pos | = 0x08 ;
@@ -2572,6 +2808,8 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P
}
else
xyzAxis = AXIS_XYZ ;
//设置运动参数
for ( int i = 1 ; i < axisCount ; i + + )
{
int time_out_send = 0 ;
@@ -2666,6 +2904,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P
Sleep ( 6 ) ;
}
//清除缓存位置
while ( m_SO7_Serial . m_RecvData [ 39 ] )
{
send_pos_data [ 0 ] = CT_ORDER ;
@@ -2733,7 +2972,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P
send_pos_data [ 40 ] = Stepdriverspeed [ 4 ] & 0xff ;
if ( bCircleRun )
if ( bCircleRun ) //圆弧插补
{
bCircleRun = false ;
send_pos_data [ 1 ] = CT_CIRCLERUN_POSITION ;
@@ -2786,6 +3025,102 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double P
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 ; //SetpositionXyz的目标位置
m_PosThread [ 2 ] = PositionY ;
m_PosThread [ 3 ] = PositionZ ;
m_PosThread [ 4 ] = m_PositionA ;
//打印当前位置,目标位置
//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 ) ;
//打印轴当前运动参数
double motionParam [ 5 ] = { 0 } ;
GetMotorParam ( AXIS_X , motionParam ) ;
g_pLogger - > SendAndFlushWithTime (
L " [SetPositionXyz] axis= %d,GetVelocity = %d,GetAcceleration= %d,GetDeceleration= %d, GetKillDeceleration= %d, GetJerk= %d \n " , AXIS_X , motionParam [ 0 ] , motionParam [ 1 ] , motionParam [ 2 ] , motionParam [ 3 ] , motionParam [ 4 ] ) ;
//设置轴运动速度,TO-DO
//开始运动到指定位置
int Axes [ ] = { ACSC_AXIS_0 , ACSC_AXIS_1 , ACSC_AXIS_2 } ; //需要运动的轴
double Points [ ] = { PositionX , PositionY , PositionZ } ; //目标位置点
if ( ! acsc_ToPointM ( handleACS , 0 , Axes , Points , nullptr ) )
{
g_pLogger - > SendAndFlushWithTime ( L " [SetPositionXyz] ACS Multi Motion Error " ) ;
}
//启动插补和定位功能
//圆弧插补
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 )
{
@@ -2798,6 +3133,44 @@ int HSI_Motion::CaculateStepMotorACC(int pos, int maxacc, int minacc)
return acc ;
}
//===========================================================================
/**
* \ brief 求 各 轴 运 动 配 置 参 数
* \ param AXIS
* \ param motionParam
* \ return
*/
HSI_STATUS HSI_Motion : : GetMotorParam ( int AXIS , double motionParam [ 5 ] )
{
auto rStatus = HSI_STATUS_NORMAL ;
if ( handleACS ! = ACSC_INVALID )
{
//依次是 速度、加速度、减速、杀死速度、抖动
if ( ! acsc_GetVelocity ( handleACS , AXIS , motionParam , nullptr ) )
{
rStatus = HSI_ACS_ERROR ;
}
if ( ! acsc_GetAcceleration ( handleACS , AXIS , motionParam + 1 , nullptr ) )
{
rStatus = HSI_ACS_ERROR ;
}
if ( ! acsc_GetDeceleration ( handleACS , AXIS , motionParam + 2 , nullptr ) )
{
rStatus = HSI_ACS_ERROR ;
}
if ( ! acsc_GetKillDeceleration ( handleACS , AXIS , motionParam + 3 , nullptr ) )
{
rStatus = HSI_ACS_ERROR ;
}
if ( ! acsc_GetJerk ( handleACS , AXIS , motionParam + 4 , nullptr ) )
{
rStatus = HSI_ACS_ERROR ;
}
}
return rStatus ;
}
//===========================================================================
HSI_STATUS HSI_Motion : : SetPositionXyza ( UINT AxisTypes , double PositionX , double PositionY , double PositionZ ,
double PositionA , HSI_MOTION_MOVE_TYPE eType , double dFlyRadius )
@@ -2827,6 +3200,13 @@ HSI_STATUS HSI_Motion::SetPositionXyzCache(UINT AxisTypes, HSI_MOTION_MOVE_TYPE
}
//===========================================================================
/**
* \ brief 圆 弧 插 补
* \ param PositionX
* \ param PositionY
* \ param PositionZ
* \ return
*/
HSI_STATUS HSI_Motion : : SetCircleInterpolate ( double PositionX , double PositionY , double PositionZ )
{
auto rStatus = HSI_STATUS_NORMAL ;
@@ -2842,7 +3222,11 @@ HSI_STATUS HSI_Motion::SetCircleInterpolate(double PositionX, double PositionY,
return rStatus ;
}
//===========================探针接口 ================================================
//===========================================================================
/**
* \ brief 探 针 接 口
* \ param RetractManDist
*/
void HSI_Motion : : ProbeRetractManDist ( int RetractManDist )
{
if ( g_pHSI_Motion )
@@ -2974,7 +3358,12 @@ HSI_STATUS HSI_Motion::JogProbe(UINT AxisTypes, double Speed)
return rStatus ;
}
//=============================读取配置 ==============================================
//===========================================================================
/**
* \ brief 读 取 配 置
* \ param GoogolIniFile
* \ return
*/
HSI_STATUS HSI_Motion : : Load_EF3_Motion_Inifile ( CString GoogolIniFile )
{
auto rStatus = HSI_STATUS_NORMAL ;
@@ -3229,7 +3618,14 @@ HSI_STATUS HSI_Motion::Load_EF3_Config_Inifile(CString GoogolIniFile)
return rStatus ;
}
//===============================读取/设置光栅尺精度 ============================================
//===========================================================================
/**
* \ brief 读 取 / 设 置 光 栅 尺 精 度
* \ param _ScaleX
* \ param _ScaleY
* \ param _ScaleZ
* \ return
*/
HSI_STATUS HSI_Motion : : GetScaleResolution ( double & _ScaleX , double & _ScaleY , double & _ScaleZ )
{
auto rStatus = HSI_STATUS_NORMAL ;
@@ -3255,7 +3651,10 @@ HSI_STATUS HSI_Motion::SetScaleResolution(double _ScaleX, double _ScaleY, double
return rStatus ;
}
//============================定位完成事件 ===============================================
//===========================================================================
/**
* \ brief 定 位 完 成 事 件
*/
void HSI_Motion : : SendMsgMotionFinished ( )
{
sEvenProp . Init ( ) ;
@@ -3265,7 +3664,10 @@ void HSI_Motion::SendMsgMotionFinished()
EventCallback ( sEvenProp ) ;
}
//=============================回调探针运行事件 ==============================================
//===========================================================================
/**
* \ brief 回 调 探 针 运 行 事 件
*/
void HSI_Motion : : SendMsgProbeFinished ( )
{
sEvenProp . Init ( ) ;
@@ -3405,7 +3807,7 @@ void HSI_Motion::UpdateMotionState()
m_PrfPos [ 3 ] - m_EncPos [ 3 ] , 2.0 ) ;
if ( dis > 0 )
{
PntToPntDistance = sqrt ( dis ) ;
PntToPntDistance = sqrt ( dis ) ; //欧氏距离
}
else
{
@@ -3544,7 +3946,10 @@ void HSI_Motion::UpdateMotionStateIO()
}
}
//========================获取运动状态 ===================================================
//===========================================================================
/**
* \ brief 获 取 运 动 状 态
*/
void HSI_Motion : : UpdateMotionStateData ( )
{
while ( m_Thread_StateData = = HSI_THREAD_RUNNING )
@@ -3624,13 +4029,16 @@ void HSI_Motion::UpdateMotionStateProbe()
void HSI_Motion : : DoEvents ( )
{
MSG msg ;
//和函数PeekMessage不一样的是, GetMessage:从系统获取消息,将消息从系统中移除,属于阻塞函数。
//当系统无消息时,GetMessage会等待下一条消息。而函数PeekMesssge是以查看的方式从系统中获取消息,可以不将消息从系统中移除,
//是非阻塞函数;当系统无消息时,返回FALSE,继续执行后续代码
//GetMessage:从系统获取消息,将消息从系统中移除,属于阻塞函数。当系统无消息时,GetMessage会等待下一条消息。
//函数PeekMesssge是以查看的方式从系统中获取消息,可以不将消息从系统中移除, 是非阻塞函数;当系统无消息时,返回FALSE,继续执行后续代码
while ( PeekMessage ( & msg , nullptr , 0 , 0 , PM_REMOVE ) )
{
__try
{
//DispatchMessage 函数分发一个消息给窗口程序。通常消息从GetMessage函数获得或者TranslateMessage函数传递的。
// 消息被分发到回调函数(过程函数),作用是消息传递给操作系统,
// 然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息。
DispatchMessage ( & msg ) ;
TranslateMessage ( & msg ) ;
}
@@ -3823,7 +4231,11 @@ HSI_STATUS HSI_Motion::GetAxisStatus(int* _Status)
return rStatus ;
}
//=============================暂停和关闭 ==============================================
//===========================================================================
/**
* \ brief 暂 停 和 关 闭
* \ return
*/
HSI_STATUS HSI_Motion : : AbortMotion ( ) //需要运动实现
{
auto rStatus = HSI_STATUS_NORMAL ;
@@ -3863,7 +4275,11 @@ HSI_STATUS HSI_Motion::AbortMotion() //
return rStatus ;
}
//===============================关闭 ============================================
//===========================================================================
/**
* \ brief 关 闭
* \ return
*/
HSI_STATUS HSI_Motion : : Shutdown ( )
{
auto rStatus = HSI_STATUS_NORMAL ;
@@ -3927,7 +4343,16 @@ HSI_STATUS HSI_Motion::Shutdown()
return rStatus ;
}
//==============================触发灯光 =============================================
//===========================================================================
/**
* \ brief 触 发 灯 光
* \ param triggleNum
* \ param delayLighting
* \ param delayLightBefor
* \ param triggleMode
* \ param Intensities
* \ return
*/
HSI_STATUS HSI_Motion : : SetTriggerLight ( int triggleNum , int delayLighting , int delayLightBefor , int triggleMode ,
double * Intensities )
{
@@ -3990,7 +4415,12 @@ HSI_STATUS HSI_Motion::SetTriggerLight(int triggleNum, int delayLighting, int de
return rStatus ;
}
//=============================硬件触发拍照 ==============================================
//===========================================================================
/**
* \ brief 硬 件 触 发 拍 照
* \ param startPoint
* \ return
*/
HSI_STATUS HSI_Motion : : DCCPPStartPoint ( double * startPoint )
{
auto rStatus = HSI_STATUS_NORMAL ;
@@ -4545,7 +4975,17 @@ HSI_STATUS HSI_Motion::DCCForLightPlate()
return rStatus ;
}
//===============================转盘 ============================================
//===========================================================================
/**
* \ brief 转 盘
* \ param CamerasDis
* \ param BinsDis
* \ param SubArea
* \ param filterTime1
* \ param filterTime2
* \ param pluseSumDis
* \ return
*/
HSI_STATUS HSI_Motion : : StartPlcJob ( int * CamerasDis , int * BinsDis , int SubArea , int filterTime1 , int filterTime2 ,
int pluseSumDis )
{
@@ -5575,7 +6015,19 @@ HSI_STATUS HSI_Motion::GetPntsDistance(double& pDistance, int& spTimeCount)
return rStatus ;
}
//========================运动控制参数读取及设置 ===================================================
//===========================================================================
/**
* \ brief 运 动 控 制 参 数 读 取 及 设 置
* \ param AxisNum
* \ param Speed
* \ param DirveSpeed
* \ param StartSpeed
* \ param AccLine
* \ param DecLine
* \ param AccCurve
* \ param DecCurve
* \ return
*/
int HSI_Motion : : SpeedPercent ( int AxisNum , double & Speed , int & DirveSpeed , int & StartSpeed , int & AccLine , int & DecLine ,
int & AccCurve , int & DecCurve )
{
@@ -5638,7 +6090,19 @@ int HSI_Motion::SpeedPercent(int AxisNum, double& Speed, int& DirveSpeed, int& S
return static_cast < int > ( Speed ) ;
}
//==========================JoyStick运动控制参数读取及设置 =================================================
//===========================================================================
/**
* \ brief JoyStick运动控制参数读取及设置
* \ param AxisNum
* \ param Speed
* \ param DirveSpeed
* \ param StartSpeed
* \ param AccLine
* \ param DecLine
* \ param AccCurve
* \ param DecCurve
* \ return
*/
bool HSI_Motion : : SpeedPercentJoyStick ( int AxisNum , long & Speed , int & DirveSpeed , int & StartSpeed , int & AccLine ,
int & DecLine , int & AccCurve , int & DecCurve )
{