Как стать автором
Обновить

Комментарии 7

Код на рис.3 с "проваливающимися" условиями в результате на рис.4,б последний PL блок вычисляет результат за 3 такта вместо ожидаемых 5

Блоки работают правильно, т.е. отрабатывают нужно число шагов. Есть несоответствие между реальной работой блоков и отображением этой работы на графиках Это в SimInTech. В ВКПа и блоки и графики соотносятся между собой.

У вас за один такт работы автомата nCycles может увеличиться сразу на 3.
Возьмите, например, x1 = 15, x2 = 10.

Это как? Вроде, везде nCycles = nCycles+1... и нет +3

Элементарно. Условия записаны подряд и выполняются одно за другим.
Вначале a = 15, b = 10.
Выполняется условие a > b. Вычисляется a = 5, nCycles = nCycles + 1.
Выполняется условие a < b (или not(a>b)). Вычисляется b = 5, nCycles = nCycles + 1.
Выполняется условие a = b (или not(a<>b)). Вычисляется y1 = 5, nCycles = nCycles + 1.

Действительно, элементарно! Спасибо! ;)

Для корректной работы при интерпретации модели автомата каждый переход автомата должен завершаться выходом из блока. Так задумывалось, но ... в данном случае этого не происходит. Вот это я и упустил, доверившись оператору if. Но в языке есть оператор goto, но его использование выглядит как-то коряво. Нашел более элегантный выход - оператор exit. После вставки его в каждое действие получилось такой результат:

Hidden text

И это уже почти то, что надо. Только у каждого автомата на секунду меньше. Но это, навскидку, можно объяснить так. В SimInTech действия "мгновенны" и по времени оно происходит ровно по переднему фронту шага, т.е. начиная с момента 0. В ВКПа действие выполнится по заднему фронту такта (точнее перед ним) и это означает, что пройдет какое-то время. В данном случае один такт, т.е. 1 сек. Так моделируется инерционность блока.

Так что, благодаря Вам, - разобрались... Вот уж действительно: "Никогда не было такого и вот опять!" :) Но теперь найдено и решение: нужно переход завершать оператором exit. Теперь код автомата выглядит так. В него я даже с перепугу вставил проверку на goodstep...

Код автомата

Вот, еще одно спасибо! Если бы я не сделал ошибку, а Вы ее не нашли, то, возможно, реализация автоматов в SimInTech осталась бы, как оно было предложено. Но, оказывается, ее можно упростить (в смысле кода блока) и при этом сделать почти идеальной с точки зрения теории инерционных автоматов. Как я это сделал - это отдельный разговор. Может, правда, те кто ставит уперто "минусы" об этом даже знали и поэтому молча гадили? ;) Но мы это сделали! :) Вот результат:

Hidden text

И это уже то, что должно быть. И это очень и очень радует. Во-первых, доказывает, что в ВКПа все правильно (а так, не скрою, были легкие сомнения). Во-вторых, в SimInTech можно реализовать автоматы и при этом даже им доверять (но, правда, нужно время, чтобы в этом убедиться окончательно).

Теперь, когда мне доведется создавать автоматы в SimInTech, я буду это делать уже с учетом совместно с Вами проделанной работы ;)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории