Вход

Просмотр полной версии : ПЛК отвергает запрос на подключение.



Barabus
11.12.2015, 13:35
Использую пример на базе этой библиотеки:
http://www.codeproject.com/Tips/16260/Modbus-TCP-class

ПЛК110-32. Конфиг такой:
http://s8.hostingkartinok.com/uploads/images/2015/12/c0fd75b8abb5a6cb15af3f42dd67e0bc.png

Код, осуществляющий подключение:

public void connect(string ip, ushort port)
{
try
{
IPAddress _ip;
if (IPAddress.TryParse(ip, out _ip) == false)
{
IPHostEntry hst = Dns.GetHostEntry(ip);
ip = hst.AddressList[0].ToString();
}
// ----------------------------------------------------------------
// Connect asynchronous client
tcpAsyCl = new Socket(IPAddress.Parse(ip).AddressFamily, SocketType.Stream, ProtocolType.Tcp);
tcpAsyCl.Connect(new IPEndPoint(IPAddress.Parse(ip), port));
tcpAsyCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, _timeout);
tcpAsyCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, _timeout);
tcpAsyCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, 1);
// ----------------------------------------------------------------
// Connect synchronous client
tcpSynCl = new Socket(IPAddress.Parse(ip).AddressFamily, SocketType.Stream, ProtocolType.Tcp);
tcpSynCl.Connect(new IPEndPoint(IPAddress.Parse(ip), port));
tcpSynCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, _timeout);
tcpSynCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, _timeout);
tcpSynCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, 1);
_connected = true;
}
catch (System.IO.IOException error)
{
_connected = false;
throw (error);
}
}

ip == "192.168.0.101"
port == 502
_timeout == 500

при исполнении выскакивает исключение на попытке установить синхронное соединение. Тут:

tcpSynCl = new Socket(IPAddress.Parse(ip).AddressFamily, SocketType.Stream, ProtocolType.Tcp);

Предупреждая дополнительные распросы, контролер сконфигурирован правильно. По указанному ip пингуется, TCP-подключение из CDS устанавливается, видимых причин для неправильной работы нет.

Вопрос: В чем может быть причина? В реализации библиотеки? Или в самом контролере?

Yegor
11.12.2015, 14:25
http://owen.ru/forum/showthread.php?t=20122

capzap
11.12.2015, 14:50
при исполнении выскакивает исключение на попытке установить синхронное соединение

Вопрос: В чем может быть причина? В реализации библиотеки? Или в самом контролере?
Дело в контроллере, один сокет - одно соединение

Barabus
11.12.2015, 16:33
Спасибо большое, примеры по ссылке великолепные. Буду изучать библиотеку NModbus.

Barabus
12.12.2015, 09:38
NModbus конечно хороша, но слишком уж велика. Оставил ее пока в сторонке. Продолжил разбираться с ModbusTCP.

capzap прав, в библиотеке допущена ошибка при проектировании, выражающаяся в попытке установить два соединения на один порт. Пример, поставляющийся с библиотекой, использует асинхронное соединение. Убрав код синхронного соединения я таки установил связь с ПЛК и успешно осуществил чтение с регистра и запись в оный.

Основной проблемой осталась периодическая потеря связи, что совсем не есть гуд. Конечно нет никакой сложности перехватывать исключение и восстанавливать связь, но для начала надо бы разобраться с причиной.

Yegor
12.12.2015, 12:02
NModbus конечно хороша, но слишком уж велика.оч смешно
static void Main(string[] args)
{
using (var master = ModbusIpMaster.CreateIp(new TcpClient("10.0.6.10", 502)))
{
var reg0 = master.ReadHoldingRegisters(1, 0, 1)[0];
}
}Причём добавление в проект вообще в три щелчка делается:

21277

Последнюю строку — в бесконечный цикл, и работать будет вечно. Уже в бою испытано. А вы какую-то сырую поделку нашли. Кстати ПЛК разрывает соединение через 12 секунд отсутствия активности на сокете, если что.

Barabus
12.12.2015, 16:23
оч смешно

Действительно смешно. Особенно если принять во внимание то, что я имел ввиду величину самой библиотеки, которую мне еще нужно адаптировать под мобильную платформу.

А ModbusTCP — всего один класс.


Кстати ПЛК разрывает соединение через 12 секунд отсутствия активности на сокете, если что.
А тут спасибо. Я это учту.

Yegor
12.12.2015, 21:07
величину самой библиотеки75 КБ?
А ModbusTCP — всего один класс.Один (https://en.wikipedia.org/wiki/God_object) непротестированный (https://github.com/NModbus4/NModbus4/tree/portable-3.0/NModbus4.UnitTests) класс, который нарушает каждую букву SOLID (https://ru.wikipedia.org/wiki/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD% D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D 0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1 %80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%8 0%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)). Серьёзно, блин, у чувака там пародия на dispose без интерфейса в финализаторе. Он на сишарпе только начал писать по-видимому. Там даже есть "if (OnOff == true)" — так только новички пишут. Такой код за километр в серьёзных проектах обходить надо.

Barabus
12.12.2015, 23:16
75 КБ?
Туева хуча файлов. Попробуйте ка подключить всю эту радость к проекту Unity (unity3d.com), чтобы оно работало под Andoid и iOS.


Такой код за километр в серьёзных проектах обходить надо.
Ничего, я уже многое поправил под себя. Под виндой работает безупречно. Теперь надо все это заставить работать под Andoid и iOS. Вот тут затыка. Официально System.Net.Sockets поддерживается в Unity 4 Pro и в Unity 5 Personal и Pro. По факту же ни черта не работает. Придется все переделывать под Transport Layer API, а с ним свои заморочки.

Проблема. Но к ПЛК никакого отношения уже не имеющая.

Barabus
13.12.2015, 00:04
Barabus, я был не прав в том, что не распознал сразу глубины Ваших разработок.
Вы можете приоткрыть тайну над целью подобной разработки?
Все просто, мне нужно управлять ПЛК с мобильных устройств.

rovki
13.12.2015, 00:11
Все просто, мне нужно управлять ПЛК с мобильных устройств.;)
В наших рядах пополнение :rolleyes:!?

