修复乱码

This commit is contained in:
zhengxuan.zhang
2026-05-11 15:16:33 +08:00
parent 53f44ffdbf
commit 72695007c3
35 changed files with 493 additions and 493 deletions
@@ -29,7 +29,7 @@ typedef float FLOAT;
#define __DMC2410_EXPORTS #define __DMC2410_EXPORTS
//定义输入和输出 //定义输入和输出
#ifdef __DMC2410_EXPORTS #ifdef __DMC2410_EXPORTS
#define DMC2410_API __declspec(dllexport) #define DMC2410_API __declspec(dllexport)
#else #else
@@ -40,23 +40,23 @@ typedef float FLOAT;
extern "C" { extern "C" {
#endif #endif
//--------------------- 板卡初始和配置函数 ---------------------- //--------------------- 板卡初始和配置函数 ----------------------
/******************************************************************************** /********************************************************************************
** 函数名称: d2410_board_init ** 函数名称: d2410_board_init
** 功能描述: 控制板初始化,设置初始化和速度等设置 ** 功能描述: 控制板初始化,设置初始化和速度等设置
** 输  入: 无 ** 输  入: 无
** 返 回 值: 0:无卡; 1-8:成功(实际卡数) ** 返 回 值: 0:无卡; 1-8:成功(实际卡数)
** 修 改: ** 修 改:
** 修改日期: 2012.05.02 ** 修改日期: 2012.05.02
*********************************************************************************/ *********************************************************************************/
DMC2410_API int __stdcall d2410_board_init(void); DMC2410_API int __stdcall d2410_board_init(void);
/******************************************************************************** /********************************************************************************
** 函数名称: d2410_board_close ** 函数名称: d2410_board_close
** 功能描述: 关闭所有卡 ** 功能描述: 关闭所有卡
** 输  入: 无 ** 输  入: 无
** 返 回 值: 无 ** 返 回 值: 无
** 日 期: 2012.05.02 ** 日 期: 2012.05.02
*********************************************************************************/ *********************************************************************************/
DMC2410_API DWORD __stdcall d2410_board_close(void); DMC2410_API DWORD __stdcall d2410_board_close(void);
@@ -64,22 +64,22 @@ DMC2410_API DWORD __stdcall d2410_get_card_soft_version(WORD card, WORD* firm_id
DMC2410_API DWORD __stdcall d2410_get_card_ID(WORD card); DMC2410_API DWORD __stdcall d2410_get_card_ID(WORD card);
DMC2410_API DWORD __stdcall d2410_get_card_version(WORD card); DMC2410_API DWORD __stdcall d2410_get_card_version(WORD card);
//脉冲输入输出配置 //脉冲输入输出配置
/******************************************************************************** /********************************************************************************
** 函数名称: d2410_set_pulse_outmode ** 函数名称: d2410_set_pulse_outmode
** 功能描述: 脉冲输出方式的设置 ** 功能描述: 脉冲输出方式的设置
** 输  入: axis - (0 - 3), outmode: 0 - 7 ** 输  入: axis - (0 - 3), outmode: 0 - 7
** 6:正交脉冲,A相超前; 7:正交脉冲,B相超前 ** 6:正交脉冲,A相超前; 7:正交脉冲,B相超前
** 返 回 值: 无 ** 返 回 值: 无
** 修改日期:2012.05.02 ** 修改日期:2012.05.02
*********************************************************************************/ *********************************************************************************/
DMC2410_API DWORD __stdcall d2410_set_pulse_outmode(WORD axis,WORD outmode); DMC2410_API DWORD __stdcall d2410_set_pulse_outmode(WORD axis,WORD outmode);
DMC2410_API DWORD __stdcall d2410_get_pulse_outmode(WORD axis,WORD *outmode); DMC2410_API DWORD __stdcall d2410_get_pulse_outmode(WORD axis,WORD *outmode);
//ALM配置 //ALM配置
DMC2410_API DWORD __stdcall d2410_config_ALM_PIN(WORD axis,WORD alm_logic,WORD alm_action); DMC2410_API DWORD __stdcall d2410_config_ALM_PIN(WORD axis,WORD alm_logic,WORD alm_action);
DMC2410_API DWORD __stdcall d2410_get_config_ALM_PIN(WORD axis,WORD* alm_logic,WORD* alm_action); DMC2410_API DWORD __stdcall d2410_get_config_ALM_PIN(WORD axis,WORD* alm_logic,WORD* alm_action);
//ALM配置 添加alm_all参数 单轴ALM停止所有轴功能 //ALM配置 添加alm_all参数 单轴ALM停止所有轴功能
DMC2410_API DWORD __stdcall d2410_config_ALM_PIN_Extern(WORD axis,WORD alm_enable,WORD alm_logic,WORD alm_all,WORD alm_action); DMC2410_API DWORD __stdcall d2410_config_ALM_PIN_Extern(WORD axis,WORD alm_enable,WORD alm_logic,WORD alm_all,WORD alm_action);
DMC2410_API DWORD __stdcall d2410_get_config_ALM_PIN_Extern(WORD axis,WORD* alm_enable,WORD* alm_logic,WORD* alm_all,WORD* alm_action); DMC2410_API DWORD __stdcall d2410_get_config_ALM_PIN_Extern(WORD axis,WORD* alm_enable,WORD* alm_logic,WORD* alm_all,WORD* alm_action);
DMC2410_API DWORD __stdcall d2410_config_EL_MODE(WORD axis,WORD el_mode); DMC2410_API DWORD __stdcall d2410_config_EL_MODE(WORD axis,WORD el_mode);
@@ -90,7 +90,7 @@ DMC2410_API DWORD __stdcall d2410_write_SEVON_PIN(WORD axis, WORD on_off);
DMC2410_API int __stdcall d2410_read_SEVON_PIN(WORD axis); DMC2410_API int __stdcall d2410_read_SEVON_PIN(WORD axis);
DMC2410_API int __stdcall d2410_read_RDY_PIN(WORD axis); DMC2410_API int __stdcall d2410_read_RDY_PIN(WORD axis);
//通用输入/输出控制函数 //通用输入/输出控制函数
DMC2410_API int __stdcall d2410_read_inbit(WORD cardno, WORD bitno); DMC2410_API int __stdcall d2410_read_inbit(WORD cardno, WORD bitno);
DMC2410_API DWORD __stdcall d2410_write_outbit(WORD cardno, WORD bitno,WORD on_off); DMC2410_API DWORD __stdcall d2410_write_outbit(WORD cardno, WORD bitno,WORD on_off);
DMC2410_API int __stdcall d2410_read_outbit(WORD cardno, WORD bitno) ; DMC2410_API int __stdcall d2410_read_outbit(WORD cardno, WORD bitno) ;
@@ -98,74 +98,74 @@ DMC2410_API long __stdcall d2410_read_inport(WORD cardno);
DMC2410_API long __stdcall d2410_read_outport(WORD cardno) ; DMC2410_API long __stdcall d2410_read_outport(WORD cardno) ;
DMC2410_API DWORD __stdcall d2410_write_outport(WORD cardno, DWORD port_value); DMC2410_API DWORD __stdcall d2410_write_outport(WORD cardno, DWORD port_value);
//制动函数 //制动函数
DMC2410_API DWORD __stdcall d2410_decel_stop(WORD axis,double Tdec); DMC2410_API DWORD __stdcall d2410_decel_stop(WORD axis,double Tdec);
DMC2410_API DWORD __stdcall d2410_imd_stop(WORD axis); DMC2410_API DWORD __stdcall d2410_imd_stop(WORD axis);
DMC2410_API DWORD __stdcall d2410_emg_stop(void) ; DMC2410_API DWORD __stdcall d2410_emg_stop(void) ;
//位置/速度设置和读取函数 //位置/速度设置和读取函数
DMC2410_API DWORD __stdcall d2410_set_position(WORD axis,long current_position); DMC2410_API DWORD __stdcall d2410_set_position(WORD axis,long current_position);
DMC2410_API long __stdcall d2410_get_position(WORD axis); DMC2410_API long __stdcall d2410_get_position(WORD axis);
DMC2410_API double __stdcall d2410_read_current_speed(WORD axis); DMC2410_API double __stdcall d2410_read_current_speed(WORD axis);
DMC2410_API double __stdcall d2410_read_vector_speed(WORD card); DMC2410_API double __stdcall d2410_read_vector_speed(WORD card);
//状态检测函数 //状态检测函数
DMC2410_API WORD __stdcall d2410_check_done(WORD axis) ; DMC2410_API WORD __stdcall d2410_check_done(WORD axis) ;
DMC2410_API WORD __stdcall d2410_axis_io_status(WORD axis); DMC2410_API WORD __stdcall d2410_axis_io_status(WORD axis);
DMC2410_API DWORD __stdcall d2410_get_rsts(WORD axis) ; DMC2410_API DWORD __stdcall d2410_get_rsts(WORD axis) ;
DMC2410_API long __stdcall d2410_get_target_position(WORD axis); DMC2410_API long __stdcall d2410_get_target_position(WORD axis);
//速度设置 //速度设置
DMC2410_API DWORD __stdcall d2410_set_profile(WORD axis,double Min_Vel,double Max_Vel,double Tacc,double Tdec); DMC2410_API DWORD __stdcall d2410_set_profile(WORD axis,double Min_Vel,double Max_Vel,double Tacc,double Tdec);
DMC2410_API DWORD __stdcall d2410_get_profile(WORD axis,double* min_Vel,double* Max_Vel,double* Tacc,double* Tdec); DMC2410_API DWORD __stdcall d2410_get_profile(WORD axis,double* min_Vel,double* Max_Vel,double* Tacc,double* Tdec);
DMC2410_API DWORD __stdcall d2410_set_vector_profile(double S_para,double Max_Vel,double Tacc,double Tdec); DMC2410_API DWORD __stdcall d2410_set_vector_profile(double S_para,double Max_Vel,double Tacc,double Tdec);
DMC2410_API DWORD __stdcall d2410_get_vector_profile(double* S_para, double* Max_Vel, double* Tacc,double* Tdec ); DMC2410_API DWORD __stdcall d2410_get_vector_profile(double* S_para, double* Max_Vel, double* Tacc,double* Tdec );
//添加停止速度设置 //添加停止速度设置
DMC2410_API DWORD __stdcall d2410_set_profile_Extern(WORD axis,double Min_Vel,double Max_Vel,double Tacc,double Tdec,double Stop_Vel); DMC2410_API DWORD __stdcall d2410_set_profile_Extern(WORD axis,double Min_Vel,double Max_Vel,double Tacc,double Tdec,double Stop_Vel);
DMC2410_API DWORD __stdcall d2410_get_profile_Extern(WORD axis,double* min_Vel,double* Max_Vel,double* Tacc,double* Tdec,double* Stop_Vel); DMC2410_API DWORD __stdcall d2410_get_profile_Extern(WORD axis,double* min_Vel,double* Max_Vel,double* Tacc,double* Tdec,double* Stop_Vel);
DMC2410_API DWORD __stdcall d2410_set_s_profile(WORD axis,double Min_Vel,double Max_Vel,double Tacc,double Tdec, long Sacc,long Sdec); DMC2410_API DWORD __stdcall d2410_set_s_profile(WORD axis,double Min_Vel,double Max_Vel,double Tacc,double Tdec, long Sacc,long Sdec);
DMC2410_API DWORD __stdcall d2410_set_st_profile(WORD axis,double Min_Vel, double Max_Vel,double Tacc,double Tdec, double Tsacc,double Tsdec); DMC2410_API DWORD __stdcall d2410_set_st_profile(WORD axis,double Min_Vel, double Max_Vel,double Tacc,double Tdec, double Tsacc,double Tsdec);
DMC2410_API DWORD __stdcall d2410_set_st_profile_Extern(WORD axis,double Min_Vel, double Max_Vel,double Tacc,double Tdec, double Tsacc,double Tsdec,double StopVel); DMC2410_API DWORD __stdcall d2410_set_st_profile_Extern(WORD axis,double Min_Vel, double Max_Vel,double Tacc,double Tdec, double Tsacc,double Tsdec,double StopVel);
//在线变速/变位 //在线变速/变位
DMC2410_API DWORD __stdcall d2410_change_speed(WORD axis,double Curr_Vel); DMC2410_API DWORD __stdcall d2410_change_speed(WORD axis,double Curr_Vel);
DMC2410_API DWORD __stdcall d2410_reset_target_position(WORD axis,long dist); DMC2410_API DWORD __stdcall d2410_reset_target_position(WORD axis,long dist);
//单轴定长运动 //单轴定长运动
DMC2410_API DWORD __stdcall d2410_t_pmove(WORD axis,long Dist,WORD posi_mode); DMC2410_API DWORD __stdcall d2410_t_pmove(WORD axis,long Dist,WORD posi_mode);
DMC2410_API DWORD __stdcall d2410_ex_t_pmove(WORD axis,long Dist,WORD posi_mode); DMC2410_API DWORD __stdcall d2410_ex_t_pmove(WORD axis,long Dist,WORD posi_mode);
DMC2410_API DWORD __stdcall d2410_s_pmove(WORD axis,long Dist,WORD posi_mode); DMC2410_API DWORD __stdcall d2410_s_pmove(WORD axis,long Dist,WORD posi_mode);
DMC2410_API DWORD __stdcall d2410_ex_s_pmove(WORD axis,long Dist,WORD posi_mode); DMC2410_API DWORD __stdcall d2410_ex_s_pmove(WORD axis,long Dist,WORD posi_mode);
//单轴连续运动 //单轴连续运动
DMC2410_API DWORD __stdcall d2410_s_vmove(WORD axis,WORD dir); DMC2410_API DWORD __stdcall d2410_s_vmove(WORD axis,WORD dir);
DMC2410_API DWORD __stdcall d2410_t_vmove(WORD axis,WORD dir); DMC2410_API DWORD __stdcall d2410_t_vmove(WORD axis,WORD dir);
//直线插补 //直线插补
DMC2410_API DWORD __stdcall d2410_t_line2(WORD axis1,long Dist1,WORD axis2,long Dist2,WORD posi_mode); DMC2410_API DWORD __stdcall d2410_t_line2(WORD axis1,long Dist1,WORD axis2,long Dist2,WORD posi_mode);
DMC2410_API DWORD __stdcall d2410_t_line3(WORD *axis,long Dist1,long Dist2,long Dist3,WORD posi_mode); DMC2410_API DWORD __stdcall d2410_t_line3(WORD *axis,long Dist1,long Dist2,long Dist3,WORD posi_mode);
DMC2410_API DWORD __stdcall d2410_t_line4(WORD cardno,long Dist1,long Dist2,long Dist3,long Dist4,WORD posi_mode); DMC2410_API DWORD __stdcall d2410_t_line4(WORD cardno,long Dist1,long Dist2,long Dist3,long Dist4,WORD posi_mode);
//圆弧插补 //圆弧插补
DMC2410_API DWORD __stdcall d2410_arc_move(WORD *axis,long *target_pos,long *cen_pos, WORD arc_dir); DMC2410_API DWORD __stdcall d2410_arc_move(WORD *axis,long *target_pos,long *cen_pos, WORD arc_dir);
DMC2410_API DWORD __stdcall d2410_rel_arc_move(WORD *axis,long *rel_pos,long *rel_cen, WORD arc_dir); DMC2410_API DWORD __stdcall d2410_rel_arc_move(WORD *axis,long *rel_pos,long *rel_cen, WORD arc_dir);
//手轮运动 //手轮运动
DMC2410_API DWORD __stdcall d2410_set_handwheel_inmode(WORD axis,WORD inmode,double multi); DMC2410_API DWORD __stdcall d2410_set_handwheel_inmode(WORD axis,WORD inmode,double multi);
DMC2410_API DWORD __stdcall d2410_handwheel_move(WORD axis); DMC2410_API DWORD __stdcall d2410_handwheel_move(WORD axis);
//找原点 //找原点
DMC2410_API DWORD __stdcall d2410_config_home_mode(WORD axis,WORD mode,WORD EZ_count); DMC2410_API DWORD __stdcall d2410_config_home_mode(WORD axis,WORD mode,WORD EZ_count);
DMC2410_API DWORD __stdcall d2410_get_config_home_mode(WORD axis,WORD* home_mode,WORD* EZ_count); DMC2410_API DWORD __stdcall d2410_get_config_home_mode(WORD axis,WORD* home_mode,WORD* EZ_count);
DMC2410_API DWORD __stdcall d2410_home_move(WORD axis,WORD home_mode,WORD vel_mode); DMC2410_API DWORD __stdcall d2410_home_move(WORD axis,WORD home_mode,WORD vel_mode);
//设置位置误差带 //设置位置误差带
DMC2410_API DWORD __stdcall d2410_set_factor_error(WORD axis,double factor,long error); DMC2410_API DWORD __stdcall d2410_set_factor_error(WORD axis,double factor,long error);
DMC2410_API DWORD __stdcall d2410_get_factor_error(WORD axis,double* factor,long* error); DMC2410_API DWORD __stdcall d2410_get_factor_error(WORD axis,double* factor,long* error);
DMC2410_API WORD __stdcall d2410_check_success_pulse(WORD axis); DMC2410_API WORD __stdcall d2410_check_success_pulse(WORD axis);
DMC2410_API WORD __stdcall d2410_check_success_encoder(WORD axis); DMC2410_API WORD __stdcall d2410_check_success_encoder(WORD axis);
//编码器计数功能 //编码器计数功能
DMC2410_API long __stdcall d2410_get_encoder(WORD axis); DMC2410_API long __stdcall d2410_get_encoder(WORD axis);
DMC2410_API DWORD __stdcall d2410_set_encoder(WORD axis,long encoder_value); DMC2410_API DWORD __stdcall d2410_set_encoder(WORD axis,long encoder_value);
DMC2410_API DWORD __stdcall d2410_config_EZ_PIN(WORD axis,WORD ez_logic, WORD ez_mode); DMC2410_API DWORD __stdcall d2410_config_EZ_PIN(WORD axis,WORD ez_logic, WORD ez_mode);
@@ -174,10 +174,10 @@ DMC2410_API long __stdcall d2410_get_counter_flag(WORD cardno);
DMC2410_API DWORD __stdcall d2410_reset_counter_flag(WORD cardno); DMC2410_API DWORD __stdcall d2410_reset_counter_flag(WORD cardno);
DMC2410_API DWORD __stdcall d2410_reset_clear_flag(WORD cardno); DMC2410_API DWORD __stdcall d2410_reset_clear_flag(WORD cardno);
//高速锁存LTC配置 //高速锁存LTC配置
DMC2410_API DWORD __stdcall d2410_config_LTC_PIN(WORD axis,WORD ltc_logic, WORD ltc_mode); DMC2410_API DWORD __stdcall d2410_config_LTC_PIN(WORD axis,WORD ltc_logic, WORD ltc_mode);
DMC2410_API DWORD __stdcall d2410_get_config_LTC_PIN(WORD axis,WORD* ltc_logic, WORD* ltc_mode); DMC2410_API DWORD __stdcall d2410_get_config_LTC_PIN(WORD axis,WORD* ltc_logic, WORD* ltc_mode);
//LTC配置 添加filter滤波时间 //LTC配置 添加filter滤波时间
DMC2410_API DWORD __stdcall d2410_config_LTC_PIN_Extern(WORD axis,WORD ltc_logic, WORD ltc_mode,double ltc_filter); DMC2410_API DWORD __stdcall d2410_config_LTC_PIN_Extern(WORD axis,WORD ltc_logic, WORD ltc_mode,double ltc_filter);
DMC2410_API DWORD __stdcall d2410_get_config_LTC_PIN_Extern(WORD axis,WORD* ltc_logic, WORD* ltc_mode,double* ltc_filter); DMC2410_API DWORD __stdcall d2410_get_config_LTC_PIN_Extern(WORD axis,WORD* ltc_logic, WORD* ltc_mode,double* ltc_filter);
DMC2410_API DWORD __stdcall d2410_config_latch_mode(WORD cardno, WORD all_enable); DMC2410_API DWORD __stdcall d2410_config_latch_mode(WORD cardno, WORD all_enable);
@@ -188,21 +188,21 @@ DMC2410_API DWORD __stdcall d2410_triger_chunnel(WORD cardno, WORD num);
DMC2410_API DWORD __stdcall d2410_set_speaker_logic(WORD cardno, WORD logic); DMC2410_API DWORD __stdcall d2410_set_speaker_logic(WORD cardno, WORD logic);
//EMG配置 //EMG配置
DMC2410_API DWORD __stdcall d2410_config_EMG_PIN(WORD cardno, WORD enable,WORD emg_logic); DMC2410_API DWORD __stdcall d2410_config_EMG_PIN(WORD cardno, WORD enable,WORD emg_logic);
//软件限位功能 //软件限位功能
DMC2410_API DWORD __stdcall d2410_config_softlimit(WORD axis,WORD ON_OFF, WORD source_sel,WORD SL_action, long N_limit,long P_limit); DMC2410_API DWORD __stdcall d2410_config_softlimit(WORD axis,WORD ON_OFF, WORD source_sel,WORD SL_action, long N_limit,long P_limit);
DMC2410_API DWORD __stdcall d2410_get_config_softlimit(WORD axis,WORD *ON_OFF, WORD *source_sel,WORD *SL_action, long *N_limit,long *P_limit); DMC2410_API DWORD __stdcall d2410_get_config_softlimit(WORD axis,WORD *ON_OFF, WORD *source_sel,WORD *SL_action, long *N_limit,long *P_limit);
//原点锁存 //原点锁存
DMC2410_API DWORD __stdcall d2410_set_homelatch_mode(WORD axis,WORD enable,WORD logic); DMC2410_API DWORD __stdcall d2410_set_homelatch_mode(WORD axis,WORD enable,WORD logic);
DMC2410_API DWORD __stdcall d2410_get_homelatch_mode(WORD axis,WORD* enable,WORD* logic); DMC2410_API DWORD __stdcall d2410_get_homelatch_mode(WORD axis,WORD* enable,WORD* logic);
DMC2410_API long __stdcall d2410_get_homelatch_flag(WORD axis); DMC2410_API long __stdcall d2410_get_homelatch_flag(WORD axis);
DMC2410_API DWORD __stdcall d2410_reset_homelatch_flag(WORD axis); DMC2410_API DWORD __stdcall d2410_reset_homelatch_flag(WORD axis);
DMC2410_API long __stdcall d2410_get_homelatch_value(WORD axis); DMC2410_API long __stdcall d2410_get_homelatch_value(WORD axis);
//多组位置比较 //多组位置比较
DMC2410_API DWORD __stdcall d2410_compare_config_Extern(WORD card, WORD queue,WORD enable, WORD axis, WORD cmp_source); DMC2410_API DWORD __stdcall d2410_compare_config_Extern(WORD card, WORD queue,WORD enable, WORD axis, WORD cmp_source);
DMC2410_API DWORD __stdcall d2410_compare_get_config_Extern(WORD card, WORD queue,WORD* enable, WORD* axis, WORD* cmp_source); DMC2410_API DWORD __stdcall d2410_compare_get_config_Extern(WORD card, WORD queue,WORD* enable, WORD* axis, WORD* cmp_source);
DMC2410_API DWORD __stdcall d2410_compare_clear_points_Extern(WORD card, WORD queue); DMC2410_API DWORD __stdcall d2410_compare_clear_points_Extern(WORD card, WORD queue);
@@ -211,7 +211,7 @@ DMC2410_API long __stdcall d2410_compare_get_current_point_Extern(WORD card, WOR
DMC2410_API long __stdcall d2410_compare_get_points_runned_Extern(WORD card, WORD queue); DMC2410_API long __stdcall d2410_compare_get_points_runned_Extern(WORD card, WORD queue);
DMC2410_API long __stdcall d2410_compare_get_points_remained_Extern(WORD card, WORD queue); DMC2410_API long __stdcall d2410_compare_get_points_remained_Extern(WORD card, WORD queue);
//高速位置比较 //高速位置比较
DMC2410_API DWORD __stdcall d2410_config_CMP_PIN(WORD axis, WORD cmp_enable,long cmp_pos, WORD CMP_logic); DMC2410_API DWORD __stdcall d2410_config_CMP_PIN(WORD axis, WORD cmp_enable,long cmp_pos, WORD CMP_logic);
DMC2410_API DWORD __stdcall d2410_get_config_CMP_PIN(WORD axis, WORD* cmp_enable,long* cmp_pos, WORD* CMP_logic); DMC2410_API DWORD __stdcall d2410_get_config_CMP_PIN(WORD axis, WORD* cmp_enable,long* cmp_pos, WORD* CMP_logic);
DMC2410_API int __stdcall d2410_read_CMP_PIN(WORD axis); DMC2410_API int __stdcall d2410_read_CMP_PIN(WORD axis);
@@ -219,28 +219,28 @@ DMC2410_API DWORD __stdcall d2410_write_CMP_PIN(WORD axis, WORD on_off);
enum ERR_Motion_ERR enum ERR_Motion_ERR
{ {
Motion_ERR_NOERR = 0, //成功 Motion_ERR_NOERR = 0, //成功
Motion_ERR_UNKNOWN = 1, //未知错误 Motion_ERR_UNKNOWN = 1, //未知错误
Motion_ERR_PARAERR = 2, //参数错误 Motion_ERR_PARAERR = 2, //参数错误
Motion_ERR_TIMEOUT = 3, //超时 Motion_ERR_TIMEOUT = 3, //超时
Motion_ERR_CONTROLLERBUSY = 4, //正在运动中 Motion_ERR_CONTROLLERBUSY = 4, //正在运动中
Motion_ERR_CONNECT_TOOMANY = 5, //板卡数过多 Motion_ERR_CONNECT_TOOMANY = 5, //板卡数过多
Motion_ERR_CONTILINE = 6, //连续插补错误 Motion_ERR_CONTILINE = 6, //连续插补错误
Motion_ERR_NoThisFunction = 7, //暂不支持该功能 Motion_ERR_NoThisFunction = 7, //暂不支持该功能
Motion_ERR_CANNOT_CONNECTETH = 8, //不能连接 Motion_ERR_CANNOT_CONNECTETH = 8, //不能连接
Motion_ERR_HANDLEERR = 9, //卡资源未能找到 Motion_ERR_HANDLEERR = 9, //卡资源未能找到
Motion_ERR_SENDERR = 10, //pci通信错误 Motion_ERR_SENDERR = 10, //pci通信错误
Motion_ERR_FIRMWAREERR = 12, //固件文件错误 Motion_ERR_FIRMWAREERR = 12, //固件文件错误
Motion_ERR_FIRMWAR_MISMATCH = 14, //固件不匹配 Motion_ERR_FIRMWAR_MISMATCH = 14, //固件不匹配
Motion_ERR_FIRMWARE_INVALID_PARA = 20, //固件参数错误 Motion_ERR_FIRMWARE_INVALID_PARA = 20, //固件参数错误
Motion_ERR_FIRMWARE_PARA_ERR = 20, //固件参数错误2 Motion_ERR_FIRMWARE_PARA_ERR = 20, //固件参数错误2
Motion_ERR_FIRMWARE_STATE_ERR = 22, //固件当前状态不允许操作 Motion_ERR_FIRMWARE_STATE_ERR = 22, //固件当前状态不允许操作
Motion_ERR_FIRMWARE_LIB_STATE_ERR = 22, //固件当前状态不允许操作2 Motion_ERR_FIRMWARE_LIB_STATE_ERR = 22, //固件当前状态不允许操作2
Motion_ERR_FIRMWARE_CARD_NOT_SUPPORT = 24, //固件不支持的功能 控制器不支持的功能 Motion_ERR_FIRMWARE_CARD_NOT_SUPPORT = 24, //固件不支持的功能 控制器不支持的功能
Motion_ERR_FIRMWARE_LIB_NOTSUPPORT = 24, //固件不支持的功能2 Motion_ERR_FIRMWARE_LIB_NOTSUPPORT = 24, //固件不支持的功能2
}; };
#ifdef __cplusplus #ifdef __cplusplus
} }
@@ -1,4 +1,4 @@
// HSI_LEADSHINE_DMC2410C.cpp : ¶¨Òå DLL µÄ³õʼ»¯Àý³Ì¡£ // HSI_LEADSHINE_DMC2410C.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
@@ -1,4 +1,4 @@
// HSI_LEADSHINE_DMC2410C.h : HSI_LEADSHINE_DMC2410C DLL µÄÖ÷Í·Îļþ // HSI_LEADSHINE_DMC2410C.h : HSI_LEADSHINE_DMC2410C DLL 的主头文件
// //
#pragma once #pragma once
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。 // HSI_Motion.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
#include "..\..\..\..\Hsi\HSI.h" #include "..\..\..\..\Hsi\HSI.h"
@@ -41,27 +41,27 @@ HSI_Motion::HSI_Motion()
SdkStatusInit(); SdkStatusInit();
GetAppPath(m_AppPath); GetAppPath(m_AppPath);
CTime tm = CTime::GetCurrentTime(); CTime tm = CTime::GetCurrentTime();
CString csTime = tm.Format("%Y-%m-%d");//显示年月日 CString csTime = tm.Format("%Y-%m-%d");//显示年月日
CString dir = L"\\Log\\" + csTime + L".DMC2410.Log"; CString dir = L"\\Log\\" + csTime + L".DMC2410.Log";
g_pLogger = new CLogger(dir); g_pLogger = new CLogger(dir);
g_pLogger2 = new CLogger(L"\\Log\\DMC2410_Precision.Log"); g_pLogger2 = new CLogger(L"\\Log\\DMC2410_Precision.Log");
#ifdef DEBUG #ifdef DEBUG
//CString 转 char* 和 char* 转 CString //CString 转 char* 和 char* 转 CString
//char *cTemp = ""; //char *cTemp = "";
//CString csTemp(cTemp); //CString csTemp(cTemp);
//删除Log目录下的所有文件 //删除Log目录下的所有文件
//CString csStr1 = "del " + m_AppPath; //CString csStr1 = "del " + m_AppPath;
////f 强制删除只读文件。 ////f 强制删除只读文件。
////s 从所有子目录删除指定文件。 ////s 从所有子目录删除指定文件。
////q 安静模式。删除全局通配符时,不要求确认。 ////q 安静模式。删除全局通配符时,不要求确认。
////a 根据属性选择要删除的文件。 ////a 根据属性选择要删除的文件。
//CString csStr2 = csStr1 + L"\\Log\\*.*" + " /f /s /q /a"; //CString csStr2 = csStr1 + L"\\Log\\*.*" + " /f /s /q /a";
//CString csCmd(csStr2); //CString csCmd(csStr2);
//USES_CONVERSION; //USES_CONVERSION;
//const char* cCmd = T2A(csCmd); //const char* cCmd = T2A(csCmd);
//system(cCmd); //system(cCmd);
//每次删除日志,CString转int 和 int转CString //每次删除日志,CString转int 和 int转CString
CString csTimeDay = tm.Format("%d");//显示年月日 CString csTimeDay = tm.Format("%d");//显示年月日
int iDay = _ttoi(csTimeDay); int iDay = _ttoi(csTimeDay);
CString csTimeYearMonth = tm.Format("%Y-%m-"); CString csTimeYearMonth = tm.Format("%Y-%m-");
for (int i = iDay; i > 0; i--) for (int i = iDay; i > 0; i--)
@@ -80,7 +80,7 @@ HSI_Motion::HSI_Motion()
for (int i = 0; i < 5; i++) for (int i = 0; i < 5; i++)
{ {
m_Jog_Speed[i] = 10.0; //表示5个档位 m_Jog_Speed[i] = 10.0; //表示5个档位
m_Jog_Acc_Time[i] = 5.0; m_Jog_Acc_Time[i] = 5.0;
m_Jog_Dec_Time[i] = 5.0; m_Jog_Dec_Time[i] = 5.0;
m_Home_Machine_Axis[i] = 1; m_Home_Machine_Axis[i] = 1;
@@ -181,7 +181,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "雷赛运动控制卡打开失败!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "雷赛运动控制卡打开失败!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
m_RStatus = d2410_board_close(); m_RStatus = d2410_board_close();
g_pLogger->SendAndFlushWithTime(L"[Startup] d2410_board_close m_RStatus = %d\n", m_RStatus); g_pLogger->SendAndFlushWithTime(L"[Startup] d2410_board_close m_RStatus = %d\n", m_RStatus);
@@ -190,21 +190,21 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
//DWORD m_RStatus1 = 0, m_RStatus2 = 0, m_RStatus3 = 0, m_RStatus4 = 0; //DWORD m_RStatus1 = 0, m_RStatus2 = 0, m_RStatus3 = 0, m_RStatus4 = 0;
for (WORD i = 0; i < 4; i++) for (WORD i = 0; i < 4; i++)
{ {
//设置s曲线 //设置s曲线
m_RStatus = d2410_set_st_profile(i, 1 * 1000, 100 * 1000, 0.1, 0.1, 1, 0); m_RStatus = d2410_set_st_profile(i, 1 * 1000, 100 * 1000, 0.1, 0.1, 1, 0);
//设置编码器为4× A/B(4倍频),必须用3,否则光栅尺的读数一直在跳 //设置编码器为4× A/B(4倍频),必须用3,否则光栅尺的读数一直在跳
m_RStatus = d2410_counter_config(i, 3); m_RStatus = d2410_counter_config(i, 3);
//限位设置,低电平有效,立即停止 //限位设置,低电平有效,立即停止
m_RStatus = d2410_config_EL_MODE(i, 0); m_RStatus = d2410_config_EL_MODE(i, 0);
//1表示限位生效 //1表示限位生效
m_RStatus += d2410_Enable_EL_PIN(i, 1); m_RStatus += d2410_Enable_EL_PIN(i, 1);
m_RStatus = d2410_config_EMG_PIN(CARDNO, 1, 1); m_RStatus = d2410_config_EMG_PIN(CARDNO, 1, 1);
m_RStatus = d2410_config_LTC_PIN_Extern(i, 1, 0, 0.0025); m_RStatus = d2410_config_LTC_PIN_Extern(i, 1, 0, 0.0025);
//打开伺服使能 //打开伺服使能
m_RStatus = d2410_write_SEVON_PIN(i, 1); m_RStatus = d2410_write_SEVON_PIN(i, 1);
//设置位置比较 //设置位置比较
m_RStatus = d2410_compare_config_Extern(CARDNO, 0, 0, i, 1); m_RStatus = d2410_compare_config_Extern(CARDNO, 0, 0, i, 1);
//设置ALM 的有效电平及其工作方式,第一个参数 ALM 信号使能状态,0:禁止,1:允许 //设置ALM 的有效电平及其工作方式,第一个参数 ALM 信号使能状态,0:禁止,1:允许
if (m_IsAlarm[i + 1] == 1) if (m_IsAlarm[i + 1] == 1)
{ {
m_RStatus = d2410_config_ALM_PIN_Extern(i, 1, 1, 0, 0); m_RStatus = d2410_config_ALM_PIN_Extern(i, 1, 1, 0, 0);
@@ -215,17 +215,17 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
} }
//设置位置误差带,实际和编码器的比例是1:1,不用,判断误差带每一次需要100ms,用时太长 //设置位置误差带,实际和编码器的比例是1:1,不用,判断误差带每一次需要100ms,用时太长
//m_RStatus5 = d2410_set_factor_error(i, 1, m_PrecisionCount[i + 1]); //m_RStatus5 = d2410_set_factor_error(i, 1, m_PrecisionCount[i + 1]);
} }
//设置指定轴的脉冲输出模式,脉冲和方向的电平 //设置指定轴的脉冲输出模式,脉冲和方向的电平
m_RStatus = d2410_set_pulse_outmode(AXIS_X, (WORD)m_PulseModeDir[1]);//0和1(芯片决定):点击右移->工作台左移 - + 2和3:点击右移->工作台右移 + + m_RStatus = d2410_set_pulse_outmode(AXIS_X, (WORD)m_PulseModeDir[1]);//0和1(芯片决定):点击右移->工作台左移 - + 2和3:点击右移->工作台右移 + +
m_RStatus = d2410_set_pulse_outmode(AXIS_Y, (WORD)m_PulseModeDir[2]); m_RStatus = d2410_set_pulse_outmode(AXIS_Y, (WORD)m_PulseModeDir[2]);
m_RStatus = d2410_set_pulse_outmode(AXIS_Z, (WORD)m_PulseModeDir[3]); m_RStatus = d2410_set_pulse_outmode(AXIS_Z, (WORD)m_PulseModeDir[3]);
m_RStatus = d2410_set_pulse_outmode(AXIS_A, (WORD)m_PulseModeDir[4]); m_RStatus = d2410_set_pulse_outmode(AXIS_A, (WORD)m_PulseModeDir[4]);
//判断是否驱动报警 //判断是否驱动报警
bool bAlarm(false); bool bAlarm(false);
if (HSI_STATUS_FAILED == DriverAlarmStatus()) if (HSI_STATUS_FAILED == DriverAlarmStatus())
{ {
@@ -233,7 +233,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
g_pLogger->SendAndFlushWithTime(L"[Startup] DriverAlarmStatus HSI_STATUS_FAILED\n"); g_pLogger->SendAndFlushWithTime(L"[Startup] DriverAlarmStatus HSI_STATUS_FAILED\n");
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
//判断急停是否触发 //判断急停是否触发
bool bEmged(false); bool bEmged(false);
IsEmergented(bEmged); IsEmergented(bEmged);
if (bEmged == true && bAlarm == true) if (bEmged == true && bAlarm == true)
@@ -243,7 +243,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
@@ -282,7 +282,7 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed)
} }
if (CurrentHomeMachineState != E_GTS_HOME_ING) if (CurrentHomeMachineState != E_GTS_HOME_ING)
{ {
//判断是否需要回家 //判断是否需要回家
if (m_HomeFocus == false) if (m_HomeFocus == false)
{ {
g_pLogger->SendAndFlushWithTime(L"[HomeMachine] no need focus home\n"); g_pLogger->SendAndFlushWithTime(L"[HomeMachine] no need focus home\n");
@@ -307,16 +307,16 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed)
return HSI_STATUS_NORMAL; return HSI_STATUS_NORMAL;
} }
CurrentHomeMachineState = E_GTS_HOME_ING; CurrentHomeMachineState = E_GTS_HOME_ING;
//回原点前清除位置清零 //回原点前清除位置清零
for (short i = 1; i < 5; i++) for (short i = 1; i < 5; i++)
{ {
m_RStatus = d2410_set_position(i - 1, 0); m_RStatus = d2410_set_position(i - 1, 0);
m_RStatus = d2410_set_encoder(i - 1, 0); m_RStatus = d2410_set_encoder(i - 1, 0);
} }
Sleep(10); Sleep(10);
//记录运行前的坐标位置,用于回家后还原到该位置 //记录运行前的坐标位置,用于回家后还原到该位置
long EncPosMove[5] = { 0 };//运行前的位置 long EncPosMove[5] = { 0 };//运行前的位置
//各轴先跑到限位的一边 //各轴先跑到限位的一边
g_pLogger->SendAndFlushWithTime(L"[HomeMachine] Go Homing Start Run Limit\n"); g_pLogger->SendAndFlushWithTime(L"[HomeMachine] Go Homing Start Run Limit\n");
if (HSI_STATUS_FAILED == HomeJog(0, 1, true)) if (HSI_STATUS_FAILED == HomeJog(0, 1, true))
{ {
@@ -324,7 +324,7 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed)
CurrentHomeMachineState = E_GTS_HOME_NONE; CurrentHomeMachineState = E_GTS_HOME_NONE;
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
//开始回原点,从限位开始返回找LTC信号 //开始回原点,从限位开始返回找LTC信号
g_pLogger->SendAndFlushWithTime(L"[HomeMachine] HomeFindLTC Go Homing Start Find LTC Signal\n"); g_pLogger->SendAndFlushWithTime(L"[HomeMachine] HomeFindLTC Go Homing Start Find LTC Signal\n");
if (HSI_STATUS_FAILED == HomeFindLTC()) if (HSI_STATUS_FAILED == HomeFindLTC())
{ {
@@ -367,7 +367,7 @@ HSI_STATUS HSI_Motion::HomeJog(short AxisNumber, short Dir, bool Wait)
if (m_Home_Machine_Axis[i] == 1) if (m_Home_Machine_Axis[i] == 1)
{ {
m_Thread_State = HSI_THREAD_PAUSED; m_Thread_State = HSI_THREAD_PAUSED;
//第二个参数表示禁用软限位功能 //第二个参数表示禁用软限位功能
m_RStatus = d2410_config_softlimit(i - 1, 0, 0, 0, 0, 0); m_RStatus = d2410_config_softlimit(i - 1, 0, 0, 0, 0, 0);
m_RStatus += d2410_set_st_profile(i - 1, 5 * 1000, fabs(m_Home_Speed_High[i]) * 1000, m_Home_Acc_Time_High[i], m_Home_Acc_Time_High[i], 20, 0); m_RStatus += d2410_set_st_profile(i - 1, 5 * 1000, fabs(m_Home_Speed_High[i]) * 1000, m_Home_Acc_Time_High[i], m_Home_Acc_Time_High[i], 20, 0);
if (i == 3) if (i == 3)
@@ -400,7 +400,7 @@ HSI_STATUS HSI_Motion::HomeJog(short AxisNumber, short Dir, bool Wait)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "回家超时+!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "回家超时+!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
@@ -424,16 +424,16 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
{ {
g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] In\n"); g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] In\n");
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志 m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
m_RStatus = d2410_config_latch_mode(CARDNO, 0);//0:单轴锁存 14轴锁存 m_RStatus = d2410_config_latch_mode(CARDNO, 0);//0:单轴锁存 14轴锁存
for (short i = 1; i < 5; i++) for (short i = 1; i < 5; i++)
{ {
if (m_Home_Machine_Axis[i] == 1) if (m_Home_Machine_Axis[i] == 1)
{ {
//第二个参数表示禁用软限位功能 //第二个参数表示禁用软限位功能
m_RStatus = d2410_config_softlimit(i - 1, 0, 0, 0, 0, 0); m_RStatus = d2410_config_softlimit(i - 1, 0, 0, 0, 0, 0);
m_RStatus += d2410_set_st_profile(i - 1, 5 * 1000, fabs(m_Home_Speed_Low[i]) * 1000, m_Home_Acc_Time_Low[i], m_Home_Acc_Time_Low[i], 20, 0); m_RStatus += d2410_set_st_profile(i - 1, 5 * 1000, fabs(m_Home_Speed_Low[i]) * 1000, m_Home_Acc_Time_Low[i], m_Home_Acc_Time_Low[i], 20, 0);
if (i == 3)//不能使用JOG模式,因为要运动过程中改变位置回到锁存的位置,所以要用点位运动 if (i == 3)//不能使用JOG模式,因为要运动过程中改变位置回到锁存的位置,所以要用点位运动
{ {
m_RStatus = d2410_s_pmove(i - 1, (long)PMOVE_N, 1); m_RStatus = d2410_s_pmove(i - 1, (long)PMOVE_N, 1);
g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] d2410_s_pmove m_RStatus = %d\n", m_RStatus); g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] d2410_s_pmove m_RStatus = %d\n", m_RStatus);
@@ -447,7 +447,7 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
} }
long DoneStatus[5] = { 1, 1, 1, 1, 1 }; long DoneStatus[5] = { 1, 1, 1, 1, 1 };
long LatchPos[5] = { 0 };//锁存的位置 long LatchPos[5] = { 0 };//锁存的位置
long EncPos = 0; long EncPos = 0;
long PrfPos = 0; long PrfPos = 0;
long temp[5] = { 0 }; long temp[5] = { 0 };
@@ -475,8 +475,8 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
LTCStatus = d2410_get_latch_flag(CARDNO); LTCStatus = d2410_get_latch_flag(CARDNO);
if (((LTCStatus >> (7 + i)) & 1) == 1) if (((LTCStatus >> (7 + i)) & 1) == 1)
{ {
//找到LTC后,偏移一段距离 //找到LTC后,偏移一段距离
//if (i==3)//接线有误,只有绝对位置值,当规划位置和实际位置的方向不一致时,就会失败 //if (i==3)//接线有误,只有绝对位置值,当规划位置和实际位置的方向不一致时,就会失败
//{ //{
// m_RStatus = d2410_reset_target_position(i - 1, LatchPos[i]*-1); // m_RStatus = d2410_reset_target_position(i - 1, LatchPos[i]*-1);
//} //}
@@ -487,14 +487,14 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
{ {
g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] %d Axis EncPos and PrfPos direction is different\n", i); g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] %d Axis EncPos and PrfPos direction is different\n", i);
CurrentHomeMachineState = E_GTS_HOME_NONE; CurrentHomeMachineState = E_GTS_HOME_NONE;
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志 m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
AbortMotion(); AbortMotion();
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
char messageAlarmDis[100] = ""; char messageAlarmDis[100] = "";
_itoa_s(i, messageAlarmDis, 30, 10); _itoa_s(i, messageAlarmDis, 30, 10);
strcat_s(messageAlarmDis, 100, " 实际位置和规划位置方向不一致\n"); strcat_s(messageAlarmDis, 100, " 实际位置和规划位置方向不一致\n");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarmDis); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarmDis);
EventCallback(sEvenProp); EventCallback(sEvenProp);
} }
@@ -514,7 +514,7 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] Axis = %d, No Find LTC Signal\n", i); g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] Axis = %d, No Find LTC Signal\n", i);
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志 m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
AbortMotion(); AbortMotion();
CurrentHomeMachineState = E_GTS_HOME_NONE; CurrentHomeMachineState = E_GTS_HOME_NONE;
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
@@ -522,7 +522,7 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
char messageAlarm[100] = ""; char messageAlarm[100] = "";
_itoa_s(i, messageAlarm, 30, 10); _itoa_s(i, messageAlarm, 30, 10);
strcat_s(messageAlarm, 100, " 轴没有找到原点LTC信号!"); strcat_s(messageAlarm, 100, " 轴没有找到原点LTC信号!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp); EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED; rStatus = HSI_STATUS_FAILED;
@@ -533,11 +533,11 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
{ {
g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] Go Hme Timeout- HSI_STATUS_FAILED\n"); g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] Go Hme Timeout- HSI_STATUS_FAILED\n");
AbortMotion(); AbortMotion();
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志 m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "回家超时-"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "回家超时-");
EventCallback(sEvenProp); EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED; rStatus = HSI_STATUS_FAILED;
} }
@@ -575,12 +575,12 @@ HSI_STATUS HSI_Motion::IsHomed(bool &bHomed)
if (g_pHSI_Motion) if (g_pHSI_Motion)
{ {
g_pLogger->SendAndFlushWithTime(L"[IsHomed] In\n"); g_pLogger->SendAndFlushWithTime(L"[IsHomed] In\n");
long EncPos[5] = { 0 };//运行前的位置 long EncPos[5] = { 0 };//运行前的位置
long PrfPos[5] = { 0 };//读取规划位置 long PrfPos[5] = { 0 };//读取规划位置
short HomedFlag[5] = { 0 }; short HomedFlag[5] = { 0 };
int HomedStatus = 0; int HomedStatus = 0;
int Count = 0; int Count = 0;
if (bHomed == true)//定位是增大判断精度 if (bHomed == true)//定位是增大判断精度
{ {
Count = 1000; Count = 1000;
} }
@@ -593,7 +593,7 @@ HSI_STATUS HSI_Motion::IsHomed(bool &bHomed)
return HSI_STATUS_NORMAL; return HSI_STATUS_NORMAL;
} }
//采用规划位置和实际位置脉冲进行比较,判断是否回家 //采用规划位置和实际位置脉冲进行比较,判断是否回家
for (short i = 1; i < 5; i++) for (short i = 1; i < 5; i++)
{ {
EncPos[i] = d2410_get_encoder(i - 1); EncPos[i] = d2410_get_encoder(i - 1);
@@ -617,7 +617,7 @@ HSI_STATUS HSI_Motion::IsHomed(bool &bHomed)
} }
} }
//采用实际位置和关闭软件记录的位置比较,判断是否回家 //采用实际位置和关闭软件记录的位置比较,判断是否回家
if (m_IsHomeEncPos == 1) if (m_IsHomeEncPos == 1)
{ {
g_pLogger->SendAndFlushWithTime(L"[IsHomed] Close Software And Remember Compare Enable\n"); g_pLogger->SendAndFlushWithTime(L"[IsHomed] Close Software And Remember Compare Enable\n");
@@ -632,7 +632,7 @@ HSI_STATUS HSI_Motion::IsHomed(bool &bHomed)
return HSI_STATUS_NORMAL; return HSI_STATUS_NORMAL;
} }
} }
//判断回家捕获的状态 //判断回家捕获的状态
for (int i = 1; i < 5; i++) for (int i = 1; i < 5; i++)
{ {
HomedStatus = d2410_get_latch_flag(CARDNO); HomedStatus = d2410_get_latch_flag(CARDNO);
@@ -707,7 +707,7 @@ HSI_STATUS HSI_Motion::ZeroPos(bool bZeroPos)
m_RStatus = d2410_set_encoder(AXIS_Y, 0); m_RStatus = d2410_set_encoder(AXIS_Y, 0);
m_RStatus = d2410_set_encoder(AXIS_Z, 0); m_RStatus = d2410_set_encoder(AXIS_Z, 0);
m_RStatus = d2410_set_encoder(AXIS_A, 0); m_RStatus = d2410_set_encoder(AXIS_A, 0);
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志 m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
CurrentHomeMachineState = E_GTS_HOME_NONE; CurrentHomeMachineState = E_GTS_HOME_NONE;
} }
else else
@@ -738,7 +738,7 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed)
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
char messageAlarm[100]; char messageAlarm[100];
_itoa_s(AxisNumber + 1, messageAlarm, 30, 10); _itoa_s(AxisNumber + 1, messageAlarm, 30, 10);
strcat_s(messageAlarm, 100, "轴驱动器报警_Jog"); strcat_s(messageAlarm, 100, "轴驱动器报警_Jog");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
@@ -749,7 +749,7 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed)
double JogSpeed(1.0); double JogSpeed(1.0);
double StartV(1.0); double StartV(1.0);
JogSpeed = SpeedPercent(Speed, StartV, AccTime, DecTime); JogSpeed = SpeedPercent(Speed, StartV, AccTime, DecTime);
WORD JOGDir = 1;//正负表方向,1正方向,-1负方向 WORD JOGDir = 1;//正负表方向,1正方向,-1负方向
JOGDir = Speed > 0 ? 1 : 0; JOGDir = Speed > 0 ? 1 : 0;
if (JogSpeed > 600) if (JogSpeed > 600)
{ {
@@ -757,13 +757,13 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed)
} }
if (CurrentHomeMachineState == E_GTS_HOME_FINISHED) if (CurrentHomeMachineState == E_GTS_HOME_FINISHED)
{ {
//第二个参数表示启用软限位功能 //第二个参数表示启用软限位功能
m_RStatus = d2410_config_softlimit(AxisNumber, 1, 0, 0, (long)(m_N_Work_Limit[IndexPara] / m_Resolution[IndexPara]), (long)(m_P_Work_Limit[IndexPara] / m_Resolution[IndexPara])); m_RStatus = d2410_config_softlimit(AxisNumber, 1, 0, 0, (long)(m_N_Work_Limit[IndexPara] / m_Resolution[IndexPara]), (long)(m_P_Work_Limit[IndexPara] / m_Resolution[IndexPara]));
g_pLogger->SendAndFlushWithTime(L"[Jog] d2410_config_softlimit Enable Softlimit m_RStatus = %d\n", m_RStatus); g_pLogger->SendAndFlushWithTime(L"[Jog] d2410_config_softlimit Enable Softlimit m_RStatus = %d\n", m_RStatus);
} }
else else
{ {
//第二个参数表示禁用软限位功能 //第二个参数表示禁用软限位功能
m_RStatus = d2410_config_softlimit(AxisNumber, 0, 0, 0, 0, 0); m_RStatus = d2410_config_softlimit(AxisNumber, 0, 0, 0, 0, 0);
g_pLogger->SendAndFlushWithTime(L"[Jog] d2410_config_softlimit No Enable Softlimit m_RStatus = %d\n", m_RStatus); g_pLogger->SendAndFlushWithTime(L"[Jog] d2410_config_softlimit No Enable Softlimit m_RStatus = %d\n", m_RStatus);
} }
@@ -860,13 +860,13 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] In\n"); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] In\n");
if (CurrentMotionState != E_SO7_MOTION_MOVETO) if (CurrentMotionState != E_SO7_MOTION_MOVETO)
{ {
//定位前判断是否驱动报警 //定位前判断是否驱动报警
if (HSI_STATUS_FAILED == DriverAlarmStatus()) if (HSI_STATUS_FAILED == DriverAlarmStatus())
{ {
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] DriverAlarmStatus HSI_STATUS_FAILED\n"); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] DriverAlarmStatus HSI_STATUS_FAILED\n");
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
//判断急停是否触发 //判断急停是否触发
bool bEmged(false); bool bEmged(false);
IsEmergented(bEmged); IsEmergented(bEmged);
if (bEmged == true) if (bEmged == true)
@@ -876,12 +876,12 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
//定位前判断是否已经回家 //定位前判断是否已经回家
bool home(true); bool home(true);
IsHomed(home); IsHomed(home);
if (false == home) if (false == home)
@@ -891,7 +891,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "没有回家,请回家之后再试!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "没有回家,请回家之后再试!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
@@ -917,7 +917,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
m_PosThread[3] = PositionZ; m_PosThread[3] = PositionZ;
m_PosThread[4] = m_PositionA; m_PosThread[4] = m_PositionA;
} }
else if (m_CrdAxis == 2)//表示使用2轴插补 else if (m_CrdAxis == 2)//表示使用2轴插补
{ {
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] xy Axis Crd Run\n"); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] xy Axis Crd Run\n");
LimitOver(HSI_MOTION_AXIS_X, PositionX); LimitOver(HSI_MOTION_AXIS_X, PositionX);
@@ -953,17 +953,17 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
WORD AxisCrd[3] = { 0, 1, 2 }; WORD AxisCrd[3] = { 0, 1, 2 };
g_IsClose = false; g_IsClose = false;
m_RStatus = d2410_set_vector_profile(0, m_SetPotion_Speed[1] * 1000, m_SetPotion_Acc_Time[1], m_SetPotion_Acc_Time[1]); m_RStatus = d2410_set_vector_profile(0, m_SetPotion_Speed[1] * 1000, m_SetPotion_Acc_Time[1], m_SetPotion_Acc_Time[1]);
if (m_AxisTypes == 0xf || m_CrdAxis == 4)//表示使用xyza轴插补 if (m_AxisTypes == 0xf || m_CrdAxis == 4)//表示使用xyza轴插补
{ {
m_RStatus = d2410_t_line4(CARDNO, (long)PositionX, (long)PositionY, (long)PositionZ, (long)m_PositionA, 1); m_RStatus = d2410_t_line4(CARDNO, (long)PositionX, (long)PositionY, (long)PositionZ, (long)m_PositionA, 1);
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] xyza Crd run single point, m_RStatus = %d\n", m_RStatus); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] xyza Crd run single point, m_RStatus = %d\n", m_RStatus);
} }
else if (m_CrdAxis == 2)//表示使用xy轴插补 else if (m_CrdAxis == 2)//表示使用xy轴插补
{ {
m_RStatus = d2410_t_line2(AXIS_X, (long)PositionX, AXIS_Y, (long)PositionY, 1); m_RStatus = d2410_t_line2(AXIS_X, (long)PositionX, AXIS_Y, (long)PositionY, 1);
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] xy Crd run single point, m_RStatus = %d\n", m_RStatus); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] xy Crd run single point, m_RStatus = %d\n", m_RStatus);
} }
else if (m_CrdAxis == 3)//表示使用xyz轴插补 else if (m_CrdAxis == 3)//表示使用xyz轴插补
{ {
m_RStatus = d2410_t_line3(AxisCrd, (long)PositionX, (long)PositionY, (long)PositionZ, 1); m_RStatus = d2410_t_line3(AxisCrd, (long)PositionX, (long)PositionY, (long)PositionZ, 1);
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] xyz Crd run single point, m_RStatus = %d\n", m_RStatus); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] xyz Crd run single point, m_RStatus = %d\n", m_RStatus);
@@ -984,7 +984,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
//ProPulse[4] = m_PosThread[4] / m_Resolution[4]; //ProPulse[4] = m_PosThread[4] / m_Resolution[4];
//m_pGT_GetEncPos(1, &EncPos[1], 4, NULL); //m_pGT_GetEncPos(1, &EncPos[1], 4, NULL);
//int i = 0; //int i = 0;
//while (i < m_SetPotion_Count[1])//到位次数判断 //while (i < m_SetPotion_Count[1])//到位次数判断
//{ //{
// m_pGT_GetEncPos(1, &EncPos[1], 4, NULL); // m_pGT_GetEncPos(1, &EncPos[1], 4, NULL);
// if (m_FlyRadius == 1000) // if (m_FlyRadius == 1000)
@@ -1002,7 +1002,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
// { // {
// i++; // i++;
// } // }
// else if (count > m_PrecisionTime[1] || g_IsClose == true) //超时退出 // else if (count > m_PrecisionTime[1] || g_IsClose == true) //超时退出
// { // {
// if (g_IsClose == false) // if (g_IsClose == false)
// { // {
@@ -1011,7 +1011,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
// sEvenProp.EventType = HSI_EVENT_ERROR; // sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION; // sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; // sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Wait_XYZA定位超时!"); // strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Wait_XYZA定位超时!");
// EventCallback(sEvenProp); // EventCallback(sEvenProp);
// } // }
// if (g_IsClose == true) // if (g_IsClose == true)
@@ -1066,7 +1066,7 @@ HSI_STATUS HSI_Motion::SetPositionXyza(UINT AxisTypes, double PositionX, double
{ {
m_PositionA = PositionA; m_PositionA = PositionA;
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyza] In\n"); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyza] In\n");
//AxisTypes = 0xf,表示4轴做插补运动 //AxisTypes = 0xf,表示4轴做插补运动
rStatus = SetPositionXyz(AxisTypes, PositionX, PositionY, PositionZ, eType, dFlyRadius); rStatus = SetPositionXyz(AxisTypes, PositionX, PositionY, PositionZ, eType, dFlyRadius);
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyza] Out\n"); g_pLogger->SendAndFlushWithTime(L"[SetPositionXyza] Out\n");
} }
@@ -1099,13 +1099,13 @@ HSI_STATUS HSI_Motion::Load_Motion_Inifile(CString DMCIniFile)
USES_CONVERSION; USES_CONVERSION;
CString temp = ""; CString temp = "";
CString axisNum[5] = { L"0", L"1", L"2", L"3", L"4" }; CString axisNum[5] = { L"0", L"1", L"2", L"3", L"4" };
//判断Log目录是否存在,不存在就创建 //判断Log目录是否存在,不存在就创建
if (CreateDirectory(m_AppPath + "\\Log", NULL)) if (CreateDirectory(m_AppPath + "\\Log", NULL))
{ {
g_pLogger->SendAndFlushWithTime(L"[Load_Motion_Inifile] Create Log Directory\n"); g_pLogger->SendAndFlushWithTime(L"[Load_Motion_Inifile] Create Log Directory\n");
CreateDirectory(m_AppPath + "\\Log", NULL); CreateDirectory(m_AppPath + "\\Log", NULL);
} }
//判断是否存在该文件 //判断是否存在该文件
if (GetFileAttributes(DMCIniFile) == -1) if (GetFileAttributes(DMCIniFile) == -1)
{ {
g_pLogger->SendAndFlushWithTime(L"[Load_Motion_Inifile] no find the file\n"); g_pLogger->SendAndFlushWithTime(L"[Load_Motion_Inifile] no find the file\n");
@@ -1113,7 +1113,7 @@ HSI_STATUS HSI_Motion::Load_Motion_Inifile(CString DMCIniFile)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DMC2410_Motion.ini文件不存在!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DMC2410_Motion.ini文件不存在!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
@@ -1184,7 +1184,7 @@ HSI_STATUS HSI_Motion::Load_Config_Inifile(CString ConfigFile)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DMC2410_Config.ini文件不存在!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DMC2410_Config.ini文件不存在!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
@@ -1292,7 +1292,7 @@ void HSI_Motion::UpdateMotionState()
int i = 0; int i = 0;
long TimeCount = m_PrecisionTime[1] * 100; long TimeCount = m_PrecisionTime[1] * 100;
while (i <= m_SetPotion_Count[1])//到位次数判断 while (i <= m_SetPotion_Count[1])//到位次数判断
{ {
EncPos[1] = d2410_get_encoder(AXIS_X); EncPos[1] = d2410_get_encoder(AXIS_X);
EncPos[2] = d2410_get_encoder(AXIS_Y); EncPos[2] = d2410_get_encoder(AXIS_Y);
@@ -1314,7 +1314,7 @@ void HSI_Motion::UpdateMotionState()
{ {
i++; i++;
} }
else if (Count > TimeCount || g_IsClose == true) //超时退出 else if (Count > TimeCount || g_IsClose == true) //超时退出
{ {
if (g_IsClose == false) if (g_IsClose == false)
{ {
@@ -1332,7 +1332,7 @@ void HSI_Motion::UpdateMotionState()
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Nowait_XYZA定位超时!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Nowait_XYZA定位超时!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
} }
else else
@@ -1409,7 +1409,7 @@ void HSI_Motion::UpdateMotionStateIO()
while (m_Thread_StateIO == HSI_THREAD_RUNNING) while (m_Thread_StateIO == HSI_THREAD_RUNNING)
{ {
Status = d2410_read_inport(CARDNO); Status = d2410_read_inport(CARDNO);
//1个脚踏开关 //1个脚踏开关
if (m_IsFootSwitch == 1) if (m_IsFootSwitch == 1)
{ {
if ((Status & m_FootSwitchInport) == 0 && FootSwitchStatus == false) if ((Status & m_FootSwitchInport) == 0 && FootSwitchStatus == false)
@@ -1427,7 +1427,7 @@ void HSI_Motion::UpdateMotionStateIO()
EventCallback(sEvenProp); EventCallback(sEvenProp);
} }
} }
//急停功能 //急停功能
if (m_IsQuickStop == 1) if (m_IsQuickStop == 1)
{ {
EmgStatus[1] = d2410_get_rsts(AXIS_X); EmgStatus[1] = d2410_get_rsts(AXIS_X);
@@ -1437,19 +1437,19 @@ void HSI_Motion::UpdateMotionStateIO()
if (((EmgStatus[1] >> 7 & 1) == 1 || (EmgStatus[2] >> 7 & 1) == 1 || (EmgStatus[3] >> 7 & 1) == 1 || (EmgStatus[4] >> 7 & 1) == 1) && QuickStopFlag == false) if (((EmgStatus[1] >> 7 & 1) == 1 || (EmgStatus[2] >> 7 & 1) == 1 || (EmgStatus[3] >> 7 & 1) == 1 || (EmgStatus[4] >> 7 & 1) == 1) && QuickStopFlag == false)
{ {
QuickStopFlag = true; QuickStopFlag = true;
m_RStatus = d2410_write_outbit(CARDNO, (WORD)m_QuickStopOutPort, 1);//1为打开输出端口 m_RStatus = d2410_write_outbit(CARDNO, (WORD)m_QuickStopOutPort, 1);//1为打开输出端口
g_pLogger->SendAndFlushWithTime(L"[UpdateMotionStateIO] QuickStop Trigger\n"); g_pLogger->SendAndFlushWithTime(L"[UpdateMotionStateIO] QuickStop Trigger\n");
sEvenProp.Init(); sEvenProp.Init();
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
} }
if (QuickStopFlag == true) if (QuickStopFlag == true)
{ {
QuickStopFlag = false; QuickStopFlag = false;
m_RStatus = d2410_write_outbit(CARDNO, (WORD)m_QuickStopOutPort, 0);//1为打开输出端口 m_RStatus = d2410_write_outbit(CARDNO, (WORD)m_QuickStopOutPort, 0);//1为打开输出端口
} }
} }
@@ -1476,7 +1476,7 @@ void HSI_Motion::DoEvents()
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DoEvents_异常"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DoEvents_异常");
EventCallback(sEvenProp); EventCallback(sEvenProp);
} }
if (g_IsClose) if (g_IsClose)
@@ -1507,23 +1507,23 @@ HSI_STATUS HSI_Motion::DriverAlarmStatus()
char messageAlarm[100] = ""; char messageAlarm[100] = "";
if ((AlarmStatus[1] >> 11 & 1) == 1) if ((AlarmStatus[1] >> 11 & 1) == 1)
{ {
strcat_s(messageAlarm, 30, "1、"); strcat_s(messageAlarm, 30, "1、");
} }
if ((AlarmStatus[2] >> 11 & 1) == 1) if ((AlarmStatus[2] >> 11 & 1) == 1)
{ {
strcat_s(messageAlarm, 30, "2、"); strcat_s(messageAlarm, 30, "2、");
} }
if ((AlarmStatus[3] >> 11 & 1) == 1) if ((AlarmStatus[3] >> 11 & 1) == 1)
{ {
strcat_s(messageAlarm, 30, "3、"); strcat_s(messageAlarm, 30, "3、");
} }
if ((AlarmStatus[4] >> 11 & 1) == 1) if ((AlarmStatus[4] >> 11 & 1) == 1)
{ {
strcat_s(messageAlarm, 30, "4、"); strcat_s(messageAlarm, 30, "4、");
} }
CString temp(messageAlarm); CString temp(messageAlarm);
g_pLogger->SendAndFlushWithTime(temp + L" axis drive alarm!\n"); g_pLogger->SendAndFlushWithTime(temp + L" axis drive alarm!\n");
strcat_s(messageAlarm, 100, "轴驱动器报警!"); strcat_s(messageAlarm, 100, "轴驱动器报警!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp); EventCallback(sEvenProp);
if (sEvenProp.EventCallbackID == HSI_EVENT_RESPONSE_CANCEL) if (sEvenProp.EventCallbackID == HSI_EVENT_RESPONSE_CANCEL)
@@ -1531,7 +1531,7 @@ HSI_STATUS HSI_Motion::DriverAlarmStatus()
g_pLogger->SendAndFlushWithTime(L"[DriverAlarmStatus] CANCEL"); g_pLogger->SendAndFlushWithTime(L"[DriverAlarmStatus] CANCEL");
return HSI_STATUS_NORMAL; return HSI_STATUS_NORMAL;
} }
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志 m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
g_pLogger->SendAndFlushWithTime(L"[DriverAlarmStatus] Out\n"); g_pLogger->SendAndFlushWithTime(L"[DriverAlarmStatus] Out\n");
@@ -1581,7 +1581,7 @@ HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status)
_Status |= temp; _Status |= temp;
} }
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出 if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出
{ {
_Status = d2410_read_outport(CARDNO); _Status = d2410_read_outport(CARDNO);
_Status &= 0x0000ffff; _Status &= 0x0000ffff;
@@ -1600,7 +1600,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
auto rStatus = HSI_STATUS_NORMAL; auto rStatus = HSI_STATUS_NORMAL;
if (g_pHSI_Motion) if (g_pHSI_Motion)
{ {
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //设置通用输出 if (IOChannel == HSI_MOTION_OUTPUT_CH1) //设置通用输出
{ {
_Status &= 0x0000ffff; _Status &= 0x0000ffff;
m_RStatus = d2410_write_outport(CARDNO, _Status); m_RStatus = d2410_write_outport(CARDNO, _Status);
@@ -1664,7 +1664,7 @@ HSI_STATUS HSI_Motion::DCCScanSetData(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType
auto rStatus = HSI_STATUS_NORMAL; auto rStatus = HSI_STATUS_NORMAL;
if (g_pHSI_Motion) if (g_pHSI_Motion)
{ {
//触发的位置为相对位置,用法一般是移动到起点位置,再开始设置触发位置(相对位置),最终设置终点位置 //触发的位置为相对位置,用法一般是移动到起点位置,再开始设置触发位置(相对位置),最终设置终点位置
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] In\n"); g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] In\n");
if (lTrigNumber > 8) if (lTrigNumber > 8)
{ {
@@ -1673,12 +1673,12 @@ HSI_STATUS HSI_Motion::DCCScanSetData(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "每个元素触发的个数不能超过8个"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "每个元素触发的个数不能超过8个");
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
//测试使用 //测试使用
if (eType == HSI_SCAN_MOTION_MANUAL_TEST)//手动触发 if (eType == HSI_SCAN_MOTION_MANUAL_TEST)//手动触发
{ {
long runned = d2410_compare_get_points_runned_Extern(CARDNO, 0); long runned = d2410_compare_get_points_runned_Extern(CARDNO, 0);
m_RStatus = d2410_compare_config_Extern(CARDNO, 0, 1, 0, 0); m_RStatus = d2410_compare_config_Extern(CARDNO, 0, 1, 0, 0);
@@ -1697,23 +1697,23 @@ HSI_STATUS HSI_Motion::DCCScanSetData(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType
//手动触发时,只针对CMP1起作用,OUT21,把OUT21当做普通IO,即禁用位置比较功能,才可以手动触发 //手动触发时,只针对CMP1起作用,OUT21,把OUT21当做普通IO,即禁用位置比较功能,才可以手动触发
m_RStatus = d2410_compare_config_Extern(CARDNO, 0, 0, 0, 1); m_RStatus = d2410_compare_config_Extern(CARDNO, 0, 0, 0, 1);
m_RStatus = d2410_write_outbit(CARDNO, 21, 1); m_RStatus = d2410_write_outbit(CARDNO, 21, 1);
Sleep(m_ManualTriggerHold); Sleep(m_ManualTriggerHold);
m_RStatus = d2410_write_outbit(CARDNO, 21, 0); m_RStatus = d2410_write_outbit(CARDNO, 21, 0);
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] ManualTrigger m_RStatus = %d, ManualTriggerHold = %dms\n", m_RStatus, m_ManualTriggerHold); g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] ManualTrigger m_RStatus = %d, ManualTriggerHold = %dms\n", m_RStatus, m_ManualTriggerHold);
} }
if (eType == HSI_SCAN_MOTION_SPEC_LOCA)//线性不等间隔 if (eType == HSI_SCAN_MOTION_SPEC_LOCA)//线性不等间隔
{ {
WORD AxisNumber = AxisConvert(AxisTypes); WORD AxisNumber = AxisConvert(AxisTypes);
long StartPos = d2410_get_encoder(AxisNumber); long StartPos = d2410_get_encoder(AxisNumber);
//功能:查询可以加入的比较点数量 //功能:查询可以加入的比较点数量
long Remainder = d2410_compare_get_points_remained_Extern(CARDNO, 0); long Remainder = d2410_compare_get_points_remained_Extern(CARDNO, 0);
//long num2 = d2410_compare_get_points_remained_Extern(CARDNO, 1); //long num2 = d2410_compare_get_points_remained_Extern(CARDNO, 1);
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] queue 0 Remainder number = %d\n", Remainder); g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] queue 0 Remainder number = %d\n", Remainder);
m_RStatus = d2410_compare_clear_points_Extern(CARDNO, 0); m_RStatus = d2410_compare_clear_points_Extern(CARDNO, 0);
//设置为低速比较;卡号,队列,启用,轴号,编码器绝对位置 //设置为低速比较;卡号,队列,启用,轴号,编码器绝对位置
m_RStatus = d2410_compare_config_Extern(CARDNO, 0, 1, AxisNumber, 1); m_RStatus = d2410_compare_config_Extern(CARDNO, 0, 1, AxisNumber, 1);
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] d2410_compare_config_Extern m_RStatus = %d\n", m_RStatus); g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] d2410_compare_config_Extern m_RStatus = %d\n", m_RStatus);
long tempbuf[100]; long tempbuf[100];
@@ -1734,7 +1734,7 @@ HSI_STATUS HSI_Motion::DCCScanSetData(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType
dir = StartPos > dTrigDis[0] ? 1 : 0; dir = StartPos > dTrigDis[0] ? 1 : 0;
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] dir = %d,StartPos = %d,StartPos(mm) = %.4f\n", dir, StartPos, StartPos * m_Resolution[AxisNumber + 1]); g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] dir = %d,StartPos = %d,StartPos(mm) = %.4f\n", dir, StartPos, StartPos * m_Resolution[AxisNumber + 1]);
tempbuf[0] = StartPos + (long)dTrigDis[0]; tempbuf[0] = StartPos + (long)dTrigDis[0];
//添加高速位置比较器;卡号,队列0,编码器绝对位置,方向,脉冲宽度模式100us,输出端口号 //添加高速位置比较器;卡号,队列0,编码器绝对位置,方向,脉冲宽度模式100us,输出端口号
m_RStatus = d2410_compare_add_point_Extern(CARDNO, 0, tempbuf[0], dir, (WORD)m_TriggerPulseMode, m_TriggerOutport); m_RStatus = d2410_compare_add_point_Extern(CARDNO, 0, tempbuf[0], dir, (WORD)m_TriggerPulseMode, m_TriggerOutport);
g_pLogger->SendAndFlushWithTime(_T("[DCCScanSetData] d2410_config_CMP_PIN m_RStatus = %d,m_SdkStatus = %s,m_TriggerPulseMode = %d,m_TriggerOutport = %d,tempbuf[0] = %d,tempbuf(mm) = %.4f\n"), m_RStatus, m_SdkStatus[m_RStatus], m_TriggerPulseMode, m_TriggerOutport, tempbuf[0], tempbuf[0] * m_Resolution[AxisNumber + 1]); g_pLogger->SendAndFlushWithTime(_T("[DCCScanSetData] d2410_config_CMP_PIN m_RStatus = %d,m_SdkStatus = %s,m_TriggerPulseMode = %d,m_TriggerOutport = %d,tempbuf[0] = %d,tempbuf(mm) = %.4f\n"), m_RStatus, m_SdkStatus[m_RStatus], m_TriggerPulseMode, m_TriggerOutport, tempbuf[0], tempbuf[0] * m_Resolution[AxisNumber + 1]);
for (UINT i = 1; i < lTrigNumber; i++) for (UINT i = 1; i < lTrigNumber; i++)
@@ -1745,7 +1745,7 @@ HSI_STATUS HSI_Motion::DCCScanSetData(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType
g_pLogger->SendAndFlushWithTime(_T("[DCCScanSetData] d2410_config_CMP_PIN m_RStatus = %d,m_SdkStatus = %s,tempbuf[%d] = %d,tempbuf(mm) = %.4f\n"), m_RStatus, m_SdkStatus[m_RStatus], i, tempbuf[i], tempbuf[i] * m_Resolution[AxisNumber + 1]); g_pLogger->SendAndFlushWithTime(_T("[DCCScanSetData] d2410_config_CMP_PIN m_RStatus = %d,m_SdkStatus = %s,tempbuf[%d] = %d,tempbuf(mm) = %.4f\n"), m_RStatus, m_SdkStatus[m_RStatus], i, tempbuf[i], tempbuf[i] * m_Resolution[AxisNumber + 1]);
} }
} }
if (eType == HSI_SCAN_MOTION_EQ_DIS)//等间隔 if (eType == HSI_SCAN_MOTION_EQ_DIS)//等间隔
{ {
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] no interval mode\n"); g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] no interval mode\n");
rStatus = HSI_STATUS_FAILED; rStatus = HSI_STATUS_FAILED;
@@ -2059,7 +2059,7 @@ double HSI_Motion::LimitOver(UINT AxisTypes, double &LimitPos)
{ {
switch (AxisNumber) switch (AxisNumber)
{ {
case 0: //轴1 case 0: //轴1
{ {
if (LimitPos > 0) if (LimitPos > 0)
{ {
@@ -1,4 +1,4 @@
// HSI_Illumination.cpp : 定义 DLL 的初始化例程。 // HSI_Illumination.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
#include "..\..\..\SevenOcean\SO7_Proto.h" #include "..\..\..\SevenOcean\SO7_Proto.h"
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。 // HSI_Motion.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
#include "..\..\..\..\Hsi\HSI.h" #include "..\..\..\..\Hsi\HSI.h"
@@ -15,8 +15,8 @@
#define BUFF_SIZE 16 #define BUFF_SIZE 16
HSI_Motion *g_pHSI_Motion = nullptr; HSI_Motion *g_pHSI_Motion = nullptr;
extern CSO7_Proto* g_pSO7_Proto; extern CSO7_Proto* g_pSO7_Proto;
HANDLE hCom;//串口句柄 HANDLE hCom;//串口句柄
unsigned char SendBuff[BUFF_SIZE];//发送接收缓冲区 unsigned char SendBuff[BUFF_SIZE];//发送接收缓冲区
//=========================================================================== //===========================================================================
HANDLE HSI_Motion::m_Thread_Id = NULL; HANDLE HSI_Motion::m_Thread_Id = NULL;
HANDLE HSI_Motion::m_Thread_Mutex = NULL; HANDLE HSI_Motion::m_Thread_Mutex = NULL;
@@ -62,18 +62,18 @@ int HSI_Motion::Port1616IOInit()
{ {
while (true) while (true)
{ {
for (i = 1; i < 257; i++)//从1到256遍历所有com for (i = 1; i < 257; i++)//从1到256遍历所有com
{ {
char buf[10]; char buf[10];
sprintf_s(buf, "COM%d", i); sprintf_s(buf, "COM%d", i);
CString comName(buf); CString comName(buf);
hCom = CreateFile(comName, hCom = CreateFile(comName,
GENERIC_READ | GENERIC_WRITE, //允许读和写 GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式,串口必须为0 0, //独占方式,串口必须为0
NULL, NULL,
OPEN_EXISTING, //打开而不是创建,串口必须为打开 OPEN_EXISTING, //打开而不是创建,串口必须为打开
0, //同步方式,同步执行时,函数直到操作完成后才返回 0, //同步方式,同步执行时,函数直到操作完成后才返回
NULL);//串口必须为NULL NULL);//串口必须为NULL
if (hCom != (HANDLE)-1) if (hCom != (HANDLE)-1)
{ {
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
@@ -96,7 +96,7 @@ int HSI_Motion::Port1616IOInit()
return 1;//Setting Error!!!! return 1;//Setting Error!!!!
} }
//设置读写超时时间 //设置读写超时时间
COMMTIMEOUTS to; COMMTIMEOUTS to;
@@ -107,8 +107,8 @@ int HSI_Motion::Port1616IOInit()
SetCommTimeouts(hCom, &to); SetCommTimeouts(hCom, &to);
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
//判断COM口是否打开正确 //判断COM口是否打开正确
unsigned char rtn = SendData(0x8000);//15号端口作为测试用 unsigned char rtn = SendData(0x8000);//15号端口作为测试用
if (rtn == 1) if (rtn == 1)
{ {
i++; i++;
@@ -179,7 +179,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "IO串口打开失败!!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "IO串口打开失败!!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
CloseHandle(hCom); CloseHandle(hCom);
g_pSO7_Proto->g_so7_config.m_isOpenIO = 0; g_pSO7_Proto->g_so7_config.m_isOpenIO = 0;
@@ -616,7 +616,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
auto rStatus = HSI_STATUS_NORMAL; auto rStatus = HSI_STATUS_NORMAL;
if (g_pSO7_Proto) if (g_pSO7_Proto)
{ {
if (IOChannel == HSI_MOTION_OUTPUT_CH3) //设置通用输出 if (IOChannel == HSI_MOTION_OUTPUT_CH3) //设置通用输出
{ {
unsigned char rtn = SendData(_Status); unsigned char rtn = SendData(_Status);
if (rtn == 1) if (rtn == 1)
@@ -636,7 +636,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "发送数据失败!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "发送数据失败!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED; rStatus = HSI_STATUS_FAILED;
} }
@@ -1155,7 +1155,7 @@ HSI_STATUS HSI_Motion::IOStep(bool RunSts)
return rStatus; return rStatus;
} }
//串口控制器 //串口控制器
//=========================================================================== //===========================================================================
void HSI_Motion::SetSum(unsigned char *CheckBit) void HSI_Motion::SetSum(unsigned char *CheckBit)
{ {
@@ -1189,25 +1189,25 @@ unsigned char HSI_Motion::CheckSum(unsigned char *CheckBit)
//=========================================================================== //===========================================================================
void HSI_Motion::SetSendBuff(unsigned char Address, unsigned char Command, UINT ComData1, UINT ComData2) void HSI_Motion::SetSendBuff(unsigned char Address, unsigned char Command, UINT ComData1, UINT ComData2)
{ {
SendBuff[0] = 0x00;//固定为00H SendBuff[0] = 0x00;//固定为00H
SendBuff[1] = 0x5A;//固定为5AH=01011010B SendBuff[1] = 0x5A;//固定为5AH=01011010B
SendBuff[2] = 0x61;//十六路为61H SendBuff[2] = 0x61;//十六路为61H
SendBuff[3] = Address;//地址,由板子的短路针决定0 SendBuff[3] = Address;//地址,由板子的短路针决定0
SendBuff[4] = Command;//命令 SendBuff[4] = Command;//命令
SendBuff[5] = (unsigned char)ComData1;//数据Y7..Y0 SendBuff[5] = (unsigned char)ComData1;//数据Y7..Y0
SendBuff[6] = (unsigned char)ComData2;//数据Y15..Y8 SendBuff[6] = (unsigned char)ComData2;//数据Y15..Y8
SendBuff[7] = 0x00;//数据 SendBuff[7] = 0x00;//数据
SendBuff[8] = 0x00;//数据 SendBuff[8] = 0x00;//数据
SendBuff[9] = 0x00;//数据 SendBuff[9] = 0x00;//数据
SendBuff[10] = 0x00;//数据 SendBuff[10] = 0x00;//数据
SendBuff[11] = 0x00;//数据 SendBuff[11] = 0x00;//数据
SendBuff[12] = 0x00;//数据 SendBuff[12] = 0x00;//数据
SendBuff[13] = 0x00;//数据 SendBuff[13] = 0x00;//数据
SendBuff[14] = 0x00;//数据 SendBuff[14] = 0x00;//数据
SendBuff[15] = 0x00;//校验和 SendBuff[15] = 0x00;//校验和
SetSum(SendBuff);//设置校验和 SetSum(SendBuff);//设置校验和
} }
//=========================================================================== //===========================================================================
unsigned char HSI_Motion::SendData(UINT Output) unsigned char HSI_Motion::SendData(UINT Output)
@@ -1221,7 +1221,7 @@ unsigned char HSI_Motion::SendData(UINT Output)
Bit8_15 = Output & 0xff00; Bit8_15 = Output & 0xff00;
Bit8_15 >>= 8; Bit8_15 >>= 8;
SetSendBuff(0, 0x03, Bit0_7, Bit8_15); SetSendBuff(0, 0x03, Bit0_7, Bit8_15);
WriteFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//把16字节发送出去 WriteFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//把16字节发送出去
UINT IsSuccess = 0, temp; UINT IsSuccess = 0, temp;
ReadData(temp, IsSuccess); ReadData(temp, IsSuccess);
if (IsSuccess != Output) if (IsSuccess != Output)
@@ -1238,10 +1238,10 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
{ {
unsigned long Bytes = 0; unsigned long Bytes = 0;
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
SetSendBuff(0, 0x05, 0, 0); //随便发点东西0x06,才能读取数据 SetSendBuff(0, 0x05, 0, 0); //随便发点东西0x06,才能读取数据
WriteFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//把16字节发送出去 WriteFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//把16字节发送出去
SetSendBuff(0, 0x07, 0, 0); SetSendBuff(0, 0x07, 0, 0);
ReadFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//读返回的数据.读超时根据COMMTIMEOUTS to;变量设定 ReadFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//读返回的数据.读超时根据COMMTIMEOUTS to;变量设定
Input = SendBuff[8]; Input = SendBuff[8];
Input <<= 8; Input <<= 8;
Input |= SendBuff[7]; Input |= SendBuff[7];
@@ -1254,7 +1254,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
// sEvenProp.EventType = HSI_EVENT_ERROR; // sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION; // sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; // sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "校验失败!"); // strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "校验失败!");
// EventCallback(sEvenProp); // EventCallback(sEvenProp);
// return 1; // return 1;
//} //}
@@ -1266,7 +1266,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
// sEvenProp.EventType = HSI_EVENT_ERROR; // sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION; // sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; // sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "读取数据失败!"); // strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "读取数据失败!");
// EventCallback(sEvenProp); // EventCallback(sEvenProp);
// return 1; // return 1;
// } // }
@@ -1,4 +1,4 @@
// HSI_Illumination.cpp : 定义 DLL 的初始化例程。 // HSI_Illumination.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
#include "..\..\..\SevenOcean\CMMIO_SERIAL.h" #include "..\..\..\SevenOcean\CMMIO_SERIAL.h"
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。 // HSI_Motion.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
#include "..\logger.h" #include "..\logger.h"
@@ -396,7 +396,7 @@ void HSI_Motion::UpdateMotionStateIO()
sEvenProp.EventType = HSI_EVENT_NOTIFY; sEvenProp.EventType = HSI_EVENT_NOTIFY;
sEvenProp.EventID = HSI_NOTIFY_CLEAR_ITERATIONS; sEvenProp.EventID = HSI_NOTIFY_CLEAR_ITERATIONS;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "PLC停止运行,软件将重置运行信息!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "PLC停止运行,软件将重置运行信息!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
} }
m_iRunningStatus = iSignal1; m_iRunningStatus = iSignal1;
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。 // HSI_Motion.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
#include "..\..\..\..\Hsi\HSI.h" #include "..\..\..\..\Hsi\HSI.h"
@@ -13,8 +13,8 @@
#define BUFF_SIZE 16 #define BUFF_SIZE 16
HANDLE hCom;//串口句柄 HANDLE hCom;//串口句柄
unsigned char SendBuff[BUFF_SIZE];//发送接收缓冲区 unsigned char SendBuff[BUFF_SIZE];//发送接收缓冲区
HSI_Motion *g_pHSI_Motion = nullptr; HSI_Motion *g_pHSI_Motion = nullptr;
//=========================================================================== //===========================================================================
HANDLE HSI_Motion::m_Thread_Id = NULL; HANDLE HSI_Motion::m_Thread_Id = NULL;
@@ -47,18 +47,18 @@ int HSI_Motion::Port1616IOInit()
{ {
while (true) while (true)
{ {
for (i = 1; i < 257; i++)//从1到256遍历所有com for (i = 1; i < 257; i++)//从1到256遍历所有com
{ {
char buf[10]; char buf[10];
sprintf_s(buf, "COM%d", i); sprintf_s(buf, "COM%d", i);
CString comName(buf); CString comName(buf);
hCom = CreateFile(comName, hCom = CreateFile(comName,
GENERIC_READ | GENERIC_WRITE, //允许读和写 GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式,串口必须为0 0, //独占方式,串口必须为0
NULL, NULL,
OPEN_EXISTING, //打开而不是创建,串口必须为打开 OPEN_EXISTING, //打开而不是创建,串口必须为打开
0, //同步方式,同步执行时,函数直到操作完成后才返回 0, //同步方式,同步执行时,函数直到操作完成后才返回
NULL);//串口必须为NULL NULL);//串口必须为NULL
if (hCom != (HANDLE)-1) if (hCom != (HANDLE)-1)
{ {
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
@@ -81,7 +81,7 @@ int HSI_Motion::Port1616IOInit()
return 1;//Setting Error!!!! return 1;//Setting Error!!!!
} }
//设置读写超时时间 //设置读写超时时间
COMMTIMEOUTS to; COMMTIMEOUTS to;
memset(&to, 0, sizeof(to)); memset(&to, 0, sizeof(to));
to.ReadIntervalTimeout = 100; to.ReadIntervalTimeout = 100;
@@ -91,8 +91,8 @@ int HSI_Motion::Port1616IOInit()
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
//判断COM口是否打开正确 //判断COM口是否打开正确
unsigned char rtn = SendData(0x8000);//15号端口作为测试用 unsigned char rtn = SendData(0x8000);//15号端口作为测试用
if (rtn == 1) if (rtn == 1)
{ {
i++; i++;
@@ -135,7 +135,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "串口打开是失败!!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "串口打开是失败!!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
CloseHandle(hCom); CloseHandle(hCom);
isOpen = false; isOpen = false;
@@ -181,25 +181,25 @@ unsigned char HSI_Motion::CheckSum(unsigned char *CheckBit)
//=========================================================================== //===========================================================================
void HSI_Motion::SetSendBuff(unsigned char Address, unsigned char Command, UINT ComData1, UINT ComData2) void HSI_Motion::SetSendBuff(unsigned char Address, unsigned char Command, UINT ComData1, UINT ComData2)
{ {
SendBuff[0] = 0x00;//固定为00H SendBuff[0] = 0x00;//固定为00H
SendBuff[1] = 0x5A;//固定为5AH=01011010B SendBuff[1] = 0x5A;//固定为5AH=01011010B
SendBuff[2] = 0x61;//十六路为61H SendBuff[2] = 0x61;//十六路为61H
SendBuff[3] = Address;//地址,由板子的短路针决定0 SendBuff[3] = Address;//地址,由板子的短路针决定0
SendBuff[4] = Command;//命令 SendBuff[4] = Command;//命令
SendBuff[5] = (unsigned char)ComData1;//数据Y7..Y0 SendBuff[5] = (unsigned char)ComData1;//数据Y7..Y0
SendBuff[6] = (unsigned char)ComData2;//数据Y15..Y8 SendBuff[6] = (unsigned char)ComData2;//数据Y15..Y8
SendBuff[7] = 0x00;//数据 SendBuff[7] = 0x00;//数据
SendBuff[8] = 0x00;//数据 SendBuff[8] = 0x00;//数据
SendBuff[9] = 0x00;//数据 SendBuff[9] = 0x00;//数据
SendBuff[10] = 0x00;//数据 SendBuff[10] = 0x00;//数据
SendBuff[11] = 0x00;//数据 SendBuff[11] = 0x00;//数据
SendBuff[12] = 0x00;//数据 SendBuff[12] = 0x00;//数据
SendBuff[13] = 0x00;//数据 SendBuff[13] = 0x00;//数据
SendBuff[14] = 0x00;//数据 SendBuff[14] = 0x00;//数据
SendBuff[15] = 0x00;//校验和 SendBuff[15] = 0x00;//校验和
SetSum(SendBuff);//设置校验和 SetSum(SendBuff);//设置校验和
} }
//=========================================================================== //===========================================================================
unsigned char HSI_Motion::SendData(UINT Output) unsigned char HSI_Motion::SendData(UINT Output)
@@ -211,7 +211,7 @@ unsigned char HSI_Motion::SendData(UINT Output)
Bit8_15 = Output & 0xff00; Bit8_15 = Output & 0xff00;
Bit8_15 >>= 8; Bit8_15 >>= 8;
SetSendBuff(0, 0x03, Bit0_7, Bit8_15); SetSendBuff(0, 0x03, Bit0_7, Bit8_15);
WriteFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//把16字节发送出去 WriteFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//把16字节发送出去
UINT IsSuccess = 0, temp = 0; UINT IsSuccess = 0, temp = 0;
ReadData(temp,IsSuccess); ReadData(temp,IsSuccess);
IsSuccess = SendBuff[6]; IsSuccess = SendBuff[6];
@@ -229,7 +229,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
unsigned long Bytes = 0; unsigned long Bytes = 0;
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
SetSendBuff(0, 0x07, 0, 0); SetSendBuff(0, 0x07, 0, 0);
ReadFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//读返回的数据.读超时根据COMMTIMEOUTS to;变量设定 ReadFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//读返回的数据.读超时根据COMMTIMEOUTS to;变量设定
Input = SendBuff[8]; Input = SendBuff[8];
Input <<= 8; Input <<= 8;
Input |= SendBuff[7]; Input |= SendBuff[7];
@@ -242,7 +242,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
// sEvenProp.EventType = HSI_EVENT_ERROR; // sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION; // sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; // sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "校验失败!"); // strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "校验失败!");
// EventCallback(sEvenProp); // EventCallback(sEvenProp);
// return 1; // return 1;
//} //}
@@ -254,7 +254,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
// sEvenProp.EventType = HSI_EVENT_ERROR; // sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION; // sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; // sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "读取数据失败!"); // strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "读取数据失败!");
// EventCallback(sEvenProp); // EventCallback(sEvenProp);
// return 1; // return 1;
// } // }
@@ -390,7 +390,7 @@ HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status)
{ {
} }
else if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出 else if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出
{ {
} }
@@ -414,7 +414,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
auto rStatus = HSI_STATUS_NORMAL; auto rStatus = HSI_STATUS_NORMAL;
if (g_pHSI_Motion) if (g_pHSI_Motion)
{ {
if (IOChannel == HSI_MOTION_OUTPUT_CH3) //设置通用输出 if (IOChannel == HSI_MOTION_OUTPUT_CH3) //设置通用输出
{ {
unsigned char rtn = SendData(_Status); unsigned char rtn = SendData(_Status);
if (rtn == 1) if (rtn == 1)
@@ -434,7 +434,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "发送数据失败!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "发送数据失败!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED; rStatus = HSI_STATUS_FAILED;
} }
@@ -1,4 +1,4 @@
// HSI_PORT_1616IO.cpp : 定义 DLL 应用程序的导出函数。 // HSI_PORT_1616IO.cpp : 定义 DLL 应用程序的导出函数。
// //
#include "stdafx.h" #include "stdafx.h"
@@ -1,13 +1,13 @@
// HSI_PORT_1616IO.h : 定义 DLL 应用程序的导出函数。 // HSI_PORT_1616IO.h : 定义 DLL 应用程序的导出函数。
// //
#pragma once #pragma once
#ifndef __AFXWIN_H__ #ifndef __AFXWIN_H__
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件" #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif #endif
#include "resource.h" // 主符号 #include "resource.h" // 主符号
#include <cstring> #include <cstring>
@@ -1,4 +1,4 @@
// HSI_Illumination.cpp : 定义 DLL 的初始化例程。 // HSI_Illumination.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
#include "..\..\..\SevenOcean\CMMIO_SERIAL.h" #include "..\..\..\SevenOcean\CMMIO_SERIAL.h"
@@ -145,7 +145,7 @@ HSI_STATUS HSI_Illumination::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
_itoa_s(m_iSerialComPortA, messageAlarm, 30, 10); _itoa_s(m_iSerialComPortA, messageAlarm, 30, 10);
strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败"); strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp); EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED; rStatus = HSI_STATUS_FAILED;
@@ -167,7 +167,7 @@ HSI_STATUS HSI_Illumination::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
_itoa_s(m_iSerialComPortB, messageAlarm, 30, 10); _itoa_s(m_iSerialComPortB, messageAlarm, 30, 10);
strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败"); strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp); EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED; rStatus = HSI_STATUS_FAILED;
@@ -440,7 +440,7 @@ BOOL HSI_Illumination::SetLampState_So7II(int _NumLamps, int(*_LampsType)[HSI_IL
{ {
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
{ {
//共26盏灯,到[2, 66] //共26盏灯,到[2, 66]
if (i == 4 && j >= 2) if (i == 4 && j >= 2)
{ {
break; break;
@@ -810,7 +810,7 @@ VOID HSI_Illumination::EventCallback(sHSIEventProperties& sEventProp)
} }
//========================光源控制器USB控制================================== //========================光源控制器USB控制==================================
//=========================================================================== //===========================================================================
//bool HSI_Illumination::FindTheHID() //bool HSI_Illumination::FindTheHID()
//{ //{
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。 // HSI_Motion.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
#include "..\..\..\..\Hsi\HSI.h" #include "..\..\..\..\Hsi\HSI.h"
@@ -44,7 +44,7 @@ HSI_Motion::HSI_Motion()
g_IsClose = false; g_IsClose = false;
m_Result = 0; m_Result = 0;
CTime tm = CTime::GetCurrentTime(); CTime tm = CTime::GetCurrentTime();
CString csTime = tm.Format("%Y-%m-%d");//显示年月日 CString csTime = tm.Format("%Y-%m-%d");//显示年月日
CString dir = L"\\Log\\" + csTime += L".LLC.Log"; CString dir = L"\\Log\\" + csTime += L".LLC.Log";
g_pLogger = new CLogger(dir); g_pLogger = new CLogger(dir);
GetAppPath(m_AppPath); GetAppPath(m_AppPath);
@@ -76,7 +76,7 @@ HSI_Motion::HSI_Motion()
m_cSendData[8] = 0;//17-24 m_cSendData[8] = 0;//17-24
m_cSendData[9] = 0xff;//9-16 m_cSendData[9] = 0xff;//9-16
m_cSendData[10] = 0xff;//1-8 m_cSendData[10] = 0xff;//1-8
m_cSendData[11] = 0x00;//25-32 电平,暂时不用 m_cSendData[11] = 0x00;//25-32 电平,暂时不用
m_cSendData[12] = 0x00;//17-24 m_cSendData[12] = 0x00;//17-24
//m_cSendData[13] = 0xff;//9-16 //m_cSendData[13] = 0xff;//9-16
//m_cSendData[14] = 0xff;//1-8 //m_cSendData[14] = 0xff;//1-8
@@ -116,7 +116,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
g_pLogger->SendAndFlushWithTime(L"[Startup] Connected\n"); g_pLogger->SendAndFlushWithTime(L"[Startup] Connected\n");
return HSI_STATUS_NORMAL; return HSI_STATUS_NORMAL;
} }
//读取配置文件LLC_Motion和LLC_Config //读取配置文件LLC_Motion和LLC_Config
CString FileMotionName(_T("")); CString FileMotionName(_T(""));
FileMotionName = m_AppPath + _T("\\Config\\LLC_Motion.ini"); FileMotionName = m_AppPath + _T("\\Config\\LLC_Motion.ini");
Load_Motion_Inifile(FileMotionName); Load_Motion_Inifile(FileMotionName);
@@ -132,7 +132,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式打开失败"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式打开失败");
EventCallback(sEvenProp); EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED; rStatus = HSI_STATUS_FAILED;
} }
@@ -140,7 +140,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
{ {
if (m_ResetTime != 0) if (m_ResetTime != 0)
{ {
//发送复位LLC控制器的指令 //发送复位LLC控制器的指令
byte cSendData[63] = { 0 }; byte cSendData[63] = { 0 };
cSendData[0] = 0x01; cSendData[0] = 0x01;
cSendData[1] = 0x02; cSendData[1] = 0x02;
@@ -159,7 +159,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式重新打开失败"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式重新打开失败");
EventCallback(sEvenProp); EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED; rStatus = HSI_STATUS_FAILED;
} }
@@ -283,7 +283,7 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed)
// sEvenProp.EventType = HSI_EVENT_ERROR; // sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION; // sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; // sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式打开失败"); // strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式打开失败");
// EventCallback(sEvenProp); // EventCallback(sEvenProp);
// } // }
// else // else
@@ -325,7 +325,7 @@ HSI_STATUS HSI_Motion::GetPositionXyz(UINT AxisTypes, double &PositionX, double
auto rStatus = HSI_STATUS_NORMAL; auto rStatus = HSI_STATUS_NORMAL;
UNREFERENCED_PARAMETER(AxisTypes); UNREFERENCED_PARAMETER(AxisTypes);
UNREFERENCED_PARAMETER(Time); UNREFERENCED_PARAMETER(Time);
//读取3个轴的位置 //读取3个轴的位置
CString tempStr; CString tempStr;
if (g_pHSI_Motion) if (g_pHSI_Motion)
{ {
@@ -389,7 +389,7 @@ HSI_STATUS HSI_Motion::Load_Motion_Inifile(CString MotionIniFile)
CString csAppPath = MotionIniFile; CString csAppPath = MotionIniFile;
USES_CONVERSION; USES_CONVERSION;
CString temp(""); CString temp("");
//判断Log目录是否存在,不存在就创建 //判断Log目录是否存在,不存在就创建
if (CreateDirectory(m_AppPath + "\\Log", NULL)) if (CreateDirectory(m_AppPath + "\\Log", NULL))
{ {
g_pLogger->SendAndFlushWithTime(L"[Load_Motion_Inifile] Create Log Directory\n"); g_pLogger->SendAndFlushWithTime(L"[Load_Motion_Inifile] Create Log Directory\n");
@@ -402,7 +402,7 @@ HSI_STATUS HSI_Motion::Load_Motion_Inifile(CString MotionIniFile)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC_Motion.ini文件不存在!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC_Motion.ini文件不存在!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
@@ -440,7 +440,7 @@ HSI_STATUS HSI_Motion::Load_Config_Inifile(CString ConfigIniFile)
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC_Config.ini文件不存在!"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC_Config.ini文件不存在!");
EventCallback(sEvenProp); EventCallback(sEvenProp);
return HSI_STATUS_FAILED; return HSI_STATUS_FAILED;
} }
@@ -491,13 +491,13 @@ void HSI_Motion::SendMsgMotionFinished()
void HSI_Motion::UpdateMotionState() void HSI_Motion::UpdateMotionState()
{ {
BOOL bReturn = false; BOOL bReturn = false;
//m_cReceiveData[7]表示输入输出的状态 //m_cReceiveData[7]表示输入输出的状态
//m_cReceiveData[1]输入9-16 //m_cReceiveData[1]输入9-16
//m_cReceiveData[2]输入1-8 //m_cReceiveData[2]输入1-8
//m_cReceiveData[3]输入25-32 //m_cReceiveData[3]输入25-32
//m_cReceiveData[4]输入17-24 //m_cReceiveData[4]输入17-24
//m_cReceiveData[5]输入9-16 //m_cReceiveData[5]输入9-16
//m_cReceiveData[6]输入1-8 //m_cReceiveData[6]输入1-8
if (g_pHSI_Motion) if (g_pHSI_Motion)
{ {
while (m_bSTM32UsbFlag) while (m_bSTM32UsbFlag)
@@ -545,7 +545,7 @@ void HSI_Motion::UpdateMotionStateIO()
int StartFlag = 0; int StartFlag = 0;
while (m_bSTM32UsbFlag) while (m_bSTM32UsbFlag)
{ {
//1个脚踏开关 //1个脚踏开关
if (m_IOStatusEnabled) if (m_IOStatusEnabled)
{ {
if (m_IsStartInput == 1) if (m_IsStartInput == 1)
@@ -592,7 +592,7 @@ void HSI_Motion::DoEvents()
sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DoEvents_异常"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DoEvents_异常");
EventCallback(sEvenProp); EventCallback(sEvenProp);
} }
if (g_IsClose) if (g_IsClose)
@@ -630,7 +630,7 @@ HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status)
auto rStatus = HSI_STATUS_NORMAL; auto rStatus = HSI_STATUS_NORMAL;
if (g_pHSI_Motion) if (g_pHSI_Motion)
{ {
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出 if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出
{ {
if (m_cReceiveData[7] == 7) if (m_cReceiveData[7] == 7)
{ {
@@ -665,7 +665,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
short rtn(0); short rtn(0);
if (g_pHSI_Motion) if (g_pHSI_Motion)
{ {
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //设置通用输出 if (IOChannel == HSI_MOTION_OUTPUT_CH1) //设置通用输出
{ {
//g_pLogger->SendAndFlushWithTime(L"[SetDIO] OUTPUT_CH1 _Status = %d\n", _Status); //g_pLogger->SendAndFlushWithTime(L"[SetDIO] OUTPUT_CH1 _Status = %d\n", _Status);
m_cSendData[13] = (_Status >> 8); m_cSendData[13] = (_Status >> 8);
@@ -697,7 +697,7 @@ HSI_STATUS HSI_Motion::Shutdown()
if (m_bSTM32UsbFlag == true) if (m_bSTM32UsbFlag == true)
{ {
AbortMotion(); AbortMotion();
Sleep(10);//延时10ms关闭灯光 Sleep(10);//延时10ms关闭灯光
byte cSendData[63] = { 0 }; byte cSendData[63] = { 0 };
for (int i = 7; i < 63; i++) for (int i = 7; i < 63; i++)
{ {
@@ -726,7 +726,7 @@ HSI_STATUS HSI_Motion::DCCScanSetData(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType
auto rStatus = HSI_STATUS_NORMAL; auto rStatus = HSI_STATUS_NORMAL;
if (g_pHSI_Motion) if (g_pHSI_Motion)
{ {
//触发的位置为相对位置,用法一般是移动到起点位置,再开始设置触发位置(相对位置),最终设置终点位置 //触发的位置为相对位置,用法一般是移动到起点位置,再开始设置触发位置(相对位置),最终设置终点位置
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] In\n"); g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] In\n");
} }
@@ -1072,7 +1072,7 @@ double HSI_Motion::LimitOver(UINT AxisTypes, double &LimitPos)
{ {
switch (AxisNumber) switch (AxisNumber)
{ {
case 1: //轴1 case 1: //轴1
{ {
if (LimitPos > 0) if (LimitPos > 0)
{ {
@@ -1334,7 +1334,7 @@ HSI_STATUS HSI_Motion::SetAccelerationEx(UINT AxisTypes, double Accel)
//========================光源控制器USB控制================================== //========================光源控制器USB控制==================================
//=========================================================================== //===========================================================================
bool HSI_Motion::FindTheHID() bool HSI_Motion::FindTheHID()
{ {
@@ -1494,7 +1494,7 @@ BOOL HSI_Motion::WriteUsbReport(byte SendData[])
// sEvenProp.EventType = HSI_EVENT_ERROR; // sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION; // sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; // sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器没有连接"); // strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器没有连接");
// EventCallback(sEvenProp); // EventCallback(sEvenProp);
//} //}
} }
@@ -16,7 +16,7 @@
#define MAX_BUFF_SIZE 0x200 #define MAX_BUFF_SIZE 0x200
const double SCALE_UNITS = 1000.0; const double SCALE_UNITS = 1000.0;
static CLogger* g_pLogger; static CLogger* g_pLogger;
static bool g_IsClose;//用于DoEvents()的退出,而不异常 static bool g_IsClose;//用于DoEvents()的退出,而不异常
enum E_SO7_MOTION_TYPE enum E_SO7_MOTION_TYPE
{ {
@@ -27,9 +27,9 @@ enum E_SO7_MOTION_TYPE
}; };
enum E_GTS_HOME_STATUS enum E_GTS_HOME_STATUS
{ {
E_GTS_HOME_NONE,//0表示从未回过回原点 E_GTS_HOME_NONE,//0表示从未回过回原点
E_GTS_HOME_ING,//1表示正在回原点 E_GTS_HOME_ING,//1表示正在回原点
E_GTS_HOME_FINISHED,//2表示已经回过原点 E_GTS_HOME_FINISHED,//2表示已经回过原点
}; };
class HSI_Motion : public HSI class HSI_Motion : public HSI
{ {
@@ -102,16 +102,16 @@ public:
static HANDLE m_Thread_Id; static HANDLE m_Thread_Id;
static HANDLE m_Thread_Mutex; static HANDLE m_Thread_Mutex;
static HANDLE m_hTriggerEvent; static HANDLE m_hTriggerEvent;
//用于IO发消息的线程 //用于IO发消息的线程
static int m_Thread_StateIO; static int m_Thread_StateIO;
static HANDLE m_Thread_IdIO; static HANDLE m_Thread_IdIO;
static HANDLE m_Thread_MutexIO; static HANDLE m_Thread_MutexIO;
static HANDLE m_hTriggerEventIO; static HANDLE m_hTriggerEventIO;
static HANDLE m_RW_IO_Mutex; static HANDLE m_RW_IO_Mutex;
int m_LogIsOpen[5];//是否打开记录,0为打开,非0为关 int m_LogIsOpen[5];//是否打开记录,0为打开,非0为关
double m_Resolution[5];//从1开始,0不用,共8个轴 double m_Resolution[5];//从1开始,0不用,共8个轴
double m_P_Work_Limit[5]; double m_P_Work_Limit[5];
double m_N_Work_Limit[5]; double m_N_Work_Limit[5];
@@ -125,40 +125,40 @@ public:
double m_SetPotion_Speed[9]; double m_SetPotion_Speed[9];
double m_SetPotion_Acc[9]; double m_SetPotion_Acc[9];
double m_SetPotion_Dec[9]; double m_SetPotion_Dec[9];
double m_PositionA = 0.0;//第四轴的地位位置 double m_PositionA = 0.0;//第四轴的地位位置
double m_Jog_Speed[5]; //表示5个档位 double m_Jog_Speed[5]; //表示5个档位
double m_Jog_Acc[5]; double m_Jog_Acc[5];
double m_Jog_Dec[5]; double m_Jog_Dec[5];
int m_IsComPortA = 0;//是否打开第一个串口,1为打开,0为关闭,默认0 int m_IsComPortA = 0;//是否打开第一个串口,1为打开,0为关闭,默认0
int m_IsComPortB = 0;//是否打开第二个串口,1为打开,0为关闭,默认0 int m_IsComPortB = 0;//是否打开第二个串口,1为打开,0为关闭,默认0
int m_ComPortA = 3;//用于打开灯光的串口A int m_ComPortA = 3;//用于打开灯光的串口A
int m_ComPortB = 4;//用于打开灯光的串口B int m_ComPortB = 4;//用于打开灯光的串口B
int m_ComPortALed[5];//对应输出的4个接口A int m_ComPortALed[5];//对应输出的4个接口A
int m_ComPortBLed[5];//对应输出的4个接口B int m_ComPortBLed[5];//对应输出的4个接口B
int m_ComPortCppWpf;//启用c++调用灯光为0,还是wpf直接调用为1,默认0 int m_ComPortCppWpf;//启用c++调用灯光为0,还是wpf直接调用为1,默认0
int m_IsSTM32Usb = 0;//启用STM32控制器时是否使用USB,默认0 int m_IsSTM32Usb = 0;//启用STM32控制器时是否使用USB,默认0
int m_IsIOFuntion=0;//是否启动IO功能,1为打开,0为关闭 int m_IsIOFuntion=0;//是否启动IO功能,1为打开,0为关闭
int m_IsStartInput = 0;//是否启用脚踏开关功能,1为启用,0为关闭,默认0 int m_IsStartInput = 0;//是否启用脚踏开关功能,1为启用,0为关闭,默认0
UINT m_StartInputPort = 1;//外部输入按钮启动程序 UINT m_StartInputPort = 1;//外部输入按钮启动程序
int m_ResetTime = 2000;//每次启动LLC控制器时的reset复位时间(ms),时间太短会打开失败 int m_ResetTime = 2000;//每次启动LLC控制器时的reset复位时间(ms),时间太短会打开失败
//MST软件运行标志,trueMST软件已经启动,falseMST软件停止 //MST软件运行标志,trueMST软件已经启动,falseMST软件停止
bool m_MSTRunFlag = false; bool m_MSTRunFlag = false;
CString m_AppPath; CString m_AppPath;
int m_Result; int m_Result;
static unsigned __stdcall m_Thread(LPVOID pThis); static unsigned __stdcall m_Thread(LPVOID pThis);
//用于IO发消息的线程 //用于IO发消息的线程
static unsigned __stdcall m_ThreadIO(LPVOID pThis); static unsigned __stdcall m_ThreadIO(LPVOID pThis);
static unsigned __stdcall m_ThreadStep(LPVOID pThis); static unsigned __stdcall m_ThreadStep(LPVOID pThis);
double ScaleToMM(long lCount, double dResolution); double ScaleToMM(long lCount, double dResolution);
long MMtoScale(double lDistanceMM, double dResolution); long MMtoScale(double lDistanceMM, double dResolution);
//STM32 usb控制 //STM32 usb控制
bool m_bSTM32UsbFlag; bool m_bSTM32UsbFlag;
HANDLE m_DeviceHandle; HANDLE m_DeviceHandle;
HANDLE m_hEventObject; HANDLE m_hEventObject;
@@ -193,12 +193,12 @@ public:
private: private:
void CreateThread(); void CreateThread();
void CloseThread(); void CloseThread();
//用于IO发消息的线程 //用于IO发消息的线程
void CreateThreadIO(); void CreateThreadIO();
void CloseThreadIO(); void CloseThreadIO();
void UpdateMotionState(); void UpdateMotionState();
void UpdateMotionStateEx(); void UpdateMotionStateEx();
void UpdateMotionStateIO();//IO发消息使用 void UpdateMotionStateIO();//IO发消息使用
void SendMsgMotionFinished(); void SendMsgMotionFinished();
VOID EventCallback(sHSIEventProperties& sEventProp); VOID EventCallback(sHSIEventProperties& sEventProp);
@@ -1,4 +1,4 @@
// HSI_SEVENOCEAN_LLC.cpp : 定义 DLL 应用程序的导出函数。 // HSI_SEVENOCEAN_LLC.cpp : 定义 DLL 应用程序的导出函数。
// //
#include "stdafx.h" #include "stdafx.h"
@@ -1,9 +1,9 @@
;HSI_SEVENOCEAN_LLC.def : DLL ;HSI_SEVENOCEAN_LLC.def : DLL
LIBRARY "HSI" LIBRARY "HSI"
EXPORTS EXPORTS
; ;
HSI_STARTUP HSI_STARTUP
HSI_GET_INTERFACE_VERSION HSI_GET_INTERFACE_VERSION
@@ -1,10 +1,10 @@
// HSI_SEVENOCEAN_LLC.h : HSI_SEVENOCEAN_LLC DLL 的主头文件 // HSI_SEVENOCEAN_LLC.h : HSI_SEVENOCEAN_LLC DLL 的主头文件
// //
#pragma once #pragma once
#include "resource.h" // 主符号 #include "resource.h" // 主符号
#include <cstring> #include <cstring>
@@ -1,4 +1,4 @@
// MachineInterfaceDll.cpp : 定义 DLL 应用程序的导出函数。 // MachineInterfaceDll.cpp : 定义 DLL 应用程序的导出函数。
// //
#include "stdafx.h" #include "stdafx.h"
@@ -1,8 +1,8 @@
// stdafx.cpp : 只包括标准包含文件的源文件 // stdafx.cpp : 只包括标准包含文件的源文件
// MachineInterfaceDll.pch 将作为预编译头 // MachineInterfaceDll.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息 // stdafx.obj 将包含预编译类型信息
#include "stdafx.h" #include "stdafx.h"
// TODO: 在 STDAFX.H 中 // TODO: 在 STDAFX.H 中
// 引用任何所需的附加头文件,而不是在此文件中引用 // 引用任何所需的附加头文件,而不是在此文件中引用
@@ -1,8 +1,8 @@
#pragma once #pragma once
// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。 // 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。
// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将 // 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。 // WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。
#include <SDKDDKVer.h> #include <SDKDDKVer.h>
@@ -1,4 +1,4 @@
// RobotControlDll.cpp : 定义 DLL 的初始化例程。 // RobotControlDll.cpp : 定义 DLL 的初始化例程。
// //
#include "stdafx.h" #include "stdafx.h"
@@ -10,28 +10,28 @@
#endif #endif
// //
//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的, //TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
// 则从此 DLL 导出的任何调入 // 则从此 DLL 导出的任何调入
// MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到 // MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
// 该函数的最前面。 // 该函数的最前面。
// //
// 例如: // 例如:
// //
// extern "C" BOOL PASCAL EXPORT ExportedFunction() // extern "C" BOOL PASCAL EXPORT ExportedFunction()
// { // {
// AFX_MANAGE_STATE(AfxGetStaticModuleState()); // AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体 // // 此处为普通函数体
// } // }
// //
// 此宏先于任何 MFC 调用 // 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着 // 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句 // 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明, // 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC // 这是因为它们的构造函数可能生成 MFC
// DLL 调用。 // DLL 调用。
// //
// 有关其他详细信息, // 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。 // 请参阅 MFC 技术说明 33 和 58。
// //
// CRobotControlDllApp // CRobotControlDllApp
@@ -42,21 +42,21 @@ BEGIN_MESSAGE_MAP(CRobotControlDllApp, CWinApp)
END_MESSAGE_MAP() END_MESSAGE_MAP()
// CRobotControlDllApp 构造 // CRobotControlDllApp 构造
CRobotControlDllApp::CRobotControlDllApp() CRobotControlDllApp::CRobotControlDllApp()
{ {
// TODO: 在此处添加构造代码, // TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中 // 将所有重要的初始化放置在 InitInstance 中
} }
// 唯一的一个 CRobotControlDllApp 对象 // 唯一的一个 CRobotControlDllApp 对象
CRobotControlDllApp theApp; CRobotControlDllApp theApp;
// CRobotControlDllApp 初始化 // CRobotControlDllApp 初始化
BOOL CRobotControlDllApp::InitInstance() BOOL CRobotControlDllApp::InitInstance()
{ {
@@ -86,6 +86,6 @@ BOOL CRobotControlDllApp::InitInstance()
BOOL CRobotControlDllApp::OnCreateAggregates() BOOL CRobotControlDllApp::OnCreateAggregates()
{ {
// TODO: 在此添加专用代码和/或调用基类 // TODO: 在此添加专用代码和/或调用基类
return TRUE; return TRUE;
} }
@@ -1,17 +1,17 @@
// RobotControlDll.h : RobotControlDll DLL 的主头文件 // RobotControlDll.h : RobotControlDll DLL 的主头文件
// //
#pragma once #pragma once
#ifndef __AFXWIN_H__ #ifndef __AFXWIN_H__
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件" #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif #endif
#include "resource.h" // 主符号 #include "resource.h" // 主符号
// CRobotControlDllApp // CRobotControlDllApp
// 有关此类实现的信息,请参阅 RobotControlDll.cpp // 有关此类实现的信息,请参阅 RobotControlDll.cpp
// //
class CRobotControlDllApp : public CWinApp class CRobotControlDllApp : public CWinApp
@@ -19,7 +19,7 @@ class CRobotControlDllApp : public CWinApp
public: public:
CRobotControlDllApp(); CRobotControlDllApp();
// 重写 // 重写
public: public:
virtual BOOL InitInstance(); virtual BOOL InitInstance();
@@ -1,4 +1,4 @@
// Robot_conect.cpp : 实现文件 // Robot_conect.cpp : 实现文件
// //
#include "stdafx.h" #include "stdafx.h"
@@ -7,7 +7,7 @@
#include "afxdialogex.h" #include "afxdialogex.h"
// Robot_conect 对话框 // Robot_conect 对话框
IMPLEMENT_DYNAMIC(Robot_conect, CDialogEx) IMPLEMENT_DYNAMIC(Robot_conect, CDialogEx)
@@ -35,12 +35,12 @@ BEGIN_MESSAGE_MAP(Robot_conect, CDialogEx)
END_MESSAGE_MAP() END_MESSAGE_MAP()
// Robot_conect 消息处理程序 // Robot_conect 消息处理程序
void Robot_conect::OnCbnSelchangeComboRobotId() void Robot_conect::OnCbnSelchangeComboRobotId()
{ {
// TODO: 在此添加控件通知处理程序代码 // TODO: 在此添加控件通知处理程序代码
} }
@@ -49,13 +49,13 @@ BOOL Robot_conect::OnInitDialog()
CDialogEx::OnInitDialog(); CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化 // TODO: 在此添加额外的初始化
// Get the Robot program list // Get the Robot program list
// m_nRobotID // m_nRobotID
return TRUE; // return TRUE unless you set the focus to a control return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE // 异常: OCX 属性页应返回 FALSE
} }
@@ -68,7 +68,7 @@ void Robot_conect::OnStart()
long status; long status;
CString tmp; CString tmp;
int i; int i;
m_CMelfarxmctrl1.ServerStart();//启动Robocom.exe m_CMelfarxmctrl1.ServerStart();//启动Robocom.exe
SleepEx(2000,TRUE); SleepEx(2000,TRUE);
data = NULL; data = NULL;
m_CMelfarxmctrl1.GetRoboComSetting(&rcnt,&data); m_CMelfarxmctrl1.GetRoboComSetting(&rcnt,&data);
@@ -87,7 +87,7 @@ void Robot_conect::OnStart()
tmp2 += _T(" : "); tmp2 += _T(" : ");
tmp2 += data; tmp2 += data;
m_cCombo.AddString(tmp2); m_cCombo.AddString(tmp2);
//获取程序列表 //获取程序列表
} }
m_cCombo.SetCurSel(0); m_cCombo.SetCurSel(0);
@@ -196,7 +196,7 @@ BEGIN_EVENTSINK_MAP(Robot_conect, CDialogEx)
void Robot_conect::MsgRecvEventMelfarxmctrl1() void Robot_conect::MsgRecvEventMelfarxmctrl1()
{ {
// TODO: 在此处添加消息处理程序代码 // TODO: 在此处添加消息处理程序代码
long msgcnt,cnt; long msgcnt,cnt;
long i,nRecvRobot,nRecvID,nRecvStatus,nRecvErr; long i,nRecvRobot,nRecvID,nRecvStatus,nRecvErr;
BSTR data; BSTR data;
@@ -215,7 +215,7 @@ void Robot_conect::MsgRecvEventMelfarxmctrl1()
{ {
case 106: case 106:
break; break;
//=========读取错误码============== //=========读取错误码==============
case 203: case 203:
data = NULL; data = NULL;
m_CMelfarxmctrl1.GetOneDataCPP(0,tmp,&data); m_CMelfarxmctrl1.GetOneDataCPP(0,tmp,&data);
@@ -237,7 +237,7 @@ void Robot_conect::MsgRecvEventMelfarxmctrl1()
::SysFreeString(data); ::SysFreeString(data);
} }
break; break;
//============读取位置信息============= //============读取位置信息=============
case 235: case 235:
m_position.Empty(); m_position.Empty();
for(i=0; i<8; i++) for(i=0; i<8; i++)
@@ -2,21 +2,21 @@
#include "melfarxmctrl1.h" #include "melfarxmctrl1.h"
// Robot_conect 对话框 // Robot_conect 对话框
class Robot_conect : public CDialogEx class Robot_conect : public CDialogEx
{ {
DECLARE_DYNAMIC(Robot_conect) DECLARE_DYNAMIC(Robot_conect)
public: public:
Robot_conect(CWnd* pParent = NULL); // 标准构造函数 Robot_conect(CWnd* pParent = NULL); // 标准构造函数
virtual ~Robot_conect(); virtual ~Robot_conect();
// 对话框数据 // 对话框数据
enum { IDD = IDD_DIALOG1 }; enum { IDD = IDD_DIALOG1 };
protected: protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
public: public:
@@ -1,7 +1,7 @@
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类 // 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由 // 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。 // Microsoft Visual C++ 重新生成,您的修改将被覆盖。
#include "stdafx.h" #include "stdafx.h"
@@ -13,7 +13,7 @@
IMPLEMENT_DYNCREATE(CMelfarxmctrl1, CWnd) IMPLEMENT_DYNCREATE(CMelfarxmctrl1, CWnd)
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 属性 // CMelfarxmctrl1 属性
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 操作 // CMelfarxmctrl1 操作
@@ -1,12 +1,12 @@
#pragma once #pragma once
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类 // 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由 // 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。 // Microsoft Visual C++ 重新生成,您的修改将被覆盖。
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 包装类 // CMelfarxmctrl1 包装类
#include "melfarxmctrl1.h" #include "melfarxmctrl1.h"
class CMelfarxmctrl1 : public CWnd class CMelfarxmctrl1 : public CWnd
{ {
@@ -34,11 +34,11 @@ public:
pPersist, bStorage, bstrLicKey); pPersist, bStorage, bstrLicKey);
} }
// 特性 // 特性
public: public:
// 操作 // 操作
public: public:
// _DMelfaRxM // _DMelfaRxM
@@ -1,7 +1,7 @@
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类 // 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由 // 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。 // Microsoft Visual C++ 重新生成,您的修改将被覆盖。
#include "stdafx.h" #include "stdafx.h"
@@ -13,7 +13,7 @@
IMPLEMENT_DYNCREATE(CMelfarxmctrl1, CWnd) IMPLEMENT_DYNCREATE(CMelfarxmctrl1, CWnd)
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 属性 // CMelfarxmctrl1 属性
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 操作 // CMelfarxmctrl1 操作
@@ -1,12 +1,12 @@
#pragma once #pragma once
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类 // 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由 // 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。 // Microsoft Visual C++ 重新生成,您的修改将被覆盖。
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 包装类 // CMelfarxmctrl1 包装类
class CMelfarxmctrl1 : public CWnd class CMelfarxmctrl1 : public CWnd
{ {
@@ -34,11 +34,11 @@ public:
pPersist, bStorage, bstrLicKey); pPersist, bStorage, bstrLicKey);
} }
// 特性 // 特性
public: public:
// 操作 // 操作
public: public:
// _DMelfaRxM // _DMelfaRxM
@@ -7,21 +7,21 @@
extern SmartMotor_Proto* pSmartMotor_Proto; extern SmartMotor_Proto* pSmartMotor_Proto;
// CAnimatics_UtilDlg 对话框 // CAnimatics_UtilDlg 对话框
class CAnimatics_UtilDlg : public CDialog class CAnimatics_UtilDlg : public CDialog
{ {
DECLARE_DYNAMIC(CAnimatics_UtilDlg) DECLARE_DYNAMIC(CAnimatics_UtilDlg)
public: public:
CAnimatics_UtilDlg(CWnd* pParent = NULL); // 标准构造函数 CAnimatics_UtilDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CAnimatics_UtilDlg(); virtual ~CAnimatics_UtilDlg();
// 对话框数据 // 对话框数据
enum { IDD = IDD_ANIMATICS_UTIL_DIALOG }; enum { IDD = IDD_ANIMATICS_UTIL_DIALOG };
protected: protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog(); virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
public: public:
@@ -1,4 +1,4 @@
// GraphView.cpp : 实现文件 // GraphView.cpp : 实现文件
// //
#include "stdafx.h" #include "stdafx.h"
@@ -12,7 +12,7 @@ IMPLEMENT_DYNAMIC(CDrawGraph, CWnd)
//======================================================== //========================================================
CDrawGraph::CDrawGraph() CDrawGraph::CDrawGraph()
{ {
//注册控件类 //注册控件类
RegisterCtrlClass(); RegisterCtrlClass();
m_nMarginLeft = 40; m_nMarginLeft = 40;
@@ -28,7 +28,7 @@ CDrawGraph::CDrawGraph()
m_dbStartX = m_dbStartY = 0; m_dbStartX = m_dbStartY = 0;
m_dbEndX = m_dbEndY = 100; m_dbEndX = m_dbEndY = 100;
//颜色表 //颜色表
m_clrCoordBkg = RGB(255, 255, 255); m_clrCoordBkg = RGB(255, 255, 255);
m_clrFrame = RGB(0, 0, 0); m_clrFrame = RGB(0, 0, 0);
m_clrWave = RGB(0, 0, 255); m_clrWave = RGB(0, 0, 255);
@@ -48,7 +48,7 @@ void CDrawGraph::RegisterCtrlClass()
if(::GetClassInfo(hInstance, STR_CLASS_NAME, &wndclsCtrl)) if(::GetClassInfo(hInstance, STR_CLASS_NAME, &wndclsCtrl))
return; return;
//设置控件类信息 //设置控件类信息
wndclsCtrl.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wndclsCtrl.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wndclsCtrl.lpfnWndProc = ::DefWindowProc; wndclsCtrl.lpfnWndProc = ::DefWindowProc;
wndclsCtrl.cbClsExtra = 0; wndclsCtrl.cbClsExtra = 0;
@@ -60,7 +60,7 @@ void CDrawGraph::RegisterCtrlClass()
wndclsCtrl.lpszMenuName = NULL; wndclsCtrl.lpszMenuName = NULL;
wndclsCtrl.lpszClassName = STR_CLASS_NAME; wndclsCtrl.lpszClassName = STR_CLASS_NAME;
//注册控件类 //注册控件类
AfxRegisterClass(&wndclsCtrl); AfxRegisterClass(&wndclsCtrl);
} }
//======================================================== //========================================================
@@ -70,18 +70,18 @@ void CDrawGraph::SetViewFont(const CString& strFont, int nPointSize, int nWeight
LOGFONT lf; LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT)); memset(&lf, 0, sizeof(LOGFONT));
//设置字体样式 //设置字体样式
nCount = sizeof(lf.lfFaceName)/sizeof(TCHAR); nCount = sizeof(lf.lfFaceName)/sizeof(TCHAR);
COPYSTRING(lf.lfFaceName, nCount, strFont); COPYSTRING(lf.lfFaceName, nCount, strFont);
lf.lfHeight = nPointSize; lf.lfHeight = nPointSize;
lf.lfWeight = nWeight; lf.lfWeight = nWeight;
lf.lfCharSet = GB2312_CHARSET; lf.lfCharSet = GB2312_CHARSET;
//清楚已有样式 //清楚已有样式
if(m_fontView.GetSafeHandle()) if(m_fontView.GetSafeHandle())
m_fontView.DeleteObject(); m_fontView.DeleteObject();
//设置字体 //设置字体
m_fontView.CreateFontIndirect(&lf); m_fontView.CreateFontIndirect(&lf);
if(bIsRedraw) if(bIsRedraw)
@@ -245,7 +245,7 @@ void CDrawGraph::DrawCoordinate(CDC* pDC, CRect rectCoord)
font.CreatePointFontIndirect (&lf); font.CreatePointFontIndirect (&lf);
CFont* pOldFont = pDC->SelectObject (&font); CFont* pOldFont = pDC->SelectObject (&font);
pDC->TextOut(rectCoord.left-40,rectCoord.top+(rectCoord.Height()/2)+30,m_YAxisLabel);//旋转90°输出 pDC->TextOut(rectCoord.left-40,rectCoord.top+(rectCoord.Height()/2)+30,m_YAxisLabel);//旋转90°输出
pDC->SelectObject (pOldFont); pDC->SelectObject (pOldFont);
pDC->TextOut(rectCoord.left-20+(rectCoord.Width()/2),rectCoord.bottom+15,m_XAxisLabel); pDC->TextOut(rectCoord.left-20+(rectCoord.Width()/2),rectCoord.bottom+15,m_XAxisLabel);
@@ -344,13 +344,13 @@ BEGIN_MESSAGE_MAP(CDrawGraph, CWnd)
ON_WM_ERASEBKGND() ON_WM_ERASEBKGND()
END_MESSAGE_MAP() END_MESSAGE_MAP()
// CDrawGraph 消息处理程序 // CDrawGraph 消息处理程序
//======================================================== //========================================================
void CDrawGraph::PreSubclassWindow() void CDrawGraph::PreSubclassWindow()
{ {
CWnd::PreSubclassWindow(); CWnd::PreSubclassWindow();
SetViewFont(_T("宋体"), 12, FW_NORMAL); SetViewFont(_T("宋体"), 12, FW_NORMAL);
} }
//======================================================== //========================================================
void CDrawGraph::OnPaint() void CDrawGraph::OnPaint()
@@ -363,25 +363,25 @@ void CDrawGraph::OnPaint()
CFont* pOldFont; CFont* pOldFont;
CDC* pMemDC = new CDC; CDC* pMemDC = new CDC;
//获取控件信息 //获取控件信息
GetClientRect(rectClient); GetClientRect(rectClient);
GetWindowText(strCaption); GetWindowText(strCaption);
//创建位图内存 //创建位图内存
bitmapTemp.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height()); bitmapTemp.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height());
pMemDC->CreateCompatibleDC(&dc); pMemDC->CreateCompatibleDC(&dc);
pOldBitmap = pMemDC->SelectObject(&bitmapTemp); pOldBitmap = pMemDC->SelectObject(&bitmapTemp);
pOldFont = pMemDC->SelectObject(&m_fontView); pOldFont = pMemDC->SelectObject(&m_fontView);
nMode = pMemDC->SetBkMode(TRANSPARENT); nMode = pMemDC->SetBkMode(TRANSPARENT);
//填充客户区 //填充客户区
pMemDC->FillSolidRect(&rectClient, GetSysColor(COLOR_BTNFACE)); pMemDC->FillSolidRect(&rectClient, GetSysColor(COLOR_BTNFACE));
//绘制视图标题 //绘制视图标题
pMemDC->DrawText(strCaption, strCaption.GetLength(), rectClient, DT_CENTER); pMemDC->DrawText(strCaption, strCaption.GetLength(), rectClient, DT_CENTER);
//绘制坐标框 //绘制坐标框
rectCoord.SetRect(rectClient.left+m_nMarginLeft, rectClient.top+m_nMarginTop, rectClient.right-m_nMarginRight, rectClient.bottom-m_nMarginBottom); rectCoord.SetRect(rectClient.left+m_nMarginLeft, rectClient.top+m_nMarginTop, rectClient.right-m_nMarginRight, rectClient.bottom-m_nMarginBottom);
DrawCoordinate(pMemDC, rectCoord); DrawCoordinate(pMemDC, rectCoord);
//绘制波形 //绘制波形
DrawActualCurve(pMemDC, rectCoord); DrawActualCurve(pMemDC, rectCoord);
dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), pMemDC, 0, 0, SRCCOPY); dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), pMemDC, 0, 0, SRCCOPY);
@@ -26,75 +26,75 @@ CEF1AUsbDevice::~CEF1AUsbDevice()
BOOL CEF1AUsbDevice::EF1AOpenDevice() BOOL CEF1AUsbDevice::EF1AOpenDevice()
{ {
//用来保存设备是否已经找到 //用来保存设备是否已经找到
BOOL DevFound=FALSE; BOOL DevFound=FALSE;
//用来保存找到的设备路径 //用来保存找到的设备路径
CString DevPathName=_T(""); CString DevPathName=_T("");
//定义一个GUID的结构体HidGuid来保存HID设备的接口类GUID。 //定义一个GUID的结构体HidGuid来保存HID设备的接口类GUID。
GUID HidGuid; GUID HidGuid;
//定义一个DEVINFO的句柄hDevInfoSet来保存获取到的设备信息集合句柄。 //定义一个DEVINFO的句柄hDevInfoSet来保存获取到的设备信息集合句柄。
HDEVINFO hDevInfoSet; HDEVINFO hDevInfoSet;
//定义MemberIndex,表示当前搜索到第几个设备,0表示第一个设备。 //定义MemberIndex,表示当前搜索到第几个设备,0表示第一个设备。
DWORD MemberIndex; DWORD MemberIndex;
//DevInterfaceData,用来保存设备的驱动接口信息 //DevInterfaceData,用来保存设备的驱动接口信息
SP_DEVICE_INTERFACE_DATA DevInterfaceData; SP_DEVICE_INTERFACE_DATA DevInterfaceData;
//定义一个BOOL变量,保存函数调用是否返回成功 //定义一个BOOL变量,保存函数调用是否返回成功
BOOL Result; BOOL Result;
//定义一个RequiredSize的变量,用来接收需要保存详细信息的缓冲长度。 //定义一个RequiredSize的变量,用来接收需要保存详细信息的缓冲长度。
DWORD RequiredSize; DWORD RequiredSize;
//定义一个指向设备详细信息的结构体指针。 //定义一个指向设备详细信息的结构体指针。
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetailData; PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetailData;
//定义一个用来保存打开设备的句柄。 //定义一个用来保存打开设备的句柄。
HANDLE hDevHandle; HANDLE hDevHandle;
//定义一个HIDD_ATTRIBUTES的结构体变量,保存设备的属性。 //定义一个HIDD_ATTRIBUTES的结构体变量,保存设备的属性。
HIDD_ATTRIBUTES DevAttributes; HIDD_ATTRIBUTES DevAttributes;
//对DevInterfaceData结构体的cbSize初始化为结构体大小 //对DevInterfaceData结构体的cbSize初始化为结构体大小
DevInterfaceData.cbSize=sizeof(DevInterfaceData); DevInterfaceData.cbSize=sizeof(DevInterfaceData);
//对DevAttributes结构体的Size初始化为结构体大小 //对DevAttributes结构体的Size初始化为结构体大小
DevAttributes.Size=sizeof(DevAttributes); DevAttributes.Size=sizeof(DevAttributes);
//调用HidD_GetHidGuid函数获取HID设备的GUID,并保存在HidGuid中。 //调用HidD_GetHidGuid函数获取HID设备的GUID,并保存在HidGuid中。
HidD_GetHidGuid(&HidGuid); HidD_GetHidGuid(&HidGuid);
//根据HidGuid来获取设备信息集合。其中Flags参数设置为 //根据HidGuid来获取设备信息集合。其中Flags参数设置为
//DIGCF_DEVICEINTERFACE|DIGCF_PRESENT,前者表示使用的GUID为 //DIGCF_DEVICEINTERFACE|DIGCF_PRESENT,前者表示使用的GUID为
//接口类GUID,后者表示只列举正在使用的设备,因为我们这里只 //接口类GUID,后者表示只列举正在使用的设备,因为我们这里只
//查找已经连接上的设备。返回的句柄保存在hDevinfo中。注意设备 //查找已经连接上的设备。返回的句柄保存在hDevinfo中。注意设备
//信息集合在使用完毕后,要使用函数SetupDiDestroyDeviceInfoList //信息集合在使用完毕后,要使用函数SetupDiDestroyDeviceInfoList
//销毁,不然会造成内存泄漏。 //销毁,不然会造成内存泄漏。
hDevInfoSet=SetupDiGetClassDevs(&HidGuid, hDevInfoSet=SetupDiGetClassDevs(&HidGuid,
NULL, NULL,
NULL, NULL,
DIGCF_DEVICEINTERFACE|DIGCF_PRESENT); DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);
//MessageBox(NULL,"开始查找设备!",NULL,MB_OK); //MessageBox(NULL,"开始查找设备!",NULL,MB_OK);
//然后对设备集合中每个设备进行列举,检查是否是我们要找的设备 //然后对设备集合中每个设备进行列举,检查是否是我们要找的设备
//当找到我们指定的设备,或者设备已经查找完毕时,就退出查找。 //当找到我们指定的设备,或者设备已经查找完毕时,就退出查找。
//首先指向第一个设备,即将MemberIndex置为0。 //首先指向第一个设备,即将MemberIndex置为0。
MemberIndex=0; MemberIndex=0;
while(1) while(1)
{ {
//调用SetupDiEnumDeviceInterfaces在设备信息集合中获取编号为 //调用SetupDiEnumDeviceInterfaces在设备信息集合中获取编号为
//MemberIndex的设备信息。 //MemberIndex的设备信息。
Result=SetupDiEnumDeviceInterfaces(hDevInfoSet, Result=SetupDiEnumDeviceInterfaces(hDevInfoSet,
NULL, NULL,
&HidGuid, &HidGuid,
MemberIndex, MemberIndex,
&DevInterfaceData); &DevInterfaceData);
//如果获取信息失败,则说明设备已经查找完毕,退出循环。 //如果获取信息失败,则说明设备已经查找完毕,退出循环。
if(Result==FALSE) break; if(Result==FALSE) break;
//将MemberIndex指向下一个设备 //将MemberIndex指向下一个设备
MemberIndex++; MemberIndex++;
//如果获取信息成功,则继续获取该设备的详细信息。在获取设备 //如果获取信息成功,则继续获取该设备的详细信息。在获取设备
//详细信息时,需要先知道保存详细信息需要多大的缓冲区,这通过 //详细信息时,需要先知道保存详细信息需要多大的缓冲区,这通过
//第一次调用函数SetupDiGetDeviceInterfaceDetail来获取。这时 //第一次调用函数SetupDiGetDeviceInterfaceDetail来获取。这时
//提供缓冲区和长度都为NULL的参数,并提供一个用来保存需要多大 //提供缓冲区和长度都为NULL的参数,并提供一个用来保存需要多大
//缓冲区的变量RequiredSize。 //缓冲区的变量RequiredSize。
Result=SetupDiGetDeviceInterfaceDetail(hDevInfoSet, Result=SetupDiGetDeviceInterfaceDetail(hDevInfoSet,
&DevInterfaceData, &DevInterfaceData,
NULL, NULL,
@@ -102,21 +102,21 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
&RequiredSize, &RequiredSize,
NULL); NULL);
//然后,分配一个大小为RequiredSize缓冲区,用来保存设备详细信息。 //然后,分配一个大小为RequiredSize缓冲区,用来保存设备详细信息。
pDevDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize); pDevDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize);
if(pDevDetailData==NULL) //如果内存不足,则直接返回。 if(pDevDetailData==NULL) //如果内存不足,则直接返回。
{ {
MessageBox(NULL,_T("内存不足!"),NULL,MB_OK); MessageBox(NULL,_T("内存不足!"),NULL,MB_OK);
SetupDiDestroyDeviceInfoList(hDevInfoSet); SetupDiDestroyDeviceInfoList(hDevInfoSet);
return false; return false;
} }
//并设置pDevDetailData的cbSize为结构体的大小(注意只是结构体大小, //并设置pDevDetailData的cbSize为结构体的大小(注意只是结构体大小,
//不包括后面缓冲区)。 //不包括后面缓冲区)。
pDevDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); pDevDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
//然后再次调用SetupDiGetDeviceInterfaceDetail函数来获取设备的 //然后再次调用SetupDiGetDeviceInterfaceDetail函数来获取设备的
//详细信息。这次调用设置使用的缓冲区以及缓冲区大小。 //详细信息。这次调用设置使用的缓冲区以及缓冲区大小。
Result=SetupDiGetDeviceInterfaceDetail(hDevInfoSet, Result=SetupDiGetDeviceInterfaceDetail(hDevInfoSet,
&DevInterfaceData, &DevInterfaceData,
pDevDetailData, pDevDetailData,
@@ -124,17 +124,17 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
NULL, NULL,
NULL); NULL);
//将设备路径复制出来,然后销毁刚刚申请的内存。 //将设备路径复制出来,然后销毁刚刚申请的内存。
DevPathName=pDevDetailData->DevicePath; DevPathName=pDevDetailData->DevicePath;
free(pDevDetailData); free(pDevDetailData);
//如果调用失败,则查找下一个设备。 //如果调用失败,则查找下一个设备。
if(Result==FALSE) continue; if(Result==FALSE) continue;
//如果调用成功,则使用不带读写访问的CreateFile函数 //如果调用成功,则使用不带读写访问的CreateFile函数
//来获取设备的属性,包括VID、PID、版本号等。 //来获取设备的属性,包括VID、PID、版本号等。
//对于一些独占设备(例如USB键盘),使用读访问方式是无法打开的, //对于一些独占设备(例如USB键盘),使用读访问方式是无法打开的,
//而使用不带读写访问的格式才可以打开这些设备,从而获取设备的属性。 //而使用不带读写访问的格式才可以打开这些设备,从而获取设备的属性。
hDevHandle=CreateFile(DevPathName, hDevHandle=CreateFile(DevPathName,
NULL, NULL,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
@@ -143,31 +143,31 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL,
NULL); NULL);
//如果打开成功,则获取设备属性。 //如果打开成功,则获取设备属性。
if(hDevHandle!=INVALID_HANDLE_VALUE) if(hDevHandle!=INVALID_HANDLE_VALUE)
{ {
//获取设备的属性并保存在DevAttributes结构体中 //获取设备的属性并保存在DevAttributes结构体中
Result=HidD_GetAttributes(hDevHandle, Result=HidD_GetAttributes(hDevHandle,
&DevAttributes); &DevAttributes);
//关闭刚刚打开的设备 //关闭刚刚打开的设备
CloseHandle(hDevHandle); CloseHandle(hDevHandle);
//获取失败,查找下一个 //获取失败,查找下一个
if(Result==FALSE) continue; if(Result==FALSE) continue;
//如果获取成功,则将属性中的VID、PID以及设备版本号与我们需要的 //如果获取成功,则将属性中的VID、PID以及设备版本号与我们需要的
//进行比较,如果都一致的话,则说明它就是我们要找的设备。 //进行比较,如果都一致的话,则说明它就是我们要找的设备。
if(DevAttributes.VendorID==m_nVID) //如果VID相等 if(DevAttributes.VendorID==m_nVID) //如果VID相等
if(DevAttributes.ProductID==m_nPID) //并且PID相等 if(DevAttributes.ProductID==m_nPID) //并且PID相等
//if(DevAttributes.VersionNumber==MyPvn) //并且设备版本号相等 //if(DevAttributes.VersionNumber==MyPvn) //并且设备版本号相等
{ {
DevFound=TRUE; //设置设备已经找到 DevFound=TRUE; //设置设备已经找到
//MessageBox(NULL,"设备已经找到!",NULL,MB_OK); //MessageBox(NULL,"设备已经找到!",NULL,MB_OK);
//那么就是我们要找的设备,分别使用读写方式打开之,并保存其句柄 //那么就是我们要找的设备,分别使用读写方式打开之,并保存其句柄
//并且选择为异步访问方式。 //并且选择为异步访问方式。
//读方式打开设备 //读方式打开设备
m_hReadHandle=CreateFile(DevPathName, m_hReadHandle=CreateFile(DevPathName,
GENERIC_READ, GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
@@ -178,12 +178,12 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
if(m_hReadHandle!=INVALID_HANDLE_VALUE) if(m_hReadHandle!=INVALID_HANDLE_VALUE)
{ {
//MessageBox(NULL,"读访问打开设备成功!",NULL,MB_OK); //MessageBox(NULL,"读访问打开设备成功!",NULL,MB_OK);
} }
else else
MessageBox(NULL,_T("读访问打开设备失败!"),NULL,MB_OK); MessageBox(NULL,_T("读访问打开设备失败!"),NULL,MB_OK);
//写方式打开设备 //写方式打开设备
m_hWriteHandle=CreateFile(DevPathName, m_hWriteHandle=CreateFile(DevPathName,
GENERIC_WRITE, GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
@@ -193,22 +193,22 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
NULL); NULL);
if(m_hWriteHandle!=INVALID_HANDLE_VALUE) if(m_hWriteHandle!=INVALID_HANDLE_VALUE)
{ {
//MessageBox(NULL,"写访问打开设备成功!",NULL,MB_OK); //MessageBox(NULL,"写访问打开设备成功!",NULL,MB_OK);
} }
else else
MessageBox(NULL,_T("写访问打开设备失败!"),NULL,MB_OK); MessageBox(NULL,_T("写访问打开设备失败!"),NULL,MB_OK);
break; break;
} }
} }
//如果打开失败,则查找下一个设备 //如果打开失败,则查找下一个设备
else continue; else continue;
} }
//调用SetupDiDestroyDeviceInfoList函数销毁设备信息集合 //调用SetupDiDestroyDeviceInfoList函数销毁设备信息集合
SetupDiDestroyDeviceInfoList(hDevInfoSet); SetupDiDestroyDeviceInfoList(hDevInfoSet);
//如果设备已经找到,那么应该使能各操作按钮,并同时禁止打开设备按钮 //如果设备已经找到,那么应该使能各操作按钮,并同时禁止打开设备按钮
if(DevFound) if(DevFound)
{ {
m_isOpen = TRUE; m_isOpen = TRUE;
@@ -242,9 +242,9 @@ int CEF1AUsbDevice::EF1AReadData(ULONG /*iIndex*/, char* oBuffer,int /*ioLength*
{ {
DWORD iLen = 0; DWORD iLen = 0;
UCHAR ReadReportBuffer[65]={0}; UCHAR ReadReportBuffer[65]={0};
if(m_hReadHandle==INVALID_HANDLE_VALUE) //如果读句柄无效 if(m_hReadHandle==INVALID_HANDLE_VALUE) //如果读句柄无效
{ {
MessageBox(NULL,_T("无效的读报告句柄!"),NULL,MB_OK); MessageBox(NULL,_T("无效的读报告句柄!"),NULL,MB_OK);
return FALSE; return FALSE;
} }
@@ -275,7 +275,7 @@ int CEF1AUsbDevice::EF1AWriteData(ULONG /*iIndex*/, char* Buffer, int ioLength)
if(m_hWriteHandle==INVALID_HANDLE_VALUE) if(m_hWriteHandle==INVALID_HANDLE_VALUE)
{ {
MessageBox(NULL,_T("无效的写报告句柄!"),NULL,MB_OK); MessageBox(NULL,_T("无效的写报告句柄!"),NULL,MB_OK);
return FALSE; return FALSE;
} }
@@ -1,4 +1,4 @@
// Keyence_LKG5000_Ethernet.cpp : 实现文件 // Keyence_LKG5000_Ethernet.cpp : 实现文件
// //
#include "stdafx.h" #include "stdafx.h"
@@ -13,7 +13,7 @@ const int LK_H_MAX_STORAGE_DATA_SIZE=65535;
extern CKeyence_Laser_LK_H* m_pKeyence_Laser_LK_H; extern CKeyence_Laser_LK_H* m_pKeyence_Laser_LK_H;
// CKeyence_LKG5000_Ethernet 对话框 // CKeyence_LKG5000_Ethernet 对话框
IMPLEMENT_DYNAMIC(CKeyence_LKG5000_Ethernet, CDialogEx) IMPLEMENT_DYNAMIC(CKeyence_LKG5000_Ethernet, CDialogEx)
@@ -54,7 +54,7 @@ BEGIN_MESSAGE_MAP(CKeyence_LKG5000_Ethernet, CDialogEx)
END_MESSAGE_MAP() END_MESSAGE_MAP()
// CKeyence_LKG5000_Ethernet 消息处理程序 // CKeyence_LKG5000_Ethernet 消息处理程序
//====================================================== //======================================================
BOOL CKeyence_LKG5000_Ethernet::OnInitDialog() BOOL CKeyence_LKG5000_Ethernet::OnInitDialog()
{ {
@@ -1,21 +1,21 @@
#pragma once #pragma once
// CKeyence_LKG5000_Ethernet 对话框 // CKeyence_LKG5000_Ethernet 对话框
class CKeyence_LKG5000_Ethernet : public CDialogEx class CKeyence_LKG5000_Ethernet : public CDialogEx
{ {
DECLARE_DYNAMIC(CKeyence_LKG5000_Ethernet) DECLARE_DYNAMIC(CKeyence_LKG5000_Ethernet)
public: public:
CKeyence_LKG5000_Ethernet(CWnd* pParent = NULL); // 标准构造函数 CKeyence_LKG5000_Ethernet(CWnd* pParent = NULL); // 标准构造函数
virtual ~CKeyence_LKG5000_Ethernet(); virtual ~CKeyence_LKG5000_Ethernet();
// 对话框数据 // 对话框数据
enum { IDD = IDD_DIALOG_KEYENCE_LKG5000_ETHERNET }; enum { IDD = IDD_DIALOG_KEYENCE_LKG5000_ETHERNET };
protected: protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog(); virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
@@ -1,4 +1,4 @@
// Keyence_UtilDlg.cpp : 实现文件 // Keyence_UtilDlg.cpp : 实现文件
// //
#include "stdafx.h" #include "stdafx.h"
@@ -36,7 +36,7 @@ float fLaserVaule1(0);
float fLaserVaule2(0); float fLaserVaule2(0);
std::vector<KeyenceReport> LK_GReport; std::vector<KeyenceReport> LK_GReport;
// CKeyence_UtilDlg 对话框 // CKeyence_UtilDlg 对话框
IMPLEMENT_DYNAMIC(CKeyence_UtilDlg, CDialog) IMPLEMENT_DYNAMIC(CKeyence_UtilDlg, CDialog)
@@ -330,7 +330,7 @@ BOOL CKeyence_UtilDlg::ExportReportCSV(const CString &FilePathName)
}; };
#pragma endregion #pragma endregion
// CKeyence_UtilDlg 消息处理程序 // CKeyence_UtilDlg 消息处理程序
#pragma region LK_G_LASER #pragma region LK_G_LASER
//=========================================================== //===========================================================
void CKeyence_UtilDlg::OnBnClickedButtonKeyenceLaserCalibrateValue0() void CKeyence_UtilDlg::OnBnClickedButtonKeyenceLaserCalibrateValue0()
@@ -1,6 +1,6 @@
#pragma once #pragma once
// CKeyence_UtilDlg 对话框 // CKeyence_UtilDlg 对话框
typedef struct{ typedef struct{
char ProgramNo; char ProgramNo;
float OUT1Value; float OUT1Value;
@@ -13,14 +13,14 @@ class CKeyence_UtilDlg : public CDialog
DECLARE_DYNAMIC(CKeyence_UtilDlg) DECLARE_DYNAMIC(CKeyence_UtilDlg)
public: public:
CKeyence_UtilDlg(CWnd* pParent = NULL); // 标准构造函数 CKeyence_UtilDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CKeyence_UtilDlg(); virtual ~CKeyence_UtilDlg();
// 对话框数据 // 对话框数据
enum { IDD = IDD_DIALOG_KEYENCE_LKG3000 }; enum { IDD = IDD_DIALOG_KEYENCE_LKG3000 };
protected: protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog(); virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
protected: protected: