PDA

Просмотр полной версии : Обмен через UDP



maks-tver
30.11.2011, 10:12
Добрый день! Подскажите пожалуйста как организовать обмен через UDP, а точнее имеется два ПЛК-100 каждый должен и принимать и передавать сетевые переменные. Нашел пример http://www.owen.ru/forum/showpost.ph...8&postcount=10 но там показано только в одну сторону.

lara197a
30.11.2011, 10:34
5133Три контроллера соединены через свич сежду собой, выполняют циклическую программу, передавая данные от 1 ко 2, от 2 к 3, и от 3 к 1.
Через свич подключены к среде программирования(визуализация) и к Мастерскаде.
Программа писалась для тестирования скорости передачи данных и проверки конфликта МРСТ и КДС. Конфликта не замечено.

maks-tver
30.11.2011, 10:57
lara197a тебе спасибо большое!!!! Я не изменил идентификатор (COB-ID)

S.A.D.
26.12.2013, 12:52
не могу ничего понять. Беру 3 ПЛК-100, соединяю через свич, придумываю 3 переменных x1, y2, z3 для 1,2,3 ПЛК соответственно. 1 ПЛК должен изменять x1, а читать y2, z2. 2 ПЛК должен изменять y2, а читать x1, z3. 3 ПЛК изменяет z3, читает x1 и y2. В инструкции про разделение IP адресов ничего не сказано, ок, оставляем как есть одинаковые у всех. В каждом из проектов делаем 2 сетевых листа переменных PRIMER_READ (COB-ID 1) и PRIMER_WRITE (COB-ID 2). 1 работает на чтение, 2 на запись. По итогу в онлайн режиме 1 ПЛК вижу только как изменяется переменная x1. То как другие ПЛК изменяют другие переменные не вижу (переменные равны нулю). Вывод - не работает. Вопрос: что я сделал не так?

Sergey666
27.12.2013, 14:12
Ну это же сеть как ни как , какие на...н одинаковые IP адреса .

amn
18.12.2014, 12:21
Пробую компилировать пример уважаемого lara197a. Компилятор выдает предупреждения.
15757
Как от них избавиться?

lara197a, спасибо за пример. У Вас для всех сетевых папок connection 1 (UDP). Я почему-то думал, что для каждой папки должно быть свое соединение (и по инструкции всего допускается 4). Кто-нибудь может пояснить этот момент?

amn
24.12.2014, 18:37
Ответьте, пожалуйста, кто знает на следующие вопросы:
1. Как много можно создать папок (с разными COB-ID) для записи в одном соединении ( connection 1 (UDP) )?
2. То же самое для чтения?
3. Если можно создавать все папки в одном соединении, то какой смысл создавать другие соединения (это те, о которых в инструкции говорится, что их можно максимум 4)? Для чего они нужны? Может это нужно для добавления другого типа сети?
4. И про предупреждения из предыдущего поста, может кто подскажет.

Sergey666
24.12.2014, 22:05
Неужели нельзя на столе 3...6 плкшек соединить и просто попробовать ?
Сразу многое понятно станет

amn
25.12.2014, 00:23
Пока есть только 2 ПЛК, остальные будут позже, а делать уже сейчас надо. Не хочется потом время тратить на переделки, если вдруг что не пойдет. Чтобы не опрашивать все переменные постоянно, думаю разбить их на группы (в разные папки для записи) и писать по команде только те папки, что необходимы в данный момент. Надо еще как-то контролировать дошли данные или нет. Для этого это же значение сразу посылаем обратно. И еще не знаю если данные придут некорректные пакет проигнорируется или нет? Галочка для проверки контрольной суммы не действует для UDP? Надо принять несколько раз одинаковый ответ для гарантии. Если изменяется только одна переменная в папке, то передается только она или вся папка целиком? Кто как делает в таких случаях?

Первый раз делаю такое, поэтому есть сомнения не будет ли мешать обмен сетевыми переменными, если в эту же сеть подключить скаду. Или лучше ее перекинуть на отдельный интерфейс.

amn
25.12.2014, 16:17
Вопрос, который проверить не могу:
При изменении одной переменной при записи по команде в другой контроллер пишется только эта переменная или вся папка целиком? Мне это надо знать, так как данные будут изменяться из панели и остальные переменные папки могут не быть на текущем экране и проконтролировать их корректность не получится.

melky
25.12.2014, 16:22
Кажется лучше до отправки считать контрольную сумму, а по приему ее проверять на приемном ПЛК, тогда обратной посылки не потребуется. В случае несовпадения наоборот будет идти запрос на повторную посылку...

amn
25.12.2014, 16:57
Из инструкции я понял, что UDP контрольную сумму не передает через сетевые переменные, только CAN. Поэтому контролировать надо самому. Если, к примеру, из панели менять уставку, то на текущем экране мы увидим, если значение неправильное и можно снова его изменить. Вот у меня и вопрос, если переменные пишутся только те, что изменились, то все нормально, а если вся папка целиком и там есть переменные, которые на текущем экране панели не отражены и будут испорчены, то мы об этом не узнаем. В этом случае надо будет делать несколько папок с переменными для каждого экрана свою папку.

melky
25.12.2014, 17:02
amn так я я о чем ? вы хотите передать 10 байт, посчитаете контрольную сумму, прикрепите к переадче и передайте 12 байт. На приемной стороне приняли 12 байт, проверили контрольную сумму, совпало, отправили - ок, принял.
Не совпало, отправили - плохо слышу, повтори...

amn
25.12.2014, 17:29
melky, речь идет о сетевых переменных, тут ничего прикрепить нельзя.

melky
25.12.2014, 17:38
amn кто-то запрещает прикреплять ?

