From 5158d2bac20187248236ed228857f30fdd2ff455 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Wed, 26 Feb 2014 08:43:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9ELKG5000=E7=9A=84ethernet?= =?UTF-8?q?=E9=80=9A=E4=BF=A1=EF=BC=8C=E5=8F=91=E9=80=81=E5=BC=80=E5=A7=8B?= =?UTF-8?q?=E3=80=81=E5=81=9C=E6=AD=A2=E6=89=AB=E6=8F=8F=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Msi/Hsi/Keyence/Keyence_Laser_LK_H.cpp | 37 +++- .../Msi/Hsi/Keyence/Keyence_Laser_LK_H.h | 6 + .../Tools/UsbUtility/Debug/UtilityDebug.Log | 7 + .../UsbUtil/Keyence_LKG5000_Ethernet.cpp | 204 +++++++++++++++--- .../UsbUtil/Keyence_LKG5000_Ethernet.h | 10 + .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 14 +- .../Tools/UsbUtility/UsbUtil/So7_Option.cpp | 8 + .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 10 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 2355712 -> 2355712 bytes 9 files changed, 266 insertions(+), 30 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser_LK_H.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser_LK_H.cpp index ac0d057..6f78bb9 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser_LK_H.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser_LK_H.cpp @@ -15,6 +15,7 @@ CKeyence_Laser_LK_H::CKeyence_Laser_LK_H() m_StoredDataNumber=0; m_NeedStorageDataNumber=0; m_StorageCycle=LKIF_STORAGECYCLE_100; + m_DeviceID=LKG5000DEVICEMAXNO; } CKeyence_Laser_LK_H::~CKeyence_Laser_LK_H() @@ -90,7 +91,7 @@ BOOL CKeyence_Laser_LK_H::OpenDeviceEthernet(IN_ADDR _IPAddr) } else { - m_result = LKIF2_OpenDeviceETHER(¶mEther); + m_result = m_pOpenDeviceETHER(¶mEther); if (m_result==RC_OK) { ReturnStatus=TRUE; @@ -103,6 +104,40 @@ BOOL CKeyence_Laser_LK_H::OpenDeviceEthernet(IN_ADDR _IPAddr) return ReturnStatus; } //============================================== +BOOL CKeyence_Laser_LK_H::SetDeviceIPADDR(int _DeviceID,IN_ADDR _IPAddr) +{ + BOOL ReturnStatus(FALSE); + if (0<=_DeviceID && _DeviceIDKeyenceLaserInit(); return TRUE; // return TRUE unless you set the focus to a control } @@ -60,6 +70,9 @@ BOOL CKeyence_LKG5000_Ethernet::OnInitDialog() //====================================================== void CKeyence_LKG5000_Ethernet::OnBnClickedCancel() { + KillTimer(1); + KillTimer(2); + CDialogEx::OnCancel(); } @@ -67,14 +80,19 @@ void CKeyence_LKG5000_Ethernet::OnBnClickedCancel() //====================================================== void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetConnect1() { - UCHAR bIPAddr0,bIPAddr1,bIPAddr2,bIPAddr3; - m_IPAddress[0].GetAddress(bIPAddr0,bIPAddr1,bIPAddr2,bIPAddr3); - DWORD DIPAddr1(0); - m_IPAddress[0].GetAddress(DIPAddr1); + UCHAR bIPAddr[4]; + m_IPAddress[0].GetAddress(bIPAddr[0],bIPAddr[1],bIPAddr[2],bIPAddr[3]); IN_ADDR IPAddr; - IPAddr.s_addr=DIPAddr1; - BOOL bStatus=g_Keyence_LKG5000[0].OpenDeviceEthernet(IPAddr); - m_csMsg.Format(_T("[Open Device1]%d"),bStatus); + int index(0); + IPAddr.S_un.S_un_b.s_b1=bIPAddr[index++]; + IPAddr.S_un.S_un_b.s_b2=bIPAddr[index++]; + IPAddr.S_un.S_un_b.s_b3=bIPAddr[index++]; + IPAddr.S_un.S_un_b.s_b4=bIPAddr[index++]; + BOOL bStatus(FALSE); + bStatus=m_pKeyence_Laser_LK_H->SetDeviceIPADDR(0,IPAddr); + bStatus=m_pKeyence_Laser_LK_H->SetDeviceID(0); + + m_csMsg.Format(_T("[Open Device1] %d"),bStatus); OutputWithScroll(m_csMsg,m_edMSG); } @@ -82,9 +100,9 @@ void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetConnect1() //====================================================== void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetReadout1() { - float OutValue1(0.0),OutValue2(0.0); - g_Keyence_LKG5000[0].Get_KeyenceLaserData(&OutValue1,&OutValue2); - m_csMsg.Format(_T("[Device1 Redout]Out1:%.4f;Out2:%.4f."),OutValue1,OutValue2); + double dOutVal[2]={0.0}; + GetLKG5000OUTValue(0,dOutVal); + m_csMsg.Format(_T("[Device1 Readout] Out1:%.4f;Out2:%.4f."),dOutVal[0],dOutVal[1]); OutputWithScroll(m_csMsg,m_edMSG); } @@ -92,12 +110,19 @@ void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetReadout1() //====================================================== void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetConnect2() { - DWORD DIPAddr1(0); - m_IPAddress[0].GetAddress(DIPAddr1); + UCHAR bIPAddr[4]; + m_IPAddress[1].GetAddress(bIPAddr[0],bIPAddr[1],bIPAddr[2],bIPAddr[3]); IN_ADDR IPAddr; - IPAddr.s_addr=DIPAddr1; - BOOL bStatus=g_Keyence_LKG5000[1].OpenDeviceEthernet(IPAddr); - m_csMsg.Format(_T("[Open Device2]%d"),bStatus); + int index(0); + IPAddr.S_un.S_un_b.s_b1=bIPAddr[index++]; + IPAddr.S_un.S_un_b.s_b2=bIPAddr[index++]; + IPAddr.S_un.S_un_b.s_b3=bIPAddr[index++]; + IPAddr.S_un.S_un_b.s_b4=bIPAddr[index++]; + + BOOL bStatus(FALSE); + bStatus=m_pKeyence_Laser_LK_H->SetDeviceIPADDR(1,IPAddr); + bStatus=m_pKeyence_Laser_LK_H->SetDeviceID(1); + m_csMsg.Format(_T("[Open Device2] %d"),bStatus); OutputWithScroll(m_csMsg,m_edMSG); } @@ -105,12 +130,117 @@ void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetConnect2() //====================================================== void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetReadout2() { - float OutValue1(0.0),OutValue2(0.0); - g_Keyence_LKG5000[1].Get_KeyenceLaserData(&OutValue1,&OutValue2); - m_csMsg.Format(_T("[Device1 Redout]Out1:%.4f;Out2:%.4f."),OutValue1,OutValue2); + double dOutVal[2]={0.0}; + GetLKG5000OUTValue(1,dOutVal); + m_csMsg.Format(_T("[Device2 Readout] Out1:%.4f;Out2:%.4f."),dOutVal[0],dOutVal[1]); OutputWithScroll(m_csMsg,m_edMSG); } //===================================================================================== +void CKeyence_LKG5000_Ethernet::GetLKG5000OUTValue(int _DeviceID,double*_dVal) +{ + float OutValue1(0.0),OutValue2(0.0); + m_pKeyence_Laser_LK_H->SetDeviceID(_DeviceID); + m_pKeyence_Laser_LK_H->Get_KeyenceLaserData(&OutValue1,&OutValue2); + _dVal[0]=static_cast(OutValue1); + _dVal[1]=static_cast(OutValue2); +} + +//===================================================================================== +void CKeyence_LKG5000_Ethernet::OnBnClickedCheckLkg5000ContinueRead1() +{ + if (((CButton *)GetDlgItem(IDC_CHECK_LKG5000_CONTINUE_READ1))->GetCheck()) + { + SetTimer(1,200,NULL); + } + else + { + KillTimer(1); + } +} +//===================================================================================== +void CKeyence_LKG5000_Ethernet::OnBnClickedCheckLkg5000ContinueRead2() +{ + if (((CButton *)GetDlgItem(IDC_CHECK_LKG5000_CONTINUE_READ2))->GetCheck()) + { + SetTimer(2,200,NULL); + } + else + { + KillTimer(2); + } +} +//===================================================================================== +void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetStoragedata1() +{ + GetStorageData(0,GetAppPath()+_T("\\storagedata1.log")); + +} +//===================================================================================== +void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetStoragedata2() +{ + GetStorageData(1,GetAppPath()+_T("\\storagedata2.log")); +} +//===================================================================================== +void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetStartScan() +{ + m_pKeyence_Laser_LK_H->SetDeviceID(0); + m_pKeyence_Laser_LK_H->StartStoreData(0,0,0); +} + +//===================================================================================== +void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetStopScan() +{ + m_pKeyence_Laser_LK_H->SetDeviceID(0); + m_pKeyence_Laser_LK_H->StopStoreData(); +} +//===================================================================================== +void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetStartScan2() +{ + m_pKeyence_Laser_LK_H->SetDeviceID(1); + m_pKeyence_Laser_LK_H->StartStoreData(0,0,0); +} +//===================================================================================== +void CKeyence_LKG5000_Ethernet::OnBnClickedBtnKeyenceLkg5000EthernetStopScan2() +{ + m_pKeyence_Laser_LK_H->SetDeviceID(1); + m_pKeyence_Laser_LK_H->StopStoreData(); +} + +void CKeyence_LKG5000_Ethernet::GetStorageData(int _DeviceId,CString csFileName) +{ + float GetData[LK_H_MAX_STORAGE_DATA_SIZE]={0.0}; + int GetDataNumber(0); + m_pKeyence_Laser_LK_H->SetDeviceID(_DeviceId); + + FILE* m_pOutFile; + char *outBuff = NULL; + CString cFileName=csFileName; + _wfopen_s(&m_pOutFile, cFileName, _T("wt")); + if (!m_pOutFile) + { + free(outBuff); + } + else + { + for(int i=0;i<1;i++) + { + m_pKeyence_Laser_LK_H->GetStoredData(i,GetData,&GetDataNumber); + m_csMsg.Format(_T("--------OUT%d: TotaL:%d----------"),i,GetDataNumber); + OutputWithScroll(m_csMsg,m_edMSG); + + fprintf(m_pOutFile,"--------OUT%d: TotaL:%d----------\n", i,GetDataNumber); + for (int i=0;iGetCheck()) { + if (!m_pKeyence_Laser_LK_H) + { + m_pKeyence_Laser_LK_H=new CKeyence_Laser_LK_H(); + } + CKeyence_LKG5000_Ethernet* pKeyence_LKG5000_Ethernet=new CKeyence_LKG5000_Ethernet(); pKeyence_LKG5000_Ethernet->DoModal(); delete pKeyence_LKG5000_Ethernet; pKeyence_LKG5000_Ethernet=nullptr; + + delete m_pKeyence_Laser_LK_H; + m_pKeyence_Laser_LK_H=NULL; } else if (((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SDK3000))->GetCheck()) { diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h index f68763d..a4f2645 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -250,6 +250,7 @@ #define IDC_CHECK_SO7_MANUAL_MACHINE_READ_POS_CONTINUE 1204 #define IDC_CHECK_CONTINUOUS_READ_IO_STATUS 1204 #define IDC_CHECK_SO7_RUNING_PROGRAM_RUNING_INFINITE 1204 +#define IDC_CHECK_LKG5000_CONTINUE_READ1 1204 #define IDC_RADIO_MACHINE_SevenOcean 1205 #define IDC_CHECK_CONTINUE_READ_LASER_LK_H_VALUE 1205 #define IDC_BUTTON_INIT_SO7USB 1206 @@ -482,6 +483,7 @@ #define IDC_CHECK_AUTOZOOM_CONTINUE_READ 1394 #define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM1 1394 #define IDC_CHECK_SO7_OUT_PORT 1394 +#define IDC_CHECK_LKG5000_CONTINUE_READ2 1394 #define IDC_BUTTON_MANUAL_HOME 1395 #define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM2 1395 #define IDC_CHECK_ 1396 @@ -689,8 +691,10 @@ #define IDC_BUTTON3 1585 #define IDC_BUTTONIDC_BUTTON_TESA_STAR_MOVETO 1585 #define IDC_BUTTON_HOME 1585 +#define IDC_BTN_KEYENCE_LKG5000_ETHERNET_STORAGEDATA2 1585 #define IDC_BUTTON_INIT_SCAN_KEYENCE_LK_GLASER 1586 #define IDC_BUTTON_GO 1586 +#define IDC_BTN_KEYENCE_LKG5000_ETHERNET_STORAGEDATA1 1586 #define IDC_EDIT_MEASURE_VALUE 1587 #define IDC_RADIO_OUT_EXTRACT 1588 #define IDC_RADIO_KEYENCE_LASER 1589 @@ -900,6 +904,10 @@ #define IDC_KEYENCE_LKG5000_IPADDRESS1 1827 #define IDC_KEYENCE_LKG5000_IPADDRESS2 1828 #define IDC_EDIT_KEYENCE_LKG5000_MSG 1830 +#define IDC_BTN_KEYENCE_LKG5000_ETHERNET_START_SCAN 1831 +#define IDC_BTN_KEYENCE_LKG5000_ETHERNET_STOP_SCAN 1832 +#define IDC_BTN_KEYENCE_LKG5000_ETHERNET_START_SCAN2 1833 +#define IDC_BTN_KEYENCE_LKG5000_ETHERNET_STOP_SCAN2 1834 #define IDC_BUTTON_DIY_EXIT_BUTTON 32740 #define ID_EDIT_SO7_CONFIG_MOTION 32741 @@ -909,7 +917,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 191 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1831 +#define _APS_NEXT_CONTROL_VALUE 1832 #define _APS_NEXT_SYMED_VALUE 104 #endif #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index 6ad171ef226ab8bf211e67f880ea20d85ed194ee..ec5c3f2e4281709e51e15fdba805162a752d5b3c 100644 GIT binary patch delta 8739 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 delta 6694 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 Ks?ip`{{I2)2XyBE