3.1 初始化子程序
(1)启动看门狗。系统由于某种原因陷入死循环后能自动退出,使系统恢复正常。
(2)初始化5024、5017。该两种模拟量模块在使用之前需要通过软件进行设置。其中5024 设置为4~20mA 电流输出,5017 设置为0~10V 输入。
(3)启动网络心跳包检测定时器。网络心跳包用于确认网络连接是否正常。
3.2 网络连接子程序
控制器首先建立 socket,然后与服务器连接。网络连接子程序的主要部分为:
void ConnectServer()
{ //首先进行相关变量定义
if((SO_5510=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==
INVALID_SOCKET) //建立socket 并设置为TCP 方式
{//未能建立socket 的处理}
pulArgp = 1;
if(ioctlsocket(SO_5510, FIONBIO, &pulArgp)) //将socket 设置为非阻塞模式
{//未能设置socket 的处理}
he=gethostbyname("172.18.55.1"); //server address
Server_addr.sin_family = AF_INET; //TCP/IP
Server_addr.sin_port = htons(Server_Port);
Server_addr.sin_addr =*((struct in_addr *)he->h_addr);
memset(&(Server_addr.sin_zero), 0, 8);
ConnectReturnFlag = connect(SO_5510, (struct sockaddr *)&Server_addr,sizeof(struct
sockaddr));//建立连接
if( ConnectReturnFlag == 0)
{//建立连接成功的相应处理}
else
{//建立连接失败的相应处理}
}
3.3 接收数并处理子程序
5510 接收到数据包后首先分析数据包内的命令字。本系统中设计的命令字有开始采集、停止采集、检查连接、有效数据等。如果是前三种命令则立即执行,如果是“有效数据”命令则打开数据包后面的内容(可能包含多个子包),子包内包含开关量、模拟量等若干子命令,程序根据不同子命令执行相应子程序。程序主体示意如下。
void ReceiveAndProcess()
{ if ((numbytes = recv(SO_5510, (char *)&RECVITEMS, sizeof(RECVITEMS), 0))==
SOCKET_ERROR)
{//没有接收到数据的处理}
if(numbytes>0)//收到数据后的处理
{ switch(RECVITEMS.Command) //判断命令字
{ case Scollectstart: //开始采集命令