Просмотр полной версии : Прерывание таймера + ModbusRTU = Медленный Modbus?
Доброго времени суток, уважаемые разработчики!
Помогите, пожалуйста, разобраться с работой вышеуказанных вещей.
Как мне кажется, есть проблема в совместном использовании прерывания таймера и Modbus RTU Master`a.
А именно:
За фиксированный период цикла ПЛК, я вижу, что Modbus отсылает данные на модуль аналогового вывода с разным интервалом.
Вижу я это, формируя пилу, смотрю её форму осциллографом - какие по оси Х и Y идут ступеньки.
Ступеньки неровные по обеим осям, т.е. получается, что данные не доходят до аналогового модуля за время каждого цикла ПЛК, а идут с пропуском. Т.е, видимо, на следующем цикле пила получает приращение и ступенька на осциллографе получается выше более чем на 1 дискрету приращения или длительность предыдущей ступеньки пилы длится более времени 1 цикла.
Приращение пилы задаётся в теле обработчика прерывания, который вызывается с темпом в 100 мкс.
При времени цикла в 4 мс, я рассчитываю получать приращение в 40 дискрет и всегда.
Если я правильно понимаю работу циклов ПЛК, то я ожидаю от Modbus`a, что он мне будет выдавать данные на аналоговый модуль всегда строго в одно и тоже время. Тогда я должен видеть пилу со всегда равными по форме ступеньками. По факту - это не так.
У Modbus`a я смотрю exception - он иногда показывает 255 - таймаут.
Без прерываний такого нет.
Отсюда у меня вопросы к вам:
1. Верно ли утверждение, что по время Modbus`a, в какой-то его фазе, прерывание таймера нарушает работу Modbus`a и пакет данных передаётся либо будучи невалидным или связь просто обрывается(о чем и, возможно, говорит exception)?
2. Можно ли как-то синхронизировать работу прерывания таймера и Modbus?
3. Как точно узнать, что были приняты не те данные по Modbus`у аналоговым модулем? Не нашёл исключения связанного с некорректной контрольной суммой? Понимаю, что может быть причиной задержек во времени, т.к. нужны повторные посылки данных, а данные уже приросли из-за прерывания и следующая их отправка будет уже в следующем цикле ПЛК.
В реальном проекте прерывания нужны для счёта быстрых входов - там энкодеры.
Спасибо!
lara197a
22.05.2016, 00:14
Ну так вы сами ответили на свой вопрос.
Прерывания они на то и прерывания.
отправляйте модбас команды после прерывания через библиотеку
и дайте время выполнить ее, до следующего прерывания.
При времени цикла в 4 мс, я рассчитываю получать приращение в 40 дискрет и всегда.
небольшое уточнение, 4мс это рассчитанное среднее время цикла или Вы о минВЦ и сразу напрашивается вопрос, Вы отправляете запросы каждый цикл?
Если я правильно понимаю работу циклов ПЛК, то я ожидаю от Modbus`a, что он мне будет выдавать данные на аналоговый модуль всегда строго в одно и тоже время.знаете ли Вы что в плк не совершенны часы реального времени и одно и тоже время ни когда не будет, даже если сильно этого хотеть
1. Верно ли утверждение, что по время Modbus`a, в какой-то его фазе, прерывание таймера нарушает работу Modbus`a и пакет данных передаётся либо будучи невалидным или связь просто обрывается(о чем и, возможно, говорит exception)?модбас передается через физический последовательный порт, который тоже работает по прерываниям, что не верно так то что это нарушает работу
2. Можно ли как-то синхронизировать работу прерывания таймера и Modbus?какой в этом смысл
3. Как точно узнать, что были приняты не те данные по Modbus`у аналоговым модулем? Не нашёл исключения связанного с некорректной контрольной суммой? Понимаю, что может быть причиной задержек во времени, т.к. нужны повторные посылки данных, а данные уже приросли из-за прерывания и следующая их отправка будет уже в следующем цикле ПЛК.
то что Вы не нашли про контрольную сумму, прочтите спецификацию протокола, там описывается в каких случаях слейв отвечает ошибкой на запрос, а в каких случаях игнорирует запрос, вызывая таким образом таймаут в мастере
в ексепшене ошибка 255 при использовании функций записи случается, так бибка реализована, например если попробуете делать тоже самое с ПК или другой библиотекой такого не будет
Цикл передачи информации по Модбус можно поделить на пять растянутых по времени этапов - подготовка мастера к передаче - передача запроса по проводам - обработка слейвом принятого запроса - передача слейвом ответа по проводам - обработка мастером ответа слейва и реакция на него. Вы ничего не сообщаете про задержки и продолжительность этих этапов, а именно от них зависит ответ на Ваш вопрос. Для того, чтобы уложиься в 4 мсек, надо работать на скорости 115 кбод с минимально допустимыми таймаутами, а лучше вообще без них. Если железо позволяет. Как у Вас с этим?
Newcomer
22.05.2016, 10:26
Если скорость обмена по Modbus не критична, то ее надо уменьшить (до 9600 или 19200) и связь нормализуется.
я опрашиваю обычно слейвы с периодом 50мс, максимально быстро это 20мс. ПИД регулятор я выставляю на работу каждые 100мс, поэтому чаще слать задание в модули аналоговых выходов смысла нет, ну ради подстраховки, те же 50мс. Запись (возвратный пакет того что я отправил) я не контролирую, потому что во первых в модуле остается последнее корректное значение, во вторых следующий запрос случиться не через такой существенно длительный промежуток времени, чтоб как то повлияло на работу исполнительного механизма, в конце концов инертность системы гораздо больше чем периодичность запросов и правильно подобранные коэффициенты сделают свою работу. Вот поэтому делиться впечатлениями о задержках и продолжительностях каких то там этапов не считаю нужным
Спасибо всем большое за оперативные ответы!
отправляйте модбас команды после прерывания через библиотеку
и дайте время выполнить ее, до следующего прерывания.
Программа написана на ST, работаю через библиотеку.
Что значит дать время?
Сейчас сделано так, что прерывания не могу сделать реже, чем 100 мкс.
Если смогу проредить энкодеры внешним устройством, то будет не более 500 мкс.
Т.е. прерывание всё равно будет наступать быстрее,чем закончится модбас. Отключать прерывание нельзя.
небольшое уточнение, 4мс это рассчитанное среднее время цикла или Вы о минВЦ и сразу напрашивается вопрос, Вы отправляете запросы каждый цикл?
Это минВЦ. Запрос отправляю каждый цикл.
знаете ли Вы что в плк не совершенны часы реального времени и одно и тоже время ни когда не будет, даже если сильно этого хотеть
Да, я конечно, знаю, но ведь порядок дрожания часов далеко не миллисекунды.
модбас передается через физический последовательный порт, который тоже работает по прерываниям, что не верно так то что это нарушает работу
Т.е. когда модбас "стартовал" и произошло прерывание таймера, то находясь в прерывании по таймеру, модбас корректно уйдёт в своё внутреннее прерывание, когда это будет нужно и данные передадутся, верно?
то что Вы не нашли про контрольную сумму, прочтите спецификацию протокола, там описывается в каких случаях слейв отвечает ошибкой на запрос, а в каких случаях игнорирует запрос, вызывая таким образом таймаут в мастере
в ексепшене ошибка 255 при использовании функций записи случается, так бибка реализована, например если попробуете делать тоже самое с ПК или другой библиотекой такого не будет
Прочитаю, но если подскажите, буду очень признателен.
Вы ничего не сообщаете про задержки и продолжительность этих этапов, а именно от них зависит ответ на Ваш вопрос. Для того, чтобы уложиься в 4 мсек, надо работать на скорости 115 кбод с минимально допустимыми таймаутами, а лучше вообще без них. Если железо позволяет. Как у Вас с этим?
Я, к сожалению, не знаю, как их определить.
Скорость 115200 кБод, таймаут в аналоговом модуле выставлен в 0, задержка ответа тоже в 0.
Если скорость обмена по Modbus не критична, то ее надо уменьшить (до 9600 или 19200) и связь нормализуется.
Попробую, но ответ кажется слишком простым, если сравнивать с другими ответами тут.
..в конце концов инертность системы гораздо больше чем периодичность запросов и правильно подобранные коэффициенты сделают свою работу. Вот поэтому делиться впечатлениями о задержках и продолжительностях каких то там этапов не считаю нужным
Про инертность тоже подумал, жаль, что не сразу. Это не успел учесть в программе.
Я регулирую скорость вращающегося ножа. Вал ножа весит не мало.
Получается, не надо так часто пытаться слать коррекцию на аналоговый модуль, 4 мс не имеет смысла.
Длина хода ножа 800мм, точность требуется до 1мм.
Я пока не могу оценить качество работы ПИД регулятора - не испытывал его ещё - это будет послезавтра, поэтому хочу иметь как можно больше итераций для коррекции в аналоговом модуле. Отсюда и такое малое МВЦ и большая скорость модбас.
Но всё же остался вопрос:
Почему ступеньки пилы отличаются по длительности так сильно - на десятки мс? Это не объяснить неточностью часов ПЛК.
Если модбас не успевает завершить обмен за время цикла, а ему уже пора обмениваться в новом цикле, то он игнорирует новую отсылку, пока не отправит данные из предыдущего цикла?
Если так, то нужно МВЦ ставить в 0 или вычисли время, за которое модбас успеет все передать?
В документации пишут, что если выставить в 0, то время цикла будет плавать,т.к. внутренние процедуры ПЛК от цикла к циклу могут иметь разное время.
Тогда начало очередного обмена по модбасу тоже будет плавать. Насколько внутренние процедуры могут плавать? мкс или мс?
lara197a
22.05.2016, 14:53
Каждый цикл посылать данные в МВА зачем?
у вас данные обратной связи не успевают обновляться.
отправляйте по изменению или с интервалами в несколько сек.
Время цикла сильно меняется.
Поставьте в программу ФБ max и миn и посмотрите какое время покажут.
разбег будет значительным.
Обратная связь у меня - это энкодеры с частотой 10 кГц - это 100 мкс, т.е. данные успевают обновляться, другое дело, что мне так часто не надо регулировать, да.
Интервал в несколько секунд - так редко не могу. Нож режет раз в секунду, а его скорость нужно успеть ещё скорректировать.
ФБ max и min - это что, подскажите, пожалуйста.
Newcomer
22.05.2016, 16:23
Если скорость обмена по Modbus не критична, то ее надо уменьшить (до 9600 или 19200) и связь нормализуется.
Попробую, но ответ кажется слишком простым, если сравнивать с другими ответами тут.
Все гениальное просто. ;)
Все гениальное просто. ;)
Завтра проверю, конечно, но..
МВЦ увеличивать надо точно и отсылать в модбас не каждый раз.
А тогда, может, и не надо скорость снижать.
Другое дело, что на объекте такую скорость, возможно, не получится обеспечить - там в шкафу и DC приводы и частотники стоят, помеха на помехе.
Newcomer
23.05.2016, 11:39
А какая сейчас скорость обмена ?
А какая сейчас скорость обмена ?
115200 кБод/с.
Newcomer
23.05.2016, 18:41
115200 кБод/с.
Не пойму что у людей за мания такая врубать везде и вся максимальную скорость Дураку должно быть понятно, что при такой скорости и прерываниях каждые 100 мкс будут проблемы с обменом по сети.
с чего это, какая связь центрального процессора,сопроцессора для скоростных задач,в новых плк это озвучено,во всех остальных может и нет, не суть и микросхемой, которая занимается передачей данных
повторю слать каждый цикл запросы нельзя, скорость потока изить до 38400, не обращать внимание на ошибку 255 при получении ответа от 16 функции
ЗЫ минВЦ поставить таким чтоб модуль статистики был "спокоен"
с чего это, какая связь центрального процессора,сопроцессора для скоростных задач,в новых плк это озвучено,во всех остальных может и нет, не суть и микросхемой, которая занимается передачей данных
повторю слать каждый цикл запросы нельзя, скорость потока изить до 38400, не обращать внимание на ошибку 255 при получении ответа от 16 функции
ЗЫ минВЦ поставить таким чтоб модуль статистики был "спокоен"
Спасибо, я это понял и отразил в одном из постов выше.
Newcomer
23.05.2016, 19:19
с чего это, какая связь центрального процессора,сопроцессора для скоростных задач,в новых плк это озвучено,во всех остальных может и нет, не суть и микросхемой, которая занимается передачей данных
Представь, ты с кем то разговариваешь, а возле стоит балбес, постоянно дергает за руку и орет в ухо. Удастся тебя успешно пообщаться ?
В прошлом году делал небольшой проект на новом ПЛК110. Там был обмен по RS-485 между ПЛК110 и ИП320. В программе были прерывания от таймера с периодом 40 мкс. При скорости обмена 19200 связи между ПЛК и панелью не было. Уменьшил скорость до 9600 и связь появилась.
у Вас какое то неправильное представление на каких скоростях работают проц и порт,речь не о миллисекундах, а о паре МКС,т.ч. прерывание в 100 МКС ему фиолетово, время паузы между фреймами возможно где-то превышает порог, тогда да пакет может быть не доставлен, для этих случаях есть другой модбас и скорость можно повыше поставить чтоб компенсировать
Newcomer
23.05.2016, 20:56
у Вас какое то неправильное представление на каких скоростях работают проц и порт,речь не о миллисекундах, а о паре МКС,т.ч. прерывание в 100 МКС ему фиолетово, время паузы между фреймами возможно где-то превышает порог, тогда да пакет может быть не доставлен, для этих случаях есть другой модбас и скорость можно повыше поставить чтоб компенсировать
Не надо много мудрить. Зуб даю, что если автор темы уменьшит скорость обмена, то все у него заработает.
лучше оба покажите код, который Вы выполняете в прерывании по времени, сдается мне он насыщен операциями и занимает время близкое к времени сработки прерывания,отсюда и проблемы,остальным участникам не оставалось свободного времени. тут либо сокращать код либо приоритет выставить соответствующий
он насыщен операциями и занимает время близкое к времени сработки прерывания,отсюда и проблемы,остальным участникам не оставалось свободного времени. тут либо сокращать код либо приоритет выставить соответствующий
В документации предупреждают, что объёмный код в прерывания ставить нельзя - я не ставлю.
Там только чтение порта с энкодерами и инкремент счётчика импульсов энкодеров.
К тому же, прерывание сейчас раз в 100 мкс, я писал выше, что смогу, скорее всего, до 500 мкс сделать.
Я не всё проверил ещё. Того, что уже подсказали на данный момент достаточно, думаю, что МВЦ и модбас не в каждый цикл - это решение.
Если не получится, то тогда можно и код проекта выложить.
Спасибо.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot