⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bl2100_modbus.c

📁 BL2100使用MODBUS与组态王通讯.C
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	/* send the packet */
	//my_sock->bytes = sock_fastwrite(&my_sock->sock, my_sock->buff,my_sock->bytes);
	my_sock->bytes = sock_fastwrite(&my_sock->sock,response,response_len);
	switch(my_sock->bytes)
	{
		case -1:
		return 4; // there was an error go to state 4 (NO_WAIT_CLOSE)
		default:
			(my_sock->statetime) = MS_TIMER+TIME_OUT; // reset time to be in the RECEIVE state
			my_sock->sent += my_sock->bytes;
		return 2; //now go to state 2 (RECEIVE)
	}
}

//*******************************************MY_HANDLER********************************
void My_Handler(My_Socket_Type *my_sock)
{
	switch(my_sock->nextstate)
	{
		case 0:/*INITIALIZATION*/          // listen for incoming connection
			if(tcp_listen(&my_sock->sock,my_sock->my_port,resolve(INCOMING_IP),INCOMING_PORT,NULL,0))
			{
				(my_sock->nextstate)++;          // init complete move onto next state
				my_sock->statetime = MS_TIMER+TIME_OUT;    // reset the statetime
				my_sock->sent = my_sock->rcvd = 0;      // reset num of packets send and rcvd
			}
			else
				exit(0);
			break;
		case 1://LISTEN//
			if(sock_established(&my_sock->sock))      // check for a connection
			{
				(my_sock->statetime) = MS_TIMER+TIME_OUT;    // reset statetime for RECEIVE state
				(my_sock->nextstate)++;          //   we have connection so move on
			}
			else if ((long)(MS_TIMER-(my_sock->statetime)) > 0) // if X sec and no sock
				my_sock->nextstate = 4;          //   abort and re-init
			break;
		case 2://RECEIVE//
			my_sock->nextstate = My_Rcv_Pkt(my_sock);     // see function for details
			if ((long)(MS_TIMER-(my_sock->statetime)) >  0)   // if X sec and still waiting
			my_sock->nextstate = 4;          //   abort and re-init
			break;
		case 3://SEND//
			my_sock->nextstate = My_Snd_Pkt(my_sock);     // see function for details
			if ((long)(MS_TIMER-(my_sock->statetime)) >  0)   // if X sec and still waiting
			my_sock->nextstate = 4;          //   abort and re-init
			break;
		case 4://NO WAIT_CLOSE//
			sock_abort(&my_sock->sock);         // close the socket
			my_sock->nextstate = 0;           // go back to the INIT state
	}
	if(!tcp_tick(&my_sock->sock))
	my_sock->nextstate = 0;
}

//********************************************MY_PRINT*********************************
void My_Print(int sCount, My_Socket_Type *my_sock)
{
	printf("\x1B=%c%cSocket[%d]: ",XY,XY+(sCount*9),sCount);
	if(!pd_havelink(0))
		printf("\x1B=%c%c%sNO LINK! ",XY+11,XY+(sCount*9),RED);
	else
		printf("\x1B=%c%c%sLINKED!    ",XY+11,XY+(sCount*9),GREEN);
	if(my_sock->nextstate == 2 || my_sock->nextstate == 3)
		printf ("%s CONNECTED!!     \n",GREEN);
	else
		printf ("%s NOT CONNECTED!! \n",RED);
	if(my_sock->oseqnum != my_sock->sock.seqnum || my_sock->oacknum != my_sock->sock.acknum)
	{
		printf("\n%sServer: Previous: seqnum = %11lu  acknum = %11lu\n",RED, my_sock->oseqnum, my_sock->oacknum);
		printf("%sServer: Current:  seqnum = %11lu  acknum = %11lu\n",BLUE, my_sock->sock.seqnum, my_sock->sock.acknum);
		my_sock->oseqnum = my_sock->sock.seqnum;
		my_sock->oacknum = my_sock->sock.acknum;
	}
	printf ("\x1B=%c%c%sstate: %06u  TimeOut: %09lu",XY,XY+(sCount*9)+5,BLACK, my_sock->nextstate,
    my_sock->statetime);
	printf ("  TIME: %09lu\n",MS_TIMER);
	printf ("Rcvd:  %06u  Sent:  %06u\n", my_sock->rcvd, my_sock->sent);
	printf ("----------------------------------------------------------------------------");
}

void SepPacket(unsigned char *pa)
{
	unsigned int count,start,i,j;
	unsigned temp;
	memset(response,0,256);
	response[0]=pa[0];
	response[1]=pa[1];
	response[2]=pa[2];
	response[3]=pa[3];
	response[4]=pa[4];
	response[5]=pa[5];
	response[6]=pa[6];
	response[7]=pa[7];
	wFunc=pa[7];
	wStartHi=pa[8];
	wStartLo=pa[9];
	wCntHi=pa[10];
	wCntLo=pa[11];
	printf("\nwFunc=%02x", wFunc);
	switch(wFunc)
	{
		case 0x01:  //Read Digital Output
			count=wCntHi*256+wCntLo;
			start=wStartHi*256+wStartLo;
			response[8]=count;
			printf(" Address=%d count=%d\n",start,count);
			if( count<8 )
			{
				for(i=0;i<=count/8;i++)
				{
					for(j=0;j<8;j++)
					if( acShad[start+8*i+j+1]==1 )
						response[9+i]|=(0x01<<j);
					else
						response[9+i]&=~(0x01<<j);
				}
				response_len=9+1;
			}
			else
			{
				for(i=0;i<count/8;i++)
				{
					for(j=0;j<8;j++)
					if( acShad[start+8*i+j+1]==1 )
						response[9+i]|=(0x01<<j);
					else
						response[9+i]&=~(0x01<<j);
				}
            response_len=9+count/8;
			}
			break;
		case 0x02:  // Read Digital Input
			count=wCntHi*256+wCntLo;
			start=wStartHi*256+wStartLo;
			response[8]=count;
			if( count<8 )
			{
				for(i=0;i<=count/8;i++)
				{
					for(j=0;j<8;j++)
					if( coil[start+8*i+j+1]==1 )
						response[9+i]|=(0x01<<j);
					else
						response[9+i]&=~(0x01<<j);
				}
				response_len=9+1;
            }
            else
           {
				for(i=0;i<count/8;i++)
				{
					for(j=0;j<8;j++)
					if( coil[start+8*i+j]==1 )
						response[9+i]|=(0x01<<j);
					else
						response[9+i]&=~(0x01<<j);
				}
				response_len=9+count/8;
			}
			break;
		case 0x03:   //Will read and write the DAC channels shadow register value.
			count=wCntHi*256+wCntLo;
			start=wStartHi*256+wStartLo;
			start/=2;
			response[8]=count*2;
			for(i=0;i<count/2;i++)
			{
				lsj_fc.F=aoShad[start+i+1];
				response[i*4+9]=lsj_fc.C[1];
				response[i*4+10]=lsj_fc.C[0];
				response[i*4+11]=lsj_fc.C[3];
				response[i*4+12]=lsj_fc.C[2];
            }
			response_len=9+count*2;
			break;
		case 0x04:     //Read input register
			count=wCntHi*256+wCntLo;
			start=wStartHi*256+wStartLo;
			start/=2;
			response[8]=count*2;
			for(i=0;i<=count/2;i++)
			{
				lsj_fc.F=reg[start+i];
				response[i*4+9]=lsj_fc.C[1];
				response[i*4+10]=lsj_fc.C[0];
				response[i*4+11]=lsj_fc.C[3];
				response[i*4+12]=lsj_fc.C[2];
            }
			response_len=9+count*2;
			break;
		case 0x05:  //强制一个线圈的通断状态
			count=wCntHi*256+wCntLo;
			start=wStartHi*256+wStartLo;
         //printf(" count=%d start=%d acShad[start]=%d",count,start,wCntHi);
			if( wCntHi==0xFF )
				acShad[start+1]=1;
			else
				acShad[start+1]=0;
			digOut(start,acShad[start+1]);
			response[8]=pa[8];
			response[9]=pa[9];
			response[10]=pa[10];
			response[11]=pa[11];
			response_len=12;
			break;
		case 0x10:
			count=wCntHi*256+wCntLo;
			start=wStartHi*256+wStartLo;
			start/=2;
			response[8]=count*2;
			for(i=1;i<=count/2;i++)
			{
				lsj_fc.C[1]=pa[i*4+9];
				lsj_fc.C[0]=pa[i*4+10];
				lsj_fc.C[3]=pa[i*4+11];
				lsj_fc.C[2]=pa[i*4+12];
				aoShad[start+i]=lsj_fc.F;
				anaOutVolts(start+i-1,aoShad[start+i]);
            }
			response_len=9+count*2;
			break;
		}//END CASE
	} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -