PDA

Просмотр полной версии : МК210-301 и SysLibSocket



Дмитрий Артюховский
11.02.2018, 16:07
Взял модуль на тестирование. Отличная штука! В принципе все работает, но захотелось подключить его в ПЛК100 через библиотеки (через конфигуратор - все хорошо!) и тут приплыли...

Сокет открывается, данные посылаются и принимаются модулем.. а вот ответов нет. После некоторого размышления стало понятно что и не будет! Ибо ПЛК открывает сокет для кодесиса на 502 порту (даже когда подключаемся другими интерфейсами!), куда собственно и валятся ответы модуля.

А вот в настройках модуля что-то не видно возможности поменять порт ((((

При подключении программой с компьютера с ответами все нормально!

пы.сы. ну и modbus UDP было бы удобно иметь

capzap
11.02.2018, 16:09
нормально там всё, без проблем собираю инфу через бибки, через конфигуратор даже не пробовал

Дмитрий Артюховский
11.02.2018, 16:15
нормально там всё, без проблем собираю инфу через бибки, через конфигуратор даже не пробовал

гм, а в чем собака то может быть ? прошивка 2.15.4, вроде не гнали на нее...

capzap
11.02.2018, 16:21
в коде естественно, ни о каком возврате данных на 502 порт речи быть не может, клиент сам назначает при установке ТСР соединения порт для ответов

Дмитрий Артюховский
11.02.2018, 16:31
а, ну да, чушь сморозил ))

Трофимов Артем
11.02.2018, 17:45
Дмитрий, могу завтра выложить наброски библиотеки. полностью стандарт не реализовывал. работают функции 1,2,3,4,16. как раз для модулей Мх210 делал.
Сразу оговорюсь - это не официальная библиотека.
каждый запрос - полный цикл работы сокета - открыть, настроить, отправить - принять , закрыть.
p.s. работал только на ПЛК110 М02

Дмитрий Артюховский
11.02.2018, 23:39
Будет интересно глянуть, но вопрос не в том что там должно быть (у меня с компа на модуль все функции модбас работают), а почему не работает syssockrecv на ПЛК100 ))) а 110м02 - это другой мир совсем... возможно это связано с кабелями, подключал и прямой кабель и up-link, работает одинаково - чудо чудное! )))

Трофимов Артем
12.02.2018, 11:03
во вложении.

capzap
12.02.2018, 11:36
у меня примерно тоже самое, стоит модуль и плк100L, как я считаю основная идея правильной работы с модулями заключается в фразе:"немножко подождали". Плк не многозадачные, модуля тем более, поэтому видимо быстрого отклика не всегда можно получить

Трофимов Артем
12.02.2018, 12:03
функция коннект мгновенно не происходит. по последним проверкам требуется хотябы 3 мс на реальное выполнение операции(лучше конечно чуть побольше).
на самом деле это я делал конечный автомат для приёма передачи, чтобы не заботиться о хэндлах в случае если модулей много и состоянии связи, если произошла пауза в обмене по логике алгоритма. также тестировали вариант с однократным коннектом и постоянной передачей данных, что не требует волшебного *немного подождали*.

capzap
12.02.2018, 12:34
Может быть с модулем и всё хорошо, а вот в связке с плк100 похвастаться стабильным точным результатом не получалось, наличие задержек уменьшало шансы на зависание соединения

Дмитрий Артюховский
12.02.2018, 13:31
во вложении.

все так и написано, паузы ток покороче, вот только "IF rcv_Byte >0 THEN" не выполняется, этот самый rcv = 0 ...

Дмитрий Артюховский
12.02.2018, 13:49
у меня примерно тоже самое, стоит модуль и плк100L, как я считаю основная идея правильной работы с модулями заключается в фразе:"немножко подождали". Плк не многозадачные, модуля тем более, поэтому видимо быстрого отклика не всегда можно получить

приятно код почитать! но, блин, ничего неожиданного не видно...

ADR(byRecv[1] - а почему не с нулевого ?

capzap
12.02.2018, 14:02
с единицы это уже привычка, с нуля обычно копипаст

Алексей Терентьев
15.02.2018, 08:05
Тоже сделал сначала через SysLibSocket на ПЛК150. Сначала все заработало с задержками 1мс, потом перестало. Стабильную связь удалось получить при 10мс задержках. При маленьких задержках время цикла сильно увеличивается. Не понравилось это. Сейчас стоят тестируются, но через конфигурацию ПЛК.

Трофимов Артем
15.02.2018, 10:53
конфигурация работает в стиле подключился и не закрываю сокет. поэтому там нет потери времени на коннект. необходимо понимать что устройство которое опрашиваем ( сервер ) оно может быть занято другими делами, например обработка IO , поэтому нужно *немножко подождать*. ведь операция разрешения на сервере состоит из нескольких функций ( как минимум двух, а то и больше может быть, зависит от ПО)

capzap
15.02.2018, 11:01
конфигурация работает в стиле подключился и не закрываю сокет. поэтому там нет потери времени на коннект

много ли в моем коде переподключений, когда соединение зависло только тогда я закрываю сокет и открываю по новой

Алексей Терентьев
16.02.2018, 03:54
А если нужно опрашивать два десятка модулей? На каждый модуль по сокету много будет. В итоге какие-то модули не будут опрашиваться?

Дмитрий Артюховский
16.02.2018, 09:32
А если нужно опрашивать два десятка модулей? На каждый модуль по сокету много будет. В итоге какие-то модули не будут опрашиваться?

TCP modbus - по любасу на каждый модуль по сокету, а поскольку столько сокетов нету - постоянные переконнекты, а вот если было бы UDP modbus - то все намного быстрее и проще!

Филоненко Владислав
16.02.2018, 13:21
UDP Modbus - это вообще что? http://www.modbus.org/specs.php про такие забавы ничего не известно. Пойди туда, не знаю куда, реализуй незнамо что. И чтоб работало!

Филоненко Владислав
16.02.2018, 13:22
А если нужно опрашивать два десятка модулей? На каждый модуль по сокету много будет. В итоге какие-то модули не будут опрашиваться?

Реконнект на другое устройство - это 2-3 мс.
И опрашивайте все. Вряд ли все 20 штук нужно опрашивать раз в 5 мс.

Дмитрий Артюховский
20.02.2018, 13:52
сокет открывается, данные посылаются и принимаются модулем.. а вот ответов нет.
починилось все, опечатка в вызове функции res = SysSockRecv( sock, buf[0], 255, 0 ); компилятор съел без ошибок, при работе res = 0 .... при написании "как надо" ADR( buf[0] ) - все заработало как надо....
но если так подумать - косяк транслятора ....

capzap
20.02.2018, 13:55
починилось все, опечатка в вызове функции res = SysSockRecv( sock, buf[0], 255, 0 ); компилятор съел без ошибок, при работе res = 0 .... при написании "как надо" ADR( buf[0] ) - все заработало как надо....
но если так подумать - косяк транслятора ....

ADR это указатель на область памяти 32-разрядным словом, есть специфические области на которые возможно ругнулся бы компилятор, а всё остальное почему бы и нет, может Вам так надо

Дмитрий Артюховский
20.02.2018, 20:33
дык, к ошибке типов претензий нет )) почему функция не работала? точнее работала но возвращала 0.. ну записала прием в ошибочную область и ладно...

capzap
20.02.2018, 21:07
нужно просто понять что раз пишите на чужой участок, то "хозяин" участка тоже без дела не стоит и вынужден обратно восстанавливать свой участок и возможно чаще чем пользовательская программа

Алексей Терентьев
26.02.2018, 04:47
Реконнект на другое устройство - это 2-3 мс.
И опрашивайте все. Вряд ли все 20 штук нужно опрашивать раз в 5 мс.

В этом году попробуем эти модули на одном, не очень ответственном, объекте. Тестирование пока продолжается успешно, но у меня всего 2 модуля. В отчете напишу некоторые пожелания. Если на объекте будет все в порядке, то в дальнейшем наверное будем их применять.

Roman Istomin
16.02.2019, 21:09
Поделитесь пожалуйста опытом в эксплуатации данных модулей.