PDA

Просмотр полной версии : NModbus (C#) и ПЛК160: TCP-сокет закрывается через 11-12 секунд бездействия



Yegor
01.12.2011, 12:57
Здравствуйте!

Есть библиотека NModbus (http://code.google.com/p/nmodbus/) - реализация протокола для использования в CLR. Я намерен использовать её для связи ПК и ПЛК160. В принципе, она работает, но по неведомой мне причине если в течение 12 секунд не передавать данные, а потом попытаться это сделать, то вылетает исключение "The operation is not allowed on non-connected sockets". Если же поддерживать активность - периодически передавать или принимать Modbus-данные - всё работает нормально. На ПЛК настроен стандартный Modbus TCP Slave.

Подскажите пожалуйста, где вероятнее всего разрывается соединения при "длительном" простое - на ПЛК или в этой библиотеке?

Здорово упрощённый, но воспроизводящий ошибку код:


static void Main(string[] args)
{
var client = new TcpClient("192.168.0.18", 502);
var master = ModbusIpMaster.CreateIp(client);
client.Client.SetSocketOption(SocketOptionLevel.So cket, SocketOptionName.KeepAlive, true);
while (true)
{
master.WriteSingleRegister(0, 0);
Console.ReadKey(); // Ждём 12 секунд и получаем ошибку в очередном цикле
}
}

Спасибо.

capzap
01.12.2011, 13:39
установку соединения выводите в отдельную функцию и при появлении исключения конектитесь поновой

Yegor
01.12.2011, 13:54
Спасибо, capzap, я попробую.

Кстати, уже думал об этом, но мне такое решение показалось не очень красивым. И, между прочим, попробовал вообще без NModbus, то есть просто передать данные через сокет - та же история.

capzap
01.12.2011, 14:30
Если не хотите проблем с соединениями, переходите на UDP

Yegor
01.12.2011, 14:56
По-моему, ПЛК160 не умеет по Modbus в UDP. Или вы про сетевые переменные? Если да, то существует ли способ читать и записывать их на ПК?

capzap
01.12.2011, 15:34
В ПЛК там работы на день, чтоб модбасТСР запустить через UDP, на ПК сложнее, незнаю как NModbus я использую библиотеку jamod на Яве, там все неоходимое есть. Раз Вы умеете передавать байты непосредственно в сокет, то проблем у Вас и со стороны ПК не будет

Yegor
10.12.2011, 16:07
TCP-вариант вроде стабильно работает если опрашивать постоянно (а это обычное дело для modbus). Так что ни с чем пока заморачиваться больше не стал. Но совет capzap буду иметь в виду, спасибо.

Адрей
16.08.2015, 08:15
В ПЛК там работы на день, чтоб модбасТСР запустить через UDP, на ПК сложнее, незнаю как NModbus я использую библиотеку jamod на Яве, там все неоходимое есть. Раз Вы умеете передавать байты непосредственно в сокет, то проблем у Вас и со стороны ПК не будет
Заинтересовался jamod, не подскажете с чего начинать и куда капать, если не сложно не могли бы поделится небольшим примером как это выглядит на страничке. Какие есть плюсы минусы с работой jamod.

capzap
16.08.2015, 09:00
http://jamod.sourceforge.net/kb/howto_index.html
про страничку не понял, что имеется ввиду, для томката что ли

плюсыминусы, даже не знаю неудобства возникают, при использовании последовательных портов, она заточена под comm.jar а oracle больше её не поддерживает, так что она осталась 32-х разрядной, вряд ли это можно назвать сложностями для 64битных ОС, для других драйверов типа rxtx пришлось несколько классов переписывать

с UDP там где то привязка к конкретному порту вроде, уже не помню, переписать класс пришлось для какой то компиленной визуализации

Адрей
16.08.2015, 09:48
Идея такова пишем страничку html, сохраняем ее на ПК, пользователь открывает ее начинает работать скрипт ява,jamod открывает сокет и ведется опрос ПЛК по ТСР далее закрывается сокет. Вы не пробовали такой вариант. Я это имел ввиду.

capzap
16.08.2015, 10:08
обычно пишнтся на яве апплет, который можно разместить на страничке, есть еще вариант с сервером приложений, типа Tomcat, а чтоб на скрипте выполнить код Явы это врядли

Адрей
16.08.2015, 10:21
Понятно а вы не пробовали jsModbus.

capzap
16.08.2015, 10:53
:) я с node.js не работал, а так видео с этой бибкой не безызвестный Мурашов показывает, может бесплатно подскажет

voale
30.11.2016, 13:11
для решения проблемы " TCP-сокет закрывается через 11-12 секунд бездействия "пытался сделать как в инструкции в NModbus
http://ftp.icpdas.com/pub/cd/8000cd/napdos/modbus/nmodbus/nmodbus_api_manual_v1.2_en.pdf
на странице 8 : If want to reconnect when offline, refer to following codes.

но это не помогает, может кто скинуть кусок кода кто как делает? заранее огромное спасибо.