1. 程式人生 > >plc c指令碼(c script) socket通訊

plc c指令碼(c script) socket通訊

client 

#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END


// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END




// Include header files
  #include "WSOCK32.h"


  #define PORT 8888
  #define SERVER_IP "192.168.30.119"
  // Declare local variables
  WSADATAwsaData;
  longlResult = 0;
  BOOLbResult = FALSE;
  SOCKETsMetNet = INVALID_SOCKET;
  struct hostent*pheMetNet = NULL;
  struct servent*pseMetNet = NULL;
  struct sockaddr_insaAddress;
  unsigned longulCommand = 1;
  charszTelegramData[1024] = "";


  // Get actual communication socket with MetNet-Server
  //sMetNet = (SOCKET)GetTagSDWord("socketState");   // Tag Signed 16-Bit Value
sMetNet=0;
//printf("變數名稱%d\n",sMetNet);


  // Examine for active connection with MetNet-Server
  if( (sMetNet == INVALID_SOCKET) || (sMetNet == 0) )
  {
// 載入socket動態連結庫(dll)
    WORD wVersionRequested;
    WSADATA wsaData;    // 這結構是用於接收Wjndows Socket的結構資訊的
    int err;
 
    wVersionRequested = MAKEWORD( 1, 1 );   // 請求1.1版本的WinSock庫
 
    err = WSAStartup( wVersionRequested, &wsaData );
    // Create communication socket
    sMetNet = socket(AF_INET, SOCK_STREAM,0);
    // printf("port------------------->>%d\n",err );
    if( sMetNet == SOCKET_ERROR )
    {
      GetSocketError(0, "Cannot create socket");
    }
    // Prepare communication parameter with MetNet-Server
    saAddress.sin_addr.s_addr =   inet_addr(SERVER_IP);
    saAddress.sin_family = AF_INET;
    saAddress.sin_port =  htons(PORT);
    // Open communication with MetNet-Server
    lResult = connect(sMetNet, (const struct sockaddr *)&saAddress, sizeof(saAddress));


    if( lResult == SOCKET_ERROR )
    {
      GetSocketError(sMetNet, "Cannot connect to server %s", SERVER_IP);
    }
    else
    {
   lResult=send(sMetNet, "nihao\r\n", strlen("nihao\r\n")+1, 0);  // 傳送顯示歡迎資訊
  printf("傳送完畢!\n");
  lResult = recv(sMetNet, &szTelegramData[0], (sizeof(szTelegramData) - 1), 0);
  printf("接收完畢!\n");
  if( (lResult > 0) && (WSAGetLastError() == 0) )
  {
    // Terminate receive telegram data
    szTelegramData[lResult] = '\0';
    // Your code ...
   printf("伺服器返回資料----------------------------------->%s\n", szTelegramData);
  }
  else
  {
   printf("----------------------------------->%d\n",  lResult );
    // Examine for socket failure (e.g. network error)
    if( (lResult == 0) && (WSAGetLastError() != WSAEWOULDBLOCK) )
    {
      // Close communication with MetNet-Server
      sMetNet = GetSocketError(sMetNet, "Cannot read data from server %s",SERVER_IP);
    }
}
    closesocket(sMetNet);
    WSACleanup();
  }
}
  // Finish action
}

server——————————————————————————————————————————————————————————————————————

#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END


// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END




// Include header files
#include "WSOCK32.h"


#define PORT 6662
#define SERVER_IP "0.0.0.0"
SOCKET sMetNet = INVALID_SOCKET;
SOCKET ClientSocket;
                struct servent*pseMetNet = NULL;