amn
25.12.2014, 17:47
Сетевые переменные это обычные глобальные переменные, которые передаются по сети без организации сетевого интерфейса. Ну и как я к глобальной переменной что-то могу прикрепить, если нет для этого инструмента?

melky
25.12.2014, 17:55
amn блин, инструмент - ВАША программа.
Передача переменных - скопом, то есть 10, 20 и т.д. и никто не мешает программе передающего устройства собрать все переменные до кучи, расчитать им контрольную сумму любым алгоритмом и отправить остальным.
Приемники, получив пакет проверяют по тому же алгоритму, правильно ли все получено, и если не правильно, отправляют запрос на повторное получение, или как вариант ждут следующей посылки, если был некорректный прием и не предпринимают действий.

Даже могут не отвечать и не запрашивать главное устройство, зависит от алгоритма.

capzap
25.12.2014, 17:58
amn блин, инструмент - ВАША программа.
Передача переменных - скопом, то есть 10, 20 и т.д. и никто не мешает программе передающего устройства собрать все переменные до кучи, расчитать им контрольную сумму любым алгоритмом и отправить остальным.
Приемники, получив пакет проверяют по тому же алгоритму, правильно ли все получено, и если не правильно, отправляют запрос на повторное получение, или как вариант ждут следующей посылки, если был некорректный прием и не предпринимают действий.

Даже могут не отвечать и не запрашивать главное устройство, зависит от алгоритма.мелкий, Вы же не знаете что такое сетевые переменные, вместо никчемного спора, пример покажите. А вот когда сядете за пример конкретно по сетвым переменным тогда сами всё поймете

melky
25.12.2014, 22:11
capzap с сетевыми сталкивался только на Modicon, сильная штука, но там через Modbus они гуляют вроде, не разбирался сильно.
Просто если речь идет о самописной реализации, то какая разница как оно будет реализовано ? просто передача 10 байт в пустоту, или передача тех же 10 байт но с добавлением контрольной суммы этих 10-ти байт ?
По крайней мере это позволяет при получении проверить, а правильный ли мы пакет получили ? Не вдаваясь в подробности протокола (раз уж сам UDP не позволяет выполнить контроль)

я извиняюсь, а чтобы передать по UDP не надо сказать устройству - передай вот это по сети ?

capzap
25.12.2014, 22:46
речь о бибке NetVarUdp_LIB_V23.lib и настройке целевой платформы, ни какой самописной реализации


ЗЫ на диске это примерно тут E:\08. Примеры программ и полезности\Samples_plc1xx\Communication\03_ NetVarUDP

melky
26.12.2014, 08:52
capzap ага, прочитал. Переменные могут передаваться не пачкой, а выборочно. Тогда наверное на приемниках надо делать обработку переменных. Задавать ей возможный диапазон и фильтрацию, на случай некорректно пришедшего значения. А библиотеку и принцип рассылки оставлять как есть.

amn
31.12.2014, 19:32
Для булевых переменных, даже передаваемых в виде маски, диапазон задать не получится. Мне кажется надо пачкой передавать, а получив, посылать в обратную, и сравнивать если пришло то же самое, то посылка дошла, иначе снова посылаем (по событию). И последней переменной сделать счетчик для контроля наличия связи и по ней же можно узнать что пришли новые данные.

capzap, скажите, а как Вы организуете управление дискретными переменными через UDP, не проверяя корректность на том конце? Я понимаю, что если не дойдет посылка ничего страшного не произойдет, дойдет следующая, а если дойдет с ошибками, то ложно сработает какой-нибудь выход.

capzap
31.12.2014, 19:40
ну чистым UDP я не пользуюсь, модбас по нему посылаю, обычно с панели у меня из дискрет, только старт, стоп, сброс аварии/подтверждения, ручное управление, по сути ложные срабатывания исключены, а ошибки пришедьшие с плк в панель я физически не успею глазом отловить

amn
31.12.2014, 20:15
Мне надо через сетевые переменные передавать маску дискретов для автоматического включения/выключения, вот и задумался, что будет если ПЛК получит данные с ошибкой и автоматически будет ложно включаться и выключаться оборудование. Надо ставить какие-то задержки для исключения ложных срабатываний.

ASo
31.12.2014, 20:27
Контрольную сумму - отменили? Даже несколько, в одном пакете.

amn
31.12.2014, 20:57
Насколько я понял из документации (CoDeSys_V23_RU.pdf стр. 201) галочки для контрольной суммы справедливы для типа сети CAN. Было бы здорово, если бы они работали и для UDP. Пусть меня поправят если я ошибаюсь.

ASo
31.12.2014, 21:44
М-дя... Образование упало ниже плинтуса...
У Вас там 2 контрольных суммы. 1.- IP 2. Ethernet. Вам нужна 3-я?

amn
31.12.2014, 23:57
ASo, поясните для необразованного простым языком. Я меняю уставку с панели. Теперь мне надо это значение передать с одного ПЛК на второй через сетевые переменные. Каким образом я могу использовать те две контрольные суммы, о которых Вы говорите, чтобы гарантированно получить значение на другом ПЛК. Если пакет не дойдет или дойдет с ошибкой надо будет повторить отправку.

Валенок
01.01.2015, 02:36
Вам же русским языком сказали - данные приходят правильные (пост 27) или вообще не приходят.
Ненадежность UDP - это дошло/не дошло, а не дошло это/дошло не это.
"Не приходят" определяется обратной квитанцией (а-ля модбас) или "параллельным" чтением текущего состояния

amn
01.01.2015, 03:04
Вот теперь понятно, большое спасибо! Добрались таки до истины на 3 странице. То есть галки для контрольной суммы надо ставить.