PDA

Просмотр полной версии : Profinet


guest13
11.06.2020, 19:50
Здравствуйте! имеется Kuka 8.3.39. Есть задача наладить её связь связь по Profinet со слейв устроствами. Аппаратно настроил обмен, вопрос - как адресно обратиться к ячейкам памяти в коде?

Pavel_T
14.06.2020, 07:22
Для того чтобы адресно обратиться к ячейкам памяти в коде надо:
1. Правильно настроить мапинг входов/выходов Куки на профинетовские.
(скажем все I/O Куки после 20 мапятся на профинетовские I/O).
2. Вручную с тачпада, из экрана для I/O проверяется функциональность
сигналов (так же и со стороны PLC).
3. В файле $config.dat, в секции "USER GLOBALS" объявляем, например две переменные:
SIGNAL MyPlcByteIn $IN[20] TO $IN[27] ;получаем байт данных только для чтения
SIGNAL MyPlcByteOut $OUT[20] TO $OUT[27] ;получаем байт данных, чтение и запись
4. В программе обращаемся с переменными как спеременными типа INT:
IF (MyPlcByteIn == 1) THEN
PTP HOME
ENDIF
5. Если PLC Siemens, то не забываем менять местами старший и младший байт в двухбайтном слове.
Подробнее смотрим в хелпе для WorkVisual.

guest13
21.06.2020, 20:59
Для того чтобы адресно обратиться к ячейкам памяти в коде надо:
1. Правильно настроить мапинг входов/выходов Куки на профинетовские.
(скажем все I/O Куки после 20 мапятся на профинетовские I/O).
2. Вручную с тачпада, из экрана для I/O проверяется функциональность
сигналов (так же и со стороны PLC).
3. В файле .dat, в секции "USER GLOBALS" объявляем, например две переменные:
SIGNAL MyPlcByteIn TO ;получаем байт данных только для чтения
SIGNAL MyPlcByteOut TO ;получаем байт данных, чтение и запись
4. В программе обращаемся с переменными как спеременными типа INT:
IF (MyPlcByteIn == 1) THEN
PTP HOME
ENDIF
5. Если PLC Siemens, то не забываем менять местами старший и младший байт в двухбайтном слове.
Подробнее смотрим в хелпе для WorkVisual.

Да, огромное спасибо! Это получилось. Только остался вопрос - почему предлагаете мапить адреса с 20? чем плохо начать с 0? или это не принципиально?

Теперь следующий вопрос - в программе периодически перед выполнением тех или иных действий необходима информация из профинета... Как лучше сделать перед местом использования вызывать функцию, которая будет считывать Профинет и кидать его в переменные, либо - в sps.sub постоянно\параллельно вызывать эту функцию?

P.S. Кто-нибудь из гуру (ну или просто выше новичка =) ) может дать контакты (любой мессенджер (вацапа, вибер, тлг, аська) или почта) для оперативных мелких вопросов в помощи поиска необходимой литературы или мелких вопросов касаемо программирования контроллера Кука С4?

Роботёр
21.06.2020, 22:27
мапить можно и с нулевого бита, система этого делать не запрещает.
не очень понятно что ты хочешь сделать. что значит необходима инфа с профинета? считывать состояние бита? зачем тогда его перезаписывать в другую переменную? в общем я не понял, опиши что хочешь поподробнее.
телефон, конечно, не дам. почту скинул в личку.

Pavel_T
22.06.2020, 06:57
В нашем случае, роботы приходят с уже предустановленными карточками ввода/вывода.
Это обычно Input output board (IOB-16-16B) или EtherCAT с расширениями на 16 бит I/O.
Поэтому младшие 16 адресов уже какбы заняты.

Роботёр
22.06.2020, 10:31
в таком случае да

guest13
22.06.2020, 21:19
Пришел к выводу, что придется постоянно записывать данные с профинета в переменные, иначе алгоритмы не будут корректно работать... Вкуриваю дальше - как оптимальнее сделать - использовать sps.sub или как-то запускать параллельную программу

Pavel_T
23.06.2020, 07:05
Если это данные от PLC к роботу, то записывать ничего не надо.
Контроллер через профинет записывает данные в переменные асинхронно,
не зависимо от программы робота. Остается их только прочитать.
Данные от робота к PLC записываются программой, в зависимости от логики.
Не обязательно в sps.sub. Запускать параллельную программу в Куке нельзя,
только прерывания.

guest13
23.06.2020, 21:08
Не обязательно в sps.sub.

только прерывания.
Да, спасибо! сегодня проверил, можно без sps.sub - переменные из профинета сами обновляются.

по поводу прерываний - можете ли подсказать где пошукать информацию о них? особенно интересует - как каждый цикл контроллера (ну или с заданной периодичностью) изменять состояние бита, для того, что ПЛК понимал, что связь не потеряна

Pavel_T
24.06.2020, 06:49
Когда робот теряет соединение с контроллером по
профинету, то он выбрасывает исключение на смартпаде
и выключет моторы. Устанавливает соединение также самастоятельно,
выдет сообщение и если после этого подтвердить сообщение со смартпада,
то можно продолжить работу. Думаю в контроллере будет видно ошибку соединения.
Что касается прерываний, то по ним, а также много чего по программированию
Куки, информация имеется. Я только не пойму, как можно pdf файлы выкатить на форум.

guest13
24.06.2020, 07:12
Что касается прерываний, то по ним, а также много чего по программированию
Куки, информация имеется. Я только не пойму, как можно pdf файлы выкатить на форум.
в почту видимо только или ссылку на облако

guest13
07.07.2020, 19:37
Для того чтобы адресно обратиться к ячейкам памяти в коде надо:
1. Правильно настроить мапинг входов/выходов Куки на профинетовские.
(скажем все I/O Куки после 20 мапятся на профинетовские I/O).
2. Вручную с тачпада, из экрана для I/O проверяется функциональность
сигналов (так же и со стороны PLC).
3. В файле .dat, в секции "USER GLOBALS" объявляем, например две переменные:
SIGNAL MyPlcByteIn TO ;получаем байт данных только для чтения
SIGNAL MyPlcByteOut TO ;получаем байт данных, чтение и запись
4. В программе обращаемся с переменными как спеременными типа INT:
IF (MyPlcByteIn == 1) THEN
PTP HOME
ENDIF
5. Если PLC Siemens, то не забываем менять местами старший и младший байт в двухбайтном слове.
Подробнее смотрим в хелпе для WorkVisual.

Это было понятно и я придерживался этого плана.... Но тут копался в пакете ServoGun и там реализация обмена через профинет меня несколько озадачила...
1) маппинг адресов. Вроде понятно, за исключением момента - почему маппят всё по каждому биту, если иногда удобнее объединять в байты (INT)
https://yadi.sk/i/onm5DWDXfO6HMg
2) линковка с переменными. Не понимаю почему используется только первый и последний биты
https://yadi.sk/i/7yPzCGBuokv1Wg
3) и совсем пока не понимаю, каким образом через POINT.DATA в эти биты профинета попадает нужное число
https://yadi.sk/i/lp0QY2zCXl9xGQ

может ли кто-то подсказать?

p.s. картинки не прикрепились, вот ссылка - https://yadi.sk/d/uRUWmET5sdOgOQ

Pavel_T
08.07.2020, 07:53
Если я правильно понял картинки, то скорее всего где-то существует переменная для
интерактивного получения номера программы по профинету,
например:
SIGNAL MyProfinetProgNum $IN[SG_ProgrumNumber_WT_S[1]] TO $IN[SG_ProgrumNumber_WT_E[1]]
дальше, существует какая-то переменная типа (SGg_POINT_T) :
DECL SGg_POINT_T POINT_DATA
Я думаю это структура, где есть поле с названием PrNumber, и очевидно существует код инициализации
этой структуры (например):
DEF InitPointData()
;заносим в поле PrNumber данные из профинета
POINT_DATA.PrNumber = MyProfinetProgNum
...
...
ENDIF
а дальше уже пользуемся этими данными по всей программе:
SQ_ProgrammNumber = POINT_DATA.PrNumber
SWITCH ...
и т.д.

guest13
09.07.2020, 19:35
а вот нет... не нашел, это первое что бросился искать. но нету такой переменной. вообще не нашел подобной линковки сигналов с профинета через Signal... это-то и озадачило

Pavel_T
10.07.2020, 06:19
Signal это для ленивых. значение по битам можно просто сложить. может быть это старая библиотека, когда сигналов в Krl еще не было.