Просмотр полной версии : Порядок выполнения цикла на ПЛК
shishkin_a_s@mail.ru
08.09.2024, 23:11
В процессе программирования возник следующий вопрос, точнее не понимание. Руководство прочитал, ответа на свой вопрос не нашел.
Итак: имеется ПР200 с двумя сетевыми платами; ПР 100 подключенный к ПР200 в качестве slave (ПР200 мастер для него); имеется шлюз Wifi для реализации modbus/TCP, подключенный к ПР200 (ко второй плате), ПР200 для него slave. В алгоритме необходимо обмениваться данными как по сети rs485 между ПР100 и ПР200, так и между ПР200 и Шлюзом. на виртуино, как ни странно, все данные отражаются, меняются (если они только читаются), а вот при попытке из изменения по сети - возникает конфуз.
Суть вопроса в следующем: в каком порядке осуществляется алгоритм? я предположу, если что поправьте:
-для мастера:
1. Опрос сетевых регистров слейвов.
2. Запись во внутреннюю память данных, полученных из сетевых регистров
3. Запись во внутреннюю память данных, полученных с физических входов ПР-ки
4. Работа 1-ого цикла программы
5. Запись, полученных результатов в цикле алгоритма, во внутренние переменные
6. Вывод данных на физические выходы ПР-ки
7. Запись данных в сетевые регистры слейвов.
-для слейва:
1. Запись во внутреннюю память данных, полученных из сетевых регистров
2. Запись во внутреннюю память данных, полученных с физических входов ПР-ки
3. Работа 1-ого цикла программы
4. Запись, полученных результатов в цикле алгоритма, во внутренние переменные
5. Вывод данных на физические выходы ПР-ки
6. Запись выходных данных в сетевые регистры
Буду рад, оказанной помощи.
В процессе программирования возник следующий вопрос, точнее не понимание. Руководство прочитал, ответа на свой вопрос не нашел.
Итак: имеется ПР200 с двумя сетевыми платами; ПР 100 подключенный к ПР200 в качестве slave (ПР200 мастер для него); имеется шлюз Wifi для реализации modbus/TCP, подключенный к ПР200 (ко второй плате), ПР200 для него slave. В алгоритме необходимо обмениваться данными как по сети rs485 между ПР100 и ПР200, так и между ПР200 и Шлюзом. на виртуино, как ни странно, все данные отражаются, меняются (если они только читаются), а вот при попытке из изменения по сети - возникает конфуз.
...
А конфуз то в чём выражается?
В процессе программирования возник следующий вопрос, точнее не понимание. Руководство прочитал, ответа на свой вопрос не нашел.
Итак: имеется ПР200 с двумя сетевыми платами; ПР 100 подключенный к ПР200 в качестве slave (ПР200 мастер для него); имеется шлюз Wifi для реализации modbus/TCP, подключенный к ПР200 (ко второй плате), ПР200 для него slave. В алгоритме необходимо обмениваться данными как по сети rs485 между ПР100 и ПР200, так и между ПР200 и Шлюзом. на виртуино, как ни странно, все данные отражаются, меняются (если они только читаются), а вот при попытке из изменения по сети - возникает конфуз.
Суть вопроса в следующем: в каком порядке осуществляется алгоритм? я предположу, если что поправьте:
-для мастера:
1. Опрос сетевых регистров слейвов.
2. Запись во внутреннюю память данных, полученных из сетевых регистров
3. Запись во внутреннюю память данных, полученных с физических входов ПР-ки
4. Работа 1-ого цикла программы
5. Запись, полученных результатов в цикле алгоритма, во внутренние переменные
6. Вывод данных на физические выходы ПР-ки
7. Запись данных в сетевые регистры слейвов.
-для слейва:
1. Запись во внутреннюю память данных, полученных из сетевых регистров
2. Запись во внутреннюю память данных, полученных с физических входов ПР-ки
3. Работа 1-ого цикла программы
4. Запись, полученных результатов в цикле алгоритма, во внутренние переменные
5. Вывод данных на физические выходы ПР-ки
6. Запись выходных данных в сетевые регистры
Буду рад, оказанной помощи.
Если учесть, что сетевые регистры (а скорее память где хранятся значения принятые/подготовленные для отправки) энергонезависимые, то скорее всего опрос идет иначе:
В начале каждого цикла производиться передача запроса (при свободном порту) или прием ответа (при занятом порту), иначе в игре только известные (сохраненные) значения. Представьте, какая будет задержка до вызова цикла пользователя, если ждать завершения опроса всех ведомых с учетом перезапросов и тайм-аутов.
shishkin_a_s@mail.ru
09.09.2024, 11:02
А конфуз то в чём выражается?
Конфуз в том, что при управлении по сети - не все данные изменяются.
Конфуз в том, что при управлении по сети - не все данные изменяются.
Какие-то конкретные переменные не меняются или всегда разные?
Надо выяснять, с какой стороны проблема - можно например заменить мастера (шлюз) на ПК с ОРС и попробовать менять данные с него
shishkin_a_s@mail.ru
09.09.2024, 11:11
Вот то, что нашёл в руководстве:
<<Время цикла– это время выполнения рабочего цикла прибора, а именно:
• опрос состояния физических входов прибора и копирование их значений в ячейки памяти;
• обработка программы;
• чтение/запись сетевых переменных программы;
• запись результатов работы программы в физические выходы прибора.
По умолчанию время цикла равно 1 мс. Прибор подстраивает время цикла в зависимости от сложности программы.>>
По-этому, возможно, по тайм-ауту в программу идёт или предыдущее значение или значение "по-умолчанию"
чтение/запись сетевых переменных программы; это не одно и то же, что передать эти переменные по протоколу.
Цикл чтения/записи Modbus не зависит от самой программы.
shishkin_a_s@mail.ru
09.09.2024, 13:30
чтение/запись сетевых переменных программы; это не одно и то же, что передать эти переменные по протоколу.
Цикл чтения/записи Modbus не зависит от самой программы.
Может я неправильно что-то понимаю. Но в документации написано следующее:
"В процессе разработки алгоритма, когда логика усложняется, то увеличивается время цикла и количество запросов за секунду будет снижаться."
Соответственно работа по интерфейсу завязана на работу самой программы.
Собственно в этом то и вопрос, в какой момент "по умолчанию" происходит передача информации из регистров в программу (чтение) и из программы в регистры (запись).
Ведь не зря есть пункт "запись в конце цикла"
Да не может быть она завязана на работу интерфейса. сами сделайте опрос нескольких переменных при программе X мс, а потом отключите опрос, программа так и будет крутиться X мс
Запись в конце цикла это другое.
...и опять начинается ерунда! Проблема в данному случае НЕ в опросе по Modbus.
Проблема в том, что ШТАТНОГО способа записывать переменную с трёх мест - НЕТ.
Для этого нужно писать СВОЙ алгоритм. Например, я писал такой для себя в виде взаимоблокировок: если значение изменилось из одного места (например, с панели), то, пока оно везде не запишется, не реагируем на изменения его по Modbus. Условно.
И рыть надо в эту сторону. А обмануть ПРку или ПЛК в виде "Во! Пока он там ещё Modbus окучивает, я подменю значение, и он его на лету поймает" - не получится.
melky В ПРках, если программа нагруженная, то время опроса Modbus увеличивается. Проверено лично мной.
Cs-Cs нагруженная сетевыми переменными в качестве мастера ПР? не удивительно. Но сам цикл программы ведь легко проверить, при наличии опроса в качестве мастера и без него.
Как минимум в штатном сервисном меню.
shishkin_a_s@mail.ru
09.09.2024, 18:56
Если я правильно понял всё, что было написано выше:
(Физические входы)+(программа)+(физические выходы) работают как единое целое, а интерфейс работает сам по себе.
Если позволите, интерфейс - это такой "барабашка", который "берет" когда и что хочет, и "возвращает" таким же порядком.
В таком случае передача импульсов по сети блоками типа F_trig невозможна? Получается я запущу F_Trig в слейве, он запишет "1" в бит регистра на один свой цикл, а если мастер в это время "копается" с неотвечающим устройством, он эту "1" профукает, правильно я понимаю?
Я бы сказал более общно: программа ПЛК - сама по себе, а интерфейсы + входы/выходы - сами по себе.
Нет, никак невозможна, если подходить формально: блок F/R_TRIG даёт импульс РОВНО на ОДИН цикл программы.
Он не привязан ни к каким интерфейсам. Более того: передача данных по интерфейсу может потребовать:
* Времени (на линии бывает не только одно устройств, а несколько; обмен данными с ними требует времени)
* Повторной попытки (если на линии была помеха и первая посылка данных не дошла)
Поэтому, конечно же, профукает.
Здесь везде нужен другой подход. И тут есть стандартные решения:
а) Запись по изменению (есть в ПРках и ПЛК) или запись по команде (есть в ПЛК). Она говорит обмену по шине примерно так: "Как будет свободное время, пошли-ка запрос на запись вот этого вон туда". То есть, создаёт "задание" на запись, но не выполняет его мгновенно.
б) Забить на работу обмена и обрабатывать всё в программе по схеме "Если текущее не равно предыдущему и если мы это не меняли - то изменили по Modbus".
Если я правильно понял всё, что было написано выше:
(Физические входы)+(программа)+(физические выходы) работают как единое целое, а интерфейс работает сам по себе.
Если позволите, интерфейс - это такой "барабашка", который "берет" когда и что хочет, и "возвращает" таким же порядком.
В таком случае передача импульсов по сети блоками типа F_trig невозможна? Получается я запущу F_Trig в слейве, он запишет "1" в бит регистра на один свой цикл, а если мастер в это время "копается" с неотвечающим устройством, он эту "1" профукает, правильно я понимаю?
Да. Верно. Если к моменту, когда пришла очередь передавать переменную, её значение несколько раз поменялось, то передаваться будет текущее (последнее) значение. Видимо поэтому в модулях дискретного ввода МВ реализованы счетчики, чтобы можно было зафиксировать факт пришедшего короткого импульса. Пусть позже, чем никогда. Впрочем Вы можете зафиксировать импульс выставлением бита в сетевой переменной, а мастер после прочтения его сбросит.
Когда из пр или ПЛК надо передать импульс, то импульсом формируют 1 для сети, и потом второй стороной эту 1 сбрасывают, как подтверждение получения.
shishkin_a_s@mail.ru
09.09.2024, 20:35
Да, понял, спасибо. Уже переделываю
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot