一个TCP/IP主机是Modbus/TCP读取寄存器的源代码,只需修改TCP/IP的接口部分就可以在以下环境下使用: 1. 命令行的JAVA应用程序 2. UNIX下基于命令行的C应用程序 3. Win32下基于命令行的C应用程序
test1.cpp - Win32 console app to read registers // test1.cpp 5/23/97
// example Win32 C++ program to read registers from PLC via gateway // compile with BC45 or BC50
// default settings for Win32 console app // empty DEF file #include int main(int argc, char **argv) { if (argc<5) { printf(\"usage: test1 ip_adrs unit reg_no num_regs\\n\" \"eg test1 198.202.138.72 5 0 10\\n\"); return 1; } char *ip_adrs = argv[1]; unsigned short unit = atoi(argv[2]); unsigned short reg_no = atoi(argv[3]); unsigned short num_regs = atoi(argv[4]); printf(\"ip_adrs = %s unit = %d reg_no = %d num_regs = %d\\n\ip_adrs, unit, reg_no, num_regs); // initialize WinSock static WSADATA wd; if (WSAStartup(0x0101, &wd)) { printf(\"cannot initialize WinSock\\n\"); return 1; } // set up socket SOCKET s; s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(502); // ASA standard port server.sin_addr.s_addr = inet_addr(ip_adrs); int i; i = connect(s, (sockaddr *)&server, sizeof(sockaddr_in)); if (i<0) { printf(\"connect - error %d\\n\closesocket(s); WSACleanup(); return 1; } fd_set fds; FD_ZERO(&fds); timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; // wait for permission to send FD_SET(s, &fds); i = select(32, NULL, &fds, NULL, &tv); // write if (i<=0) { printf(\"select - error %d\\n\closesocket(s); WSACleanup(); return 1; } // build request of form 0 0 0 0 0 6 ui 3 rr rr nn nn unsigned char obuf[261]; unsigned char ibuf[261]; for (i=0;i<5;i++) obuf[i] = 0; obuf[5] = 6; obuf[6] = unit; obuf[7] = 3; obuf[8] = reg_no >> 8; obuf[9] = reg_no & 0xff; obuf[10] = num_regs >> 8; obuf[11] = num_regs & 0xff; // send request i = send(s, obuf, 12, 0); if (i<12) { printf(\"failed to send all 12 chars\\n\"); } // wait for response FD_SET(s, &fds); i = select(32, &fds, NULL, NULL, &tv); //read if (i<=0) { printf(\"no TCP response received\\n\"); closesocket(s); WSACleanup(); return 1; } // read response i = recv(s, ibuf, 261, 0); if (i<9) { if (i==0) { printf(\"unexpected close of connection at remote end\\n\"); } else { printf(\"response was too short - %d chars\\n\} } else if (ibuf[7] & 0x80) { printf(\"Modbus exception response - type %d\\n\} else if (i != (9+2*num_regs)) { printf(\"incorrect response size is %d expected %d\\n\} else { for (i=0;i // close down closesocket(s); WSACleanup(); return 0; } 因篇幅问题不能全部显示,请点此查看更多更全内容