www.pudn.com > TCPmodbushy.rar > master.c
/****************************************************************************** * Project : t_box * Module Name : master.C * CPU Type : C8051F340 * * Description : * * History Author Version Comment * 2006.10.22 HY V0.0 Original version * * Copyright (C) 2006 HY. All rights reserved. ******************************************************************************/ #include "o:\sysdef.h" #include#include "o:/lwip/tcp.h" #include "o:/lwip/pbuf.h" #include "o:/IPV4/lwip/ip_addr.h" uint data landTIME; /* interval of each land*/ uchar data UART_out_time; uchar data FrameDataReceived; uchar idata head_info[16]; uchar idata comm_send_protocol; uchar idata commDelyTime; bit data slave_send_flag; MEMB xdata *ip_station_list; uchar IpConflictTime; // (0.25*IpConflictTime)S #ifdef TESTDEBUG uchar test[14]; #endif /****************************************************************************** * Name: InitOther ******************************************************************************/ void InitPara( void ) { #ifdef TESTDEBUG uchar i; #endif uchar xdata tmp[BAUDRATE_LEN+PARITYTYPE_LEN+DATABITS_LEN+STOPBITS_LEN]; ReadBytesFromFlash( BAUDRATE_ADDRESS, BAUDRATE_LEN, tmp); ReadBytesFromFlash( PARITYTYPE_ADDRESS, PARITYTYPE_LEN, &(tmp[2])); ReadBytesFromFlash( DATABITS_ADDRESS, DATABITS_LEN, &(tmp[3])); ReadBytesFromFlash( STOPBITS_ADDRESS, STOPBITS_LEN, &(tmp[4])); InitCommuPort(MAKE_WORD( tmp[0], tmp[1] ),tmp[2],tmp[3],tmp[4]); //InitCommuPort(57600,1,8,1); FrameDataReceived = START_SEND; //set send comm data protocol comm_send_protocol = ReadByteFromFlash( PROTOCOL_TYPE ); commDelyTime = 0; // commDelyTime = ReadByteFromFlash( COMM_SEND_DELYTIME ); #ifdef TESTDEBUG for(i = 0;i<14;i++) { test[i] = 0; } #endif affair_head = MIN_AFFAIR; affair_tail = MIN_AFFAIR; initTransaction(); land_sever1_flag = LAND_SEVER; land_sever2_flag = LAND_SEVER; send_net_type_flag = NO; com_flag = NO; master_sendcommdata_flag = NO; master_com_flag = NO; slave_send_flag = NO; } /***************************************************************************** * master function *****************************************************************************/ void input( void ) { if( CurWorkState & AUTOLAND ) { land_function(); } if(send_net_type_flag) { net_type_function(1); net_type_function(2); } if(pCashData) { apply_process(); /*get data from pCashData*/ } if( !(CurWorkState & MASTER_NOT_SLAVE) ) { s_uart(); } else { m_uart(); } } /**************************************************************************** function: Init_TBox_State *****************************************************************************/ void Init_TBox_State( void ) { IpConflictTime = 0; // (0.25*IpConflictTime)S IP_LED = LED_OFF; if( CurWorkState & SETPARA_NOT_WORK ) { // PARA SETTING struct ip_addr xdata ipaddr; ipaddr.addr = 0xC0A8006F; /*IP = 192.168.0.111 */ netif_set_ipaddr((struct ip_addr xdata *)&ipaddr); ipaddr.addr = 0xFFFFFF00; /*MASK = 255.255.255.0 */ netif_set_netmask((struct ip_addr xdata *)&ipaddr); ipaddr.addr = 0xC0A80001; /*GateW = 192.168.0.001 */ netif_set_gw((struct ip_addr xdata *)&ipaddr); netif_set_up(); etharp_query( &(netif->ip_addr), NULL ); } else { // WORKING STATE if( CurWorkState & AUTO_NOT_MANUAL_IP ) { // DHCP CLIENT dhcp_start(); } else { // MANUAL ALLOCATE IP uchar xdata tmp[4]; struct ip_addr xdata ipaddr; ReadBytesFromFlash( STATIC_IP_ADDRESS, STATIC_IP_LEN, tmp); ipaddr.addr = MAKE_LONG( MAKE_WORD(tmp[0],tmp[1]),MAKE_WORD(tmp[2],tmp[3])); netif_set_ipaddr((struct ip_addr xdata *)&ipaddr); ReadBytesFromFlash( NETMASK_ADDRESS, NETMASK_LEN, tmp); ipaddr.addr = MAKE_LONG( MAKE_WORD(tmp[0],tmp[1]),MAKE_WORD(tmp[2],tmp[3])); netif_set_netmask((struct ip_addr xdata *)&ipaddr); ReadBytesFromFlash( GW_ADDRESS, GW_LEN, tmp); ipaddr.addr = MAKE_LONG( MAKE_WORD(tmp[0],tmp[1]),MAKE_WORD(tmp[2],tmp[3])); netif_set_gw((struct ip_addr xdata *)&ipaddr); netif_set_up(); etharp_query( &(netif->ip_addr), NULL ); } } /* open TCP Listen Socket */ StartListen(); /*if TBOX is master,apply DYNAMIC_LIST memory and init this list*/ if( (CurWorkState & MASTER_NOT_SLAVE) ) init_dynamic_list(); } /**************************************************************************** * function: when state change, CLear curren state *****************************************************************************/ void EndCurrentState( void ) { // DHCP_CLIENT if( CurWorkState & AUTO_NOT_MANUAL_IP ) dhcp_stop(); // Close Listen Socket StopListen(); // Close Self's Socket and RST remote TCP LINK tcp_close_AllLink(); EA = OFF; } /************************************************************** master function ****************************************************************/ void m_uart( void ) { if(FrameDataReceived == END_RECEIVE) { //queryIP_count = 0; //master_com_flag = NO; if( check_RCVdata() ) { MODBUS_analyse(); } RstRcvCommu(); } if(comm_send_protocol == TCP_PROTOCOL) { if(master_sendcommdata_flag && (!master_com_flag)) switch_message(); } } /************************************************************************************ UART process *************************************************************************************/ void s_uart( void ) { uchar i,offset,j; uint len; MEMB xdata *pd,*tmp; if( FrameDataReceived == START_SEND ) { pd = find_head(); if( pd != NULL ) { tmp = pd; if(commDelyTime == 0 && !slave_send_flag) commDelyTime = ReadByteFromFlash( COMM_SEND_DELYTIME ); if(slave_send_flag) { slave_send_flag = NO; if( ( pd->tag & 0x40 ) == SERVE_TRANS_MESSAGE) { head_info[0] = SERVE_TRANS_MESSAGE; /*Transaction*/ head_info[1] = pd->space[0]; head_info[2] = pd->space[1]; /*station num*/ head_info[3] = pd->space[TCPMODBUS_LEN]; /*ip+port+net type*/ for(i = 0;i<7;i++) head_info[i+4] = pd->space[i+9]; len = MAKE_WORD(pd->space[4],pd->space[5]) - TRANS_COMMAND_LEN; offset = TCPMODBUS_LEN + TRANS_COMMAND_LEN + 1; // Copy Data to com buff CommuBuffer[0] = pd->space[TCPMODBUS_LEN]; j = 1; } else { if(pd->space[0] == UDP_PROTOCOL) { // Include Statio No for( i=0; i<(UDP_DATA_STR + TCPMODBUS_LEN + 1); i++ ) head_info[i] = pd->space[i]; // UDP_DATA_STR+4กข5 is TCPMODBUS DATA AREA LEN len = MAKE_WORD( head_info[UDP_DATA_STR+4],head_info[UDP_DATA_STR+5] ); offset = UDP_DATA_STR + TCPMODBUS_LEN; } else {// TCP uchar ip_offset; uint ip_data_tmp; for( i=0; i<(TCP_DATA_STR + TCPMODBUS_LEN + 1); i++) head_info[i] = pd->space[i]; /*remember ip and port*/ i = pd->TCP_connect_num & 0x7F; ip_offset = TCP_DATA_STR + TCPMODBUS_LEN + 1; ip_data_tmp = HIGH_WORD( Manager_Tcp_Table[i].pPointTcp_Pcb->remote_ip.addr); head_info[ip_offset] = HIGH_BYTE(ip_data_tmp); head_info[ip_offset + 1] = LOW_BYTE(ip_data_tmp); ip_data_tmp = LOW_WORD( Manager_Tcp_Table[i].pPointTcp_Pcb->remote_ip.addr); head_info[ip_offset + 2] = HIGH_BYTE(ip_data_tmp); head_info[ip_offset + 3] = LOW_BYTE(ip_data_tmp); //port head_info[ip_offset + 4] = HIGH_BYTE(Manager_Tcp_Table[i].pPointTcp_Pcb->remote_port); head_info[ip_offset + 5] = LOW_BYTE(Manager_Tcp_Table[i].pPointTcp_Pcb->remote_port); // connect num head_info[ip_offset + 6] = pd->TCP_connect_num & 0x7F; // UDP_DATA_STR+4กข5 is TCPMODBUS DATA AREA LEN len = MAKE_WORD(head_info[TCP_DATA_STR+4],head_info[TCP_DATA_STR+5] ); offset = TCP_DATA_STR + TCPMODBUS_LEN; } // Copy Data to com buff j = 0; } while( pd ) { for( ; offset < pd->size; offset++ ) { CommuBuffer[j++] = pd->space[offset]; } pd = pd->link; offset = 0; } // Free apply Memb free_memb(tmp); UART_out_time = UART_TIME; RSTsend( len, CommuBuffer ); } } } else { if( FrameDataReceived == END_RECEIVE ) { if( check_RCVdata() ) { switch_message(); } FrameDataReceived = START_SEND; out_affair_queue(); } if( FrameDataReceived == WAIT_RECEIVE ) { if(UART_out_time == 0) { #ifdef TESTDEBUG test[13]++; #endif FrameDataReceived = START_SEND; out_affair_queue(); } } } if( com_flag ) { switch_message(); } } /******************************************************************************* * process data cash *******************************************************************************/ void apply_process(void) { uchar i,head; for( i=0; i remote_ip.addr ); } } /***************************************************************************************** *****************************************************************************************/ void init_dynamic_list( void ) { uchar head,offset; MEMB xdata *pd; head = apply_memb( STATION_IP_LISTSIZE ); ip_station_list = &( memory[head] ); /*initlize list*/ offset = 0; pd = ip_station_list; while( pd ) { while( offset < pd->size ) { pd->space[offset] = 0; offset++; } pd=pd->link; offset = 0; } }