struct sockaddr_insaAddress,ClientAddr;
int AddrLen = 0;
                int i=0;
   // Examine for active connection with MetNet-Server
   if( (sMetNet == INVALID_SOCKET) || (sMetNet == 0) )
   {
// 載入socket動態連結庫(dll)
   WORD wVersionRequested;
   // 這結構是用於接收Wjndows Socket的結構資訊的
   WSADATA wsaData;   
//接收執行結果,用來判斷是否正確  
   int ret;
   // 請求1.1版本的WinSock庫
   wVersionRequested = MAKEWORD( 1, 1 );
   //測試執行步驟 
   printf("%s\n","test");
   ret = WSAStartup( wVersionRequested, &wsaData );
   // Create communication socket
   sMetNet = socket(AF_INET, SOCK_STREAM,0);
   // printf("port------------------->>%d\n",err );
   if( sMetNet == SOCKET_ERROR )
   {
     GetSocketError(0, "Cannot create socket");
   }
                    SetTagSDWord("socketState", sMetNet);
   // Prepare communication parameter with MetNet-Server
   saAddress.sin_addr.s_addr =   inet_addr(SERVER_IP);
   saAddress.sin_family = AF_INET;
   saAddress.sin_port =  htons(PORT);
   //將套接字綁定於特定地址的特定埠,其中第二個引數可以使用SOCKADDR_IN來代替。
  ret=bind(sMetNet,(const struct sockaddr *)&saAddress,sizeof(saAddress));
  if(ret != 0)
  {
      GetSocketError(0, "Bind failed!");
  }
// 第一個引數指定需要設定的套接字,第二個引數為(等待連線佇列的最大長度)
  ret= listen(sMetNet, 10);
  if(ret != 0)
  {
      GetSocketError(0, "listen failed!");
  }
   printf("Server is listening\n");

//迴圈等待客戶端接入 
 while ( 1 )
    {
                                                                char recvchar[100];
printf("等待客戶端接入,第%d個",i);
AddrLen = sizeof(ClientAddr);
ClientSocket = accept(sMetNet, (struct sockaddr*)&ClientAddr, &AddrLen);
if ( ClientSocket == INVALID_SOCKET )
{
GetSocketError(0, "Accept failed!");
break;
}
printf("client ip is: %s and the port is:%d",inet_ntoa (ClientAddr.sin_addr),ClientAddr.sin_port);
                                                                send(ClientSocket ,"nihao\r\n", strlen("nihao\r\n")+1,0);




                                                                 recv(ClientSocket ,recvchar,100,0);//本函式用於已連線的資料報或流式套介面s進行資料的接收
                                                 printf("%s\n",recvchar);
closesocket(ClientSocket );
i++;
}

}


  // Finish action

專案指令碼————————————————————————————————————————————————————————————————————————

// Include header files
#include "WSOCK32.h"




unsigned int GetSocketError(unsigned int sSocket, char *lpszFormatMessage, ...)
{


  // Declare local variables
  va_listvlErrorValues;
  intiLastSocketError = 0;
  intiNewSocketError = 0;
  static char   szLastErrorMessage[254 + 1] = "";
  char          szNewErrorMessage[254 + 1] = "";


  // Get last and new socket error
  iNewSocketError = WSAGetLastError();


  // Get new error message
  if( lpszFormatMessage != NULL )
  {
    va_start(vlErrorValues, lpszFormatMessage);
    vsprintf(&szNewErrorMessage[0], lpszFormatMessage, vlErrorValues);
    va_end(vlErrorValues);
  }


  // Close open communication socket
  if( sSocket > 0 )
  {
    shutdown(sSocket, 2);
    closesocket(sSocket);
    SetTagSDWord(HMI_SA_METNETSOCKET, INVALID_SOCKET);
  }


  // Write socket error message
  printf("== SOCKET ERROR =========================================\r\n");
  printf("  Socket error\t:  %d\r\n", iNewSocketError);
  if( strlen(&szNewErrorMessage[0]) > 0 )
    printf("  Error message\t:  %s\r\n", &szNewErrorMessage[0]);
  printf("=========================================================\r\n");


  // Finish function
  return(INVALID_SOCKET);


}

全域性標頭檔案——————————————————————————————————————————————————————————————————————

//--------------------------------------------------------------------------------
// 
// Function: WSOCK32.H Winsocket definitions
//
// Reference:Definitions to be used with the WSOCK32.DLL
//
//--------------------------------------------------------------------------------


#ifndef __WSOCK32


#define __WSOCK32 1


// Basic system type definitions, taken from the BSD file sys/types.h
typedef unsigned charu_char;
typedef unsigned shortu_short;
typedef unsigned intu_int;
typedef unsigned longu_long;
typedef intINT_PTR, *PINT_PTR;
typedef unsigned intUINT_PTR, *PUINT_PTR;
typedef longLONG_PTR, *PLONG_PTR;
typedef unsigned longULONG_PTR, *PULONG_PTR;


// The new type to be used in all instances which refer to sockets
typedef INT_PTRSOCKET;


//
#define WSADESCRIPTION_LEN      256
#define WSASYS_STATUS_LEN       128


