您的当前位置:首页正文

modbus源代码

2020-08-22 来源:品趣旅游知识分享网
Modbus TCP源代码-编程举例

一个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 #include #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;iunsigned short w = (ibuf[9+i+i]<<8) + ibuf[10+i+i]; printf(\"word %d = %d\\n\} }

// close down closesocket(s); WSACleanup(); return 0; }

因篇幅问题不能全部显示,请点此查看更多更全内容