Подскащите как решить проблему контроля потери соединения мс Wiznet W3150+ с ПЭВМ ?
В настоящее время наше предприятие использует модуль Wiznet NM7010B+ для осуществления удаленного мониторинга оборудования.
Для осуществления мониторинга, оборудование подключается к ПЭВМ по TCP/IP.
ПЭВМ ----------> Хаб-----//----->Хаб-----------> Оборудование с модулем NM7010B+
^
|
место разрыва TCP/IP соединения
ПЭВМ настраивается в качестве TCP-клиента, оборудование (плата) с модулем NM7010B+ - в качестве TCP-сервера. Модуль NM7010B+ выполнен на базе микросхемы W3150A+.
Суть проблемы состоит в невозможности определить факт потери соединения (физического разрыва на участке, указанном на рисунке ) средствами модуля NM7010B+ .
Если установить соединение по TCP/IP компьютер <> NM7010B+ и разорвать в указанном на рисунке месте, то и компьютер и модуль будут оставаться «в соединении» сколь угодно длительное время (по крайней мере более 8 часов). Т.е., факт разрыва не определяется ни компьютером, ни модулем NM7010B+.
Со стороны ПО компьютера, решением является задание низкоуровневых операционных режимов для Socket посредством функция socket.IOControl со значениями:
keepalivetime=3000; // определяет интервал между посылкой сообщений при пассивном состоянии канала.
keepaliveinterval=500; // определяет интервал посылки сообщений, если ответ не получен.
После применения этих параметров, разрыв соединения приводит к генерации ошибки сокета. Что, в свою очередь, может быть обработано программно и позволяет отследить факт разрыва соединения.
Со стороны оборудования подобного решения найти не удалось.
Мы попытались выполнить следующие действия:
1. После того как установлено соединение (между ПЭВМ и NM7010B+ ) и микросхема W3150A+ имеет состояние SOCK_ESTABLISHED , производим физический разрыв соединения, как показано на рисунке выше. Микросхема W3150A+ остается в состоянии SOCK_ESTABLISHED;
2. Записывается регистр RTR=0х07D0 (200мс) и RCR=5;
3 Записывается команда SEND_KEEP в регистр команд сокета Sn_CR и в течении 3 минут происходит ожидание установки бита TIMEOUT в «1» (при чтении регистра прерывания сокета Sn_IR). После истечения 3 минут бит TIMEOUT так и не взвелся, хотя должен был взвестись через 6 секунд.
Таким образом данную последовательность действий мы не можем использовать для сброса состояния соединения блока с модулем NM7010B+.
Подскажите , каким образом можно определить факт потери соединения !!!!