typedef struct WSAData 
{
  WORD                    wVersion;
  WORD                    wHighVersion;
  char                    szDescription[WSADESCRIPTION_LEN+1];
  char                    szSystemStatus[WSASYS_STATUS_LEN+1];
  unsigned short          iMaxSockets;
  unsigned short          iMaxUdpDg;
  char FAR *              lpVendorInfo;
} WSADATA;


typedef WSADATA *LPWSADATA;


// Internet address (old style... should be updated)
#ifndef s_addr


struct in_addr {
        union {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { u_short s_w1,s_w2; } S_un_w;
                u_long S_addr;
        } S_un;
        #define s_addr  S_un.S_addr// can be used for most tcp & ip code
        #define s_host  S_un.S_un_b.s_b2// host on imp
        #define s_net   S_un.S_un_b.s_b1// network
        #define s_imp   S_un.S_un_w.s_w2// imp
        #define s_impno S_un.S_un_b.s_b4// imp #
        #define s_lh    S_un.S_un_b.s_b3// logical host
};


#endif


// Socket address, internet style
struct sockaddr_in
{
short   sin_family;
u_short sin_port;
struct  in_addr sin_addr;
char    sin_zero[8];
};


// Structures returned by network data base library, taken from the
// BSD file netdb.h.  All addresses are supplied in host order, and
// returned in network order (suitable for use in system calls).
struct  hostent
{
char    FAR * h_name;           // official name of host
char    FAR * FAR * h_aliases;// alias list
short   h_addrtype;// host address type
short   h_length;               // length of address
char    FAR * FAR * h_addr_list;// list of addresses
#define h_addr  h_addr_list[0]// address, for backward compat
};


struct  servent 
{
char    FAR * s_name;// official service name
char    FAR * FAR * s_aliases;// alias list
short   s_port;                 // port #
char    FAR * s_proto;          // protocol to use
};




// Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
#define IOCPARM_MASK    0x7f           // parameters must be < 128 bytes
#define IOC_VOID        0x20000000      // no parameters
#define IOC_OUT         0x40000000      // copy out parameters
#define IOC_IN          0x80000000    // copy in parameters
#define IOC_INOUT       (IOC_IN|IOC_OUT)// 0x20000000 distinguishes new & old ioctl's


#define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))
#define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
#define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))


#define FIONREAD    _IOR('f', 127, u_long) // get # bytes to read
#define FIONBIO     _IOW('f', 126, u_long) // set/clear non-blocking i/o
#define FIOASYNC    _IOW('f', 125, u_long) // set/clear async i/o




// This is used instead of -1, since the SOCKET type is unsigned.
#define INVALID_SOCKET  (SOCKET)(~0)
#define SOCKET_ERROR            (-1)


// Types
#define SOCK_STREAM     1               // stream socket


// Address families.
#define AF_UNSPEC       0// unspecified
#define AF_UNIX         1   // local to host (pipes, portals)
#define AF_INET         2               // internetwork: UDP, TCP, etc.
#define AF_IMPLINK      3               // arpanet imp addresses
#define AF_PUP          4               // pup protocols: e.g. BSP
#define AF_CHAOS        5               // mit CHAOS protocols
#define AF_IPX          6               // IPX and SPX */
#define AF_NS           6               // XEROX NS protocols
#define AF_ISO          7               // ISO protocols
#define AF_OSI          AF_ISO          // OSI is ISO
#define AF_ECMA         8               // european computer manufacturers
#define AF_DATAKIT      9               // datakit protocols
#define AF_CCITT        10              // CCITT protocols, X.25 etc
#define AF_SNA          11              // IBM SNA
#define AF_DECnet       12              // DECnet
#define AF_DLI          13              // Direct data link interface
#define AF_LAT          14              // LAT
#define AF_HYLINK       15              // NSC Hyperchannel
#define AF_APPLETALK    16              // AppleTalk
#define AF_NETBIOS      17              // NetBios-style addresses
#define AF_VOICEVIEW    18              // VoiceView
#define AF_FIREFOX      19              // FireFox
#define AF_UNKNOWN1     20              // Somebody is using this!
#define AF_BAN          21              // Banyan
#define AF_MAX          22// Max address families


// Structure used by kernel to store most addresses.
struct sockaddr
{
u_short sa_family;              // address family
char    sa_data[14];  // up to 14 bytes of direct address
};


