From 02f1c7e503b3012bf826e91fccc0bfcc4c48acc8 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Wed, 29 Oct 2014 16:55:31 +0800 Subject: [PATCH] REMOVE DLLCHR.Add TCP/IP COMM. --- .../Msi/Hsi/STIL/Common/src/cAcqEasy.cpp | 6 +- .../Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp | 63 ++++++- .../Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp | 169 ++++++++++++++++++ .../Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.h | 48 +++++ .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 83 +++++---- .../Tools/UsbUtility/UsbUtil/So7_Option.cpp | 21 +++ .../UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp | 119 ++++++++++++ .../UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h | 31 ++++ .../Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj | 8 +- .../UsbUtil/Usb_Util.vcxproj.filters | 12 ++ .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 11 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 150016 -> 150016 bytes 12 files changed, 524 insertions(+), 47 deletions(-) create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.h create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h diff --git a/PcDmis/Base/Interfac/Msi/Hsi/STIL/Common/src/cAcqEasy.cpp b/PcDmis/Base/Interfac/Msi/Hsi/STIL/Common/src/cAcqEasy.cpp index e6b4150..d458b71 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/STIL/Common/src/cAcqEasy.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/STIL/Common/src/cAcqEasy.cpp @@ -6,7 +6,7 @@ //-------------------------------------------------------------------- cAcqEasy::cAcqEasy(MCHR_ID SensorID) { -#ifdef _DEBUG +#ifndef _REMOVE_DLLCHR DWORD dwThreadId = 0; int nIndex = 0, idx = 0, jdx = 0; @@ -62,7 +62,7 @@ cAcqEasy::cAcqEasy(MCHR_ID SensorID) //-------------------------------------------------------------------- cAcqEasy::~cAcqEasy() { -#ifdef _DEBUG +#ifndef _REMOVE_DLLCHR int nIndex = 0; @@ -99,7 +99,7 @@ cAcqEasy::~cAcqEasy() #endif //_DEBUG } -#ifdef _DEBUG +#ifndef _REMOVE_DLLCHR //------------------------------------------------------------------------------------------------- void cAcqEasy::_ReleaseAcqBuffer(int NumberOfBuffers) { diff --git a/PcDmis/Base/Interfac/Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp b/PcDmis/Base/Interfac/Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp index 872f19c..74fddb4 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp @@ -134,6 +134,7 @@ void CSTIL_CCS_PRIMA_Laser::ResetParam() } BOOL CSTIL_CCS_PRIMA_Laser::InitChrLib() { +#ifndef _REMOVE_DLLCHR char szVersion[MAX_CHAR]; //DLL initialization @@ -151,10 +152,14 @@ BOOL CSTIL_CCS_PRIMA_Laser::InitChrLib() } TRACE1("DLL CHR V%s\n", szVersion); return(TRUE); +#else + return FALSE; +#endif } BOOL CSTIL_CCS_PRIMA_Laser::OpenCom (enChrConnection connectionType, int comPort, int baudrate) { +#ifndef _REMOVE_DLLCHR TRACE ("Init Chr Lib\n"); m_ErrorCode = SPARKSHI_ERROR_NONE; m_nBaudrate = static_cast(baudrate); @@ -208,11 +213,18 @@ BOOL CSTIL_CCS_PRIMA_Laser::OpenCom (enChrConnection connectionType, int comPort { return(FALSE); } +#else + UNREFERENCED_PARAMETER(connectionType); + UNREFERENCED_PARAMETER(comPort); + UNREFERENCED_PARAMETER(baudrate); + return FALSE; +#endif } //----------------------------------------------------------------------------------------- BOOL CSTIL_CCS_PRIMA_Laser::CreateEvents(cAcqEasy *pAcquisitionEasy, HANDLE *pAcquisitionEvent) { +#ifndef _REMOVE_DLLCHR m_ErrorCode = SPARKSHI_ERROR_NONE; if (pAcquisitionEasy == NULL) { @@ -231,6 +243,11 @@ BOOL CSTIL_CCS_PRIMA_Laser::CreateEvents(cAcqEasy *pAcquisitionEasy, HANDLE *pAc } m_ErrorCode = SPARKSHI_ERROR_CREATE_EVENT; return (FALSE); +#else + UNREFERENCED_PARAMETER(pAcquisitionEasy); + UNREFERENCED_PARAMETER(pAcquisitionEvent); + return FALSE; +#endif } //----------------------------------------------------------------------------------------- BOOL CSTIL_CCS_PRIMA_Laser::ReleaseEvents(HANDLE *pAcquisitionEvent) @@ -246,6 +263,7 @@ BOOL CSTIL_CCS_PRIMA_Laser::ReleaseEvents(HANDLE *pAcquisitionEvent) BOOL CSTIL_CCS_PRIMA_Laser::InitAcquisition (eAcqEasyFunc selectedFunction, enTriggerType selectedTrigger, int numberOfPointTRE) { +#ifndef _REMOVE_DLLCHR DWORD readLong; m_ErrorCode = SPARKSHI_ERROR_NONE; @@ -336,11 +354,18 @@ BOOL CSTIL_CCS_PRIMA_Laser::InitAcquisition (eAcqEasyFunc selectedFunction, enTr else return (FALSE); return (TRUE); +#else + UNREFERENCED_PARAMETER(selectedFunction); + UNREFERENCED_PARAMETER(selectedTrigger); + UNREFERENCED_PARAMETER(numberOfPointTRE); + return FALSE; +#endif } BOOL CSTIL_CCS_PRIMA_Laser::ReleaseAcquisition () { +#ifndef _REMOVE_DLLCHR if (m_pAcqEasy) { m_pAcqEasy->StopAcquisition(); @@ -378,6 +403,9 @@ BOOL CSTIL_CCS_PRIMA_Laser::ReleaseAcquisition () m_pAcqEasy = NULL; } return (TRUE); +#else + return FALSE; +#endif } WORD CSTIL_CCS_PRIMA_Laser::GetLastError () @@ -387,6 +415,7 @@ WORD CSTIL_CCS_PRIMA_Laser::GetLastError () BOOL CSTIL_CCS_PRIMA_Laser::CloseCom () { +#ifndef _REMOVE_DLLCHR BOOL bStatus(FALSE); m_ErrorCode = SPARKSHI_ERROR_NONE; if (m_SensorId != 0) @@ -409,11 +438,15 @@ BOOL CSTIL_CCS_PRIMA_Laser::CloseCom () bStatus=(FALSE); } return bStatus; +#else + return FALSE; +#endif } BOOL CSTIL_CCS_PRIMA_Laser::GetDistanceValue(double &dblDistance, double &dblIntensity, bool bSoftTrigger) { +#ifndef _REMOVE_DLLCHR int DataCount = 0; m_ErrorCode = SPARKSHI_ERROR_NONE; if (m_pAcqEasy == NULL) @@ -479,11 +512,18 @@ BOOL CSTIL_CCS_PRIMA_Laser::GetDistanceValue(double &dblDistance, double &dblInt return(SPARKSHI_ERROR); else return (SPARKSHI_ERROR_NONE); +#else + UNREFERENCED_PARAMETER(dblDistance); + UNREFERENCED_PARAMETER(dblIntensity); + UNREFERENCED_PARAMETER(bSoftTrigger); + return FALSE; +#endif } BOOL CSTIL_CCS_PRIMA_Laser::GetThicknessValue(double &dblThickness, double &dblDistance1, double &dblDistance2, double &dblIntensity1, double &dblIntensity2, bool bSoftTrigger) -{ +{ +#ifndef _REMOVE_DLLCHR int DataCount = 0; m_ErrorCode = SPARKSHI_ERROR_NONE; if (m_pAcqEasy == NULL) @@ -586,12 +626,21 @@ BOOL CSTIL_CCS_PRIMA_Laser::GetThicknessValue(double &dblThickness, double &dblD return(SPARKSHI_ERROR); else return (SPARKSHI_ERROR_NONE); - +#else + UNREFERENCED_PARAMETER(dblThickness); + UNREFERENCED_PARAMETER(dblDistance1); + UNREFERENCED_PARAMETER(dblDistance2); + UNREFERENCED_PARAMETER(dblIntensity1); + UNREFERENCED_PARAMETER(dblIntensity2); + UNREFERENCED_PARAMETER(bSoftTrigger); + return FALSE; +#endif } BOOL CSTIL_CCS_PRIMA_Laser::SetRefractiveIndex (double indice) { +#ifndef _REMOVE_DLLCHR if (MCHR_SetRefractiveIndex (m_SensorId, (float) indice) == MCHR_ERROR) { m_ErrorCode = MCHR_GetLastError (m_SensorId); @@ -602,12 +651,17 @@ BOOL CSTIL_CCS_PRIMA_Laser::SetRefractiveIndex (double indice) m_RefractiveIndex = (float) indice; return (SPARKSHI_ERROR_NONE); } +#else + UNREFERENCED_PARAMETER(indice); + return FALSE; +#endif } BOOL CSTIL_CCS_PRIMA_Laser::GetRefractiveIndex (double &indice) { +#ifndef _REMOVE_DLLCHR float convParam = (float) indice; if (MCHR_GetRefractiveIndex (m_SensorId, &convParam) == MCHR_ERROR) { @@ -620,6 +674,9 @@ BOOL CSTIL_CCS_PRIMA_Laser::GetRefractiveIndex (double &indice) indice = convParam; return (SPARKSHI_ERROR_NONE); } - +#else + UNREFERENCED_PARAMETER(indice); + return FALSE; +#endif } #endif //_DEBUG diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp new file mode 100644 index 0000000..314f30c --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp @@ -0,0 +1,169 @@ +#include "StdAfx.h" +#include +#include +#include "So7_TCPIP.h" + +const int WSA_MAJOR_VERSION = 1; +const int WSA_MINOR_VERSION = 1; +#define WSA_VERSION MAKEWORD(WSA_MAJOR_VERSION, WSA_MINOR_VERSION) +#define SOCKADDR_LEN sizeof(SOCKADDR_IN) + + +//================================================================ +CSo7_TCPIP::CSo7_TCPIP() +{ + m_socket=INVALID_SOCKET; + m_pszNetworkAddr="127.0.0.1"; + m_nPortNumber=8000; + m_bDisableTimeout=false; +} + + +//================================================================ +CSo7_TCPIP::~CSo7_TCPIP() +{ + //DisConnect(); +} +//================================================================ +int CSo7_TCPIP::Init_Winsock() +{ + int nRet; + static int first = TRUE; + if (first) + { + WSADATA stWSAData; /* WinSock DLL Info */ + nRet = WSAStartup(WSA_VERSION, &stWSAData); + if (nRet) + { + return FALSE; + } + first = FALSE; + } + return TRUE; +} +//================================================================ +TCPIP_RETURN_CODE CSo7_TCPIP::Connect() +{ + TCPIP_RETURN_CODE rCode=TCPIP_CONNECT_OK; + //DisConnect(); + int retVal(0), errorCode(0); + retVal=Init_Winsock(); + if(!retVal) + { + return TCPIP_INIT_WINSOCK_ERROR; + } + // 创建套节字 + m_socket = socket(AF_INET, SOCK_STREAM, 0); + if(m_socket == INVALID_SOCKET) + { + rCode=TCPIP_INVAILD_SOCKET; + } + else + { + // 设置socket为窗口通知消息类型 + ::WSAAsyncSelect(m_socket, m_hMsgWnd, + WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_WRITE | FD_READ); + + // 假定szAddr是IP地址 + ULONG uAddr = inet_addr(m_pszNetworkAddr); + if(uAddr == INADDR_NONE) + { + // 不是IP地址,就认为这是主机名称 + // 从主机名取得IP地址 + hostent* pHost = ::gethostbyname(m_pszNetworkAddr); + if(pHost == NULL) + { + closesocket(m_socket); + m_socket = INVALID_SOCKET; + return TCPIP_INVAILD_SOCKET; + } + // 得到以网络字节顺序排列的IP地址 + uAddr = ((struct in_addr*)*(pHost->h_addr_list))->s_addr; + } + + // 填写服务器地址信息 + sockaddr_in remote; + remote.sin_addr.S_un.S_addr = uAddr; + remote.sin_family = AF_INET; + remote.sin_port = htons(m_nPortNumber); + + // 连接到远程机 + retVal=connect(m_socket, (sockaddr*)&remote, sizeof(sockaddr)); + if(retVal) + { + errorCode = WSAGetLastError(); + rCode=(TCPIP_RETURN_CODE)errorCode; + } + } + return rCode; +} +//================================================================ +TCPIP_RETURN_CODE CSo7_TCPIP::DisConnect() +{ + if(m_socket == INVALID_SOCKET) + { + return TCPIP_INVAILD_SOCKET; + } + ::closesocket(m_socket); + m_socket = INVALID_SOCKET; + return TCPIP_CONNECT_OK; +} +//================================================================ +TCPIP_RETURN_CODE CSo7_TCPIP::Send() +{ + if(m_socket == INVALID_SOCKET) + { + return TCPIP_INVAILD_SOCKET; + } + BYTE bSendData[20]={1,2,3,4,5}; + int iSendDataLength=20; + if(::send(m_socket,(const char*)(bSendData),iSendDataLength,0) != -1) + { + return TCPIP_CONNECT_OK; + } + return TCPIP_CONNECT_OK; +} +//================================================================ +TCPIP_RETURN_CODE CSo7_TCPIP::Recv() +{ + if(m_socket == INVALID_SOCKET) + { + return TCPIP_INVAILD_SOCKET; + } + return TCPIP_CONNECT_OK; +} +//================================================================ +LRESULT CSo7_TCPIP::OnSocket(WPARAM wParam, LPARAM lParam) +{ + // 取得有事件发生的套节字句柄 + SOCKET s = wParam; + // 查看是否出错 + + int errorCode = WSAGETSELECTERROR(lParam); + if(errorCode) + return errorCode; //should put a message up here + int event = WSAGETSELECTEVENT(lParam); + switch(event) + { + case FD_CONNECT: + { + + } + break; + case FD_READ: + { + char szText[1024] = { 0 }; + ::recv(s, szText, 1024, 0); + Recv(); + } + break; + case FD_WRITE: + //This event happens when the tcp buffers are ready for another send. + //So if there is not enough room for the first write the event will happen + //and then the buffers are ready for more. + break; + case FD_CLOSE: + break; + } + return 0; +} \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.h new file mode 100644 index 0000000..c2d16f7 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.h @@ -0,0 +1,48 @@ +// protocol for control SevenOcean's Machine +// +////////////////////////////////////////////////////////////////////// +#ifndef SO7_TCPIP_H_INCLUDED_ +#define SO7_TCPIP_H_INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +#include +#include +#define WM_SOCKET WM_USER + 0x1 + +typedef enum { + TCPIP_CONNECT_OK=0, + + TCPIP_INIT_WINSOCK_ERROR, + TCPIP_INVAILD_SOCKET, + TCPIP_INVAILD_IP_ADDRESS, + TCPIP_INVAILD_PORT_NUMBER, + TCPIP_CONNECT_SERVER_FAILED, +} TCPIP_RETURN_CODE; + +//====================================================================================== +class CSo7_TCPIP +{ +public: + CSo7_TCPIP(); + virtual ~CSo7_TCPIP(); + + TCPIP_RETURN_CODE Connect(); + TCPIP_RETURN_CODE Send(); + TCPIP_RETURN_CODE Recv(); + TCPIP_RETURN_CODE DisConnect(); + HWND m_hMsgWnd; + LRESULT OnSocket(WPARAM wParam, LPARAM lParam); +private: + SOCKET m_socket; + LPCSTR m_pszNetworkAddr; + u_short m_nPortNumber; + bool m_bDisableTimeout; + int Init_Winsock(); +}; + +#endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc index ffd8a70..0315741 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc @@ -16,7 +16,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Chinese (Simplified, PRC) resources +// 中文(简体,中国) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED @@ -396,7 +396,7 @@ BEGIN EDITTEXT IDC_EDIT_ZOOM_TIME,14,159,112,112,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL END -IDD_SO7_OPTION_DIALOG DIALOGEX 0, 0, 290, 163 +IDD_SO7_OPTION_DIALOG DIALOGEX 0, 0, 290, 185 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Utility for SO7" FONT 8, "MS Shell Dlg", 400, 0, 0x1 @@ -405,8 +405,8 @@ BEGIN CONTROL "SV2000E视频卡",IDC_RADIO_VIDEOCARD_SV2000E,"Button",BS_AUTORADIOBUTTON,24,48,69,10 CONTROL "SV4000E视频卡",IDC_RADIO_VIDEOCARD_SV4000E,"Button",BS_AUTORADIOBUTTON,24,64,68,10 CONTROL "TC4000视频卡",IDC_RADIO_VIDEOCARD_TC4000,"Button",BS_AUTORADIOBUTTON,24,80,69,10 - CONTROL "IP Camera",IDC_RADIO_SO7_IP_CAMERA,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,195,96,62,10 - CONTROL "USB Camera",IDC_RADIO_SO7_USB_CAMERA,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,195,112,62,10 + CONTROL "IP Camera",IDC_RADIO_SO7_IP_CAMERA,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,24,115,62,10 + CONTROL "USB Camera",IDC_RADIO_SO7_USB_CAMERA,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,21,130,62,10 CONTROL "LK_G激光",IDC_RADIO_KEYENCE_LASER,"Button",BS_AUTORADIOBUTTON,100,32,76,10 CONTROL "LK_H激光(USB)",IDC_RADIO_KEYENCE_LASER_LK_H,"Button",BS_AUTORADIOBUTTON,100,48,76,10 CONTROL "LK_H激光(ETHERNET)",IDC_RADIO_KEYENCE_LASER_LKH_ETHERNET, @@ -418,12 +418,13 @@ BEGIN CONTROL "控制器(USB R)",IDC_RADIO_CONTROLLER2,"Button",BS_AUTORADIOBUTTON,195,47,75,10 CONTROL "控制器(RS232)",IDC_RADIO__SO7_RS232,"Button",BS_AUTORADIOBUTTON,195,63,77,10 CONTROL "Verifcation algorithm",IDC_RADIO_SO7_VERIFICATION_ALGORITHM, - "Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,8,140,81,10 + "Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,168,81,10 CONTROL "Image.dll",IDC_RADIO_TEST_IMAGE_DLL,"Button",BS_AUTORADIOBUTTON,195,80,45,10 - DEFPUSHBUTTON "OK",IDOK,145,142,50,14 - PUSHBUTTON "Cancel",IDCANCEL,225,142,50,14 - GROUPBOX "测试选项",IDC_STATIC,10,8,265,123 + DEFPUSHBUTTON "OK",IDOK,145,164,50,14 + PUSHBUTTON "Cancel",IDCANCEL,225,164,50,14 + GROUPBOX "测试选项",IDC_STATIC,10,8,265,153 CONTROL "MV900视频卡",IDC_RADIO_VIDEOCARD_MV900,"Button",BS_AUTORADIOBUTTON,24,96,69,10 + CONTROL "CJ2M PLC",IDC_RADIO_SO7_OMRON_PLC,"Button",BS_AUTORADIOBUTTON,101,129,62,10 END IDD_SO7_VIDEOCARD_SDK3000 DIALOGEX 0, 0, 488, 316 @@ -1035,6 +1036,24 @@ BEGIN PUSHBUTTON "默认参数",IDC_BUTTON_MV900_DEFAULT_PARA,520,130,53,14 END +IDD_SO7_UTIL_PLC_TCPIP DIALOGEX 0, 0, 338, 251 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "PLC TCP/IP " +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + PUSHBUTTON "Exit",IDCANCEL,292,230,39,14 + GROUPBOX "TCP/IP Control",IDC_STATIC,17,12,87,81 + PUSHBUTTON "Connect",IDC_BUTTON_PLC_TCPIP_CONNECT,29,29,63,18 + PUSHBUTTON "Disconnect",IDC_BUTTON_PLC_TCPIP_DISCONNECT,29,64,63,18 + EDITTEXT IDC_EDIT_MSG,19,97,265,130,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + PUSHBUTTON "Clear",IDC_BUTTON_PLC_TCPIP_CLEAR_MSG,289,156,39,14 + PUSHBUTTON "Read Data",IDC_BUTTON_PLC_TCPIP_READ,203,30,63,18 + PUSHBUTTON "Write Data",IDC_BUTTON_PLC_TCPIP_WRITE,203,62,63,18 + GROUPBOX "TCP/IP Control",IDC_STATIC,110,12,174,81 + EDITTEXT IDC_EDIT_PLC_TCPIP_ADDR,139,47,40,14,ES_AUTOHSCROLL + LTEXT "Addr",IDC_STATIC,116,50,16,8 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -1072,7 +1091,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 275 TOPMARGIN, 6 - BOTTOMMARGIN, 156 + BOTTOMMARGIN, 178 END IDD_SO7_VIDEOCARD_SDK3000, DIALOG @@ -1215,6 +1234,14 @@ BEGIN TOPMARGIN, 7 BOTTOMMARGIN, 352 END + + IDD_SO7_UTIL_PLC_TCPIP, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 331 + TOPMARGIN, 7 + BOTTOMMARGIN, 244 + END END #endif // APSTUDIO_INVOKED @@ -1644,16 +1671,22 @@ IDB_BITMAP_X_RIGHT BITMAP "res\\bmp\\X_RIGHT.bmp" STRINGTABLE BEGIN + IDS_ABOUTBOX "&About Mv_Util..." IDS_STRING_GERERAL_IO "通用IO" IDS_STRING_TRIG_IO "触发IO" END -#endif // Chinese (Simplified, PRC) resources +STRINGTABLE +BEGIN + IDS_SO7_ABOUTBOX "&About Utility for SO7..." +END + +#endif // 中文(简体,中国) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// English (United States) resources +// 英语(美国) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US @@ -2612,33 +2645,7 @@ BEGIN END END -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United Kingdom) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_ABOUTBOX "&About Mv_Util..." -END - -STRINGTABLE -BEGIN - IDS_SO7_ABOUTBOX "&About Utility for SO7..." -END - -#endif // English (United Kingdom) resources +#endif // 英语(美国) resources ///////////////////////////////////////////////////////////////////////////// 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 966cff1..211ae14 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 @@ -55,6 +55,9 @@ #include "So7_Manual_Machine.h" #include "So7_XBoxController.h" +#include "..\..\..\SevenOcean\So7_TCPIP.h" +#include "So7_Util_PLC_TCPIP.h" + #include "So7_Option.h" #include "afxdialogex.h" @@ -74,6 +77,8 @@ CXBOXController* XBoxPlayer =NULL; CART_PCI8622* m_pART_PCI8622=NULL; CSTIL_CCS_PRIMA_Laser* g_pSTIL_CCS_PRIMA=NULL; + +CSo7_TCPIP* g_pSo7_TCPIP=NULL; // CSo7_Option dialog IMPLEMENT_DYNAMIC(CSo7_Option, CDialog) @@ -141,6 +146,7 @@ BOOL CSo7_Option::OnInitDialog() ((CButton *)GetDlgItem(IDC_RADIO_SO7_VERIFICATION_ALGORITHM))->SetCheck(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_TEST_IMAGE_DLL))->SetCheck(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_ART_PCI8622))->SetCheck(FALSE); + ((CButton *)GetDlgItem(IDC_RADIO_SO7_OMRON_PLC))->SetCheck(FALSE); #ifdef _RELEASE_SO7_CONTROLER_ONLY ((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SDK3000))->EnableWindow(FALSE); @@ -428,6 +434,21 @@ void CSo7_Option::OnBnClickedOk() m_pSo7_Interface=NULL; } } + else if(((CButton *)GetDlgItem(IDC_RADIO_SO7_OMRON_PLC))->GetCheck()) + { + if (!g_pSo7_TCPIP) + { + g_pSo7_TCPIP=new CSo7_TCPIP(); + } + CSo7_Util_PLC_TCPIP* pSo7_Util_PLC_TCPIP=new CSo7_Util_PLC_TCPIP(); + pSo7_Util_PLC_TCPIP->DoModal(); + delete pSo7_Util_PLC_TCPIP; + if (g_pSo7_TCPIP) + { + delete g_pSo7_TCPIP; + g_pSo7_TCPIP=NULL; + } + } else if(((CButton *)GetDlgItem(IDC_RADIO_SO7_VERIFICATION_ALGORITHM))->GetCheck()) { CSO7_Verfication_Algorithm* pSO7_Verfication_Algorithm=new CSO7_Verfication_Algorithm(); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp new file mode 100644 index 0000000..070e23e --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp @@ -0,0 +1,119 @@ +// So7_Util_PLC_TCPIP.cpp : 实现文件 +// + +#include "stdafx.h" +#include "resource.h" +#include "..\..\..\SevenOcean\So7_TCPIP.h" +#include "So7_Util_PLC_TCPIP.h" +#include "afxdialogex.h" + +extern CSo7_TCPIP* g_pSo7_TCPIP; + +// CSo7_Util_PLC_TCPIP 对话框 + +IMPLEMENT_DYNAMIC(CSo7_Util_PLC_TCPIP, CDialog) + +CSo7_Util_PLC_TCPIP::CSo7_Util_PLC_TCPIP(CWnd* pParent /*=NULL*/) + : CDialog(CSo7_Util_PLC_TCPIP::IDD, pParent) +{ + +} + +CSo7_Util_PLC_TCPIP::~CSo7_Util_PLC_TCPIP() +{ +} + +void CSo7_Util_PLC_TCPIP::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_EDIT_MSG, m_edMSG); + +} + + +BEGIN_MESSAGE_MAP(CSo7_Util_PLC_TCPIP, CDialog) + ON_BN_CLICKED(IDC_BUTTON_PLC_TCPIP_CONNECT, &CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipConnect) + ON_BN_CLICKED(IDC_BUTTON_PLC_TCPIP_DISCONNECT, &CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipDisconnect) + ON_BN_CLICKED(IDC_BUTTON_PLC_TCPIP_READ, &CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipRead) + ON_BN_CLICKED(IDC_BUTTON_PLC_TCPIP_WRITE, &CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipWrite) + ON_BN_CLICKED(IDC_BUTTON_PLC_TCPIP_CLEAR_MSG, &CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipClearMsg) + ON_BN_CLICKED(IDCANCEL, &CSo7_Util_PLC_TCPIP::OnBnClickedCancel) + ON_MESSAGE(WM_SOCKET,&CSo7_Util_PLC_TCPIP::OnSocket) + ON_BN_CLICKED(IDCANCEL, &CSo7_Util_PLC_TCPIP::OnBnClickedCancel) +END_MESSAGE_MAP() + + +// CSo7_Util_PLC_TCPIP 消息处理程序 + + +void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipConnect() +{ + g_pSo7_TCPIP->m_hMsgWnd=m_hWnd; + TCPIP_RETURN_CODE rCode=g_pSo7_TCPIP->Connect(); + m_csMSG.Format(_T("Connect return code:%d."),rCode); + OutputWithScroll(m_csMSG,m_edMSG); +} + + +void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipDisconnect() +{ + TCPIP_RETURN_CODE rCode=g_pSo7_TCPIP->DisConnect(); + m_csMSG.Format(_T("Connect return code:%d."),rCode); + OutputWithScroll(m_csMSG,m_edMSG); +} + + +void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipRead() +{ + ; +} + + +void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipWrite() +{ + TCPIP_RETURN_CODE rCode=g_pSo7_TCPIP->Send(); + m_csMSG.Format(_T("Connect return code:%d."),rCode); + OutputWithScroll(m_csMSG,m_edMSG); +} + + +void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipClearMsg() +{ + ((CEdit *)GetDlgItem(IDC_EDIT_MSG))->SetWindowTextW(_T("")); +} + + +void CSo7_Util_PLC_TCPIP::OnBnClickedCancel() +{ + // TODO: 在此添加控件通知处理程序代码 + CDialog::OnCancel(); +} + +//===================================================================================== +//Print message on edit control +void CSo7_Util_PLC_TCPIP::OutputWithScroll(const CString &strNewText,CEdit &edtOutput) +{ + CString strOutput; + edtOutput.GetWindowText(strOutput); + strOutput += strNewText; + if ("\r\n" != strOutput.Right(2)) + { + strOutput += "\r\n"; + } + + int iCount = strOutput.GetLength(); + + edtOutput.SetRedraw(FALSE); + edtOutput.SetWindowText(strOutput); + int iLine = edtOutput.GetLineCount(); + edtOutput.LineScroll(iLine, 0); + edtOutput.SetSel(iCount, iCount); + edtOutput.SetRedraw(TRUE); +} +LRESULT CSo7_Util_PLC_TCPIP::OnSocket(WPARAM w, LPARAM p) +{ + LRESULT lResult=0; + if( g_pSo7_TCPIP ) + lResult = g_pSo7_TCPIP->OnSocket(w,p); + return( lResult ); +} \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h new file mode 100644 index 0000000..f8d6ddd --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h @@ -0,0 +1,31 @@ +#pragma once + + +// CSo7_Util_PLC_TCPIP 对话框 + +class CSo7_Util_PLC_TCPIP : public CDialog +{ + DECLARE_DYNAMIC(CSo7_Util_PLC_TCPIP) + +public: + CSo7_Util_PLC_TCPIP(CWnd* pParent = NULL); // 标准构造函数 + virtual ~CSo7_Util_PLC_TCPIP(); + +// 对话框数据 + enum { IDD = IDD_SO7_UTIL_PLC_TCPIP }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 + void OutputWithScroll(const CString &strNewText,CEdit &edtOutput); + DECLARE_MESSAGE_MAP() +public: + CString m_csMSG; + CEdit m_edMSG; + afx_msg void OnBnClickedButtonPlcTcpipConnect(); + afx_msg void OnBnClickedButtonPlcTcpipDisconnect(); + afx_msg void OnBnClickedButtonPlcTcpipRead(); + afx_msg void OnBnClickedButtonPlcTcpipWrite(); + afx_msg void OnBnClickedButtonPlcTcpipClearMsg(); + afx_msg void OnBnClickedCancel(); + afx_msg LRESULT OnSocket(WPARAM w, LPARAM p); +}; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj index 4902c5d..36eff43 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj @@ -129,7 +129,7 @@ Disabled - WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_WARNINGS;_RELEASE_FULL_VERSION;%(PreprocessorDefinitions) + WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_WARNINGS;_RELEASE_FULL_VERSION;_REMOVE_DLLCHR;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -145,7 +145,7 @@ $(IntDir);%(AdditionalIncludeDirectories) - ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;..\..\..\Videocard\SV4000E\dataAcq.lib;..\..\..\Videocard\SV4000E\DXMediaCap.lib;..\..\..\ART\PCI8622_32.lib;..\..\..\STIL\Dll_chr.lib;..\..\..\Videocard\MV900\Convert.lib;..\..\..\Videocard\MV900\MVSDK.lib;%(AdditionalDependencies) + ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;..\..\..\Videocard\SV4000E\dataAcq.lib;..\..\..\Videocard\SV4000E\DXMediaCap.lib;..\..\..\ART\PCI8622_32.lib;..\..\..\Videocard\MV900\Convert.lib;..\..\..\Videocard\MV900\MVSDK.lib;wsock32.lib;%(AdditionalDependencies) true Windows MachineX86 @@ -323,6 +323,7 @@ + @@ -366,6 +367,7 @@ + @@ -414,6 +416,7 @@ + @@ -457,6 +460,7 @@ + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters index 7080ce8..9e9fbbb 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters @@ -223,6 +223,12 @@ Sources Files + + Sources Files + + + Sources Files + @@ -480,6 +486,12 @@ Header Files + + Header Files + + + Header Files + 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 2537620..2142f40 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -754,6 +754,7 @@ #define IDC_RADIO_SO7_IP_CAMERA2 1604 #define IDC_RADIO_SO7_USB_CAMERA 1604 #define IDC_RADIO_TC4000_CHANNEL2 1605 +#define IDC_RADIO_SO7_OMRON_PLC 1605 #define IDC_RADIO_TC4000_CHANNEL3 1606 #define IDC_RADIO_TC4000_CHANNEL4 1607 #define IDC_RADIO_SV2000E_CHANNEL1 1608 @@ -874,6 +875,7 @@ #define IDD_SO7_ART_PCI8622 1721 #define IDD_DIALOG_STIL_CCS_PRIMA 1722 #define IDD_SO7_VIDEOCARD_MV900 1723 +#define IDD_SO7_UTIL_PLC_TCPIP 1724 #define IDC_RADIO_SPEED_SLOW 1770 #define IDC_RADIO_SCALE 1772 #define IDC_EDIT_SPEED_X 1773 @@ -1000,6 +1002,7 @@ #define IDC_BUTTON_ART_PCI8622_STOP 1844 #define IDC_BUTTON_R1_HOME 1845 #define IDC_BUTTON_ART_PCI8622_READ_DATA 1845 +#define IDC_BUTTON_PLC_TCPIP_CLEAR_MSG 1845 #define IDC_CHECK_SO7_R1_ENABLE 1846 #define IDC_EDIT_ART_PCI8622_LOG 1846 #define IDC_EDIT_R1_CURRENT_POSITION 1847 @@ -1044,6 +1047,12 @@ #define IDC_MV900_CHECK_MIRROR_VERTICALLY 1880 #define IDC_RADIO_MV900_GRAY 1881 #define IDC_RADIO_MV900_RGB 1882 +#define IDC_BUTTON_PLC_TCPIP_CONNECT 1883 +#define IDC_BUTTON_PLC_TCPIP_DISCONNECT 1884 +#define IDC_BUTTON_PLC_TCPIP_READ 1885 +#define IDC_BUTTON_PLC_TCPIP_WRITE 1886 +#define IDC_EDIT_PLC_TCPIP_ADDR 1887 +#define IDC_EDIT_MSG 1888 #define IDC_BUTTON_DIY_EXIT_BUTTON 32740 #define ID_EDIT_SO7_CONFIG_MOTION 32741 @@ -1053,7 +1062,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 193 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1883 +#define _APS_NEXT_CONTROL_VALUE 1889 #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 b0da117187b32f6646c1fb608e05165ad02a1710..701e583eeb8330eb295ac4151fa714b16a6eeaef 100644 GIT binary patch delta 9235 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 delta 8352 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