📄 bl2100_modbus.c
字号:
{
/* 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 + -