// WinSock error codes are also defined in winerror.h
#ifndef WSABASEERR
#define WSABASEERR              10000
#define WSAEINTR                (WSABASEERR+4)
#define WSAEBADF                (WSABASEERR+9)
#define WSAEACCES               (WSABASEERR+13)
#define WSAEFAULT               (WSABASEERR+14)
#define WSAEINVAL               (WSABASEERR+22)
#define WSAEMFILE               (WSABASEERR+24)
#define WSAEWOULDBLOCK          (WSABASEERR+35)
#define WSAEINPROGRESS          (WSABASEERR+36)
#define WSAEALREADY             (WSABASEERR+37)
#define WSAENOTSOCK             (WSABASEERR+38)
#define WSAEDESTADDRREQ         (WSABASEERR+39)
#define WSAEMSGSIZE             (WSABASEERR+40)
#define WSAEPROTOTYPE           (WSABASEERR+41)
#define WSAENOPROTOOPT          (WSABASEERR+42)
#define WSAEPROTONOSUPPORT      (WSABASEERR+43)
#define WSAESOCKTNOSUPPORT      (WSABASEERR+44)
#define WSAEOPNOTSUPP           (WSABASEERR+45)
#define WSAEPFNOSUPPORT         (WSABASEERR+46)
#define WSAEAFNOSUPPORT         (WSABASEERR+47)
#define WSAEADDRINUSE           (WSABASEERR+48)
#define WSAEADDRNOTAVAIL        (WSABASEERR+49)
#define WSAENETDOWN             (WSABASEERR+50)
#define WSAENETUNREACH          (WSABASEERR+51)
#define WSAENETRESET            (WSABASEERR+52)
#define WSAECONNABORTED         (WSABASEERR+53)
#define WSAECONNRESET           (WSABASEERR+54)
#define WSAENOBUFS              (WSABASEERR+55)
#define WSAEISCONN              (WSABASEERR+56)
#define WSAENOTCONN             (WSABASEERR+57)
#define WSAESHUTDOWN            (WSABASEERR+58)
#define WSAETOOMANYREFS         (WSABASEERR+59)
#define WSAETIMEDOUT            (WSABASEERR+60)
#define WSAECONNREFUSED         (WSABASEERR+61)
#define WSAELOOP                (WSABASEERR+62)
#define WSAENAMETOOLONG         (WSABASEERR+63)
#define WSAEHOSTDOWN            (WSABASEERR+64)
#define WSAEHOSTUNREACH         (WSABASEERR+65)
#define WSAENOTEMPTY            (WSABASEERR+66)
#define WSAEPROCLIM             (WSABASEERR+67)
#define WSAEUSERS               (WSABASEERR+68)
#define WSAEDQUOT               (WSABASEERR+69)
#define WSAESTALE               (WSABASEERR+70)
#define WSAEREMOTE              (WSABASEERR+71)
#define WSASYSNOTREADY          (WSABASEERR+91)
#define WSAVERNOTSUPPORTED      (WSABASEERR+92)
#define WSANOTINITIALISED       (WSABASEERR+93)
#define WSAEDISCON              (WSABASEERR+101)
#define WSAHOST_NOT_FOUND       (WSABASEERR+1001)
#define WSATRY_AGAIN            (WSABASEERR+1002)
#define WSANO_RECOVERY          (WSABASEERR+1003)
#define WSANO_DATA              (WSABASEERR+1004)
#endif // ifdef WSABASEERR


// Winsocket function declaration from WSOCK32.DLL
#pragma code("wsock32.dll")
int WSAGetLastError(void);
int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
int WSACleanup(void);
struct hostent *gethostbyname(const char FAR *name);
struct servent *getservbyname(const char FAR *name, const char FAR *proto);
SOCKET socket(int af, int type, int protocol);
int connect(SOCKET s, const struct sockaddr FAR *name, int namelen);
int ioctlsocket(SOCKET s, long cmd,u_long FAR *argp);
int shutdown(SOCKET s, int how);
int closesocket(SOCKET s);
int send(SOCKET s, const char FAR *buf, int len, int flags);
int recv(SOCKET s, char FAR * buf, int len, int flags);
u_long PASCAL FAR ntohl (IN u_long netlong);
u_short PASCAL FAR ntohs (IN u_short netshort);
u_long PASCAL FAR htonl ( IN u_long hostlong);
u_short PASCAL FAR htons (IN u_short hostshort);
unsigned long PASCAL FAR inet_addr (IN const char FAR * cp);
char FAR * PASCAL FAR inet_ntoa (IN struct in_addr in);
int bind(SOCKET s, const struct sockaddr FAR *name,int namelen );
int listen(SOCKET s,int connectNum);
#pragma code()




#endif /* ifdef WSOCK32.h */