From 4bfd0a6a4cc126a88aa437652628beeda39e9973 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Sun, 13 Apr 2014 23:30:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=87=BADLL?= =?UTF-8?q?=E5=B7=A5=E7=A8=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hgignore | 4 + .../Msi/Hsi/Keyence/Keyence_Proto.cpp | 66 +-- .../Interfac/Msi/Hsi/Keyence/Keyence_Proto.h | 22 +- .../Base/Interfac/Msi/Hsi/MicroVu/SsiStatus.h | 16 +- PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h | 1 - .../Msi/Hsi/SevenOcean/EF8000_Interface.cpp | 32 +- .../Msi/Hsi/SevenOcean/EF8000_Interface.h | 5 +- .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp | 415 ++++++++++++++---- .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h | 28 +- .../Msi/Hsi/SevenOcean/SO7_Proto_Aux.h | 3 +- .../Tools/UsbUtility/Debug/UtilityDebug.Log | 6 + .../MachineInterfaceDll.cpp | 212 +++++++++ .../MachineInterfaceDll/MachineInterfaceDll.h | 34 ++ .../MachineInterfaceDll.vcxproj | 103 +++++ .../MachineInterfaceDll.vcxproj.filters | 57 +++ .../MachineInterfaceDll.vcxproj.user | 7 + .../UsbUtility/MachineInterfaceDll/stdafx.cpp | 8 + .../UsbUtility/MachineInterfaceDll/stdafx.h | 54 +++ .../MachineInterfaceDll/targetver.h | 8 + .../Tools/UsbUtility/Release/UtilityDebug.Log | 5 + .../UsbUtility/UsbUtil/SO7_Send_Parameter.cpp | 1 + .../UsbUtility/UsbUtil/So7_Motion_Pages.cpp | 1 + .../Tools/UsbUtility/UsbUtil/So7_Option.cpp | 1 + .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln | 28 ++ .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 2355712 -> 92672 bytes .../UsbUtility/Win32TestDll/Win32TestDll.cpp | 20 + .../Win32TestDll/Win32TestDll.vcxproj | 93 ++++ .../Win32TestDll/Win32TestDll.vcxproj.filters | 36 ++ .../Win32TestDll/Win32TestDll.vcxproj.user | 3 + .../Tools/UsbUtility/Win32TestDll/stdafx.cpp | 8 + .../Tools/UsbUtility/Win32TestDll/stdafx.h | 15 + .../Tools/UsbUtility/Win32TestDll/targetver.h | 8 + 32 files changed, 1154 insertions(+), 146 deletions(-) create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.h create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.filters create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.user create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/stdafx.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/stdafx.h create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/targetver.h create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj.filters create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj.user create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/stdafx.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/stdafx.h create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/targetver.h diff --git a/.hgignore b/.hgignore index fd455d2..4b380c4 100644 --- a/.hgignore +++ b/.hgignore @@ -35,3 +35,7 @@ PcDmis/Base/Interfac/Msi/Hsi/KeyenceTM065/LK-G通 *.ipch *.opensdf *.tmp +PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/Debug +PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/Release +PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Debug +PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Release diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Proto.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Proto.cpp index 4f29fed..00cbb50 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Proto.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Proto.cpp @@ -277,7 +277,7 @@ usb_dev_handle* CKeyence_Proto::_open_usb_dev(void) } //****************************************************************************** -SSI_STATUS_MOTION CKeyence_Proto::_usb_reset(void) +SSI_STATUS CKeyence_Proto::_usb_reset(void) { if (g_dev) { @@ -287,9 +287,9 @@ SSI_STATUS_MOTION CKeyence_Proto::_usb_reset(void) else { ASSERT(0); - return SSI_STATUS_MOTION_TIMEOUT; + return SSI_STATUS_TIMEOUT; } - return SSI_STATUS_MOTION_TIMEOUT; + return SSI_STATUS_TIMEOUT; } @@ -298,12 +298,12 @@ SSI_STATUS_MOTION CKeyence_Proto::_usb_reset(void) // Send is direct and async. // The receive thread will receive data and interpret it. //****************************************************************************** -SSI_STATUS_MOTION CKeyence_Proto::Init_MvUsb() +SSI_STATUS CKeyence_Proto::Init_MvUsb() { // Set initial state of the machine g_machine.s_status._machine_running = false; - SSI_STATUS_MOTION Status=SSI_STATUS_MOTION_NORMAL; + SSI_STATUS Status=SSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(Status); /*if (g_pLogger->m_lLogMask & LOGACTIONS) g_pLogger->SendAndFlushPerMode(_T("Enter Initialize Mv Usb\n")); @@ -317,20 +317,20 @@ SSI_STATUS_MOTION CKeyence_Proto::Init_MvUsb() { MessageBox(NULL, _T("Unable to open device"), _T("Message"), MB_OK); g_pLogger->SendAndFlushPerMode(_T("Unable to open device %s"), usb_strerror()); - return SSI_STATUS_MOTION_DATALINK_ERROR; + return SSI_STATUS_DATALINK_ERROR; } if (usb_set_configuration(g_dev, MY_CONFIG) < 0) { MessageBox(NULL, _T("Unable to SET CONFIGURATION"), _T("Message"), MB_OK); - return SSI_STATUS_MOTION_DATALINK_ERROR; + return SSI_STATUS_DATALINK_ERROR; } if (usb_claim_interface(g_dev, 0) < 0) { usb_close(g_dev); MessageBox(NULL, _T("Unable to CLAIM DEVICE"), _T("Message"), MB_OK); - return SSI_STATUS_MOTION_DATALINK_ERROR; + return SSI_STATUS_DATALINK_ERROR; } // ******************************************************************** @@ -413,13 +413,13 @@ SSI_STATUS_MOTION CKeyence_Proto::Init_MvUsb() //if (g_pLogger->m_lLogMask & LOGACTIONS) // g_pLogger->SendAndFlushPerMode(_T("Exit Initialize Usb\n")); - return SSI_STATUS_MOTION_NORMAL; + return SSI_STATUS_NORMAL; } //****************************************************************************** -SSI_STATUS_MOTION CKeyence_Proto::Exit_MvUsb() +SSI_STATUS CKeyence_Proto::Exit_MvUsb() { - SSI_STATUS_MOTION Status=SSI_STATUS_MOTION_NORMAL; + SSI_STATUS Status=SSI_STATUS_NORMAL; //if (g_pLogger->m_lLogMask & LOGACTIONS) // g_pLogger->SendAndFlushPerMode(_T("Enter Exit_MvUsb\n")); @@ -500,7 +500,7 @@ SSI_STATUS_MOTION CKeyence_Proto::Exit_MvUsb() // Kick the g_hEP01_Thread_Event to get the g_EP01_Thread going. // iEP = EP_KEYENCE_01 or EP_KEYENCE_02 = 0x01 or 0x02 //****************************************************************************** -SSI_STATUS_MOTION CKeyence_Proto::_do_single_threaded_usb_comm(int iEP_Base) +SSI_STATUS CKeyence_Proto::_do_single_threaded_usb_comm(int iEP_Base) { TRACE1("=====_do_single_threaded_usb_comm(iEP) g_hEP01_Thread_Event. %x\n", iEP_Base); while ((ep_buff[iEP_Base]._hProtoPending == TRUE) || (ep_buff[iEP_Base+1]._hProtoPending == TRUE)) @@ -516,52 +516,52 @@ SSI_STATUS_MOTION CKeyence_Proto::_do_single_threaded_usb_comm(int iEP_Base) Sleep(3); } TRACE1("=====_do_single_threaded_usb_comm(iEP) g_hProtoDoneEvents. %x\n", iEP_Base); - return SSI_STATUS_MOTION_NORMAL; + return SSI_STATUS_NORMAL; } //****************************************************************************** // This startup just kicks off the EP_KEYENCE_81 worker thread. //****************************************************************************** -SSI_STATUS_MOTION CKeyence_Proto::_start_machine() +SSI_STATUS CKeyence_Proto::_start_machine() { g_hEP81_Thread_State = THREAD_RUNNING; g_hEP82_Thread_State = THREAD_RUNNING; g_machine.s_status._machine_running = true; - return SSI_STATUS_MOTION_NORMAL; + return SSI_STATUS_NORMAL; }; //=============================================================================== -SSI_STATUS_MOTION CKeyence_Proto::_shutdown_machine() +SSI_STATUS CKeyence_Proto::_shutdown_machine() { g_machine.s_status._machine_running = false; - return SSI_STATUS_MOTION_NORMAL; + return SSI_STATUS_NORMAL; }; //=============================================================================== // iEP = EP_KEYENCE_01 or EP_KEYENCE_02 //=============================================================================== -SSI_STATUS_MOTION CKeyence_Proto::_submit_async_8x(int iEP_Base) +SSI_STATUS CKeyence_Proto::_submit_async_8x(int iEP_Base) { int _ret; _ret = usb_bulk_setup_async(g_dev, &(ep_buff[iEP_Base]._async_context), (unsigned char)ep_buff[iEP_Base]._ep); if (_ret < 0) { - return SSI_STATUS_MOTION_SETUP_ASYNC_CONTEXT_ERROR; + return SSI_STATUS_SETUP_ASYNC_CONTEXT_ERROR; } _ret = usb_submit_async(ep_buff[iEP_Base]._async_context, ep_buff[iEP_Base]._buffer, ep_buff[iEP_Base]._size); if (_ret < 0) { printf("error usb_submit_async_ep_xx:\n%s\n", usb_strerror()); - return SSI_STATUS_MOTION_SETUP_ASYNC_CONTEXT_ERROR; + return SSI_STATUS_SETUP_ASYNC_CONTEXT_ERROR; } - return SSI_STATUS_MOTION_NORMAL; + return SSI_STATUS_NORMAL; } //=============================================================================== // iEP_Base : EP_81_DATA_IDX/EP_82_DATA_IDX // //=============================================================================== -SSI_STATUS_MOTION CKeyence_Proto::_reap_async_8x(int iEP_Base) +SSI_STATUS CKeyence_Proto::_reap_async_8x(int iEP_Base) { int _ret; _ret = usb_reap_async(ep_buff[iEP_Base]._async_context, 1000); @@ -575,16 +575,16 @@ SSI_STATUS_MOTION CKeyence_Proto::_reap_async_8x(int iEP_Base) { usb_free_async(&(ep_buff[iEP_Base]._async_context)); ASSERT(0); - return SSI_STATUS_MOTION_TIMEOUT; + return SSI_STATUS_TIMEOUT; } - return SSI_STATUS_MOTION_NORMAL; + return SSI_STATUS_NORMAL; } //=============================================================================== // _send_usb_data(iEP) sends data to the corresponding iEP channel. // iEP = EP_KEYENCE_01 / EP_KEYENCE_02 EP_KEYENCE_01 = 0x01; EP_KEYENCE_02 = 0x02; //=============================================================================== -SSI_STATUS_MOTION CKeyence_Proto::_send_usb_data(int iEP_Base) +SSI_STATUS CKeyence_Proto::_send_usb_data(int iEP_Base) { int _ret; ep_buff[iEP_Base]._save_send_cmd = ep_buff[iEP_Base]._buffer[0]; @@ -595,13 +595,13 @@ SSI_STATUS_MOTION CKeyence_Proto::_send_usb_data(int iEP_Base) _ret = usb_bulk_setup_async(g_dev, &(ep_buff[iEP_Base]._async_context), (unsigned char)ep_buff[iEP_Base]._ep); if (_ret < 0) { - return SSI_STATUS_MOTION_SETUP_ASYNC_CONTEXT_ERROR; + return SSI_STATUS_SETUP_ASYNC_CONTEXT_ERROR; } _ret = usb_submit_async(ep_buff[iEP_Base]._async_context, ep_buff[iEP_Base]._buffer, ep_buff[iEP_Base]._size);//send data if (_ret < 0) { printf("error usb_submit_async_ep_xx:\n%s\n", usb_strerror()); - return SSI_STATUS_MOTION_SETUP_ASYNC_CONTEXT_ERROR; + return SSI_STATUS_SETUP_ASYNC_CONTEXT_ERROR; } TRACE1("_submit_async_8x(EP:%X)\r\n", iEP_Base); // @@ -624,13 +624,13 @@ SSI_STATUS_MOTION CKeyence_Proto::_send_usb_data(int iEP_Base) { usb_free_async(&(ep_buff[iEP_Base]._async_context)); ASSERT(0); - return SSI_STATUS_MOTION_TIMEOUT; + return SSI_STATUS_TIMEOUT; } - return SSI_STATUS_MOTION_NORMAL; + return SSI_STATUS_NORMAL; } //============================================================== - SSI_STATUS_MOTION CKeyence_Proto::_send_cmd_KEYENCE_CMD_GET_LASER_DATA() + SSI_STATUS CKeyence_Proto::_send_cmd_KEYENCE_CMD_GET_LASER_DATA() { WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE); memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE); @@ -648,13 +648,13 @@ SSI_STATUS_MOTION CKeyence_Proto::_send_usb_data(int iEP_Base) _do_single_threaded_usb_comm(EP_01_CMD_IDX); ReleaseMutex(g_hEP01_Serial_Mutex); - return SSI_STATUS_MOTION_NORMAL; + return SSI_STATUS_NORMAL; }; //============================================================== -SSI_STATUS_MOTION CKeyence_Proto::_process_KEYENCE_CMD_GET_LASER_DATA() +SSI_STATUS CKeyence_Proto::_process_KEYENCE_CMD_GET_LASER_DATA() { - return SSI_STATUS_MOTION_NORMAL; + return SSI_STATUS_NORMAL; }; \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Proto.h b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Proto.h index 51230a8..4eb9deb 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Proto.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Proto.h @@ -155,22 +155,22 @@ public: static CLogger* g_pLogger; static usb_dev_handle *g_dev; - SSI_STATUS_MOTION Init_MvUsb(); - SSI_STATUS_MOTION Exit_MvUsb(); + SSI_STATUS Init_MvUsb(); + SSI_STATUS Exit_MvUsb(); static void Trace_EP_Buff(long lIndex); static void _process_rcv_transfer_data(int iEP); usb_dev_handle* _open_usb_dev(void); - SSI_STATUS_MOTION _usb_reset(void); + SSI_STATUS _usb_reset(void); - SSI_STATUS_MOTION _start_machine(); - SSI_STATUS_MOTION _shutdown_machine(); - SSI_STATUS_MOTION _do_single_threaded_usb_comm(int iEP); - SSI_STATUS_MOTION _submit_async_8x(int iEP_Base); - SSI_STATUS_MOTION _reap_async_8x(int iEP_Base); - SSI_STATUS_MOTION _send_usb_data(int iEP_Base); + SSI_STATUS _start_machine(); + SSI_STATUS _shutdown_machine(); + SSI_STATUS _do_single_threaded_usb_comm(int iEP); + SSI_STATUS _submit_async_8x(int iEP_Base); + SSI_STATUS _reap_async_8x(int iEP_Base); + SSI_STATUS _send_usb_data(int iEP_Base); - SSI_STATUS_MOTION _send_cmd_KEYENCE_CMD_GET_LASER_DATA(); - static SSI_STATUS_MOTION _process_KEYENCE_CMD_GET_LASER_DATA(); + SSI_STATUS _send_cmd_KEYENCE_CMD_GET_LASER_DATA(); + static SSI_STATUS _process_KEYENCE_CMD_GET_LASER_DATA(); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/MicroVu/SsiStatus.h b/PcDmis/Base/Interfac/Msi/Hsi/MicroVu/SsiStatus.h index edaca3b..d5843e2 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/MicroVu/SsiStatus.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/MicroVu/SsiStatus.h @@ -17,20 +17,8 @@ enum SSI_STATUS { SSI_STATUS_REPLAY_FILE_ERROR, SSI_STATUS_MV_CONFIG_FILE_NOT_FOUND, SSI_STATUS_MV_HOMING_TIMEOUT, - SSI_STATUS_ERROR -}; - -enum SSI_STATUS_MOTION { - SSI_STATUS_MOTION_NORMAL = 0, - SSI_STATUS_MOTION_STALLED, - SSI_STATUS_MOTION_LIMIT_REACHED, - SSI_STATUS_MOTION_TIMEOUT, - SSI_STATUS_MOTION_INVALID_PARAMETERS, - SSI_STATUS_UNKNOWN_ERROR, - SSI_STATUS_SO7_CONFIG_FILE_NOT_FOUND, - SSI_STATUS_MOTION_SETUP_ASYNC_CONTEXT_ERROR, - SSI_STATUS_MOTION_REPLAY_FILE_ERROR, - SSI_STATUS_MOTION_DATALINK_ERROR + SSI_STATUS_ERROR, + SSI_STATUS_TIMEOUT }; enum SSI_STATUS_SMARTMOTOR { diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h index d81b04c..1cedb7c 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h @@ -12,7 +12,6 @@ #define BAR_CODE_WIDTH 20 #define BAR_CODE_HEIGHT 20 - #ifdef EF_IMAGE_DLL #define EXP __declspec(dllexport) #else diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/EF8000_Interface.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/EF8000_Interface.cpp index 94f8f44..30f0024 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/EF8000_Interface.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/EF8000_Interface.cpp @@ -1,7 +1,6 @@ #include "StdAfx.h" -#include -#include #include +#include "DLL.h" #include "EF8000_Interface.h " @@ -29,6 +28,32 @@ CEF8000_Interface::~CEF8000_Interface() } +//****************************************************************************** +void CEF8000_Interface::GetAppPath(CString &Path) +{ + Path=_T(""); // Speed optimization - noticed slow in GlowCode + if (Path.IsEmpty()) + { + CString tmpPath; + GetModuleFileName(NULL,tmpPath.GetBuffer(255),255); + tmpPath.ReleaseBuffer(); + tmpPath.TrimRight(); + int nLastSlash = tmpPath.ReverseFind('\\'); + if (nLastSlash >= 0) + tmpPath = tmpPath.Left(nLastSlash); + else + tmpPath.Empty(); + Path=tmpPath; + } +}; +BOOL CEF8000_Interface::OpenMotorDat() +{ + CString csAppPath; + GetAppPath(csAppPath); + CString csMotorDatFile =csAppPath+_T("\\motor.dat"); + return OpenSpeedParameter(csMotorDatFile); +} + BOOL CEF8000_Interface::SaveSpeedParameter(CString _FileName) { FILE* iFileHandle=NULL; @@ -84,7 +109,8 @@ FILE* CEF8000_Interface::FileOpen(const CString filename,const int Mode) case fmOpenWrite: fileMode =_T("wb"); break; case fmOpenReadWrite:fileMode =_T("wb+"); break; } - FILE *FileStream = _tfopen(filename, fileMode); + FILE *FileStream = NULL; + _tfopen_s(&FileStream,filename, fileMode); return FileStream; }; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/EF8000_Interface.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/EF8000_Interface.h index c9b0892..a8be5fc 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/EF8000_Interface.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/EF8000_Interface.h @@ -9,9 +9,6 @@ #pragma once #endif // _MSC_VER > 1000 -#include "DLL.h" - - #pragma pack(push) #pragma pack(16) /* @@ -588,8 +585,10 @@ public: ~CEF8000_Interface(); BOOL SaveSpeedParameter(CString _FileName); BOOL OpenSpeedParameter(CString _FileName); + BOOL OpenMotorDat(); protected: + void GetAppPath(CString &Path); FILE* FileOpen(const CString filename,const int Mode); int FileSeek(FILE * _Handle, long _Offset, int _Origin); int FileRead(FILE * _Handle, void *_Buffer, int _Count); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp index 5b74dcc..1be3f1a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp @@ -1,16 +1,16 @@ #include "stdafx.h" +#include #include "SO7_Proto.h" -#include "math.h" - - #define MY_CONFIG 1 #define MAX_DEVPATH_LENGTH 256 #define ENDPOINT_TIMEOUT 500 #define MAX_IN_BUFF_SIZE 1024 +#define M_PI 3.14159265358979323846 +const DOUBLE ROTARY_MMtoScale_RESOLUTION=0.0005; //***** Static Data ***** static char *outBuff = NULL; struct_so7_ep_buff CSO7_Proto::ep_buff[lEPSIZE]; @@ -2631,7 +2631,10 @@ SSI_STATUS_MOTION CSO7_Proto::Load_So7_Config() } fclose(hConfigFile); } - + else + { + return SSI_STATUS_SO7_CONFIG_FILE_NOT_FOUND; + } return SSI_STATUS_MOTION_NORMAL; } @@ -2684,7 +2687,7 @@ SSI_STATUS_MOTION CSO7_Proto::_replay_capture(CString s_replay_file) _wfopen_s(&pInFile, s_replay_file, _T("r")); if (pInFile == NULL) - return SSI_STATUS_MOTION_REPLAY_FILE_ERROR; + return SSI_STATUS_UNKNOWN_ERROR; char *cData = (char *)malloc(MAX_BUFF_SIZE); char *inBuff = (char *)malloc(MAX_BUFF_SIZE); @@ -2819,81 +2822,81 @@ SSI_STATUS_MOTION CSO7_Proto::Init_SO7Usb() //Set initial state of the machine g_machine.s_status._machine_running = false; - SSI_STATUS_MOTION rStatus=SSI_STATUS_MOTION_NORMAL; - - g_machine.IsOffline=FALSE; - - int usb_status = NULL; - usb_init(); // initialize the library - usb_status = usb_find_busses(); // find all busses - usb_status = usb_find_devices(); // find all connected devices - g_dev = _open_usb_dev(); if (!g_dev) { - MessageBox(NULL, _T("Unable to open device"), _T("Message"), MB_OK|MB_ICONERROR); - g_pLogger->SendAndFlushPerMode(_T("Unable to open device %s \r\n"), usb_strerror()); - g_machine.IsOffline=TRUE; - rStatus= SSI_STATUS_MOTION_DATALINK_ERROR; + g_machine.IsOffline=FALSE; + + int usb_status = NULL; + usb_init(); // initialize the library + usb_status = usb_find_busses(); // find all busses + usb_status = usb_find_devices(); // find all connected devices + g_dev = _open_usb_dev(); + if (!g_dev) + { + MessageBox(NULL, _T("Unable to open device"), _T("Message"), MB_OK|MB_ICONERROR); + g_pLogger->SendAndFlushPerMode(_T("Unable to open device %s \r\n"), usb_strerror()); + g_machine.IsOffline=TRUE; + rStatus= SSI_STATUS_MOTION_DATALINK_ERROR; + } + else if (usb_set_configuration(g_dev, MY_CONFIG) < 0) + { + MessageBox(NULL, _T("Unable to SET CONFIGURATION"), _T("Message"), MB_OK|MB_ICONERROR); + g_machine.IsOffline=TRUE; + rStatus=SSI_STATUS_MOTION_DATALINK_ERROR; + } + else if (usb_claim_interface(g_dev, 0) < 0) + { + usb_close(g_dev); + MessageBox(NULL, _T("Unable to CLAIM DEVICE"), _T("Message"), MB_OK|MB_ICONERROR); + g_machine.IsOffline=TRUE; + rStatus=SSI_STATUS_MOTION_DATALINK_ERROR; + } + + g_pLogger->SendAndFlushPerMode(_T("Init:Open device succeed .\r\n")); + // ******************************************************************** + // This event is used to kick the Serial Usb Command process. This threading model + // is important because the underlying library is not thread-safe. + // + ep_buff[EP_02_CMD_IDX]._event = CreateEvent(NULL, // default security attributes + FALSE, // manual reset event object + NULL, // signaled + NULL); // unamed object + + g_hEP02_Thread_Id = CreateThread( (LPSECURITY_ATTRIBUTES) NULL, + 0, + (LPTHREAD_START_ROUTINE) g_EP02_Thread, + (LPVOID) this, + 0, + NULL); + g_hEP02_Thread_State = THREAD_RUNNING_STATE1; + + // ******************************************************************** + // Prepare and start EP_S07_81 Thread - Use async commit. + // + ep_buff[EP_82_DATA_IDX]._event = CreateEvent(NULL, // default security attributes + FALSE, // manual reset event object + NULL, // signaled + NULL); // unamed object + g_hEP8x_Thread_State = THREAD_PAUSED; + g_hEP8x_Thread_Id = CreateThread( (LPSECURITY_ATTRIBUTES) NULL, + 0, + (LPTHREAD_START_ROUTINE) g_EP8x_Thread, + (LPVOID) this, + 0, + NULL); + g_hEP02_Serial_Mutex = CreateMutex(NULL, // default security attributes + FALSE, // initial owner + NULL); // name + + + + // ********************************************************************* + g_hHomedEvent = CreateEvent(NULL, // default security attributes + TRUE, // manual reset event object + FALSE, // initial state is signaled + NULL); // unamed object } - else if (usb_set_configuration(g_dev, MY_CONFIG) < 0) - { - MessageBox(NULL, _T("Unable to SET CONFIGURATION"), _T("Message"), MB_OK|MB_ICONERROR); - g_machine.IsOffline=TRUE; - rStatus=SSI_STATUS_MOTION_DATALINK_ERROR; - } - else if (usb_claim_interface(g_dev, 0) < 0) - { - usb_close(g_dev); - MessageBox(NULL, _T("Unable to CLAIM DEVICE"), _T("Message"), MB_OK|MB_ICONERROR); - g_machine.IsOffline=TRUE; - rStatus=SSI_STATUS_MOTION_DATALINK_ERROR; - } - - g_pLogger->SendAndFlushPerMode(_T("Init:Open device succeed .\r\n")); - // ******************************************************************** - // This event is used to kick the Serial Usb Command process. This threading model - // is important because the underlying library is not thread-safe. - // - ep_buff[EP_02_CMD_IDX]._event = CreateEvent(NULL, // default security attributes - FALSE, // manual reset event object - NULL, // signaled - NULL); // unamed object - - g_hEP02_Thread_Id = CreateThread( (LPSECURITY_ATTRIBUTES) NULL, - 0, - (LPTHREAD_START_ROUTINE) g_EP02_Thread, - (LPVOID) this, - 0, - NULL); - g_hEP02_Thread_State = THREAD_RUNNING_STATE1; - - // ******************************************************************** - // Prepare and start EP_S07_81 Thread - Use async commit. - // - ep_buff[EP_82_DATA_IDX]._event = CreateEvent(NULL, // default security attributes - FALSE, // manual reset event object - NULL, // signaled - NULL); // unamed object - g_hEP8x_Thread_State = THREAD_PAUSED; - g_hEP8x_Thread_Id = CreateThread( (LPSECURITY_ATTRIBUTES) NULL, - 0, - (LPTHREAD_START_ROUTINE) g_EP8x_Thread, - (LPVOID) this, - 0, - NULL); - g_hEP02_Serial_Mutex = CreateMutex(NULL, // default security attributes - FALSE, // initial owner - NULL); // name - - - - // ********************************************************************* - g_hHomedEvent = CreateEvent(NULL, // default security attributes - TRUE, // manual reset event object - FALSE, // initial state is signaled - NULL); // unamed object - return rStatus; } @@ -3250,6 +3253,264 @@ SSI_STATUS_MOTION CSO7_Proto::so7_motion_Dcc_Home() return SSI_STATUS_MOTION_NORMAL; } +//================================================================== +SSI_STATUS_MOTION CSO7_Proto::so7_Motion_R_IsHomed(bool &bHomed) +{ + _send_cmd_SO7_CMD_GET_RESET_FLAG(); + if (g_machine.Sys_Reset_Flag == 1) + { + bHomed=true; + } + else + { + bHomed=false; + } + return SSI_STATUS_MOTION_NORMAL; +} + +//================================================================== +SSI_STATUS_MOTION CSO7_Proto::so7_motion_Dcc_Home_R() +{ + //查询是否复位 + _send_cmd_SO7_CMD_GET_RESET_FLAG(); + if (g_machine.Sys_Reset_Flag == 1) + { + SetEvent(g_hHomedEvent); + return SSI_STATUS_MOTION_NORMAL; + } + m_bHomingActive = true; // Tell the world we need to home the stage + + // Home r + long lMoveToDis(0); + g_machine.x._pos_fixed._long_=0; + g_machine.y._pos_fixed._long_=0; + g_machine.z._pos_fixed._long_=0; + lMoveToDis=MMtoScale(2.0*g_machine.s_machine_config.motion.m_RotaryCircleDis,ROTARY_MMtoScale_RESOLUTION); + if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_X) + { + g_machine.x._pos_fixed._long_=lMoveToDis; + } + else if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_Y) + { + g_machine.y._pos_fixed._long_=lMoveToDis; + } + else if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_Z) + { + g_machine.z._pos_fixed._long_=lMoveToDis; + } + _send_cmd_SO7_CMD_MOVE_TO_POS_XYZ(CT_MOVETOXYZ); + + g_pLogger->SendAndFlushPerMode(_T("so7_motion_reset_worktable_lower_left.\n")); + //======================================== + const long lSleep = 20; + const long lMaxLoopCnt = 2000/lSleep; + long lLoopCnt = 0; + Sleep(lSleep); + BOOL IsFinished(FALSE); + do + { + so7_motion_is_finished(EMSG_STOPXYZ_1_MOVETOXYZ,IsFinished); + Sleep(lSleep); + ++lLoopCnt; + } while (!IsFinished && lLoopCnt < lMaxLoopCnt); + m_bHomingActive = false; + if (IsFinished) + { + _send_cmd_SO7_CMD_SET_RESET_FLAG(); + g_machine.cVerNumber = 3; + _send_cmd_SO7_CMD_SET_VER_NUMBER(); + g_pLogger->SendAndFlushPerMode(_T("Home succeed.\n")); + SetEvent(g_hHomedEvent); + return SSI_STATUS_MOTION_NORMAL; + } + else + { + return SSI_STATUS_MOTION_TIMEOUT; + } +} +//================================================================== +SSI_STATUS_MOTION CSO7_Proto::so7_motion_get_position_R(double & dRad) +{ + WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done + + long lX=0, lY=0, lZ=0; + long lX_Ref=0, lY_Ref=0, lZ_Ref=0; + double dR(0.0); + _send_cmd_SO7_CMD_READ_AXIS_XYZ(); + if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_X) + { + lX = g_machine.x._scale_pos._long_; + _send_cmd_SO7_CMD_READ_ZSIGNAL_POS_X(); + lX_Ref=g_machine.x._ZSignal_pos._long_; + dR=static_cast(lX-lX_Ref); + } + else if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_Y) + { + lY = g_machine.y._scale_pos._long_; + _send_cmd_SO7_CMD_READ_ZSIGNAL_POS_Y(); + lY_Ref=g_machine.y._ZSignal_pos._long_; + dR=static_cast(lY-lY_Ref); + } + else if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_Z) + { + lZ = g_machine.z._scale_pos._long_; + _send_cmd_SO7_CMD_READ_ZSIGNAL_POS_Z(); + lZ_Ref=g_machine.z._ZSignal_pos._long_; + dR=static_cast(lZ-lZ_Ref); + } + bool bPlus(true); + if (dR<-0.00001) + { + bPlus=true; + } + else + { + bPlus=false; + } + int iRetryCnts(0); + g_machine.s_machine_config.motion.m_RotaryCirclePulse=g_machine.s_machine_config.motion.m_RotaryCircleDis/ROTARY_MMtoScale_RESOLUTION; + if (fabs(dR)-fabs(2.0*g_machine.s_machine_config.motion.m_RotaryCirclePulse)>100) + { + do + { + iRetryCnts++; + if (bPlus) + { + dR+=8388608; + } + else + { + dR-=8388608; + } + //m_csMessage.Format("[CONVERT RotaryY]CNTS:%d;PLUS:%d;ScaleYResult:%.4f.",iRetryCnts,bPlus,dR); + } while ((iRetryCnts<5)&& + (fabs(dR)-fabs(g_machine.s_machine_config.motion.m_RotaryCirclePulse)>100)); + } + dRad = 2.0*M_PI*dR/(g_machine.s_machine_config.motion.m_RotaryCirclePulse); + + return SSI_STATUS_MOTION_NORMAL; +}; +//================================================================== +SSI_STATUS_MOTION CSO7_Proto::so7_motion_set_position_R(double dRad,bool bWait) +{ + WaitForSingleObject(g_hHomedEvent, INFINITE); + // get the current position + double dRStart(0.0),dRMovetoDis(0.0); + long lMoveToDis(0); + so7_motion_get_position_R(dRStart); + dRMovetoDis=dRad-dRStart; + double dMod=dRMovetoDis/(2.0*M_PI); + int iMod(0); + if(dMod>=0.0001) + { + iMod=static_cast(floor(dMod)); + } + else + { + iMod=static_cast(ceil(dMod)); + } + dRMovetoDis=dRMovetoDis-2.0*M_PI*static_cast(iMod); + + if ((dRMovetoDis)<=-0.01) + { + dRMovetoDis=2.0*M_PI+dRMovetoDis; + } + else + { + dRMovetoDis=dRMovetoDis; + } + lMoveToDis=static_cast(dRMovetoDis*(static_cast(g_machine.s_machine_config.motion.m_RotaryCirclePulse))/(2.0*M_PI)); + g_machine.x._pos_fixed._long_=0; + g_machine.y._pos_fixed._long_=0; + g_machine.z._pos_fixed._long_=0; + if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_X) + { + g_machine.x._pos_fixed._long_=lMoveToDis; + } + else if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_Y) + { + g_machine.y._pos_fixed._long_=lMoveToDis; + } + else if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_Z) + { + g_machine.z._pos_fixed._long_=lMoveToDis; + } + _send_cmd_SO7_CMD_MOVE_TO_POS_XYZ(CT_MOVETOXYZ); + g_machine.MotionType=EMSG_STOPXYZ_1_MOVETOXYZ; + + BOOL IsFinished(TRUE); + if (bWait) + { + const long lSleep = 20; + const long lMaxLoopCnt = 2000/lSleep; // use max homing time of 20 seconds + long lLoopCnt = 0; + Sleep(lSleep); + do + { + so7_motion_is_finished(EMSG_STOPXYZ_1_MOVETOXYZ,IsFinished); + Sleep(lSleep); + ++lLoopCnt; + } while (!IsFinished && lLoopCnt < lMaxLoopCnt); + } + g_machine.MotionType=-1; + if (IsFinished) + { + return SSI_STATUS_MOTION_NORMAL; + } + else + { + return SSI_STATUS_MOTION_TIMEOUT; + } +}; +//================================================================== +SSI_STATUS_MOTION CSO7_Proto::so7_Motion_R_IsMotionFInished(bool &bFinished) +{ + if (g_machine.MotionType4) + { + _SpeedGear=4; + } + if (_SpeedGear<1) + { + _SpeedGear=1; + } + if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_X) + { + _send_cmd_SO7_CMD_MOVE_X(_SpeedGear); + } + else if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_Y) + { + _send_cmd_SO7_CMD_MOVE_Y(_SpeedGear); + } + else if (g_machine.s_machine_config.motion.m_RotaryAxisNO==MACHINE_AXIS_Z) + { + _send_cmd_SO7_CMD_MOVE_Z(_SpeedGear); + } + return SSI_STATUS_MOTION_NORMAL; +} //================================================================== SSI_STATUS_MOTION CSO7_Proto::so7_motion_startup(double dScaleResolutionX, double dScaleResolutionY, double dScaleResolutionZ) @@ -3303,7 +3564,7 @@ SSI_STATUS_MOTION CSO7_Proto::so7_motion_get_position_xyz(double & dX, double & //================================================================== SSI_STATUS_MOTION CSO7_Proto::so7_motion_set_position_xyz(double dX, double dY, double dZ, bool bWait) { - //WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done + WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done if (g_machine.IsOffline) { diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h index 6536961..d79c50a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h @@ -11,7 +11,7 @@ #include "..\Tools\UsbUtility\logger.h" #include "CMD_H.h" #include "..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Include\lusb0_usb.h" -#include "..\MicroVu\SsiStatus.h" +#include "..\Tools\UsbUtility\MachineInterfaceDll\MachineInterfaceDll.h" #define MAX_BUFF_SIZE 0x200 @@ -60,6 +60,16 @@ const long MAX_INTENSITY = 0x3FF; #define MAXLIGHTVALUE 255 #define MINLIGHTVALUE 1 +enum MACHINE_AXIS +{ + MACHINE_AXIS_NONE = 0, + MACHINE_AXIS_X, + MACHINE_AXIS_Y, + MACHINE_AXIS_Z, + MACHINE_AXIS_ZOOM, + MACHINE_AXIS_R, + MACHINE_AXIS_ALL = 5 +}; enum EMACHINETYPE { MACHINE_SO7_CONTROLLER, @@ -180,6 +190,9 @@ struct s_so7_machine_interface_config INT m_SV4000E_DenoisePara[4]; INT m_MachineType; INT m_VideoCardType; + INT m_RotaryAxisNO; + double m_RotaryCircleDis; + double m_RotaryCirclePulse; }; //====================== @@ -219,7 +232,8 @@ struct struct_so7_machine bool _bZMMoving; char _bIsZMMotionFinished; bool _bZMHoming; - bool _bXYZZMIdle; + bool _bXYZZMIdle; + bool _bRMovins; } s_status; union { struct s_lights_value @@ -250,6 +264,7 @@ struct struct_so7_machine BOOL IsSupportReadInterrputMsg; double dRotaryCirclDis; char SEQ_NUMBER; + char MotionType; struct s_so7_axis x; struct s_so7_axis y; struct s_so7_axis z; @@ -381,6 +396,9 @@ public: SSI_STATUS_MOTION so7_motion_startup(double x_scale_resolution, double y_scale_resolution, double z_scale_resolution); bool so7_motion_is_homed(); SSI_STATUS_MOTION so7_motion_Dcc_Home(); + SSI_STATUS_MOTION so7_motion_Dcc_Home_R(); + SSI_STATUS_MOTION so7_Motion_R_IsHomed(bool &bHomed); + SSI_STATUS_MOTION so7_Motion_R_IsMotionFInished(bool &bFinished); SSI_STATUS_MOTION _start_machine(); SSI_STATUS_MOTION _shutdown_machine(); SSI_STATUS_MOTION so7_motion_probe_on_off_(bool _bOnOff); @@ -398,7 +416,11 @@ public: SSI_STATUS_MOTION so7_motion_set_position_xyz(double dX, double dY, double dZ, bool bWait); SSI_STATUS_MOTION so7_motion_set_speed_xyz(double dPercentSpeed); SSI_STATUS_MOTION so7_motion_get_speed_xyz(double &dPercentSpeed); - SSI_STATUS_MOTION so7_motion_get_3D_max_speed(double &dMaxSpeed); + SSI_STATUS_MOTION so7_motion_set_position_R(double dR,bool bWait); + SSI_STATUS_MOTION so7_motion_get_position_R(double & dR); + SSI_STATUS_MOTION so7_motion_move_R(char _SpeedGear); + + SSI_STATUS_MOTION so7_motion_get_3D_max_speed(double &dMaxSpeed); SSI_STATUS_MOTION so7_motion_is_finished(char MotionType,BOOL& IsFinished); SSI_STATUS_MOTION _calculate_straightline_motion(double dSpeedMM); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto_Aux.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto_Aux.h index 25e08be..3fb7fea 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto_Aux.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto_Aux.h @@ -11,7 +11,8 @@ #include "..\Tools\UsbUtility\logger.h" #include "CMD_H.h" #include "..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Include\lusb0_usb.h" -#include "..\MicroVu\SsiStatus.h" +#include "..\Tools\UsbUtility\MachineInterfaceDll\MachineInterfaceDll.h" + #define MAX_BUFF_SIZE 0x200 #define USB_R_SEQ_NUMBER 1 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log index 019546d..8a5a8f6 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -4533,3 +4533,9 @@ _start_machine Construct Cso7_Proto. Init:Open device succeed . _start_machine +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.cpp new file mode 100644 index 0000000..0f76621 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.cpp @@ -0,0 +1,212 @@ +// MachineInterfaceDll.cpp : 定义 DLL 应用程序的导出函数。 +// + +#include "stdafx.h" +#include +#include +#include +#include +#include +#include +#include "..\..\..\SevenOcean\DLL.h" +#include "..\..\..\SevenOcean\EF8000_Interface.h" +#include "..\..\..\SevenOcean\SO7_Proto.h" +#include "MachineInterfaceDll.h" + +CEF8000_Interface* m_pEF8000_Interface=NULL; +CSO7_Proto* m_pSO7_Proto=NULL; +bool g_bOfflineOnly(false); + +//================================================================== +SSI_STATUS_MOTION LoadMotionParameter() +{ + BOOL rStatus(FALSE); + if (!m_pEF8000_Interface) + { + m_pEF8000_Interface=new CEF8000_Interface(); + } + rStatus=m_pEF8000_Interface->OpenMotorDat(); + if (rStatus) + { + for(int j=0;j<5;j++) + { + m_pSO7_Proto->g_machine.s_machine_config.x_axis._speed_base[j]=m_pEF8000_Interface->Set_Speed[j][0]; + m_pSO7_Proto->g_machine.s_machine_config.x_axis._speed_max[j]=m_pEF8000_Interface->Set_Speed[j][1]; + m_pSO7_Proto->g_machine.s_machine_config.x_axis._speed_start[j]=m_pEF8000_Interface->Set_Speed[j][2]; + m_pSO7_Proto->g_machine.s_machine_config.x_axis._speed_fresh[j]=m_pEF8000_Interface->Set_Speed[j][3]; + + m_pSO7_Proto->g_machine.s_machine_config.x_axis._speed_slow_dis[j]=m_pEF8000_Interface->slow_dis[j]; + } + for(int j=0;j<5;j++) + { + m_pSO7_Proto->g_machine.s_machine_config.y_axis._speed_base[j]=m_pEF8000_Interface->Set_Speed[j+5][0]; + m_pSO7_Proto->g_machine.s_machine_config.y_axis._speed_max[j]=m_pEF8000_Interface->Set_Speed[j+5][1]; + m_pSO7_Proto->g_machine.s_machine_config.y_axis._speed_start[j]=m_pEF8000_Interface->Set_Speed[j+5][2]; + m_pSO7_Proto->g_machine.s_machine_config.y_axis._speed_fresh[j]=m_pEF8000_Interface->Set_Speed[j+5][3]; + + m_pSO7_Proto->g_machine.s_machine_config.y_axis._speed_slow_dis[j]=m_pEF8000_Interface->slow_dis[j+5]; + } + for(int j=0;j<5;j++) + { + m_pSO7_Proto->g_machine.s_machine_config.z_axis._speed_base[j]=m_pEF8000_Interface->Set_Speed[j+10][0]; + m_pSO7_Proto->g_machine.s_machine_config.z_axis._speed_max[j]=m_pEF8000_Interface->Set_Speed[j+10][1]; + m_pSO7_Proto->g_machine.s_machine_config.z_axis._speed_start[j]=m_pEF8000_Interface->Set_Speed[j+10][2]; + m_pSO7_Proto->g_machine.s_machine_config.z_axis._speed_fresh[j]=m_pEF8000_Interface->Set_Speed[j+10][3]; + + m_pSO7_Proto->g_machine.s_machine_config.z_axis._speed_slow_dis[j]=m_pEF8000_Interface->slow_dis[j+10]; + } + m_pSO7_Proto->g_machine.s_machine_config.x_axis._motor_precision=m_pEF8000_Interface->g_precision[0]; + m_pSO7_Proto->g_machine.s_machine_config.y_axis._motor_precision=m_pEF8000_Interface->g_precision[1]; + m_pSO7_Proto->g_machine.s_machine_config.z_axis._motor_precision= m_pEF8000_Interface->g_precision[2]; + + m_pSO7_Proto->g_machine.s_machine_config.x_axis._motor_wheelbase=m_pEF8000_Interface->Image_Info.m_Motor_Dx; + m_pSO7_Proto->g_machine.s_machine_config.y_axis._motor_wheelbase=m_pEF8000_Interface->Image_Info.m_Motor_Dy; + m_pSO7_Proto->g_machine.s_machine_config.z_axis._motor_wheelbase=m_pEF8000_Interface->Image_Info.m_Motor_Dz; + m_pSO7_Proto->g_machine._motor_pulse_num= m_pEF8000_Interface->Image_Info.m_Motor_Plus_Num; + } + if (rStatus) + { + return SSI_STATUS_MOTION_NORMAL; + } + else + { + return SSI_STATUS_MOTOR_DAT_FILE_NOT_FOUND; + } +} +//================================================================== +extern "C" EXP_IMP SSI_STATUS_MOTION WINAPI Machine_Startup(bool bOfflineOnly,bool bDCCHome) +{ + SSI_STATUS_MOTION rStatus=SSI_STATUS_MOTION_NORMAL; + g_bOfflineOnly=bOfflineOnly; + if (!g_bOfflineOnly) + { + if (!m_pSO7_Proto) + { + m_pSO7_Proto=new CSO7_Proto(); + } + rStatus=m_pSO7_Proto->Init_SO7Usb(); + if (rStatus==SSI_STATUS_MOTION_NORMAL) + { + m_pSO7_Proto->_start_machine(); + rStatus=m_pSO7_Proto->Load_So7_Config(); + if (rStatus==SSI_STATUS_MOTION_NORMAL) + { + rStatus=LoadMotionParameter(); + if (rStatus==SSI_STATUS_MOTION_NORMAL) + { + m_pSO7_Proto->_send_cmd_SO7_CMD_GET_RESET_FLAG(); + if(m_pSO7_Proto->g_machine.IsSupportReadInterrputMsg) + { + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_FIRMWARE_VERSION_INFO(); + } + if (bDCCHome) + { + m_pSO7_Proto->so7_motion_Dcc_Home_R(); + } + } + } + } + } + return rStatus; +} +//================================================================== +extern "C" EXP_IMP SSI_STATUS_MOTION WINAPI Machine_Sutdown() +{ + if (m_pEF8000_Interface) + { + delete m_pEF8000_Interface; + m_pEF8000_Interface=nullptr; + } + if (m_pSO7_Proto) + { + if(m_pSO7_Proto->g_machine.IsSupportReadInterrputMsg) + { + m_pSO7_Proto->_send_cmd_SO7_CMD_SET_GET_INTERRUPT_MSG_METHOD(E_GET_INTERRUPT_MSG_INTERRUPT); + } + m_pSO7_Proto->_shutdown_machine(); + m_pSO7_Proto->Exit_SO7Usb(); + delete m_pSO7_Proto; + m_pSO7_Proto=nullptr; + } + return SSI_STATUS_MOTION_NORMAL; +} +//================================================================== +extern "C" EXP_IMP SSI_STATUS_MOTION WINAPI Motion_GetPositionR(double& dPos) +{ + if (!g_bOfflineOnly) + { + if (!m_pSO7_Proto) + { + m_pSO7_Proto=new CSO7_Proto(); + } + return m_pSO7_Proto->so7_motion_get_position_R(dPos); + } + else + { + return SSI_STATUS_MOTION_NORMAL; + } +} +//================================================================== +extern "C" EXP_IMP SSI_STATUS_MOTION WINAPI Motion_SetPositionR(double dAbsolutePos,bool bWait) +{ + if (!g_bOfflineOnly) + { + if (!m_pSO7_Proto) + { + m_pSO7_Proto=new CSO7_Proto(); + } + return m_pSO7_Proto->so7_motion_set_position_R(dAbsolutePos,bWait); + } + else + { + return SSI_STATUS_MOTION_NORMAL; + } +} +//================================================================== +extern "C" EXP_IMP SSI_STATUS_MOTION WINAPI Motion_IsHomed(bool &bHomed) +{ + if (!g_bOfflineOnly) + { + if (!m_pSO7_Proto) + { + m_pSO7_Proto=new CSO7_Proto(); + } + return m_pSO7_Proto->so7_Motion_R_IsHomed(bHomed); + } + else + { + return SSI_STATUS_MOTION_NORMAL; + } +} +//================================================================== +extern "C" EXP_IMP SSI_STATUS_MOTION WINAPI Motion_IsFinished(bool &bFinished) +{ + if (!g_bOfflineOnly) + { + if (!m_pSO7_Proto) + { + m_pSO7_Proto=new CSO7_Proto(); + } + return m_pSO7_Proto->so7_Motion_R_IsMotionFInished(bFinished); + } + else + { + return SSI_STATUS_MOTION_NORMAL; + } +} +//================================================================== +extern "C" EXP_IMP SSI_STATUS_MOTION WINAPI Motion_MoveR(char cSpeedGear) +{ + if (!g_bOfflineOnly) + { + if (!m_pSO7_Proto) + { + m_pSO7_Proto=new CSO7_Proto(); + } + return m_pSO7_Proto->so7_motion_move_R(cSpeedGear); + } + else + { + return SSI_STATUS_MOTION_NORMAL; + } +} diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.h new file mode 100644 index 0000000..88cd9be --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.h @@ -0,0 +1,34 @@ +#pragma once + +#ifdef MACHINEINTERFACEDLL_EXPORTS +#define EXP_IMP __declspec(dllexport) +#else +#define EXP_IMP __declspec(dllimport) +#endif + +enum SSI_STATUS_MOTION +{ + SSI_STATUS_MOTION_NORMAL = 0, + SSI_STATUS_MOTION_DATALINK_ERROR, + SSI_STATUS_MOTION_LIMIT_REACHED, + SSI_STATUS_MOTION_INVALID_PARAMETERS, + SSI_STATUS_MOTION_TIMEOUT, + SSI_STATUS_SO7_CONFIG_FILE_NOT_FOUND, + SSI_STATUS_MOTOR_DAT_FILE_NOT_FOUND, + SSI_STATUS_UNKNOWN_ERROR +}; + +extern "C" +{ + /////////////////////////////////////////////// + EXP_IMP SSI_STATUS_MOTION WINAPI Machine_Startup(bool bOfflineOnly,bool bDCCHome); + EXP_IMP SSI_STATUS_MOTION WINAPI Machine_Sutdown(); + //Units:Rad + EXP_IMP SSI_STATUS_MOTION WINAPI Motion_GetPositionR(double& dPos); + EXP_IMP SSI_STATUS_MOTION WINAPI Motion_SetPositionR(double dAbsolutePos,bool bWait); + EXP_IMP SSI_STATUS_MOTION WINAPI Motion_IsHomed(bool &bHomed); + EXP_IMP SSI_STATUS_MOTION WINAPI Motion_IsFinished(bool &bFinished); + //SpeedGear:1,2,3,4(Faster) + EXP_IMP SSI_STATUS_MOTION WINAPI Motion_MoveR(char cSpeedGear); + +} \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj new file mode 100644 index 0000000..12b4b2c --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj @@ -0,0 +1,103 @@ +锘 + + + + Debug + Win32 + + + Release + Win32 + + + + {A945B062-6081-49F0-992D-D14769C4C7D4} + Win32Proj + MachineInterfaceDll + + + + DynamicLibrary + true + Unicode + Static + + + DynamicLibrary + false + true + Unicode + Static + + + + + + + + + + + + + true + + + false + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;MACHINEINTERFACEDLL_EXPORTS;%(PreprocessorDefinitions) + + + Windows + true + ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;%(AdditionalDependencies) + + + + + Level4 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;MACHINEINTERFACEDLL_EXPORTS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib + + + + + + + + + + + + + + + + + + + + Create + Create + + + + + + \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.filters b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.filters new file mode 100644 index 0000000..0a4421b --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.filters @@ -0,0 +1,57 @@ +锘 + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + + + + + 婧愭枃浠 + + + 婧愭枃浠 + + + 婧愭枃浠 + + + 婧愭枃浠 + + + 婧愭枃浠 + + + \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.user b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.user new file mode 100644 index 0000000..d82205c --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.user @@ -0,0 +1,7 @@ +锘 + + + E:\Tony\MachineInterfaceUtility\PcDmis\Base\Interfac\Msi\Hsi\Tools\UsbUtility\Debug\Win32TestDll.exe + WindowsLocalDebugger + + \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/stdafx.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/stdafx.cpp new file mode 100644 index 0000000..43f4ff4 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : 只包括标准包含文件的源文件 +// MachineInterfaceDll.pch 将作为预编译头 +// stdafx.obj 将包含预编译类型信息 + +#include "stdafx.h" + +// TODO: 在 STDAFX.H 中 +// 引用任何所需的附加头文件,而不是在此文件中引用 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/stdafx.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/stdafx.h new file mode 100644 index 0000000..e501d8e --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/stdafx.h @@ -0,0 +1,54 @@ + +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#pragma once + +#ifndef _SECURE_ATL +#define _SECURE_ATL 1 +#endif + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif + +#include "targetver.h" + +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit + +// turns off MFC's hiding of some common and often safely ignored warning messages +#define _AFX_ALL_WARNINGS + +#include // MFC core and standard components +#include // MFC extensions + + +#include // MFC Automation classes + + + +#ifndef _AFX_NO_OLE_SUPPORT +#include // MFC support for Internet Explorer 4 Common Controls +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC support for Windows Common Controls +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include // MFC support for ribbons and control bars + +#ifdef _UNICODE +#if defined _M_IX86 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_IA64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_X64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#else +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif +#endif + +CString GetAppPath(void); + + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/targetver.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/targetver.h new file mode 100644 index 0000000..aadba2f --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。 + +// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将 +// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。 + +#include diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Release/UtilityDebug.Log b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Release/UtilityDebug.Log index fe3e081..2bd3a11 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Release/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Release/UtilityDebug.Log @@ -143,3 +143,8 @@ Init:Open device succeed . _start_machine Exit: Exit_SO7Usb Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp index 28128d2..9b49de5 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp @@ -4,6 +4,7 @@ #include #include "afxpropertysheet.h" #include "resource.h" +#include "..\..\..\SevenOcean\DLL.h" #include "..\..\..\SevenOcean\EF8000_Interface.h" #include "..\..\..\SevenOcean\SO7_Proto.h" #include "DrawGraph.h" diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Motion_Pages.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Motion_Pages.cpp index 9bf14c9..4998331 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Motion_Pages.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Motion_Pages.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "afxpropertysheet.h" #include "resource.h" +#include "..\..\..\SevenOcean\DLL.h" #include "..\..\..\SevenOcean\EF8000_Interface.h" #include "..\..\..\SevenOcean\SO7_Proto.h" #include "..\..\..\SevenOcean\CMMIO_SERIAL.H" diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp index 8ec5421..6f2d5e1 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp @@ -5,6 +5,7 @@ #include "resource.h" #include "AboutDlg.h" #include "..\..\..\SevenOcean\CMMIO_SERIAL.H" +#include "..\..\..\SevenOcean\DLL.h" #include "..\..\..\SevenOcean\EF8000_Interface.h" #include "..\..\..\SevenOcean\SO7_Proto.h" #include "..\..\..\SevenOcean\SO7_Proto_Aux.h" diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln index 20fd8a6..0c3342b 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln @@ -3,6 +3,10 @@ Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Usb_Util", "UsbUtil\Usb_Util.vcxproj", "{50B21A79-C887-4F7E-8911-7E3A685BFA25}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MachineInterfaceDll", "MachineInterfaceDll\MachineInterfaceDll.vcxproj", "{A945B062-6081-49F0-992D-D14769C4C7D4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Win32TestDll", "Win32TestDll\Win32TestDll.vcxproj", "{BF02B850-BB32-4635-9E53-8583C474884D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -31,6 +35,30 @@ Global {50B21A79-C887-4F7E-8911-7E3A685BFA25}.Template|Win32.Build.0 = Template|Win32 {50B21A79-C887-4F7E-8911-7E3A685BFA25}.Template|x64.ActiveCfg = Template|x64 {50B21A79-C887-4F7E-8911-7E3A685BFA25}.Template|x64.Build.0 = Template|x64 + {A945B062-6081-49F0-992D-D14769C4C7D4}.Debug|Win32.ActiveCfg = Debug|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.Debug|Win32.Build.0 = Debug|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.Debug|x64.ActiveCfg = Debug|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.Release|Win32.ActiveCfg = Release|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.Release|Win32.Build.0 = Release|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.Release|x64.ActiveCfg = Release|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.ReleaseSO7|Win32.ActiveCfg = Release|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.ReleaseSO7|Win32.Build.0 = Release|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.ReleaseSO7|x64.ActiveCfg = Release|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.Template|Win32.ActiveCfg = Release|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.Template|Win32.Build.0 = Release|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.Template|x64.ActiveCfg = Release|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.Debug|Win32.ActiveCfg = Debug|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.Debug|Win32.Build.0 = Debug|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.Debug|x64.ActiveCfg = Debug|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.Release|Win32.ActiveCfg = Release|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.Release|Win32.Build.0 = Release|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.Release|x64.ActiveCfg = Release|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.ReleaseSO7|Win32.ActiveCfg = Release|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.ReleaseSO7|Win32.Build.0 = Release|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.ReleaseSO7|x64.ActiveCfg = Release|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.Template|Win32.ActiveCfg = Release|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.Template|Win32.Build.0 = Release|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.Template|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE 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 a1fa219652a703c13da6069799014bafc9bc9ddc..c9d908b376bd871f34457179c857953661c13d78 100644 GIT binary patch delta 13991 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 literal 2355712 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 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.cpp new file mode 100644 index 0000000..9f88fe1 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.cpp @@ -0,0 +1,20 @@ +// TestDll.cpp : 定义控制台应用程序的入口点。 +// + +#include "stdafx.h" +#include "..\MachineInterfaceDll\MachineInterfaceDll.h" + +int _tmain(int argc, _TCHAR* argv[]) +{ + SSI_STATUS_MOTION status=Machine_Startup(false,false); + double dPos(0.0); + bool bb; + status=Motion_GetPositionR(dPos); + status=Motion_SetPositionR(dPos,true); + status=Motion_IsHomed(bb); + status=Motion_IsFinished(bb); + status=Motion_MoveR(1); + status=Machine_Sutdown(); + return 0; +} + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj new file mode 100644 index 0000000..179b7f4 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj @@ -0,0 +1,93 @@ +锘 + + + + Debug + Win32 + + + Release + Win32 + + + + {BF02B850-BB32-4635-9E53-8583C474884D} + Win32Proj + Win32TestDll + + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + true + + + false + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + ../Debug/MachineInterfaceDll.lib;%(AdditionalDependencies) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + true + true + ../Release/MachineInterfaceDll.lib;%(AdditionalDependencies) + + + + + + + + + + + + Create + Create + + + + + + + \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj.filters b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj.filters new file mode 100644 index 0000000..309c98a --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj.filters @@ -0,0 +1,36 @@ +锘 + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + 澶存枃浠 + + + 澶存枃浠 + + + + + 婧愭枃浠 + + + 婧愭枃浠 + + + \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj.user b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj.user new file mode 100644 index 0000000..695b5c7 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Win32TestDll.vcxproj.user @@ -0,0 +1,3 @@ +锘 + + \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/stdafx.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/stdafx.cpp new file mode 100644 index 0000000..dca32bd --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : 只包括标准包含文件的源文件 +// Win32TestDll.pch 将作为预编译头 +// stdafx.obj 将包含预编译类型信息 + +#include "stdafx.h" + +// TODO: 在 STDAFX.H 中 +// 引用任何所需的附加头文件,而不是在此文件中引用 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/stdafx.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/stdafx.h new file mode 100644 index 0000000..3d9c3c8 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/stdafx.h @@ -0,0 +1,15 @@ +// stdafx.h : 标准系统包含文件的包含文件, +// 或是经常使用但不常更改的 +// 特定于项目的包含文件 +// + +#pragma once + +#include "targetver.h" + +#include +#include +#include + + +// TODO: 在此处引用程序需要的其他头文件 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/targetver.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/targetver.h new file mode 100644 index 0000000..aadba2f --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。 + +// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将 +// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。 + +#include