/* MBTM_LAN.c: Modbus TCP Master via Ethernet Compiler: BC++ 3.1, Turbo C++ 1.01(3.01) Compile mode: large Project: MBTM_LAN.C lib\G4500.lib lib\TCP_DM32.lib lib\ModGPRS.lb Hardware: G-4513 [Feb 17, 2015] by William */ #include #include "lib\g4500.h" #include "lib\tcpip32.h" #include "lib\ModGPRS.h" //variables declared in TCP/IP library. extern int errno; extern long ET_TOUT; /* basic timeout value */ int Ethernet_Init(void) { /* Return: 0: ok. -1: function "llip" error -2: function "Ninit" error -3: function "Portinit" error */ int iRet; struct ip host_ip; GetSavedIp((struct ip*)&host_ip); iRet=lhip("7186EX", &host_ip); if(iRet!=NoError) return -1; iRet=Ninit(); if(iRet!=NoError) return -2; iRet=Portinit( "*" ); /* initiate network device */ if(iRet!=NoError) return -3; return 0; } int Ethernet_Connect(unsigned char *cRemoteIP,int iRemoteTCPPort,long lConnect_Timeout) { /* cRemoteIP: Remote IP address, for example: "192.168.255.1" iRemoteTCPPort: Remote TCP port number lConnect_Timeout: timeout (unit: ms) Return: >=0 :ok, return socket number <0 :error, return -1. */ extern int errno; int iSocketNumber,iRet; unsigned long lStartTimeTick; int iTemp; struct sockaddr_in sktRemoteServer; iSocketNumber=socket(PF_INET,SOCK_STREAM,0); if(iSocketNumber>=0) { YIELD(); memset(&sktRemoteServer, 0, sizeof(sktRemoteServer)); /* bzero is a unix system call */ sktRemoteServer.sin_family = AF_INET; sktRemoteServer.sin_addr.s_addr = inet_addr(cRemoteIP); sktRemoteServer.sin_port = htons( iRemoteTCPPort ); YIELD(); SOCKET_NOBLOCK(iSocketNumber); /*Set Non-blocking mode*/ ET_TOUT=300L; //300ms, ET_TOUT has less than 800ms (WatchDog reboot time) iRet=connect(iSocketNumber, (struct sockaddr *)&sktRemoteServer, sizeof(sktRemoteServer)); if(iRet) /* unsuccessful connection not 0 */ { lStartTimeTick=*TimeTicks; if(errno==EINPROGRESS) { while((*TimeTicks-lStartTimeTick)=0) { SOCKET_BLOCK(iSocketNumber); return iSocketNumber; } else { RefreshWDT(); return -1; } } int Ethernet_Receive(int iSocket,char *cInBuf,int iMaxLen,int iTimeout) { /* iSocket: Socket number *cInBuf: Buffer to store received data iMaxLen: Max length to receive iTimeout: timeout to receive data (unit: ms) Return: >0 : ok, return received data length. <=0 : error, doesn't receive any data. */ int iLength; SOCKET_RXTOUT(iSocket, iTimeout); //set the receive timeout for a connection// iLength= recv(iSocket,cInBuf,iMaxLen,0); //MSG_OOB SOCKET_BLOCK(iSocket); YIELD(); if (iLength>=0) cInBuf[iLength]=0; return iLength; } #define ModubsCmdLen 5 int iLoop=0, iSocket; typedef struct MODBUSCMD { int NetID; int FunctionCode; int WriteMemoryAddress; int RemoteMemoryAddress; int IOCounter; }Buffer_ModbusCmd; const char ModbusName[5][20] = { {"Station Number:"}, {"Function Code:"}, {"Write Address:"}, {"Remote Address:"}, {"IO Counter:"} }; Buffer_ModbusCmd ModbusCmd; unsigned char iMemory_DI[100]; unsigned char iMemory_DO[100]; int iMemory_AI[100]; int iMemory_AO[100]; int main(void) { int iRet, iLength; int Cnt = 0; int i; int *Ptr_ModebusCmd = (int *)&ModbusCmd; char tmp; char sInBuffer[100]; char ModbusBuf[512]; char RemoteIP[20]; int serverPort; //Step1. Initate the controller. InitLib(); InitGPRSModbus(iMemory_DI, iMemory_DO, iMemory_AI, iMemory_AO); //Step2. Initial the Ethernet adapter. iRet=Ethernet_Init(); if(iRet==NoError) Print("Inint Ethernet ok.\n\r"); else Print("Inint Ethernet error.\n\r"); if(iSocket>=0) Print("Connect ok, socket=%d\n\r", iSocket); else Print("Connect error.\n\r"); memset(RemoteIP,0,sizeof(RemoteIP)); memset(ModbusBuf,0,sizeof(ModbusBuf)); //Step3. Enter remote IP and port. Print("please input server IP:(ex: 74.125.227.48)\r\n"); Scanf("%s", RemoteIP); Print("please input server Port:(ex: 80)\r\n"); Scanf("%d", &serverPort); iSocket = Ethernet_Connect(RemoteIP,serverPort, 2000); if (iSocket >= 0) Print("Remote connected ok!!,The Socket Num:%d\r\n",iSocket); else Print("Remote connected error!!\r\n"); while(1) { if(Kbhit()) { tmp = Getch(); if( tmp == 27 || tmp == 'q') break; } //Step4. Enter Modbus TCP command. for(i=0;i 0) { //Step8. Allocation data iRet = GPRSModbusTCP_Receive((char *) sInBuffer, iLength); //Step9. Print IO data Print("iRet:%d\r\n",iRet); Print("Function code:%d\r\n",ModbusCmd.FunctionCode); for(i=0;i