Самоотключение релейных и аналоговых выходов на контроллере Z400

Автор Danial, 06 апреля 2017, 06:49:39

« назад - далее »

Danial

Здравствуйте.
Я столкнулся с такой проблемой, что в моей программе релейные выходы отключаются после нескольких секунд работы.
Программа в приложении.
Если вы загрузите в контроллер Z400 программу П3, из проекта в приложении, или запустите её в режиме отладки, то вы можете заметить, что отладчик показывает, что выходы Y2, Lo и Aout2 активны. Однако работают они только секунд 5, потом сбрасываются в 0.
Я проверял это на 3-х разных контроллерах Z400. Везде результат один и тот же.

Версия ядра контроллера - 3.52.
ZWorkbench v1.1.134.

VoronovMaksim88

Залил, проверил. Всё действительно так как вы говорите.

Каждый раз когда возникает подобная проблема надо посмотреть не даёт ли контроллер системной  аварии.
Для этого надо выкинуть на поляну "код ошибки".
Затем перекомпилируем, перезагружаемся в отладке и вуаля!!! ошибка №7!!!
Читаем документ Документ: D080813. А там чёрным по-русски написано:
"7 - Слишком маленький интервал базового таймера, не успевает выполняться
интерпретатор".
Смотрим на свой базовый таймер, а там 100мс. Ну не справляется бедолага Pic18F46, тяжко ему.
Ну давайте сжалимся и дадим 200 милисекунд.
Перекомпилируем перезагружаемся в отладке и всё ОК !!!!

В прикрепе скриншоты и коды ошибок.



Danial

Окей. Спасибо.
Я буду иметь в виду.
Но это, блин, такие нюансы, которые не лежат на поверхности...
Может быть можно сделать так, чтобы zWorkbench хоть предупреждение какое-либо выдавал, или выбирал базовый таймер 200 мсек, когда я создаю новый контроллер (100 - это значение по-умолчанию).

И потом, я уже делал несколько программ с величиной базового таймера 100 мсек. Но там я не наблюдал таких проблем.
Значит ли это, что их и не будет, или при определённых условиях эти установки могут сбоить из-за такого базового таймера?

mike

А эти все вопросы рождаются потому, что не читаются документы.

Документ: D120213

Перекопирую часть прямо сюда:

6. Цикл программы и Базовый таймер
Шаги схемы выполняются гарантированно, т.е. значения выходов гарантированно поступают на соответствующие входы; блоки гарантированно выполняют расчеты. В отличие от электронных схем, где каждый элемент имеет временные задержки в работе и может пропустить значения входов, схема FBD работает в общем дискретном времени, где каждый шаг полного расчета схемы соответствует одной единице дискретного времени. А каждая единица дискретного времени схемы соответствует какому-то интервалу физического времени.

Длительность этого интервала зависит только от скорости работы устройства, настройка такого соотношения в системе zetFBD отсутствует. Устройство выполняет шаги с максимально возможной скоростью.

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

Гарантия срабатывания блоков в каждом шаге позволяет использовать следующую особенность: многие логические значения выходов, сигнализирующие о возникновении события, работают по принципу «одиночного срабатывания». Это значит, что такой выход выдает 0 в течение большинства шагов выполнения схемы. Только при возникновении события он выдает 1, в течение только одного шага выполнения схемы, а на следующих шагах снова выдается 0. Такая одиночная 1 только в течение одного шага (в течение одной единицы дискретного времени) обязательно будет обработана соответствующими блоками. Само собой разумеется, что если такой выход подключить к физическому дискретному выходу устройства – он будет включаться на время 1 шага схемы, который может длиться от 100 мксек до 1000 мсек, что неправильно, т.к. внешние системы не должны быть зависимы от времени выполнения шага устройства. Поведение таких выходов удобно тем, что для них передний фронт и уровень – одно и то же, при необходимости иметь передний фронт можно просто использовать этот выход, без анализа фронта.

Для синхронизации с реальным временем используется блок "таймер", работа которого определяется Базовым таймером системы.

Любое количество блоков "таймер" используют один аппаратный «базовый» таймер устройства, настраиваемый на определенный постоянный интервал срабатывания.
Базовый таймер - это интервал времени, за который гарантированно успевает выполниться вся программа контроллера без учета оптимизации.

Важно понимать:

Цикл системы всегда динамический. Система внутренней оптимизации будет стремиться выполнить программу за минимальное время;
Базовый таймер задает интервал времени, которому кратны все пользовательские таймеры;
Если время динамического цикла выполнения программы будет больше времени базового таймера, то устройство выдаст ошибку (см. документ D080813 - Коды ошибок)

------------------

Из документа следует, что ФБД редактор понятия не имеет уложитесь вы в отведенное время или нет.
Для этого предусмотрена переменная КОД ОШИБОК.
Может быть это чуть-чуть неудобно, зато позволяет очень сильно оптимизировать скорость выполнения кода даже на самых медленных процессорах.