//--------------------------------------------------------------------------- #include //#define NEDIO_FAIL 0 //--------------------------------------------------------------------------- // Important note about DLL memory management when your DLL uses the // static version of the RunTime Library: // // If your DLL exports any functions that pass String objects (or structs/ // classes containing nested Strings) as parameter or function results, // you will need to add the library MEMMGR.LIB to both the DLL project and // any other projects that use the DLL. You will also need to use MEMMGR.LIB // if any other projects which use the DLL will be performing new or delete // operations on any non-TObject-derived classes which are exported from the // DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling // EXE's to use the BORLNDMM.DLL as their memory manager. In these cases, // the file BORLNDMM.DLL should be deployed along with your DLL. // // To avoid using BORLNDMM.DLL, pass string information using "char *" or // ShortString parameters. // // If your DLL uses the dynamic version of the RTL, you do not need to // explicitly add MEMMGR.LIB as this will be done implicitly for you //--------------------------------------------------------------------------- #include "NEDIO_Main.h" #include #include // windows ¼ÒÄÏÀ» Á¦¾îÇϱâ À§ÇØ ÇÊ¿äÇÑ Çì´õ #include // ¾²·¹µå 󸮸¦ Çϱâ À§ÇØ ÇÊ¿äÇÑ Çì´õÆÄÀÏ #include SOCKET GlobalSocket; // »ç¿ëÇÒ ¼ÒÄÏ Àü¿ª º¯¼ö SOCKADDR_IN remote; // ÀÎÅÍ³Ý ¼ÒÄÏ ±¸Á¶Ã¼¿¡ ´ëÇÑ ÀνºÅϽº »ý¼º void RecvThread(void *passedTherad); // ÇÔ¼ö ÇÁ·ÎÅäŸÀÔ //char sendBuff[80]; char cInputStatus[60]; char cAIStatus[60]; int iFlag; int iRecvStatus; unsigned int uiIniModuleAddress; bool bBusy; int iInputMode; #define NEDIO_OK 1 #define NEDIO_FAIL 0 #define NEDIO_ERROR 2 #define NEDIO_WINSOCK_RECV_ERROR 3 //#define NEDIO_WINSOCK_TIME_OUT 4 #pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; } //--------------------------------------------------------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Initialization __declspec(dllexport) int NEDIO_Init(int iPortNo, char *cRemote_IP) { WSADATA localWSA; char tempBuffer[60]; int status; // Winsock Interface Initialization if((status = WSAStartup(MAKEWORD(1,1), &localWSA)) == 0) { remote.sin_family = AF_INET; // internetwork: UDP, TCP, etc. //remote.sin_port = htons(61000); // vhxm qjsgh //remote.sin_addr.s_addr = inet_addr("192.168.0.61"); // // Internet Address remote.sin_port = htons(iPortNo); // vhxm qjsgh remote.sin_addr.s_addr = inet_addr(cRemote_IP); // // Internet Address return NEDIO_OK; }else{ //sprintf(tempBuffer, "WINSOCK DLL Failure:%d",status); //Memo3->Lines->Add(tempBuffer); return NEDIO_FAIL; } } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Nedio Connect __declspec(dllexport) int NEDIO_Connect(int iPortNo, char *cLocal_IP) { static int rThread = 0; SOCKADDR_IN localsin; char tempBufff[60]; GlobalSocket = socket(AF_INET, SOCK_DGRAM, 0); if(GlobalSocket == INVALID_SOCKET) // ¼ÒÄÏ ½ÇÆÐ { closesocket(GlobalSocket); return NEDIO_ERROR; } localsin.sin_family = AF_INET; localsin.sin_port = htons(iPortNo); localsin.sin_addr.s_addr = inet_addr(cLocal_IP);//INADDR_ANY; // INADDR_ANY => ÇöÀç ÄÄÇ»ÅÍ¿¡ ÇÒ´çµÈ IPÁÖ¼Ò·Î ÆÐŶÀ» ¹Þ¾ÆµéÀϼö ÀÖ°Ô ÇØÁØ´Ù. // ÇÁ·Î¼¼½º ¿¡¼­ ƯÁ¤ Æ÷Æ®¸¦ ¸í½ÃÀûÀ¸·Î Áã°í ÀÖ±â À§ÇØ »ç¿ë // ¸î¹ø Æ÷Æ® ¹øÈ£¸¦ »ç¿ëÇϰڴÙ? ¶ó´Â ½Ä if(bind(GlobalSocket, (SOCKADDR *)&localsin, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { //sprintf(tempBufff, "Connect Fail:%d",WSAGetLastError()); //Memo3->Lines->Add(tempBufff); return NEDIO_FAIL; } _beginthread(RecvThread, 0, &rThread); iRecvStatus = NEDIO_OK; uiIniModuleAddress = 0x0000; bBusy = false; return NEDIO_OK; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // thread void RecvThread(void *passedThread) { int status; SOCKADDR_IN remote_sockaddr_in; unsigned long remote_sockaddr_length = sizeof(SOCKADDR_IN); char temp[2048]; while(1) { //if(iInputMode) status= recvfrom(GlobalSocket,cAIStatus,60,(int)NULL,(SOCKADDR *)&remote_sockaddr_in,(int *)&remote_sockaddr_length); //else status= recvfrom(GlobalSocket,cInputStatus,60,(int)NULL,(SOCKADDR *)&remote_sockaddr_in,(int *)&remote_sockaddr_length); status= recvfrom(GlobalSocket,cInputStatus,60,(int)NULL,(SOCKADDR *)&remote_sockaddr_in,(int *)&remote_sockaddr_length); if(status == SOCKET_ERROR) { _endthread(); iRecvStatus = NEDIO_WINSOCK_RECV_ERROR; } iFlag = 1; //return cInputStatus; //sprintf(temp,"%s from Packet: Data = [%x %x %x %x]",inet_ntoa(remote_sockaddr_in.sin_addr ), cInputStatus[0], cInputStatus[1], cInputStatus[2], cInputStatus[3], cInputStatus[4], cInputStatus[5], cInputStatus[6], cInputStatus[7]); //Form1->Memo2->Lines->Add(temp); } } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // SYSTEM_INFO __declspec(dllexport) int NEDIO_SysInfo(int iDevNum) { } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Set Input/Output Mode __declspec(dllexport) unsigned int NEDIO_DioModeMulti_Set(int iModuleNo, int iMode) { char ch[6]; unsigned int uiModule; char sendBuff[80]; iFlag = 0; ch[0] = 0x00; ch[1] = 0x03; if(iMode) uiModule = uiIniModuleAddress | ((0x0001 << (iModuleNo-1)) & 0xFFFF); else uiModule = uiIniModuleAddress & ((0x0001 << (iModuleNo-1)) ^ 0xFFFF); ch[2] = (uiModule >> 8) & 0x00FF; ch[3] = (uiModule & 0x00FF); sprintf(sendBuff, "%c%c%c%c", ch[0],ch[1],ch[2],ch[3]); if(sendto(GlobalSocket,sendBuff,sizeof(sendBuff),(int)NULL,(SOCKADDR *)&remote,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { return NEDIO_ERROR; } Sleep(50); if(!(iRecvStatus == 3)){ uiIniModuleAddress = uiModule; //return NEDIO_OK; return NEDIO_OK; }else{ return NEDIO_FAIL; } } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // OutPut Command __declspec(dllexport) int NEDIO_DioOne_Put(int iModuleNo, int iChannel, int iLogic) { char ch[6], cH, cL; unsigned int uiNewOutStatus, uiOldOutStatus, uiModule; char sendBuff[80]; bBusy = true; iFlag = 0; ch[0] = 0x00; ch[1] = 0x01; sprintf(sendBuff, "%c%c", ch[0],ch[1]); /// ÇöÀç Ãâ·Â »óÅ ¹Ýȯ ÈÄ iInputMode = 0; if(sendto(GlobalSocket,sendBuff,sizeof(sendBuff),(int)NULL,(SOCKADDR *)&remote,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { return NEDIO_ERROR; } Sleep(10); uiOldOutStatus = ((cInputStatus[(iModuleNo*1)+iModuleNo] << 8 ) & 0xFF00) | (cInputStatus[(iModuleNo*1)+iModuleNo+1] & 0xFF); ch[0] = 0x00; ch[1] = 0x02; uiModule = 0x0000 | ((0x0001 << (iModuleNo-1)) & 0xFFFF); ch[2] = (uiModule >> 8) & 0xFF; ch[3] = (uiModule & 0xFF); if(iLogic) uiNewOutStatus = uiOldOutStatus | ((0x0001 << (iChannel-1)) & 0xFFFF); else uiNewOutStatus = uiOldOutStatus & ((0x0001 << (iChannel-1)) ^ 0xFFFF); ch[4] = (uiNewOutStatus >> 8) & 0xFF; ch[5] = uiNewOutStatus & 0xFF; sprintf(sendBuff, "%c%c%c%c%c%c", ch[0],ch[1],ch[2],ch[3],ch[4],ch[5]); iInputMode = 0; if(sendto(GlobalSocket,sendBuff,sizeof(sendBuff),(int)NULL,(SOCKADDR *)&remote,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { return NEDIO_ERROR; } Sleep(10); uiOldOutStatus = ((cInputStatus[(iModuleNo*1)+iModuleNo] << 8 ) & 0xFF00) | (cInputStatus[(iModuleNo*1)+iModuleNo+1] & 0xFF); int ic=0; while(1){ if((uiNewOutStatus != uiOldOutStatus)){ iInputMode = 0; if(sendto(GlobalSocket,sendBuff,sizeof(sendBuff),(int)NULL,(SOCKADDR *)&remote,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { return NEDIO_ERROR; } Sleep(5); }else break; uiOldOutStatus = ((cInputStatus[(iModuleNo*1)+iModuleNo] << 8) & 0xFF00) | (cInputStatus[(iModuleNo*1)+iModuleNo+1] & 0xFF); //uiOldOutStatus = ((cInputStatus[(2*iModuleNo)] << 4 ) & 0x0FF0) | ((cInputStatus[(2*iModuleNo)+1] >> 4) & 0x000F); ic++; if(ic >= 20) break; } if(ic <20) return NEDIO_OK; else return NEDIO_WINSOCK_RECV_ERROR; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // reset module and initialize __declspec(dllexport) int NEDIO_DioModeMulti_Reset() { char ch[6]; unsigned int uiData; char sendBuff[80]; iFlag = 0; ch[0] = 0x00; ch[1] = 0x04; //ch[2] = (iModuleNo >> 8) & 0x00FF; //ch[3] = (iModuleNo & 0x00FF); //ch[4] = (iChannel >> 8) & 0x00FF; //ch[5] = (iChannel & 0x00FF); sprintf(sendBuff, "%c%c", ch[0],ch[1]); if(sendto(GlobalSocket,sendBuff,sizeof(sendBuff),(int)NULL,(SOCKADDR *)&remote,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { //sprintf(tempBuffer,"Send Error:%d",WSAGetLastError()); //Memo3->Lines->Add(tempBuffer); return NEDIO_ERROR; } Sleep(50); return NEDIO_OK; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Input / Output Status __declspec(dllexport) unsigned int NEDIO_DioModeMulti_Get(int iModuleNo) { char ch[6]; unsigned int uiData; char sendBuff[80]; iFlag = 0; ch[0] = 0x00; ch[1] = 0x01; sprintf(sendBuff, "%c%c", ch[0],ch[1]); if(sendto(GlobalSocket,sendBuff,sizeof(sendBuff),(int)NULL,(SOCKADDR *)&remote,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { return NEDIO_ERROR; } Sleep(10); uiData = ((cInputStatus[(2*iModuleNo)] << 8 ) & 0xFF00) | (cInputStatus[(2*iModuleNo)+1] & 0x00FF); // uiData = ((cInputStatus[(iModuleNo*1)+iModuleNo] << 8 ) & 0xFF00) | (cInputStatus[(iModuleNo*1)+iModuleNo+1] & 0x00FF); return uiData; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Output All Off __declspec(dllexport) int NEDIO_OUTPUT_ALL_CONTROL(int iModuleNo, int iOnOff) { //bBusy = true; char ch[6]; unsigned int uiData, uiModule; char sendBuff[80]; iFlag = 0; ch[0] = 0x00; ch[1] = 0x02; uiModule = 0x0000 | ((0x0001 << (iModuleNo-1)) & 0xFFFF); ch[2] = (uiModule >> 8) & 0x00FF; ch[3] = (uiModule & 0x00FF); if(iOnOff) sprintf(sendBuff, "%c%c%c%c%c%c", ch[0],ch[1],ch[2],ch[3],0xFF,0xFF); else sprintf(sendBuff, "%c%c%c%c%c%c", ch[0],ch[1],ch[2],ch[3],0x00,0x00); if(sendto(GlobalSocket,sendBuff,sizeof(sendBuff),(int)NULL,(SOCKADDR *)&remote,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { return NEDIO_ERROR; } //bBusy = false; return NEDIO_OK; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Read Analog __declspec(dllexport) unsigned int NEDIO_READ_ANALOG(int iModuleNo, _stAD *uiADData) { char ch[6]; unsigned int uiData, uiModule; char sendBuff[80]; iFlag = 0; ch[0] = 0x00; ch[1] = 0x06; //uiModule = 0x0000 | ((0x0001 << (iModuleNo-1)) & 0xFFFF); ch[2] = iModuleNo & 0xFF; //ch[2] = (uiModule >> 8) & 0x00FF; //ch[3] = (uiModule & 0x00FF); sprintf(sendBuff, "%c%c%c", ch[0],ch[1],ch[2]); iInputMode = 1; if(sendto(GlobalSocket,sendBuff,sizeof(sendBuff),(int)NULL,(SOCKADDR *)&remote,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { return NEDIO_ERROR; } Sleep(10); for(int i=0;i<8;i++) uiADData[i].uiAD = ((cInputStatus[(2*i)] << 4 ) & 0x0FF0) | ((cInputStatus[(2*i)+1] >> 4) & 0x000F); //uiADData[iChNo].uiAD = ((cInputStatus[(2*iChNo)] << 4 ) & 0x0FF0) | ((cInputStatus[(2*iChNo)+1] >> 4) & 0x000F); //Sleep(10); return 1; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Write Analog 1Ch __declspec(dllexport) int NEDIO_DA_WRITE_ONECH(int iModuleNo, int iChNo ,int iData) { char ch[6]; unsigned int uiData, uiModule; char sendBuff[80]; iFlag = 0; ch[0] = 0x00; ch[1] = 0x08; ch[2] = iModuleNo & 0xFF; ch[3] = 0xFF & iChNo; ch[4] = (iData >> 4) & 0xFF; ch[5] = (iData << 4) & 0xF0; //ch[4] = (iData >> 8) & 0xFF; //ch[5] = iData & 0xFF; uiData = (ch[4] << 4) & 0x0FF0 | ((ch[5]>>4) & 0x000F); //uiData = (ch[4] << 12) & 0x0F00 | (ch[5] & 0x00FF); /*uiModule = 0x0000 | ((0x0001 << (iModuleNo-1)) & 0xFFFF); ch[2] = (uiModule >> 8) & 0x00FF; ch[3] = (uiModule & 0x00FF); iChNo = 0x0000 | ((0x0001 << (iChNo-1)) & 0xFFFF); ch[4] = iChNo; ch[5] = (uiModule >> 8) & 0x00FF; ch[6] = (uiModule & 0x00FF); */ sprintf(sendBuff, "%c%c%c%c%c%c", ch[0],ch[1],ch[2],ch[3],ch[4],ch[5]); Sleep(10); if(sendto(GlobalSocket,sendBuff,sizeof(sendBuff),(int)NULL,(SOCKADDR *)&remote,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { return NEDIO_ERROR; } //bBusy = false; return NEDIO_OK; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------