修复乱码

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
//定义输入和输出
//定义输入和输出
#ifdef __DMC2410_EXPORTS
#define DMC2410_API __declspec(dllexport)
#else
@@ -40,23 +40,23 @@ typedef float FLOAT;
extern "C" {
#endif
//--------------------- 板卡初始和配置函数 ----------------------
//--------------------- 板卡初始和配置函数 ----------------------
/********************************************************************************
** 函数名称: d2410_board_init
** 功能描述: 控制板初始化,设置初始化和速度等设置
** 输  入: 无
** 返 回 值: 0:无卡; 1-8:成功(实际卡数)
** 修 改:
** 修改日期: 2012.05.02
** 函数名称: d2410_board_init
** 功能描述: 控制板初始化,设置初始化和速度等设置
** 输  入: 无
** 返 回 值: 0:无卡; 1-8:成功(实际卡数)
** 修 改:
** 修改日期: 2012.05.02
*********************************************************************************/
DMC2410_API int __stdcall d2410_board_init(void);
/********************************************************************************
** 函数名称: d2410_board_close
** 功能描述: 关闭所有卡
** 输  入: 无
** 返 回 值: 无
** 日 期: 2012.05.02
** 函数名称: d2410_board_close
** 功能描述: 关闭所有卡
** 输  入: 无
** 返 回 值: 无
** 日 期: 2012.05.02
*********************************************************************************/
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_version(WORD card);
//脉冲输入输出配置
//脉冲输入输出配置
/********************************************************************************
** 函数名称: d2410_set_pulse_outmode
** 功能描述: 脉冲输出方式的设置
** 输  入: axis - (0 - 3), outmode: 0 - 7
** 6:正交脉冲,A相超前; 7:正交脉冲,B相超前
** 返 回 值: 无
** 修改日期:2012.05.02
** 函数名称: d2410_set_pulse_outmode
** 功能描述: 脉冲输出方式的设置
** 输  入: axis - (0 - 3), outmode: 0 - 7
** 6:正交脉冲,A相超前; 7:正交脉冲,B相超前
** 返 回 值: 无
** 修改日期:2012.05.02
*********************************************************************************/
DMC2410_API DWORD __stdcall d2410_set_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_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_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);
@@ -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_RDY_PIN(WORD axis);
//通用输入/输出控制函数
//通用输入/输出控制函数
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 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 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_imd_stop(WORD axis);
DMC2410_API DWORD __stdcall d2410_emg_stop(void) ;
//位置/速度设置和读取函数
//位置/速度设置和读取函数
DMC2410_API DWORD __stdcall d2410_set_position(WORD axis,long current_position);
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_vector_speed(WORD card);
//状态检测函数
//状态检测函数
DMC2410_API WORD __stdcall d2410_check_done(WORD axis) ;
DMC2410_API WORD __stdcall d2410_axis_io_status(WORD axis);
DMC2410_API DWORD __stdcall d2410_get_rsts(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_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_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_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_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_change_speed(WORD axis,double Curr_Vel);
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_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_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_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_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_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_set_handwheel_inmode(WORD axis,WORD inmode,double multi);
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_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_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 WORD __stdcall d2410_check_success_pulse(WORD axis);
DMC2410_API WORD __stdcall d2410_check_success_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_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_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_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_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);
@@ -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);
//EMG配置
//EMG配置
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_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_get_homelatch_mode(WORD axis,WORD* enable,WORD* logic);
DMC2410_API long __stdcall d2410_get_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 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_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_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_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);
@@ -219,28 +219,28 @@ DMC2410_API DWORD __stdcall d2410_write_CMP_PIN(WORD axis, WORD on_off);
enum ERR_Motion_ERR
{
Motion_ERR_NOERR = 0, //成功
Motion_ERR_UNKNOWN = 1, //未知错误
Motion_ERR_PARAERR = 2, //参数错误
Motion_ERR_NOERR = 0, //成功
Motion_ERR_UNKNOWN = 1, //未知错误
Motion_ERR_PARAERR = 2, //参数错误
Motion_ERR_TIMEOUT = 3, //超时
Motion_ERR_CONTROLLERBUSY = 4, //正在运动中
Motion_ERR_CONNECT_TOOMANY = 5, //板卡数过多
Motion_ERR_TIMEOUT = 3, //超时
Motion_ERR_CONTROLLERBUSY = 4, //正在运动中
Motion_ERR_CONNECT_TOOMANY = 5, //板卡数过多
Motion_ERR_CONTILINE = 6, //连续插补错误
Motion_ERR_NoThisFunction = 7, //暂不支持该功能
Motion_ERR_CANNOT_CONNECTETH = 8, //不能连接
Motion_ERR_HANDLEERR = 9, //卡资源未能找到
Motion_ERR_SENDERR = 10, //pci通信错误
Motion_ERR_FIRMWAREERR = 12, //固件文件错误
Motion_ERR_FIRMWAR_MISMATCH = 14, //固件不匹配
Motion_ERR_CONTILINE = 6, //连续插补错误
Motion_ERR_NoThisFunction = 7, //暂不支持该功能
Motion_ERR_CANNOT_CONNECTETH = 8, //不能连接
Motion_ERR_HANDLEERR = 9, //卡资源未能找到
Motion_ERR_SENDERR = 10, //pci通信错误
Motion_ERR_FIRMWAREERR = 12, //固件文件错误
Motion_ERR_FIRMWAR_MISMATCH = 14, //固件不匹配
Motion_ERR_FIRMWARE_INVALID_PARA = 20, //固件参数错误
Motion_ERR_FIRMWARE_PARA_ERR = 20, //固件参数错误2
Motion_ERR_FIRMWARE_STATE_ERR = 22, //固件当前状态不允许操作
Motion_ERR_FIRMWARE_LIB_STATE_ERR = 22, //固件当前状态不允许操作2
Motion_ERR_FIRMWARE_CARD_NOT_SUPPORT = 24, //固件不支持的功能 控制器不支持的功能
Motion_ERR_FIRMWARE_LIB_NOTSUPPORT = 24, //固件不支持的功能2
Motion_ERR_FIRMWARE_INVALID_PARA = 20, //固件参数错误
Motion_ERR_FIRMWARE_PARA_ERR = 20, //固件参数错误2
Motion_ERR_FIRMWARE_STATE_ERR = 22, //固件当前状态不允许操作
Motion_ERR_FIRMWARE_LIB_STATE_ERR = 22, //固件当前状态不允许操作2
Motion_ERR_FIRMWARE_CARD_NOT_SUPPORT = 24, //固件不支持的功能 控制器不支持的功能
Motion_ERR_FIRMWARE_LIB_NOTSUPPORT = 24, //固件不支持的功能2
};
#ifdef __cplusplus
}
@@ -1,4 +1,4 @@
// HSI_LEADSHINE_DMC2410C.cpp : ¶¨Òå DLL µÄ³õʼ»¯Àý³Ì¡£
// HSI_LEADSHINE_DMC2410C.cpp : 定义 DLL 的初始化例程。
//
#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
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "..\..\..\..\Hsi\HSI.h"
@@ -41,27 +41,27 @@ HSI_Motion::HSI_Motion()
SdkStatusInit();
GetAppPath(m_AppPath);
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";
g_pLogger = new CLogger(dir);
g_pLogger2 = new CLogger(L"\\Log\\DMC2410_Precision.Log");
#ifdef DEBUG
//CString 转 char* 和 char* 转 CString
//CString 转 char* 和 char* 转 CString
//char *cTemp = "";
//CString csTemp(cTemp);
//删除Log目录下的所有文件
//删除Log目录下的所有文件
//CString csStr1 = "del " + m_AppPath;
////f 强制删除只读文件。
////s 从所有子目录删除指定文件。
////q 安静模式。删除全局通配符时,不要求确认。
////a 根据属性选择要删除的文件。
////f 强制删除只读文件。
////s 从所有子目录删除指定文件。
////q 安静模式。删除全局通配符时,不要求确认。
////a 根据属性选择要删除的文件。
//CString csStr2 = csStr1 + L"\\Log\\*.*" + " /f /s /q /a";
//CString csCmd(csStr2);
//USES_CONVERSION;
//const char* cCmd = T2A(csCmd);
//system(cCmd);
//每次删除日志,CString转int 和 int转CString
CString csTimeDay = tm.Format("%d");//显示年月日
//每次删除日志,CString转int 和 int转CString
CString csTimeDay = tm.Format("%d");//显示年月日
int iDay = _ttoi(csTimeDay);
CString csTimeYearMonth = tm.Format("%Y-%m-");
for (int i = iDay; i > 0; i--)
@@ -80,7 +80,7 @@ HSI_Motion::HSI_Motion()
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_Dec_Time[i] = 5.0;
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.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "雷赛运动控制卡打开失败!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "雷赛运动控制卡打开失败!");
EventCallback(sEvenProp);
m_RStatus = d2410_board_close();
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;
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);
//设置编码器为4× A/B(4倍频),必须用3,否则光栅尺的读数一直在跳
//设置编码器为4× A/B(4倍频),必须用3,否则光栅尺的读数一直在跳
m_RStatus = d2410_counter_config(i, 3);
//限位设置,低电平有效,立即停止
//限位设置,低电平有效,立即停止
m_RStatus = d2410_config_EL_MODE(i, 0);
//1表示限位生效
//1表示限位生效
m_RStatus += d2410_Enable_EL_PIN(i, 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_write_SEVON_PIN(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)
{
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_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_Z, (WORD)m_PulseModeDir[3]);
m_RStatus = d2410_set_pulse_outmode(AXIS_A, (WORD)m_PulseModeDir[4]);
//判断是否驱动报警
//判断是否驱动报警
bool bAlarm(false);
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");
return HSI_STATUS_FAILED;
}
//判断急停是否触发
//判断急停是否触发
bool bEmged(false);
IsEmergented(bEmged);
if (bEmged == true && bAlarm == true)
@@ -243,7 +243,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!");
EventCallback(sEvenProp);
return HSI_STATUS_FAILED;
}
@@ -282,7 +282,7 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed)
}
if (CurrentHomeMachineState != E_GTS_HOME_ING)
{
//判断是否需要回家
//判断是否需要回家
if (m_HomeFocus == false)
{
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;
}
CurrentHomeMachineState = E_GTS_HOME_ING;
//回原点前清除位置清零
//回原点前清除位置清零
for (short i = 1; i < 5; i++)
{
m_RStatus = d2410_set_position(i - 1, 0);
m_RStatus = d2410_set_encoder(i - 1, 0);
}
Sleep(10);
//记录运行前的坐标位置,用于回家后还原到该位置
long EncPosMove[5] = { 0 };//运行前的位置
//各轴先跑到限位的一边
//记录运行前的坐标位置,用于回家后还原到该位置
long EncPosMove[5] = { 0 };//运行前的位置
//各轴先跑到限位的一边
g_pLogger->SendAndFlushWithTime(L"[HomeMachine] Go Homing Start Run Limit\n");
if (HSI_STATUS_FAILED == HomeJog(0, 1, true))
{
@@ -324,7 +324,7 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed)
CurrentHomeMachineState = E_GTS_HOME_NONE;
return HSI_STATUS_FAILED;
}
//开始回原点,从限位开始返回找LTC信号
//开始回原点,从限位开始返回找LTC信号
g_pLogger->SendAndFlushWithTime(L"[HomeMachine] HomeFindLTC Go Homing Start Find LTC Signal\n");
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)
{
m_Thread_State = HSI_THREAD_PAUSED;
//第二个参数表示禁用软限位功能
//第二个参数表示禁用软限位功能
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);
if (i == 3)
@@ -400,7 +400,7 @@ HSI_STATUS HSI_Motion::HomeJog(short AxisNumber, short Dir, bool Wait)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "回家超时+!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "回家超时+!");
EventCallback(sEvenProp);
return HSI_STATUS_FAILED;
}
@@ -424,16 +424,16 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
{
g_pLogger->SendAndFlushWithTime(L"[HomeFindLTC] In\n");
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
m_RStatus = d2410_config_latch_mode(CARDNO, 0);//0:单轴锁存 14轴锁存
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
m_RStatus = d2410_config_latch_mode(CARDNO, 0);//0:单轴锁存 14轴锁存
for (short i = 1; i < 5; i++)
{
if (m_Home_Machine_Axis[i] == 1)
{
//第二个参数表示禁用软限位功能
//第二个参数表示禁用软限位功能
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);
if (i == 3)//不能使用JOG模式,因为要运动过程中改变位置回到锁存的位置,所以要用点位运动
if (i == 3)//不能使用JOG模式,因为要运动过程中改变位置回到锁存的位置,所以要用点位运动
{
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);
@@ -447,7 +447,7 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
}
long DoneStatus[5] = { 1, 1, 1, 1, 1 };
long LatchPos[5] = { 0 };//锁存的位置
long LatchPos[5] = { 0 };//锁存的位置
long EncPos = 0;
long PrfPos = 0;
long temp[5] = { 0 };
@@ -475,8 +475,8 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
LTCStatus = d2410_get_latch_flag(CARDNO);
if (((LTCStatus >> (7 + i)) & 1) == 1)
{
//找到LTC后,偏移一段距离
//if (i==3)//接线有误,只有绝对位置值,当规划位置和实际位置的方向不一致时,就会失败
//找到LTC后,偏移一段距离
//if (i==3)//接线有误,只有绝对位置值,当规划位置和实际位置的方向不一致时,就会失败
//{
// 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);
CurrentHomeMachineState = E_GTS_HOME_NONE;
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
AbortMotion();
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
char messageAlarmDis[100] = "";
_itoa_s(i, messageAlarmDis, 30, 10);
strcat_s(messageAlarmDis, 100, " 实际位置和规划位置方向不一致\n");
strcat_s(messageAlarmDis, 100, " 实际位置和规划位置方向不一致\n");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarmDis);
EventCallback(sEvenProp);
}
@@ -514,7 +514,7 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
return HSI_STATUS_FAILED;
}
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();
CurrentHomeMachineState = E_GTS_HOME_NONE;
sEvenProp.EventType = HSI_EVENT_ERROR;
@@ -522,7 +522,7 @@ HSI_STATUS HSI_Motion::HomeFindLTC()
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
char messageAlarm[100] = "";
_itoa_s(i, messageAlarm, 30, 10);
strcat_s(messageAlarm, 100, " 轴没有找到原点LTC信号!");
strcat_s(messageAlarm, 100, " 轴没有找到原点LTC信号!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp);
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");
AbortMotion();
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "回家超时-");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "回家超时-");
EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED;
}
@@ -575,12 +575,12 @@ HSI_STATUS HSI_Motion::IsHomed(bool &bHomed)
if (g_pHSI_Motion)
{
g_pLogger->SendAndFlushWithTime(L"[IsHomed] In\n");
long EncPos[5] = { 0 };//运行前的位置
long PrfPos[5] = { 0 };//读取规划位置
long EncPos[5] = { 0 };//运行前的位置
long PrfPos[5] = { 0 };//读取规划位置
short HomedFlag[5] = { 0 };
int HomedStatus = 0;
int Count = 0;
if (bHomed == true)//定位是增大判断精度
if (bHomed == true)//定位是增大判断精度
{
Count = 1000;
}
@@ -593,7 +593,7 @@ HSI_STATUS HSI_Motion::IsHomed(bool &bHomed)
return HSI_STATUS_NORMAL;
}
//采用规划位置和实际位置脉冲进行比较,判断是否回家
//采用规划位置和实际位置脉冲进行比较,判断是否回家
for (short i = 1; i < 5; i++)
{
EncPos[i] = d2410_get_encoder(i - 1);
@@ -617,7 +617,7 @@ HSI_STATUS HSI_Motion::IsHomed(bool &bHomed)
}
}
//采用实际位置和关闭软件记录的位置比较,判断是否回家
//采用实际位置和关闭软件记录的位置比较,判断是否回家
if (m_IsHomeEncPos == 1)
{
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;
}
}
//判断回家捕获的状态
//判断回家捕获的状态
for (int i = 1; i < 5; i++)
{
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_Z, 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;
}
else
@@ -738,7 +738,7 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed)
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
char messageAlarm[100];
_itoa_s(AxisNumber + 1, messageAlarm, 30, 10);
strcat_s(messageAlarm, 100, "轴驱动器报警_Jog");
strcat_s(messageAlarm, 100, "轴驱动器报警_Jog");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp);
return HSI_STATUS_FAILED;
@@ -749,7 +749,7 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed)
double JogSpeed(1.0);
double StartV(1.0);
JogSpeed = SpeedPercent(Speed, StartV, AccTime, DecTime);
WORD JOGDir = 1;//正负表方向,1正方向,-1负方向
WORD JOGDir = 1;//正负表方向,1正方向,-1负方向
JOGDir = Speed > 0 ? 1 : 0;
if (JogSpeed > 600)
{
@@ -757,13 +757,13 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed)
}
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]));
g_pLogger->SendAndFlushWithTime(L"[Jog] d2410_config_softlimit Enable Softlimit m_RStatus = %d\n", m_RStatus);
}
else
{
//第二个参数表示禁用软限位功能
//第二个参数表示禁用软限位功能
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);
}
@@ -860,13 +860,13 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] In\n");
if (CurrentMotionState != E_SO7_MOTION_MOVETO)
{
//定位前判断是否驱动报警
//定位前判断是否驱动报警
if (HSI_STATUS_FAILED == DriverAlarmStatus())
{
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyz] DriverAlarmStatus HSI_STATUS_FAILED\n");
return HSI_STATUS_FAILED;
}
//判断急停是否触发
//判断急停是否触发
bool bEmged(false);
IsEmergented(bEmged);
if (bEmged == true)
@@ -876,12 +876,12 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!");
EventCallback(sEvenProp);
return HSI_STATUS_FAILED;
}
//定位前判断是否已经回家
//定位前判断是否已经回家
bool home(true);
IsHomed(home);
if (false == home)
@@ -891,7 +891,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "没有回家,请回家之后再试!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "没有回家,请回家之后再试!");
EventCallback(sEvenProp);
return HSI_STATUS_FAILED;
}
@@ -917,7 +917,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
m_PosThread[3] = PositionZ;
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");
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 };
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]);
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);
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);
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);
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];
//m_pGT_GetEncPos(1, &EncPos[1], 4, NULL);
//int i = 0;
//while (i < m_SetPotion_Count[1])//到位次数判断
//while (i < m_SetPotion_Count[1])//到位次数判断
//{
// m_pGT_GetEncPos(1, &EncPos[1], 4, NULL);
// if (m_FlyRadius == 1000)
@@ -1002,7 +1002,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
// {
// i++;
// }
// else if (count > m_PrecisionTime[1] || g_IsClose == true) //超时退出
// else if (count > m_PrecisionTime[1] || g_IsClose == true) //超时退出
// {
// if (g_IsClose == false)
// {
@@ -1011,7 +1011,7 @@ HSI_STATUS HSI_Motion::SetPositionXyz(UINT AxisTypes, double PositionX, double
// sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Wait_XYZA定位超时!");
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Wait_XYZA定位超时!");
// EventCallback(sEvenProp);
// }
// if (g_IsClose == true)
@@ -1066,7 +1066,7 @@ HSI_STATUS HSI_Motion::SetPositionXyza(UINT AxisTypes, double PositionX, double
{
m_PositionA = PositionA;
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyza] In\n");
//AxisTypes = 0xf,表示4轴做插补运动
//AxisTypes = 0xf,表示4轴做插补运动
rStatus = SetPositionXyz(AxisTypes, PositionX, PositionY, PositionZ, eType, dFlyRadius);
g_pLogger->SendAndFlushWithTime(L"[SetPositionXyza] Out\n");
}
@@ -1099,13 +1099,13 @@ HSI_STATUS HSI_Motion::Load_Motion_Inifile(CString DMCIniFile)
USES_CONVERSION;
CString temp = "";
CString axisNum[5] = { L"0", L"1", L"2", L"3", L"4" };
//判断Log目录是否存在,不存在就创建
//判断Log目录是否存在,不存在就创建
if (CreateDirectory(m_AppPath + "\\Log", NULL))
{
g_pLogger->SendAndFlushWithTime(L"[Load_Motion_Inifile] Create Log Directory\n");
CreateDirectory(m_AppPath + "\\Log", NULL);
}
//判断是否存在该文件
//判断是否存在该文件
if (GetFileAttributes(DMCIniFile) == -1)
{
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.EventID = HSI_EVENT_MOTION;
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);
return HSI_STATUS_FAILED;
}
@@ -1184,7 +1184,7 @@ HSI_STATUS HSI_Motion::Load_Config_Inifile(CString ConfigFile)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
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);
return HSI_STATUS_FAILED;
}
@@ -1292,7 +1292,7 @@ void HSI_Motion::UpdateMotionState()
int i = 0;
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[2] = d2410_get_encoder(AXIS_Y);
@@ -1314,7 +1314,7 @@ void HSI_Motion::UpdateMotionState()
{
i++;
}
else if (Count > TimeCount || g_IsClose == true) //超时退出
else if (Count > TimeCount || g_IsClose == true) //超时退出
{
if (g_IsClose == false)
{
@@ -1332,7 +1332,7 @@ void HSI_Motion::UpdateMotionState()
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Nowait_XYZA定位超时!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "Nowait_XYZA定位超时!");
EventCallback(sEvenProp);
}
else
@@ -1409,7 +1409,7 @@ void HSI_Motion::UpdateMotionStateIO()
while (m_Thread_StateIO == HSI_THREAD_RUNNING)
{
Status = d2410_read_inport(CARDNO);
//1个脚踏开关
//1个脚踏开关
if (m_IsFootSwitch == 1)
{
if ((Status & m_FootSwitchInport) == 0 && FootSwitchStatus == false)
@@ -1427,7 +1427,7 @@ void HSI_Motion::UpdateMotionStateIO()
EventCallback(sEvenProp);
}
}
//急停功能
//急停功能
if (m_IsQuickStop == 1)
{
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)
{
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");
sEvenProp.Init();
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "急停已触发!!!");
EventCallback(sEvenProp);
}
if (QuickStopFlag == true)
{
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.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DoEvents_异常");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DoEvents_异常");
EventCallback(sEvenProp);
}
if (g_IsClose)
@@ -1507,23 +1507,23 @@ HSI_STATUS HSI_Motion::DriverAlarmStatus()
char messageAlarm[100] = "";
if ((AlarmStatus[1] >> 11 & 1) == 1)
{
strcat_s(messageAlarm, 30, "1、");
strcat_s(messageAlarm, 30, "1、");
}
if ((AlarmStatus[2] >> 11 & 1) == 1)
{
strcat_s(messageAlarm, 30, "2、");
strcat_s(messageAlarm, 30, "2、");
}
if ((AlarmStatus[3] >> 11 & 1) == 1)
{
strcat_s(messageAlarm, 30, "3、");
strcat_s(messageAlarm, 30, "3、");
}
if ((AlarmStatus[4] >> 11 & 1) == 1)
{
strcat_s(messageAlarm, 30, "4、");
strcat_s(messageAlarm, 30, "4、");
}
CString temp(messageAlarm);
g_pLogger->SendAndFlushWithTime(temp + L" axis drive alarm!\n");
strcat_s(messageAlarm, 100, "轴驱动器报警!");
strcat_s(messageAlarm, 100, "轴驱动器报警!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp);
if (sEvenProp.EventCallbackID == HSI_EVENT_RESPONSE_CANCEL)
@@ -1531,7 +1531,7 @@ HSI_STATUS HSI_Motion::DriverAlarmStatus()
g_pLogger->SendAndFlushWithTime(L"[DriverAlarmStatus] CANCEL");
return HSI_STATUS_NORMAL;
}
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
m_RStatus = d2410_reset_latch_flag(CARDNO);//清除锁存标志
return HSI_STATUS_FAILED;
}
g_pLogger->SendAndFlushWithTime(L"[DriverAlarmStatus] Out\n");
@@ -1581,7 +1581,7 @@ HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status)
_Status |= temp;
}
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出
{
_Status = d2410_read_outport(CARDNO);
_Status &= 0x0000ffff;
@@ -1600,7 +1600,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
auto rStatus = HSI_STATUS_NORMAL;
if (g_pHSI_Motion)
{
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //设置通用输出
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //设置通用输出
{
_Status &= 0x0000ffff;
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;
if (g_pHSI_Motion)
{
//触发的位置为相对位置,用法一般是移动到起点位置,再开始设置触发位置(相对位置),最终设置终点位置
//触发的位置为相对位置,用法一般是移动到起点位置,再开始设置触发位置(相对位置),最终设置终点位置
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] In\n");
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.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "每个元素触发的个数不能超过8个");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "每个元素触发的个数不能超过8个");
EventCallback(sEvenProp);
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);
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_write_outbit(CARDNO, 21, 1);
Sleep(m_ManualTriggerHold);
m_RStatus = d2410_write_outbit(CARDNO, 21, 0);
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);
long StartPos = d2410_get_encoder(AxisNumber);
//功能:查询可以加入的比较点数量
//功能:查询可以加入的比较点数量
long Remainder = d2410_compare_get_points_remained_Extern(CARDNO, 0);
//long num2 = d2410_compare_get_points_remained_Extern(CARDNO, 1);
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_config_Extern(CARDNO, 0, 1, AxisNumber, 1);
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] d2410_compare_config_Extern m_RStatus = %d\n", m_RStatus);
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;
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];
//添加高速位置比较器;卡号,队列0,编码器绝对位置,方向,脉冲宽度模式100us,输出端口号
//添加高速位置比较器;卡号,队列0,编码器绝对位置,方向,脉冲宽度模式100us,输出端口号
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]);
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]);
}
}
if (eType == HSI_SCAN_MOTION_EQ_DIS)//等间隔
if (eType == HSI_SCAN_MOTION_EQ_DIS)//等间隔
{
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] no interval mode\n");
rStatus = HSI_STATUS_FAILED;
@@ -2059,7 +2059,7 @@ double HSI_Motion::LimitOver(UINT AxisTypes, double &LimitPos)
{
switch (AxisNumber)
{
case 0: //轴1
case 0: //轴1
{
if (LimitPos > 0)
{
@@ -1,4 +1,4 @@
// HSI_Illumination.cpp : ¶¨Òå DLL µÄ³õʼ»¯Àý³Ì¡£
// HSI_Illumination.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "..\..\..\SevenOcean\SO7_Proto.h"
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "..\..\..\..\Hsi\HSI.h"
@@ -15,8 +15,8 @@
#define BUFF_SIZE 16
HSI_Motion *g_pHSI_Motion = nullptr;
extern CSO7_Proto* g_pSO7_Proto;
HANDLE hCom;//串口句柄
unsigned char SendBuff[BUFF_SIZE];//发送接收缓冲区
HANDLE hCom;//串口句柄
unsigned char SendBuff[BUFF_SIZE];//发送接收缓冲区
//===========================================================================
HANDLE HSI_Motion::m_Thread_Id = NULL;
HANDLE HSI_Motion::m_Thread_Mutex = NULL;
@@ -62,18 +62,18 @@ int HSI_Motion::Port1616IOInit()
{
while (true)
{
for (i = 1; i < 257; i++)//从1到256遍历所有com
for (i = 1; i < 257; i++)//从1到256遍历所有com
{
char buf[10];
sprintf_s(buf, "COM%d", i);
CString comName(buf);
hCom = CreateFile(comName,
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式,串口必须为0
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式,串口必须为0
NULL,
OPEN_EXISTING, //打开而不是创建,串口必须为打开
0, //同步方式,同步执行时,函数直到操作完成后才返回
NULL);//串口必须为NULL
OPEN_EXISTING, //打开而不是创建,串口必须为打开
0, //同步方式,同步执行时,函数直到操作完成后才返回
NULL);//串口必须为NULL
if (hCom != (HANDLE)-1)
{
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
@@ -96,7 +96,7 @@ int HSI_Motion::Port1616IOInit()
return 1;//Setting Error!!!!
}
//设置读写超时时间
//设置读写超时时间
COMMTIMEOUTS to;
@@ -107,8 +107,8 @@ int HSI_Motion::Port1616IOInit()
SetCommTimeouts(hCom, &to);
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
//判断COM口是否打开正确
unsigned char rtn = SendData(0x8000);//15号端口作为测试用
//判断COM口是否打开正确
unsigned char rtn = SendData(0x8000);//15号端口作为测试用
if (rtn == 1)
{
i++;
@@ -179,7 +179,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "IO串口打开失败!!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "IO串口打开失败!!");
EventCallback(sEvenProp);
CloseHandle(hCom);
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;
if (g_pSO7_Proto)
{
if (IOChannel == HSI_MOTION_OUTPUT_CH3) //设置通用输出
if (IOChannel == HSI_MOTION_OUTPUT_CH3) //设置通用输出
{
unsigned char rtn = SendData(_Status);
if (rtn == 1)
@@ -636,7 +636,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "发送数据失败!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "发送数据失败!");
EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED;
}
@@ -1155,7 +1155,7 @@ HSI_STATUS HSI_Motion::IOStep(bool RunSts)
return rStatus;
}
//串口控制器
//串口控制器
//===========================================================================
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)
{
SendBuff[0] = 0x00;//固定为00H
SendBuff[1] = 0x5A;//固定为5AH=01011010B
SendBuff[2] = 0x61;//十六路为61H
SendBuff[3] = Address;//地址,由板子的短路针决定0
SendBuff[4] = Command;//命令
SendBuff[0] = 0x00;//固定为00H
SendBuff[1] = 0x5A;//固定为5AH=01011010B
SendBuff[2] = 0x61;//十六路为61H
SendBuff[3] = Address;//地址,由板子的短路针决定0
SendBuff[4] = Command;//命令
SendBuff[5] = (unsigned char)ComData1;//数据Y7..Y0
SendBuff[6] = (unsigned char)ComData2;//数据Y15..Y8
SendBuff[7] = 0x00;//数据
SendBuff[8] = 0x00;//数据
SendBuff[9] = 0x00;//数据
SendBuff[10] = 0x00;//数据
SendBuff[11] = 0x00;//数据
SendBuff[12] = 0x00;//数据
SendBuff[13] = 0x00;//数据
SendBuff[14] = 0x00;//数据
SendBuff[15] = 0x00;//校验和
SendBuff[5] = (unsigned char)ComData1;//数据Y7..Y0
SendBuff[6] = (unsigned char)ComData2;//数据Y15..Y8
SendBuff[7] = 0x00;//数据
SendBuff[8] = 0x00;//数据
SendBuff[9] = 0x00;//数据
SendBuff[10] = 0x00;//数据
SendBuff[11] = 0x00;//数据
SendBuff[12] = 0x00;//数据
SendBuff[13] = 0x00;//数据
SendBuff[14] = 0x00;//数据
SendBuff[15] = 0x00;//校验和
SetSum(SendBuff);//设置校验和
SetSum(SendBuff);//设置校验和
}
//===========================================================================
unsigned char HSI_Motion::SendData(UINT Output)
@@ -1221,7 +1221,7 @@ unsigned char HSI_Motion::SendData(UINT Output)
Bit8_15 = Output & 0xff00;
Bit8_15 >>= 8;
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;
ReadData(temp, IsSuccess);
if (IsSuccess != Output)
@@ -1238,10 +1238,10 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
{
unsigned long Bytes = 0;
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
SetSendBuff(0, 0x05, 0, 0); //随便发点东西0x06,才能读取数据
WriteFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//把16字节发送出去
SetSendBuff(0, 0x05, 0, 0); //随便发点东西0x06,才能读取数据
WriteFile(hCom, SendBuff, BUFF_SIZE, &Bytes, NULL);//把16字节发送出去
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 <<= 8;
Input |= SendBuff[7];
@@ -1254,7 +1254,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
// sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "校验失败!");
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "校验失败!");
// EventCallback(sEvenProp);
// return 1;
//}
@@ -1266,7 +1266,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
// sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "读取数据失败!");
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "读取数据失败!");
// EventCallback(sEvenProp);
// return 1;
// }
@@ -1,4 +1,4 @@
// HSI_Illumination.cpp : 定义 DLL 的初始化例程。
// HSI_Illumination.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "..\..\..\SevenOcean\CMMIO_SERIAL.h"
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "..\logger.h"
@@ -396,7 +396,7 @@ void HSI_Motion::UpdateMotionStateIO()
sEvenProp.EventType = HSI_EVENT_NOTIFY;
sEvenProp.EventID = HSI_NOTIFY_CLEAR_ITERATIONS;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "PLC停止运行,软件将重置运行信息!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "PLC停止运行,软件将重置运行信息!");
EventCallback(sEvenProp);
}
m_iRunningStatus = iSignal1;
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "..\..\..\..\Hsi\HSI.h"
@@ -13,8 +13,8 @@
#define BUFF_SIZE 16
HANDLE hCom;//串口句柄
unsigned char SendBuff[BUFF_SIZE];//发送接收缓冲区
HANDLE hCom;//串口句柄
unsigned char SendBuff[BUFF_SIZE];//发送接收缓冲区
HSI_Motion *g_pHSI_Motion = nullptr;
//===========================================================================
HANDLE HSI_Motion::m_Thread_Id = NULL;
@@ -47,18 +47,18 @@ int HSI_Motion::Port1616IOInit()
{
while (true)
{
for (i = 1; i < 257; i++)//从1到256遍历所有com
for (i = 1; i < 257; i++)//从1到256遍历所有com
{
char buf[10];
sprintf_s(buf, "COM%d", i);
CString comName(buf);
hCom = CreateFile(comName,
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式,串口必须为0
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式,串口必须为0
NULL,
OPEN_EXISTING, //打开而不是创建,串口必须为打开
0, //同步方式,同步执行时,函数直到操作完成后才返回
NULL);//串口必须为NULL
OPEN_EXISTING, //打开而不是创建,串口必须为打开
0, //同步方式,同步执行时,函数直到操作完成后才返回
NULL);//串口必须为NULL
if (hCom != (HANDLE)-1)
{
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
@@ -81,7 +81,7 @@ int HSI_Motion::Port1616IOInit()
return 1;//Setting Error!!!!
}
//设置读写超时时间
//设置读写超时时间
COMMTIMEOUTS to;
memset(&to, 0, sizeof(to));
to.ReadIntervalTimeout = 100;
@@ -91,8 +91,8 @@ int HSI_Motion::Port1616IOInit()
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
//判断COM口是否打开正确
unsigned char rtn = SendData(0x8000);//15号端口作为测试用
//判断COM口是否打开正确
unsigned char rtn = SendData(0x8000);//15号端口作为测试用
if (rtn == 1)
{
i++;
@@ -135,7 +135,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "串口打开是失败!!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "串口打开是失败!!");
EventCallback(sEvenProp);
CloseHandle(hCom);
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)
{
SendBuff[0] = 0x00;//固定为00H
SendBuff[1] = 0x5A;//固定为5AH=01011010B
SendBuff[2] = 0x61;//十六路为61H
SendBuff[3] = Address;//地址,由板子的短路针决定0
SendBuff[4] = Command;//命令
SendBuff[0] = 0x00;//固定为00H
SendBuff[1] = 0x5A;//固定为5AH=01011010B
SendBuff[2] = 0x61;//十六路为61H
SendBuff[3] = Address;//地址,由板子的短路针决定0
SendBuff[4] = Command;//命令
SendBuff[5] = (unsigned char)ComData1;//数据Y7..Y0
SendBuff[6] = (unsigned char)ComData2;//数据Y15..Y8
SendBuff[7] = 0x00;//数据
SendBuff[8] = 0x00;//数据
SendBuff[9] = 0x00;//数据
SendBuff[10] = 0x00;//数据
SendBuff[11] = 0x00;//数据
SendBuff[12] = 0x00;//数据
SendBuff[13] = 0x00;//数据
SendBuff[14] = 0x00;//数据
SendBuff[15] = 0x00;//校验和
SendBuff[5] = (unsigned char)ComData1;//数据Y7..Y0
SendBuff[6] = (unsigned char)ComData2;//数据Y15..Y8
SendBuff[7] = 0x00;//数据
SendBuff[8] = 0x00;//数据
SendBuff[9] = 0x00;//数据
SendBuff[10] = 0x00;//数据
SendBuff[11] = 0x00;//数据
SendBuff[12] = 0x00;//数据
SendBuff[13] = 0x00;//数据
SendBuff[14] = 0x00;//数据
SendBuff[15] = 0x00;//校验和
SetSum(SendBuff);//设置校验和
SetSum(SendBuff);//设置校验和
}
//===========================================================================
unsigned char HSI_Motion::SendData(UINT Output)
@@ -211,7 +211,7 @@ unsigned char HSI_Motion::SendData(UINT Output)
Bit8_15 = Output & 0xff00;
Bit8_15 >>= 8;
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;
ReadData(temp,IsSuccess);
IsSuccess = SendBuff[6];
@@ -229,7 +229,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
unsigned long Bytes = 0;
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
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 <<= 8;
Input |= SendBuff[7];
@@ -242,7 +242,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
// sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "校验失败!");
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "校验失败!");
// EventCallback(sEvenProp);
// return 1;
//}
@@ -254,7 +254,7 @@ unsigned char HSI_Motion::ReadData(UINT &Input, UINT &Output)
// sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "读取数据失败!");
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "读取数据失败!");
// EventCallback(sEvenProp);
// 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;
if (g_pHSI_Motion)
{
if (IOChannel == HSI_MOTION_OUTPUT_CH3) //设置通用输出
if (IOChannel == HSI_MOTION_OUTPUT_CH3) //设置通用输出
{
unsigned char rtn = SendData(_Status);
if (rtn == 1)
@@ -434,7 +434,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "发送数据失败!");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "发送数据失败!");
EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED;
}
@@ -1,4 +1,4 @@
// HSI_PORT_1616IO.cpp : 定义 DLL 应用程序的导出函数。
// HSI_PORT_1616IO.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
@@ -1,13 +1,13 @@
// HSI_PORT_1616IO.h : 定义 DLL 应用程序的导出函数。
// HSI_PORT_1616IO.h : 定义 DLL 应用程序的导出函数。
//
#pragma once
#ifndef __AFXWIN_H__
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif
#include "resource.h" // 主符号
#include "resource.h" // 主符号
#include <cstring>
@@ -1,4 +1,4 @@
// HSI_Illumination.cpp : 定义 DLL 的初始化例程。
// HSI_Illumination.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.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.EventResponse = HSI_EVENT_RESPONSE_OK;
_itoa_s(m_iSerialComPortA, messageAlarm, 30, 10);
strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败");
strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED;
@@ -167,7 +167,7 @@ HSI_STATUS HSI_Illumination::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
_itoa_s(m_iSerialComPortB, messageAlarm, 30, 10);
strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败");
strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm);
EventCallback(sEvenProp);
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++)
{
//共26盏灯,到[2, 66]
//共26盏灯,到[2, 66]
if (i == 4 && j >= 2)
{
break;
@@ -810,7 +810,7 @@ VOID HSI_Illumination::EventCallback(sHSIEventProperties& sEventProp)
}
//========================光源控制器USB控制==================================
//========================光源控制器USB控制==================================
//===========================================================================
//bool HSI_Illumination::FindTheHID()
//{
@@ -1,4 +1,4 @@
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
// HSI_Motion.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "..\..\..\..\Hsi\HSI.h"
@@ -44,7 +44,7 @@ HSI_Motion::HSI_Motion()
g_IsClose = false;
m_Result = 0;
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";
g_pLogger = new CLogger(dir);
GetAppPath(m_AppPath);
@@ -76,7 +76,7 @@ HSI_Motion::HSI_Motion()
m_cSendData[8] = 0;//17-24
m_cSendData[9] = 0xff;//9-16
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[13] = 0xff;//9-16
//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");
return HSI_STATUS_NORMAL;
}
//读取配置文件LLC_Motion和LLC_Config
//读取配置文件LLC_Motion和LLC_Config
CString FileMotionName(_T(""));
FileMotionName = m_AppPath + _T("\\Config\\LLC_Motion.ini");
Load_Motion_Inifile(FileMotionName);
@@ -132,7 +132,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式打开失败");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式打开失败");
EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED;
}
@@ -140,7 +140,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
{
if (m_ResetTime != 0)
{
//发送复位LLC控制器的指令
//发送复位LLC控制器的指令
byte cSendData[63] = { 0 };
cSendData[0] = 0x01;
cSendData[1] = 0x02;
@@ -159,7 +159,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式重新打开失败");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式重新打开失败");
EventCallback(sEvenProp);
rStatus = HSI_STATUS_FAILED;
}
@@ -283,7 +283,7 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed)
// sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式打开失败");
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器 USB模式打开失败");
// EventCallback(sEvenProp);
// }
// else
@@ -325,7 +325,7 @@ HSI_STATUS HSI_Motion::GetPositionXyz(UINT AxisTypes, double &PositionX, double
auto rStatus = HSI_STATUS_NORMAL;
UNREFERENCED_PARAMETER(AxisTypes);
UNREFERENCED_PARAMETER(Time);
//读取3个轴的位置
//读取3个轴的位置
CString tempStr;
if (g_pHSI_Motion)
{
@@ -389,7 +389,7 @@ HSI_STATUS HSI_Motion::Load_Motion_Inifile(CString MotionIniFile)
CString csAppPath = MotionIniFile;
USES_CONVERSION;
CString temp("");
//判断Log目录是否存在,不存在就创建
//判断Log目录是否存在,不存在就创建
if (CreateDirectory(m_AppPath + "\\Log", NULL))
{
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.EventID = HSI_EVENT_MOTION;
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);
return HSI_STATUS_FAILED;
}
@@ -440,7 +440,7 @@ HSI_STATUS HSI_Motion::Load_Config_Inifile(CString ConfigIniFile)
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
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);
return HSI_STATUS_FAILED;
}
@@ -491,13 +491,13 @@ void HSI_Motion::SendMsgMotionFinished()
void HSI_Motion::UpdateMotionState()
{
BOOL bReturn = false;
//m_cReceiveData[7]表示输入输出的状态
//m_cReceiveData[1]输入9-16
//m_cReceiveData[2]输入1-8
//m_cReceiveData[3]输入25-32
//m_cReceiveData[4]输入17-24
//m_cReceiveData[5]输入9-16
//m_cReceiveData[6]输入1-8
//m_cReceiveData[7]表示输入输出的状态
//m_cReceiveData[1]输入9-16
//m_cReceiveData[2]输入1-8
//m_cReceiveData[3]输入25-32
//m_cReceiveData[4]输入17-24
//m_cReceiveData[5]输入9-16
//m_cReceiveData[6]输入1-8
if (g_pHSI_Motion)
{
while (m_bSTM32UsbFlag)
@@ -545,7 +545,7 @@ void HSI_Motion::UpdateMotionStateIO()
int StartFlag = 0;
while (m_bSTM32UsbFlag)
{
//1个脚踏开关
//1个脚踏开关
if (m_IOStatusEnabled)
{
if (m_IsStartInput == 1)
@@ -592,7 +592,7 @@ void HSI_Motion::DoEvents()
sEvenProp.EventType = HSI_EVENT_ERROR;
sEvenProp.EventID = HSI_EVENT_MOTION;
sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DoEvents_异常");
strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "DoEvents_异常");
EventCallback(sEvenProp);
}
if (g_IsClose)
@@ -630,7 +630,7 @@ HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status)
auto rStatus = HSI_STATUS_NORMAL;
if (g_pHSI_Motion)
{
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出
if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出
{
if (m_cReceiveData[7] == 7)
{
@@ -665,7 +665,7 @@ HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
short rtn(0);
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);
m_cSendData[13] = (_Status >> 8);
@@ -697,7 +697,7 @@ HSI_STATUS HSI_Motion::Shutdown()
if (m_bSTM32UsbFlag == true)
{
AbortMotion();
Sleep(10);//延时10ms关闭灯光
Sleep(10);//延时10ms关闭灯光
byte cSendData[63] = { 0 };
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;
if (g_pHSI_Motion)
{
//触发的位置为相对位置,用法一般是移动到起点位置,再开始设置触发位置(相对位置),最终设置终点位置
//触发的位置为相对位置,用法一般是移动到起点位置,再开始设置触发位置(相对位置),最终设置终点位置
g_pLogger->SendAndFlushWithTime(L"[DCCScanSetData] In\n");
}
@@ -1072,7 +1072,7 @@ double HSI_Motion::LimitOver(UINT AxisTypes, double &LimitPos)
{
switch (AxisNumber)
{
case 1: //轴1
case 1: //轴1
{
if (LimitPos > 0)
{
@@ -1334,7 +1334,7 @@ HSI_STATUS HSI_Motion::SetAccelerationEx(UINT AxisTypes, double Accel)
//========================光源控制器USB控制==================================
//========================光源控制器USB控制==================================
//===========================================================================
bool HSI_Motion::FindTheHID()
{
@@ -1494,7 +1494,7 @@ BOOL HSI_Motion::WriteUsbReport(byte SendData[])
// sEvenProp.EventType = HSI_EVENT_ERROR;
// sEvenProp.EventID = HSI_EVENT_MOTION;
// sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK;
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器没有连接");
// strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "LLC控制器没有连接");
// EventCallback(sEvenProp);
//}
}
@@ -16,7 +16,7 @@
#define MAX_BUFF_SIZE 0x200
const double SCALE_UNITS = 1000.0;
static CLogger* g_pLogger;
static bool g_IsClose;//用于DoEvents()的退出,而不异常
static bool g_IsClose;//用于DoEvents()的退出,而不异常
enum E_SO7_MOTION_TYPE
{
@@ -27,9 +27,9 @@ enum E_SO7_MOTION_TYPE
};
enum E_GTS_HOME_STATUS
{
E_GTS_HOME_NONE,//0表示从未回过回原点
E_GTS_HOME_ING,//1表示正在回原点
E_GTS_HOME_FINISHED,//2表示已经回过原点
E_GTS_HOME_NONE,//0表示从未回过回原点
E_GTS_HOME_ING,//1表示正在回原点
E_GTS_HOME_FINISHED,//2表示已经回过原点
};
class HSI_Motion : public HSI
{
@@ -102,16 +102,16 @@ public:
static HANDLE m_Thread_Id;
static HANDLE m_Thread_Mutex;
static HANDLE m_hTriggerEvent;
//用于IO发消息的线程
//用于IO发消息的线程
static int m_Thread_StateIO;
static HANDLE m_Thread_IdIO;
static HANDLE m_Thread_MutexIO;
static HANDLE m_hTriggerEventIO;
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_N_Work_Limit[5];
@@ -125,40 +125,40 @@ public:
double m_SetPotion_Speed[9];
double m_SetPotion_Acc[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_Dec[5];
int m_IsComPortA = 0;//是否打开第一个串口,1为打开,0为关闭,默认0
int m_IsComPortB = 0;//是否打开第二个串口,1为打开,0为关闭,默认0
int m_ComPortA = 3;//用于打开灯光的串口A
int m_ComPortB = 4;//用于打开灯光的串口B
int m_ComPortALed[5];//对应输出的4个接口A
int m_ComPortBLed[5];//对应输出的4个接口B
int m_ComPortCppWpf;//启用c++调用灯光为0,还是wpf直接调用为1,默认0
int m_IsSTM32Usb = 0;//启用STM32控制器时是否使用USB,默认0
int m_IsComPortA = 0;//是否打开第一个串口,1为打开,0为关闭,默认0
int m_IsComPortB = 0;//是否打开第二个串口,1为打开,0为关闭,默认0
int m_ComPortA = 3;//用于打开灯光的串口A
int m_ComPortB = 4;//用于打开灯光的串口B
int m_ComPortALed[5];//对应输出的4个接口A
int m_ComPortBLed[5];//对应输出的4个接口B
int m_ComPortCppWpf;//启用c++调用灯光为0,还是wpf直接调用为1,默认0
int m_IsSTM32Usb = 0;//启用STM32控制器时是否使用USB,默认0
int m_IsIOFuntion=0;//是否启动IO功能,1为打开,0为关闭
int m_IsStartInput = 0;//是否启用脚踏开关功能,1为启用,0为关闭,默认0
UINT m_StartInputPort = 1;//外部输入按钮启动程序
int m_IsIOFuntion=0;//是否启动IO功能,1为打开,0为关闭
int m_IsStartInput = 0;//是否启用脚踏开关功能,1为启用,0为关闭,默认0
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;
CString m_AppPath;
int m_Result;
static unsigned __stdcall m_Thread(LPVOID pThis);
//用于IO发消息的线程
//用于IO发消息的线程
static unsigned __stdcall m_ThreadIO(LPVOID pThis);
static unsigned __stdcall m_ThreadStep(LPVOID pThis);
double ScaleToMM(long lCount, double dResolution);
long MMtoScale(double lDistanceMM, double dResolution);
//STM32 usb控制
//STM32 usb控制
bool m_bSTM32UsbFlag;
HANDLE m_DeviceHandle;
HANDLE m_hEventObject;
@@ -193,12 +193,12 @@ public:
private:
void CreateThread();
void CloseThread();
//用于IO发消息的线程
//用于IO发消息的线程
void CreateThreadIO();
void CloseThreadIO();
void UpdateMotionState();
void UpdateMotionStateEx();
void UpdateMotionStateIO();//IO发消息使用
void UpdateMotionStateIO();//IO发消息使用
void SendMsgMotionFinished();
VOID EventCallback(sHSIEventProperties& sEventProp);
@@ -1,4 +1,4 @@
// HSI_SEVENOCEAN_LLC.cpp : 定义 DLL 应用程序的导出函数。
// HSI_SEVENOCEAN_LLC.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
@@ -1,9 +1,9 @@
;HSI_SEVENOCEAN_LLC.def : DLL
;HSI_SEVENOCEAN_LLC.def : DLL
LIBRARY "HSI"
EXPORTS
;
;
HSI_STARTUP
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
#include "resource.h" // 主符号
#include "resource.h" // 主符号
#include <cstring>
@@ -1,4 +1,4 @@
// MachineInterfaceDll.cpp : 定义 DLL 应用程序的导出函数。
// MachineInterfaceDll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
@@ -1,8 +1,8 @@
// stdafx.cpp : 只包括标准包含文件的源文件
// MachineInterfaceDll.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息
// stdafx.cpp : 只包括标准包含文件的源文件
// MachineInterfaceDll.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息
#include "stdafx.h"
// TODO: 在 STDAFX.H 中
// 引用任何所需的附加头文件,而不是在此文件中引用
// TODO: 在 STDAFX.H 中
// 引用任何所需的附加头文件,而不是在此文件中引用
@@ -1,8 +1,8 @@
#pragma once
// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。
// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。
// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。
// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。
#include <SDKDDKVer.h>
@@ -1,4 +1,4 @@
// RobotControlDll.cpp : 定义 DLL 的初始化例程。
// RobotControlDll.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
@@ -10,28 +10,28 @@
#endif
//
//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
// 则从此 DLL 导出的任何调入
// MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
// 该函数的最前面。
//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
// 则从此 DLL 导出的任何调入
// MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
// 该函数的最前面。
//
// 例如:
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//
// CRobotControlDllApp
@@ -42,21 +42,21 @@ BEGIN_MESSAGE_MAP(CRobotControlDllApp, CWinApp)
END_MESSAGE_MAP()
// CRobotControlDllApp 构造
// CRobotControlDllApp 构造
CRobotControlDllApp::CRobotControlDllApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CRobotControlDllApp 对象
// 唯一的一个 CRobotControlDllApp 对象
CRobotControlDllApp theApp;
// CRobotControlDllApp 初始化
// CRobotControlDllApp 初始化
BOOL CRobotControlDllApp::InitInstance()
{
@@ -86,6 +86,6 @@ BOOL CRobotControlDllApp::InitInstance()
BOOL CRobotControlDllApp::OnCreateAggregates()
{
// TODO: 在此添加专用代码和/或调用基类
// TODO: 在此添加专用代码和/或调用基类
return TRUE;
}
@@ -1,17 +1,17 @@
// RobotControlDll.h : RobotControlDll DLL 的主头文件
// RobotControlDll.h : RobotControlDll DLL 的主头文件
//
#pragma once
#ifndef __AFXWIN_H__
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif
#include "resource.h" // 主符号
#include "resource.h" // 主符号
// CRobotControlDllApp
// 有关此类实现的信息,请参阅 RobotControlDll.cpp
// 有关此类实现的信息,请参阅 RobotControlDll.cpp
//
class CRobotControlDllApp : public CWinApp
@@ -19,7 +19,7 @@ class CRobotControlDllApp : public CWinApp
public:
CRobotControlDllApp();
// 重写
// 重写
public:
virtual BOOL InitInstance();
@@ -1,4 +1,4 @@
// Robot_conect.cpp : 实现文件
// Robot_conect.cpp : 实现文件
//
#include "stdafx.h"
@@ -7,7 +7,7 @@
#include "afxdialogex.h"
// Robot_conect 对话框
// Robot_conect 对话框
IMPLEMENT_DYNAMIC(Robot_conect, CDialogEx)
@@ -35,12 +35,12 @@ BEGIN_MESSAGE_MAP(Robot_conect, CDialogEx)
END_MESSAGE_MAP()
// Robot_conect 消息处理程序
// Robot_conect 消息处理程序
void Robot_conect::OnCbnSelchangeComboRobotId()
{
// TODO: 在此添加控件通知处理程序代码
// TODO: 在此添加控件通知处理程序代码
}
@@ -49,13 +49,13 @@ BOOL Robot_conect::OnInitDialog()
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
// TODO: 在此添加额外的初始化
// Get the Robot program list
// m_nRobotID
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;
CString tmp;
int i;
m_CMelfarxmctrl1.ServerStart();//启动Robocom.exe
m_CMelfarxmctrl1.ServerStart();//启动Robocom.exe
SleepEx(2000,TRUE);
data = NULL;
m_CMelfarxmctrl1.GetRoboComSetting(&rcnt,&data);
@@ -87,7 +87,7 @@ void Robot_conect::OnStart()
tmp2 += _T(" : ");
tmp2 += data;
m_cCombo.AddString(tmp2);
//获取程序列表
//获取程序列表
}
m_cCombo.SetCurSel(0);
@@ -196,7 +196,7 @@ BEGIN_EVENTSINK_MAP(Robot_conect, CDialogEx)
void Robot_conect::MsgRecvEventMelfarxmctrl1()
{
// TODO: 在此处添加消息处理程序代码
// TODO: 在此处添加消息处理程序代码
long msgcnt,cnt;
long i,nRecvRobot,nRecvID,nRecvStatus,nRecvErr;
BSTR data;
@@ -215,7 +215,7 @@ void Robot_conect::MsgRecvEventMelfarxmctrl1()
{
case 106:
break;
//=========读取错误码==============
//=========读取错误码==============
case 203:
data = NULL;
m_CMelfarxmctrl1.GetOneDataCPP(0,tmp,&data);
@@ -237,7 +237,7 @@ void Robot_conect::MsgRecvEventMelfarxmctrl1()
::SysFreeString(data);
}
break;
//============读取位置信息=============
//============读取位置信息=============
case 235:
m_position.Empty();
for(i=0; i<8; i++)
@@ -2,21 +2,21 @@
#include "melfarxmctrl1.h"
// Robot_conect 对话框
// Robot_conect 对话框
class Robot_conect : public CDialogEx
{
DECLARE_DYNAMIC(Robot_conect)
public:
Robot_conect(CWnd* pParent = NULL); // 标准构造函数
Robot_conect(CWnd* pParent = NULL); // 标准构造函数
virtual ~Robot_conect();
// 对话框数据
// 对话框数据
enum { IDD = IDD_DIALOG1 };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
@@ -1,7 +1,7 @@
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
#include "stdafx.h"
@@ -13,7 +13,7 @@
IMPLEMENT_DYNCREATE(CMelfarxmctrl1, CWnd)
/////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 属性
// CMelfarxmctrl1 属性
/////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 操作
// CMelfarxmctrl1 操作
@@ -1,12 +1,12 @@
#pragma once
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
/////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 包装类
// CMelfarxmctrl1 包装类
#include "melfarxmctrl1.h"
class CMelfarxmctrl1 : public CWnd
{
@@ -34,11 +34,11 @@ public:
pPersist, bStorage, bstrLicKey);
}
// 特性
// 特性
public:
// 操作
// 操作
public:
// _DMelfaRxM
@@ -1,7 +1,7 @@
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
#include "stdafx.h"
@@ -13,7 +13,7 @@
IMPLEMENT_DYNCREATE(CMelfarxmctrl1, CWnd)
/////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 属性
// CMelfarxmctrl1 属性
/////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 操作
// CMelfarxmctrl1 操作
@@ -1,12 +1,12 @@
#pragma once
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
/////////////////////////////////////////////////////////////////////////////
// CMelfarxmctrl1 包装类
// CMelfarxmctrl1 包装类
class CMelfarxmctrl1 : public CWnd
{
@@ -34,11 +34,11 @@ public:
pPersist, bStorage, bstrLicKey);
}
// 特性
// 特性
public:
// 操作
// 操作
public:
// _DMelfaRxM
@@ -7,21 +7,21 @@
extern SmartMotor_Proto* pSmartMotor_Proto;
// CAnimatics_UtilDlg 对话框
// CAnimatics_UtilDlg 对话框
class CAnimatics_UtilDlg : public CDialog
{
DECLARE_DYNAMIC(CAnimatics_UtilDlg)
public:
CAnimatics_UtilDlg(CWnd* pParent = NULL); // 标准构造函数
CAnimatics_UtilDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CAnimatics_UtilDlg();
// 对话框数据
// 对话框数据
enum { IDD = IDD_ANIMATICS_UTIL_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
public:
@@ -1,4 +1,4 @@
// GraphView.cpp : 实现文件
// GraphView.cpp : 实现文件
//
#include "stdafx.h"
@@ -12,7 +12,7 @@ IMPLEMENT_DYNAMIC(CDrawGraph, CWnd)
//========================================================
CDrawGraph::CDrawGraph()
{
//注册控件类
//注册控件类
RegisterCtrlClass();
m_nMarginLeft = 40;
@@ -28,7 +28,7 @@ CDrawGraph::CDrawGraph()
m_dbStartX = m_dbStartY = 0;
m_dbEndX = m_dbEndY = 100;
//颜色表
//颜色表
m_clrCoordBkg = RGB(255, 255, 255);
m_clrFrame = RGB(0, 0, 0);
m_clrWave = RGB(0, 0, 255);
@@ -48,7 +48,7 @@ void CDrawGraph::RegisterCtrlClass()
if(::GetClassInfo(hInstance, STR_CLASS_NAME, &wndclsCtrl))
return;
//设置控件类信息
//设置控件类信息
wndclsCtrl.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wndclsCtrl.lpfnWndProc = ::DefWindowProc;
wndclsCtrl.cbClsExtra = 0;
@@ -60,7 +60,7 @@ void CDrawGraph::RegisterCtrlClass()
wndclsCtrl.lpszMenuName = NULL;
wndclsCtrl.lpszClassName = STR_CLASS_NAME;
//注册控件类
//注册控件类
AfxRegisterClass(&wndclsCtrl);
}
//========================================================
@@ -70,18 +70,18 @@ void CDrawGraph::SetViewFont(const CString& strFont, int nPointSize, int nWeight
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
//设置字体样式
//设置字体样式
nCount = sizeof(lf.lfFaceName)/sizeof(TCHAR);
COPYSTRING(lf.lfFaceName, nCount, strFont);
lf.lfHeight = nPointSize;
lf.lfWeight = nWeight;
lf.lfCharSet = GB2312_CHARSET;
//清楚已有样式
//清楚已有样式
if(m_fontView.GetSafeHandle())
m_fontView.DeleteObject();
//设置字体
//设置字体
m_fontView.CreateFontIndirect(&lf);
if(bIsRedraw)
@@ -245,7 +245,7 @@ void CDrawGraph::DrawCoordinate(CDC* pDC, CRect rectCoord)
font.CreatePointFontIndirect (&lf);
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->TextOut(rectCoord.left-20+(rectCoord.Width()/2),rectCoord.bottom+15,m_XAxisLabel);
@@ -344,13 +344,13 @@ BEGIN_MESSAGE_MAP(CDrawGraph, CWnd)
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// CDrawGraph 消息处理程序
// CDrawGraph 消息处理程序
//========================================================
void CDrawGraph::PreSubclassWindow()
{
CWnd::PreSubclassWindow();
SetViewFont(_T("宋体"), 12, FW_NORMAL);
SetViewFont(_T("宋体"), 12, FW_NORMAL);
}
//========================================================
void CDrawGraph::OnPaint()
@@ -363,25 +363,25 @@ void CDrawGraph::OnPaint()
CFont* pOldFont;
CDC* pMemDC = new CDC;
//获取控件信息
//获取控件信息
GetClientRect(rectClient);
GetWindowText(strCaption);
//创建位图内存
//创建位图内存
bitmapTemp.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height());
pMemDC->CreateCompatibleDC(&dc);
pOldBitmap = pMemDC->SelectObject(&bitmapTemp);
pOldFont = pMemDC->SelectObject(&m_fontView);
nMode = pMemDC->SetBkMode(TRANSPARENT);
//填充客户区
//填充客户区
pMemDC->FillSolidRect(&rectClient, GetSysColor(COLOR_BTNFACE));
//绘制视图标题
//绘制视图标题
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);
DrawCoordinate(pMemDC, rectCoord);
//绘制波形
//绘制波形
DrawActualCurve(pMemDC, rectCoord);
dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), pMemDC, 0, 0, SRCCOPY);
@@ -26,75 +26,75 @@ CEF1AUsbDevice::~CEF1AUsbDevice()
BOOL CEF1AUsbDevice::EF1AOpenDevice()
{
//用来保存设备是否已经找到
//用来保存设备是否已经找到
BOOL DevFound=FALSE;
//用来保存找到的设备路径
//用来保存找到的设备路径
CString DevPathName=_T("");
//定义一个GUID的结构体HidGuid来保存HID设备的接口类GUID。
//定义一个GUID的结构体HidGuid来保存HID设备的接口类GUID。
GUID HidGuid;
//定义一个DEVINFO的句柄hDevInfoSet来保存获取到的设备信息集合句柄。
//定义一个DEVINFO的句柄hDevInfoSet来保存获取到的设备信息集合句柄。
HDEVINFO hDevInfoSet;
//定义MemberIndex,表示当前搜索到第几个设备,0表示第一个设备。
//定义MemberIndex,表示当前搜索到第几个设备,0表示第一个设备。
DWORD MemberIndex;
//DevInterfaceData,用来保存设备的驱动接口信息
//DevInterfaceData,用来保存设备的驱动接口信息
SP_DEVICE_INTERFACE_DATA DevInterfaceData;
//定义一个BOOL变量,保存函数调用是否返回成功
//定义一个BOOL变量,保存函数调用是否返回成功
BOOL Result;
//定义一个RequiredSize的变量,用来接收需要保存详细信息的缓冲长度。
//定义一个RequiredSize的变量,用来接收需要保存详细信息的缓冲长度。
DWORD RequiredSize;
//定义一个指向设备详细信息的结构体指针。
//定义一个指向设备详细信息的结构体指针。
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetailData;
//定义一个用来保存打开设备的句柄。
//定义一个用来保存打开设备的句柄。
HANDLE hDevHandle;
//定义一个HIDD_ATTRIBUTES的结构体变量,保存设备的属性。
//定义一个HIDD_ATTRIBUTES的结构体变量,保存设备的属性。
HIDD_ATTRIBUTES DevAttributes;
//对DevInterfaceData结构体的cbSize初始化为结构体大小
//对DevInterfaceData结构体的cbSize初始化为结构体大小
DevInterfaceData.cbSize=sizeof(DevInterfaceData);
//对DevAttributes结构体的Size初始化为结构体大小
//对DevAttributes结构体的Size初始化为结构体大小
DevAttributes.Size=sizeof(DevAttributes);
//调用HidD_GetHidGuid函数获取HID设备的GUID,并保存在HidGuid中。
//调用HidD_GetHidGuid函数获取HID设备的GUID,并保存在HidGuid中。
HidD_GetHidGuid(&HidGuid);
//根据HidGuid来获取设备信息集合。其中Flags参数设置为
//DIGCF_DEVICEINTERFACE|DIGCF_PRESENT,前者表示使用的GUID为
//接口类GUID,后者表示只列举正在使用的设备,因为我们这里只
//查找已经连接上的设备。返回的句柄保存在hDevinfo中。注意设备
//信息集合在使用完毕后,要使用函数SetupDiDestroyDeviceInfoList
//销毁,不然会造成内存泄漏。
//根据HidGuid来获取设备信息集合。其中Flags参数设置为
//DIGCF_DEVICEINTERFACE|DIGCF_PRESENT,前者表示使用的GUID为
//接口类GUID,后者表示只列举正在使用的设备,因为我们这里只
//查找已经连接上的设备。返回的句柄保存在hDevinfo中。注意设备
//信息集合在使用完毕后,要使用函数SetupDiDestroyDeviceInfoList
//销毁,不然会造成内存泄漏。
hDevInfoSet=SetupDiGetClassDevs(&HidGuid,
NULL,
NULL,
DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);
//MessageBox(NULL,"开始查找设备!",NULL,MB_OK);
//MessageBox(NULL,"开始查找设备!",NULL,MB_OK);
//然后对设备集合中每个设备进行列举,检查是否是我们要找的设备
//当找到我们指定的设备,或者设备已经查找完毕时,就退出查找。
//首先指向第一个设备,即将MemberIndex置为0。
//然后对设备集合中每个设备进行列举,检查是否是我们要找的设备
//当找到我们指定的设备,或者设备已经查找完毕时,就退出查找。
//首先指向第一个设备,即将MemberIndex置为0。
MemberIndex=0;
while(1)
{
//调用SetupDiEnumDeviceInterfaces在设备信息集合中获取编号为
//MemberIndex的设备信息。
//调用SetupDiEnumDeviceInterfaces在设备信息集合中获取编号为
//MemberIndex的设备信息。
Result=SetupDiEnumDeviceInterfaces(hDevInfoSet,
NULL,
&HidGuid,
MemberIndex,
&DevInterfaceData);
//如果获取信息失败,则说明设备已经查找完毕,退出循环。
//如果获取信息失败,则说明设备已经查找完毕,退出循环。
if(Result==FALSE) break;
//将MemberIndex指向下一个设备
//将MemberIndex指向下一个设备
MemberIndex++;
//如果获取信息成功,则继续获取该设备的详细信息。在获取设备
//详细信息时,需要先知道保存详细信息需要多大的缓冲区,这通过
//第一次调用函数SetupDiGetDeviceInterfaceDetail来获取。这时
//提供缓冲区和长度都为NULL的参数,并提供一个用来保存需要多大
//缓冲区的变量RequiredSize。
//如果获取信息成功,则继续获取该设备的详细信息。在获取设备
//详细信息时,需要先知道保存详细信息需要多大的缓冲区,这通过
//第一次调用函数SetupDiGetDeviceInterfaceDetail来获取。这时
//提供缓冲区和长度都为NULL的参数,并提供一个用来保存需要多大
//缓冲区的变量RequiredSize。
Result=SetupDiGetDeviceInterfaceDetail(hDevInfoSet,
&DevInterfaceData,
NULL,
@@ -102,21 +102,21 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
&RequiredSize,
NULL);
//然后,分配一个大小为RequiredSize缓冲区,用来保存设备详细信息。
//然后,分配一个大小为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);
return false;
}
//并设置pDevDetailData的cbSize为结构体的大小(注意只是结构体大小,
//不包括后面缓冲区)。
//并设置pDevDetailData的cbSize为结构体的大小(注意只是结构体大小,
//不包括后面缓冲区)。
pDevDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
//然后再次调用SetupDiGetDeviceInterfaceDetail函数来获取设备的
//详细信息。这次调用设置使用的缓冲区以及缓冲区大小。
//然后再次调用SetupDiGetDeviceInterfaceDetail函数来获取设备的
//详细信息。这次调用设置使用的缓冲区以及缓冲区大小。
Result=SetupDiGetDeviceInterfaceDetail(hDevInfoSet,
&DevInterfaceData,
pDevDetailData,
@@ -124,17 +124,17 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
NULL,
NULL);
//将设备路径复制出来,然后销毁刚刚申请的内存。
//将设备路径复制出来,然后销毁刚刚申请的内存。
DevPathName=pDevDetailData->DevicePath;
free(pDevDetailData);
//如果调用失败,则查找下一个设备。
//如果调用失败,则查找下一个设备。
if(Result==FALSE) continue;
//如果调用成功,则使用不带读写访问的CreateFile函数
//来获取设备的属性,包括VID、PID、版本号等。
//对于一些独占设备(例如USB键盘),使用读访问方式是无法打开的,
//而使用不带读写访问的格式才可以打开这些设备,从而获取设备的属性。
//如果调用成功,则使用不带读写访问的CreateFile函数
//来获取设备的属性,包括VID、PID、版本号等。
//对于一些独占设备(例如USB键盘),使用读访问方式是无法打开的,
//而使用不带读写访问的格式才可以打开这些设备,从而获取设备的属性。
hDevHandle=CreateFile(DevPathName,
NULL,
FILE_SHARE_READ|FILE_SHARE_WRITE,
@@ -143,31 +143,31 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
FILE_ATTRIBUTE_NORMAL,
NULL);
//如果打开成功,则获取设备属性。
//如果打开成功,则获取设备属性。
if(hDevHandle!=INVALID_HANDLE_VALUE)
{
//获取设备的属性并保存在DevAttributes结构体中
//获取设备的属性并保存在DevAttributes结构体中
Result=HidD_GetAttributes(hDevHandle,
&DevAttributes);
//关闭刚刚打开的设备
//关闭刚刚打开的设备
CloseHandle(hDevHandle);
//获取失败,查找下一个
//获取失败,查找下一个
if(Result==FALSE) continue;
//如果获取成功,则将属性中的VID、PID以及设备版本号与我们需要的
//进行比较,如果都一致的话,则说明它就是我们要找的设备。
if(DevAttributes.VendorID==m_nVID) //如果VID相等
if(DevAttributes.ProductID==m_nPID) //并且PID相等
//if(DevAttributes.VersionNumber==MyPvn) //并且设备版本号相等
//如果获取成功,则将属性中的VID、PID以及设备版本号与我们需要的
//进行比较,如果都一致的话,则说明它就是我们要找的设备。
if(DevAttributes.VendorID==m_nVID) //如果VID相等
if(DevAttributes.ProductID==m_nPID) //并且PID相等
//if(DevAttributes.VersionNumber==MyPvn) //并且设备版本号相等
{
DevFound=TRUE; //设置设备已经找到
//MessageBox(NULL,"设备已经找到!",NULL,MB_OK);
DevFound=TRUE; //设置设备已经找到
//MessageBox(NULL,"设备已经找到!",NULL,MB_OK);
//那么就是我们要找的设备,分别使用读写方式打开之,并保存其句柄
//并且选择为异步访问方式。
//读方式打开设备
//那么就是我们要找的设备,分别使用读写方式打开之,并保存其句柄
//并且选择为异步访问方式。
//读方式打开设备
m_hReadHandle=CreateFile(DevPathName,
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
@@ -178,12 +178,12 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
if(m_hReadHandle!=INVALID_HANDLE_VALUE)
{
//MessageBox(NULL,"读访问打开设备成功!",NULL,MB_OK);
//MessageBox(NULL,"读访问打开设备成功!",NULL,MB_OK);
}
else
MessageBox(NULL,_T("读访问打开设备失败!"),NULL,MB_OK);
MessageBox(NULL,_T("读访问打开设备失败!"),NULL,MB_OK);
//写方式打开设备
//写方式打开设备
m_hWriteHandle=CreateFile(DevPathName,
GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
@@ -193,22 +193,22 @@ BOOL CEF1AUsbDevice::EF1AOpenDevice()
NULL);
if(m_hWriteHandle!=INVALID_HANDLE_VALUE)
{
//MessageBox(NULL,"写访问打开设备成功!",NULL,MB_OK);
//MessageBox(NULL,"写访问打开设备成功!",NULL,MB_OK);
}
else
MessageBox(NULL,_T("写访问打开设备失败!"),NULL,MB_OK);
MessageBox(NULL,_T("写访问打开设备失败!"),NULL,MB_OK);
break;
}
}
//如果打开失败,则查找下一个设备
//如果打开失败,则查找下一个设备
else continue;
}
//调用SetupDiDestroyDeviceInfoList函数销毁设备信息集合
//调用SetupDiDestroyDeviceInfoList函数销毁设备信息集合
SetupDiDestroyDeviceInfoList(hDevInfoSet);
//如果设备已经找到,那么应该使能各操作按钮,并同时禁止打开设备按钮
//如果设备已经找到,那么应该使能各操作按钮,并同时禁止打开设备按钮
if(DevFound)
{
m_isOpen = TRUE;
@@ -242,9 +242,9 @@ int CEF1AUsbDevice::EF1AReadData(ULONG /*iIndex*/, char* oBuffer,int /*ioLength*
{
DWORD iLen = 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;
}
@@ -275,7 +275,7 @@ int CEF1AUsbDevice::EF1AWriteData(ULONG /*iIndex*/, char* Buffer, int ioLength)
if(m_hWriteHandle==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,_T("无效的写报告句柄!"),NULL,MB_OK);
MessageBox(NULL,_T("无效的写报告句柄!"),NULL,MB_OK);
return FALSE;
}
@@ -1,4 +1,4 @@
// Keyence_LKG5000_Ethernet.cpp : 实现文件
// Keyence_LKG5000_Ethernet.cpp : 实现文件
//
#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;
// CKeyence_LKG5000_Ethernet 对话框
// CKeyence_LKG5000_Ethernet 对话框
IMPLEMENT_DYNAMIC(CKeyence_LKG5000_Ethernet, CDialogEx)
@@ -54,7 +54,7 @@ BEGIN_MESSAGE_MAP(CKeyence_LKG5000_Ethernet, CDialogEx)
END_MESSAGE_MAP()
// CKeyence_LKG5000_Ethernet 消息处理程序
// CKeyence_LKG5000_Ethernet 消息处理程序
//======================================================
BOOL CKeyence_LKG5000_Ethernet::OnInitDialog()
{
@@ -1,21 +1,21 @@
#pragma once
// CKeyence_LKG5000_Ethernet 对话框
// CKeyence_LKG5000_Ethernet 对话框
class CKeyence_LKG5000_Ethernet : public CDialogEx
{
DECLARE_DYNAMIC(CKeyence_LKG5000_Ethernet)
public:
CKeyence_LKG5000_Ethernet(CWnd* pParent = NULL); // 标准构造函数
CKeyence_LKG5000_Ethernet(CWnd* pParent = NULL); // 标准构造函数
virtual ~CKeyence_LKG5000_Ethernet();
// 对话框数据
// 对话框数据
enum { IDD = IDD_DIALOG_KEYENCE_LKG5000_ETHERNET };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
@@ -1,4 +1,4 @@
// Keyence_UtilDlg.cpp : 实现文件
// Keyence_UtilDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -36,7 +36,7 @@ float fLaserVaule1(0);
float fLaserVaule2(0);
std::vector<KeyenceReport> LK_GReport;
// CKeyence_UtilDlg 对话框
// CKeyence_UtilDlg 对话框
IMPLEMENT_DYNAMIC(CKeyence_UtilDlg, CDialog)
@@ -330,7 +330,7 @@ BOOL CKeyence_UtilDlg::ExportReportCSV(const CString &FilePathName)
};
#pragma endregion
// CKeyence_UtilDlg 消息处理程序
// CKeyence_UtilDlg 消息处理程序
#pragma region LK_G_LASER
//===========================================================
void CKeyence_UtilDlg::OnBnClickedButtonKeyenceLaserCalibrateValue0()
@@ -1,6 +1,6 @@
#pragma once
// CKeyence_UtilDlg 对话框
// CKeyence_UtilDlg 对话框
typedef struct{
char ProgramNo;
float OUT1Value;
@@ -13,14 +13,14 @@ class CKeyence_UtilDlg : public CDialog
DECLARE_DYNAMIC(CKeyence_UtilDlg)
public:
CKeyence_UtilDlg(CWnd* pParent = NULL); // 标准构造函数
CKeyence_UtilDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CKeyence_UtilDlg();
// 对话框数据
// 对话框数据
enum { IDD = IDD_DIALOG_KEYENCE_LKG3000 };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
protected: