WIZnet Developer Forum

Wiz550web_응답대기 시간 관련 문의 입니다

WIZ550WEB_응답대기 시간 관련 문의 입니다.

현재 모듈과 PC를 스위칭 허브로 연결하여 UDP로 데이터를 주고 받고 있습니다.

모듈과 PC가 모두 켜져 있는 상태에서는 정상적으로 데이터를 잘 주고 받고

WIZ550WEB의 프로그램에서 지연시간 없이

잘 돌아가고 있으며,

하지만 PC가 꺼진 상태에서는 데이터를 주고 받은 부분에서 대기 시간이 생겨서 프로그램이 일정시간동안

무응답상태로 있다가 다시 응답상태로 돌아 오고 있습니다.

지금 이부분을 해결 하려고 프로그램을 부분을 확인 하고 있습니다.

int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port)

int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)

위 함수 안에서 시간 지연이 발생하는것으로 보입니다.

어느 부분을 수정해야 하는지 , 그리고 하드웨어로 처리하는 방법이 있는지 문의 드립니다.

안녕하세요.

"하지만 PC가 꺼진 상태에서는 데이터를 주고 받은 부분에서 대기 시간이 생겨서 프로그램이 일정시간동안

무응답상태로 있다가 다시 응답상태로 돌아 오고 있습니다. "

이 부분에 대한 추가 설명 부탁드립니다.

PC가 꺼진 상태에서 데이터를 주고 받는다는 것이 되는건가요…?

이 부분에 대한 추가 설명 부탁드립니다.

감사합니다.

안녕하세요.
현재 사용 중이신 WIZ550web 펌웨어 버전과 구현 하시고자 하는 응용의 동작 구성도를 간단히 설명하여 주시면 빠른 문제 해결에 도움이 될 것으로 생각됩니다. :slight_smile:

PC와 모듈의 데이터 송수신하는 부분이 전체 프로그램에 영향을 미치지 않게 설계하고 있습니다.

데이터를 주고 받는 것은 모니터링용 입니다.

실제 모듈에서 모든 처리를 하고 PC는 데이터를 받고 보내고 하는 용도 입니다.

그래서 PC가 꺼저 있어도 모듈의 프로그램은 정상적으로 돌아가야 합니다.

그런데 모듈과 PC를 네트워크로 연결해 놓고 PC를 끄면 모니터링 하는 부분에서 지연 시간이 생겨서

전체 프로그램에 영향을 주고 있습니다.

그래서 지연시간을 줄이거나 없애는 방법을 찾고 있습니다.

모니터링 하는 부분을 주석 처리하면 지연시간이 생기지 않습니다.

감사합니다.

안녕하세요.

말씀하신 점으로 보아 유추되는 점은,

PC가 모니터링을 하고 있는 상태라고 할지라도 실제 PC에서 모듈에 영향을 주는 것 같습니다.

이 말은 모듈에서 PC쪽으로 Data를 보내고 있기 때문에 PC가 끊어지면 모듈이 PC로 보내는 Data에 대한 응답을 받지 못해서

지연이 되는 것으로 생각이 됩니다.

웹으로 모니터링을 하시는건가요??

WIZ550web은 TCP로 웹을 제어합니다. TCP의 경우 요청을 보내면 반드시 응답이 와야합니다.

위에서 설명드린바와 같이 PC가 응답 메세지를 안보내니깐 모듈에서 대기를 하는 것 같습니다.

모니터링 하는 부분을 UDP통신으로 바꿔야 할 것으로 생각됩니다.

감사합니다.

안녕하세요.

말씀하신 점으로 보아 유추되는 점은,

PC가 모니터링을 하고 있는 상태라고 할지라도 실제 PC에서 모듈에 영향을 주는 것 같습니다.

이 말은 모듈에서 PC쪽으로 Data를 보내고 있기 때문에 PC가 끊어지면 모듈이 PC로 보내는 Data에 대한 응답을 받지 못해서

지연이 되는 것으로 생각이 됩니다.

웹으로 모니터링을 하시는건가요??

-> 웹으로 모니터링을 하는것이 아니고 단순히 UDP로 일정량의 데이터를 보내고 받는것 입니다.
그리고 PC로 부터 데이터가 안들어와도 프로그램은 정상적으로 돌아가도록 되어 있습니다.
PC는 있어도 되고 없어도 되는 상태 입니다.

WIZ550web은 TCP로 웹을 제어합니다. TCP의 경우 요청을 보내면 반드시 응답이 와야합니다.

위에서 설명드린바와 같이 PC가 응답 메세지를 안보내니깐 모듈에서 대기를 하는 것 같습니다.

모니터링 하는 부분을 UDP통신으로 바꿔야 할 것으로 생각됩니다.

-> 현재 UDP로 사용하고 있습니다.

참고로 WIZ220WEB에서는 PC가 꺼저 있어도 정상적으로 대기시간 없이 프로그램이 작동합니다.

감사합니다.

말씀하신 내용은 UDP로 일정 데이터만 PC로 보내서 이를 모니터링 한다. 이게 맞죠?

그렇다면, 몇가지 질문드립니다.

대기시간이라고 말씀하시는 것은 아예 무한 루틴으로 빠져버린다는 건가요??

아니면 대기시간 이후에 동작은 정상적으로 하는 건가요??

여러 경우를 생각해봐야 할 것 같습니다.

그리고 혹시 뼈대 코드는 어떤 코드를 활용해서 구현하셨나요??

WIZ550web에서 사용하시는 Tool과 컴파일러까지 알려주세요.

감사합니다.

대기시간이라고 말씀하시는 것은 아예 무한 루틴으로 빠져버린다는 건가요??

아니면 대기시간 이후에 동작은 정상적으로 하는 건가요??

-> 대기시간후 정상 작동 합니다.

-> 컴파일러
Eclipse IDE for C/C++ Developers
Version: Kepler Service Release 2
Build id: 20140224-0627

다운로드 툴
WIZnet Configuration Tool Version 1.02

참고로 소스 코드 첨부합니다.

ProcessUDP_HOST() 함수 에서 지연시간이 발생 합니다.

/*

Name : main.c
Author : WIZnet
Version :
Copyright : WIZnet Co., Ltd. 2014
Description : main definition

*/

/*

  • @brief WIZ550WEB Firmware
  • @note
  • Copyright© WIZnet Co., Ltd. 2014
  • All rights reserved.

*/

/*****************************************************************************

  • Includes
    ****************************************************************************/
    #include “stm32f10x.h”
    #include “common.h”
    #include “userHandler.h”
    #include “uartHandler.h”
    #include “rccHandler.h”
    #include “gpioHandler.h”
    #include “adcHandler.h”
    #include “spiHandler.h”
    #include “ConfigData.h”
    #include “ConfigMessage.h”
    #include “timerHandler.h”
    #include “flashHandler.h”
    #include <stdio.h>
    #include <stdint.h>
    #include “…/…/Ethernet/socket.h”

void ProcessUDP_HOST( void );
void delay_sec( unsigned int uiTime );

#define LOOPBACK_DEBUG

#define DATA_BUF_SIZE 2048

// WIZ550WEB-EVB 디지털 출력 포트 수량 -------------
#define MAX_OUT_PORT 8

// WIZ550WEB-EVB 디지털 입력 포트 수량 -------------
#define MAX_IN_PORT 8

// IP address -------------------------------------
unsigned char Host_IP[4] = {192,168,0,10};
uint16_t My_TX_Port = 1234;
uint16_t My_RX_Port = 1233;

// Socket number
#define DEFAULT_SOCKET 0
#define HOST_SOCKET 1

///////////////////////////////////////
// Debugging Message Printout enable //
///////////////////////////////////////
//#define MAIN_DEBUG
//#define WEB_DEBUG
#if defined (MAIN_DEBUG) || defined (WEB_DEBUG)
#include <stdio.h>
#endif

//////////////////////////////
// Shared Buffer Definition //
//////////////////////////////
#define DATA_BUF_SIZE 2048

uint8_t RX_BUF[DATA_BUF_SIZE];
uint8_t TX_BUF[DATA_BUF_SIZE];

////////////////////////////////
// W5500 HW Socket Definition //
////////////////////////////////
#define MAX_HTTPSOCK 6
uint8_t socknumlist[] = {2, 3, 4, 5, 6, 7};

//#define SOCK_CONFIG 0
//#define SOCK_DHCP 1
//////////////////////////////////////////

#define FALSE 0
#define TRUE 1

static unsigned char aucRxBuff[8] = {1, 2, 3, 4, 5, 6, 7, 8};
static unsigned char aucStatus[8] = {1, 2, 3, 4, 5, 6, 7, 8};

static unsigned char ucDataRxCheck = FALSE;

void ProcessUDP_HOST( void )
{
int32_t ret;
uint16_t size;

uint8_t sn = HOST_SOCKET;

switch(getSn_SR(sn))
{
case SOCK_UDP :
{
if((size = getSn_RX_RSR(sn)) > 0)
{
recvfrom(sn,aucRxBuff,size,Host_IP,&My_RX_Port); // receive data from a destination
}

		if( ucDataRxCheck == FALSE )
        {
			sendto(sn,aucStatus,8,Host_IP,My_TX_Port);
		}

	}
	break;

  case SOCK_CLOSED:
     if((ret=socket(sn,Sn_MR_UDP,My_RX_Port,0x00)) != sn)
     {
     	 return;
	 }
     break;

  default :
     break;

}

}

void delay_500msec( unsigned int uiTime )
{
unsigned int i;
/*
if ( uiTime < 0)
{
uiTime = 1;
}
else if ( uiTime > 0xffff )
{
uiTime = 0xffff;
}
*/
for ( i=0; i<uiTime; i++)
{
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
}

}

void delay_sec( unsigned int uiTime )
{
unsigned int i;
/*
if ( uiTime < 0)
{
uiTime = 1;
}
else if ( uiTime > 0xffff )
{
uiTime = 0xffff;
}
*/
for ( i=0; i<uiTime; i++)
{
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
}

}

int main(void)
{
uint8_t i;

//unsigned char ucBitMask;

//unsigned char *data_buf = NULL;	//= (unsigned char *)0x2000;			// buffer for loopack data


#if defined (_MAIN_DEBUG_) && defined (_USE_SDCARD_)
uint8_t ret;
#endif

//S2E_Packet *value = get_S2E_Packet_pointer();

// MCU Initialization
RCC_Configuration();		// rccHandler.c
NVIC_Configuration();		// boardutil.c
Timer_Configuration();		// timerHandler.c

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); 	// JTAG Disable


#if defined(MULTIFLASH_ENABLE)
probe_flash();
#endif

// Load the Configuration data
load_S2E_Packet_from_storage();		// ConfigData.c


// UART Initialization
USART1_Configuration();		// uartHandler.c
USART2_Configuration();		// uartHandler.c


// W5500 Initialization
W5500_SPI_LowLevel_Init();
W5500_Init();

IO_status_init();

// 포트를 출력으로 설정----------- 0 ~ 7
for (i=0; i<MAX_OUT_PORT; i++ )
{
	IOdata.io[i] = Output;
	IO_Init(i);
}

// 포트를 입력으로 설정----------- 8 ~ 15
for (i=0; i<MAX_IN_PORT; i++ )
{
	IOdata.io[i+D8] = Input;
	IO_Init(i+D8);
}



// LED Initialization
LED_Init(LED1);				// boardutil.c
LED_Init(LED2);				// boardutil.c
//LED_Off(LED1);				// boardutil.c
//LED_Off(LED2);				// boardutil.c


//LED_Off(LED1);
//Delay( 1000000 );

//LED_On(LED2);
//Delay( 1000000 );


// ADC Initialization
//adc_dmamulti_init();

/*
#ifdef _MAIN_DEBUG_
printf("\r\n=======================================\r\n");
printf(" WIZnet WIZ550WEB Revision 1.0\r\n");
printf(" Embedded Web Server Module\r\n");
printf(" Firmware Version %d.%d.%d\r\n", MAJOR_VER, MINOR_VER, MAINTENANCE_VER);
printf("=======================================\r\n");
printf(" # Device Name : %s\r\n\r\n", value->module_name);
#endif
*/

Net_Conf();			// ConfigData.c

/*
#ifdef _MAIN_DEBUG_
display_Net_Info();
#endif
*/
 
//atc_init();

#ifdef _USE_WATCHDOG_
// IWDG Initialization: STM32 Independent WatchDog
IWDG_Configureation();
#endif
 
LED_Off(LED1);
LED_Off(LED2);

while(1)
{
	#ifdef _USE_WATCHDOG_
	IWDG_ReloadCounter(); // Feed IWDG
	#endif

	do_udp_config(DEFAULT_SOCKET);				// Configuration tool handler

	/*

	생략

	*/


	ProcessUDP_HOST();							// 데이터 주고 받기


} // End of main routine

}

감사합니다.

void ProcessUDP_HOST( void ) 코드에서 지연이 되는 것으로 예측이 되는 것은,

recvfrom(sn,aucRxBuff,size,Host_IP,&My_RX_Port); 함수에 사용된

Host_IP, My_RX_Port 으로 보입니다.

아래는 저희가 배포하는 Loopback 예제 코드입니다. 참조해주세요.

github.com/Wiznet/ioLibrary_Dri … loopback.c

먼저, 저희가 배포드리는 Loopback 예제 코드를 설명드리자면 (loopback_udps함수)

어떤 UDP peer로 부터 Data를 받는지 모르기 때문에 따로 destip[4], destport 변수를 만들었습니다.

그래서 실제 UDP로 통신할 때 UDP Packet이 오면, UDP pakcet 중 header부분은 칩 내부에서 처리하게 됩니다.

그렇게 되면 header에 포함되어 있는 IP 및 Port 번호는 W5500 칩 내부 Register에 저장되게 됩니다.

그리고 사용자는 저장 된 Register에서 IP 및 Port를 &을 사용하여 읽고, 그대로 Sendto로 전송하게 됩니다.

그런데, 제작하신 코드를 보면 Host_IP, My_RX_Port가 임의 변수로 정해져있죠??

이렇게 구성하고 동작하시면, 당연히 PC가 켜져있는 상태에서는 정해진 IP 및 Port에서 Data가 날라오고 보내지니깐 통신이 되는데,

PC를 OFF하면 그 IP와 Port가 없기 때문에 칩 내부적으로 기다리는 상태가 되는 것으로 판단됩니다.

그래서, 저희가 배포하는 Loopback 코드대로 코드 작성을 변경하시고 다시 테스트 부탁드립니다.

감사합니다.

샘플 코드를 적용하여 수정 한 결과 PC가 없을때 시간 지연이 발생하지 않습니다.

하지만 PC에서 한번 데이터를 보내야 정상적으로 데이터를 주고 받을 수 있습니다.

그 전까지는 PC에서는 데이터를 받을 수 없습니다.

이 부분을 해결할 수 있는 방법이 있는지 문의 드립니다.

물론 PC에서 데이터를 받기 전에 미리 한번 보내면 해결 되지만 이 방식 말고 다른 방식이 있는지

알고싶습니다.

그리고 WIZ550WEB-EVB 새로운 버전 출시 시점이 언제 인지 알수 있을까요?

감사합니다.

안녕하세요.

우선 지연시간 해결이 되서 다행입니다.

문의주신 부분을 설명드리자면, UDP라는 통신자체가 비연결지향이기 때문에, 상대방 peer에서 Data가 오지 않는 이상 그저 대기할 뿐 입니다.

물론 UDP에서도 TCP처럼 제작할 순 있지만 그렇게 된다면 차라리 TCP를 사용하는 것이 낫죠…

말씀하신대로 Server에서 전원 ON 시 모듈쪽으로 data를 보내면 알아서 UDP로 통신되게 구성하는게 가장 괜찮은 방법으로 보입니다.

현재 WIZ550web-EVB는 새로운 버전 출시는 미정입니다.

WIZ550web Module만 새로운 버전 출시일이 3월 중순에서 4월 중순안에 될 것으로 보입니다.

감사합니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.