Спасибо всем большое за оперативные ответы!
Программа написана на ST, работаю через библиотеку.отправляйте модбас команды после прерывания через библиотеку
и дайте время выполнить ее, до следующего прерывания.
Что значит дать время?
Сейчас сделано так, что прерывания не могу сделать реже, чем 100 мкс.
Если смогу проредить энкодеры внешним устройством, то будет не более 500 мкс.
Т.е. прерывание всё равно будет наступать быстрее,чем закончится модбас. Отключать прерывание нельзя.
Это минВЦ. Запрос отправляю каждый цикл.небольшое уточнение, 4мс это рассчитанное среднее время цикла или Вы о минВЦ и сразу напрашивается вопрос, Вы отправляете запросы каждый цикл?
Да, я конечно, знаю, но ведь порядок дрожания часов далеко не миллисекунды.знаете ли Вы что в плк не совершенны часы реального времени и одно и тоже время ни когда не будет, даже если сильно этого хотеть
Т.е. когда модбас "стартовал" и произошло прерывание таймера, то находясь в прерывании по таймеру, модбас корректно уйдёт в своё внутреннее прерывание, когда это будет нужно и данные передадутся, верно?модбас передается через физический последовательный порт, который тоже работает по прерываниям, что не верно так то что это нарушает работу
Прочитаю, но если подскажите, буду очень признателен.то что Вы не нашли про контрольную сумму, прочтите спецификацию протокола, там описывается в каких случаях слейв отвечает ошибкой на запрос, а в каких случаях игнорирует запрос, вызывая таким образом таймаут в мастере
в ексепшене ошибка 255 при использовании функций записи случается, так бибка реализована, например если попробуете делать тоже самое с ПК или другой библиотекой такого не будет
Я, к сожалению, не знаю, как их определить.Вы ничего не сообщаете про задержки и продолжительность этих этапов, а именно от них зависит ответ на Ваш вопрос. Для того, чтобы уложиься в 4 мсек, надо работать на скорости 115 кбод с минимально допустимыми таймаутами, а лучше вообще без них. Если железо позволяет. Как у Вас с этим?
Скорость 115200 кБод, таймаут в аналоговом модуле выставлен в 0, задержка ответа тоже в 0.
Попробую, но ответ кажется слишком простым, если сравнивать с другими ответами тут.Если скорость обмена по Modbus не критична, то ее надо уменьшить (до 9600 или 19200) и связь нормализуется.
Про инертность тоже подумал, жаль, что не сразу. Это не успел учесть в программе...в конце концов инертность системы гораздо больше чем периодичность запросов и правильно подобранные коэффициенты сделают свою работу. Вот поэтому делиться впечатлениями о задержках и продолжительностях каких то там этапов не считаю нужным
Я регулирую скорость вращающегося ножа. Вал ножа весит не мало.
Получается, не надо так часто пытаться слать коррекцию на аналоговый модуль, 4 мс не имеет смысла.
Длина хода ножа 800мм, точность требуется до 1мм.
Я пока не могу оценить качество работы ПИД регулятора - не испытывал его ещё - это будет послезавтра, поэтому хочу иметь как можно больше итераций для коррекции в аналоговом модуле. Отсюда и такое малое МВЦ и большая скорость модбас.
Но всё же остался вопрос:
Почему ступеньки пилы отличаются по длительности так сильно - на десятки мс? Это не объяснить неточностью часов ПЛК.
Если модбас не успевает завершить обмен за время цикла, а ему уже пора обмениваться в новом цикле, то он игнорирует новую отсылку, пока не отправит данные из предыдущего цикла?
Если так, то нужно МВЦ ставить в 0 или вычисли время, за которое модбас успеет все передать?
В документации пишут, что если выставить в 0, то время цикла будет плавать,т.к. внутренние процедуры ПЛК от цикла к циклу могут иметь разное время.
Тогда начало очередного обмена по модбасу тоже будет плавать. Насколько внутренние процедуры могут плавать? мкс или мс?




Ответить с цитированием