Barabus
13.12.2015, 00:33
;)
В наших рядах пополнение :rolleyes:!?
Угу. А вы какой движок/SDK используете для HMI?

rovki
13.12.2015, 00:54
Угу. А вы какой движок/SDK используете для HMI?
Самодельный :cool:-КаСкада ,если правильно понял вас ,так как не программист .

Barabus
13.12.2015, 01:09
Самодельный :cool:-КаСкада
До-олгий путь. Это под каждую аппаратную платформу отдельное решение.

Взяли бы кроссплатформенный SDK. Unity советовать не буду, ибо вещь тяжеловесная и предназначена прежде всего для разработки игр. А вот Xamarin (https://xamarin.com/platform) или Marmalade (https://www.madewithmarmalade.com/) были бы в самый раз. Если с Unity ничего не получится, то я буду выбирать один из них.

Barabus
13.12.2015, 01:48
Собственно, с Unity я разобрался. С сокетов переписал на потоки и все заработало.

Прошел еще один день открытий. Пора спать.

Barabus
13.12.2015, 01:58
Хотелось бы сравнивать Вашу будущую разработку с такими брендами, как Iridium Mobile и THRONE
В эту сторону есть куда копать и что самое важное, есть спрос.

У Шнайдер Электрик программа программирования для пром. ПЛК называется Unity PRO XL (однофамильцы)
Ценички на эти продукты кусаются.

А как свое изделие закончу, непременно продемонстрирую. Планирую закончить программную часть и простенький аппаратный стенд к концу новогодних каникул. Теперь у меня есть для этого все необходимое.

Barabus
13.12.2015, 15:24
Для тех, кто это покупает, цена - не аргумент.
Должно быть работоспособно и удобно в редактировании.

Не менее удобно, чем Codesys

Я разрабатываю не среду программирования, а решение для конечного пользователя. А для конечного пользователя цена еще как важна. 300 тыс. против 3 млн. - это существенно.

Barabus
13.12.2015, 15:29
Собственно, новая проблема.

После холодного старта ПЛК отказывается устанавливать подключение. Стоит же сделать подключение/отключение (отладочный USB-порт) из CoDeSys, после этого проблем в работе не возникает.

В чем может быть причина?

Отбой. Надо просто немного с минуту подождать. Тогда все ОК.

Barabus
13.12.2015, 18:19
Цена становится важна, когда в таких (как Вы указали) объемах.
Одна лицензия на один "мобильник" (Iridium Mobile) - 10000р
Про лицензионную политику THRONE - не скажу, так как там только в ближайших планах создать нативный драйвер для Modbus.
21302
А цена на оборудование, к которым они умеют работать? Цены КNX-контролеры начитаются где-то от $1500, если мне не изменяет память. Да с-ный выключатель или датчик движения стоят от $200. Итого себестоимость минимального проекта стремится к 500 т.р., а еще и себе в карман хочется что-то положить.

Решения на промышленных ПЛК выходят в разы дешевле. Свободу проектирования GUI же и сравнивать не стоит, на самописной системе возможности безграничны.

Barabus
13.12.2015, 18:28
Собственно, не могу не согласиться с господином Yegorом. Выбранная мной библиотека Modbus-TCP-class — кусок г-на. Переписал уже практически полностью, убрал обработку исключений ибо сомневаюсь в корректности их работы. Постоянно срабатывала ложная тревога о потере подключения.

Сейчас гоняю около часа два подключения. Оба живы-здоровы. Похоже придется таки изучать протокол и все делать самому заново.

P.S.: Если кто знает годную библиотеку Modbus TCP Master полностью на шарпе и не сильно объемную, то дайте знать.

Barabus
13.12.2015, 20:04
Собираетесь ли Вы на себе замыкать эксплуатацию объекта?
Конечно. Так и задумано.


Хотелось бы увидеть как будет выглядеть редактор.
К GUI я пока толком не приступал, все мучаюсь с сетью. Как будет что-то не очень страшное, сразу покажу.

Yegor
14.12.2015, 09:01
Придется все переделывать под Transport Layer API, а с ним свои заморочки.В NModbus'е можно реализовать StreamResource и хоть через голубиную почту отправлять. Я так в PowerShell сообщения перенаправлял в консоль без всяких сокетов и портов.

Barabus
15.12.2015, 08:22
В NModbus'е можно реализовать StreamResource и хоть через голубиную почту отправлять. Я так в PowerShell сообщения перенаправлял в консоль без всяких сокетов и портов.
У NModbus главная проблема в том, что он использует нативную библиотеку FTD2XX, которую as is на Android, iOS и Windows RT ну никак не запустить.

И даже если были бы их исходники на плюсах, то все равно никаких гарантий. Может там код на винду завязан. Да и переписывание отдельно под каждую платформу, связывание нативного кода с управляемым под Unity с последующим вылавливанием багов — это то еще развлечение.

Я уже выбрал другое решение. Тоже не фонтан с точки зрения красоты кода, но очень простое и главное — рабочее.