以往上位機程序我們一般都是通過232、485和PLC通信,232通信受到距離的限制,485距離能夠滿足要求,也有不足的地方受環境干擾比較大,切傳輸過程中速度不怎么快,新的課題通過網口與PLC通信,西門子的PLC我們用過網口作為傳輸介質,速度可以而且使用起來方便,只需一根網線就可以調試程序了,這次的課題是以OMR的PLC作為控制PLC,上位機程序(也就是大家說的組態軟件)我們自己來寫,我會寫出一系列的課程把我們實現的過程與大家一起分享,也希望做這快的朋友一起來討論。
今天是入門課利用socket實現TCP/IP通信編程,實現兩臺電腦通過IP互聯。
socket編程的教材網上搜羅下還是很多的,思路基本上也是一樣的,程序分兩部分客戶端和服務器端
第一部分 服務器端
一、創建服務器套接字(create)。
二、服務器套接字進行信息綁定(bind),并開始監聽連接(listen)。
三、接受來自用戶端的連接請求(accept)。
四、開始數據傳輸(send/receive)。
五、關閉套接字(closesocket)。
socket接收、發送代碼
1 SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
2 char sendBuf[50];
3 sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
4 send(sockConn,sendBuf,strlen(sendBuf)+1,0);
5 char recvBuf[50];
6 recv(sockConn,recvBuf,50,0);
7 printf("%s\n",recvBuf);
8 closesocket(sockConn);
第二部分 用戶端
一、創建用戶套接字(create)。
二、與遠程服務器進行連接(connect),如被接受則創建接收進程。
三、開始數據傳輸(send/receive)。
四、關閉套接字(closesocket)。
客戶端代碼
1 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
2
3 SOCKADDR_IN addrSrv;
4 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
5 addrSrv.sin_family=AF_INET;
6 addrSrv.sin_port=htons(6000);
7 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
8 send(sockClient,"hello",strlen("hello")+1,0);
9 char recvBuf[50];
10 recv(sockClient,recvBuf,50,0);
11 printf("%s\n",recvBuf);
服務器端代碼和客戶端主要代碼基本上都是上面的程序,
在應用的過程中有幾點要根據自己的需求更改,
1、127.0.0.1是服務器端的IP地址,根據自己的IP段進行修改;
2、htons(6000)是端口號根據具體設定進行修改,我們PLC端口號用到是9600,這點我們需要修改成9600。
網上好多程序都是VC6寫的,在參考過程中葉遇到了問題,程序LICK出現了如下錯誤
unresolved external symbol __imp__closesocket@4
解決辦法:
這是由于VC庫中沒有加如 ws2_32.lib 所致。
解決方案一:程序代碼中加入#pragma comment(lib, "Ws2_32.lib")
解決方案二:在project\setting\link 中object/library modules加入 ws2_32.lib
這個是VC6的解決方案,我用的VS2008找了一下
上個圖吧,VS2008里設置,工程屬性-鏈接器-命令行-附加選項添加 ws2_32.lib就ok了。
編譯通過后,服務器端,可以看到hello,
客戶端,可以看到welcome 127.0.0.1 to here!
深圳北大青鳥