Найти тему

Запись значения по импульсу.

Занимался проектом, в котором головной контроллер - овен СПК107.

Модули ввода/вывода -тоже овеновские. Так случилось, что программа была уже написана под эти модули, но их решили заменить.

В наличии наверно не было. Заменили на контроллеры ПР200. Мне нужно было транслировать температуры, дискретные входы и управлять выходами по модбас.

Программу переделал. Но столкнулся с такой особенностью протокола модбас.

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

В СПК-107 есть системные часы, можно транслировать секунды, а в ПР200 смотреть, если показания зависли, то регистрируем потерю связи.

Зависание входной переменной можно регистрировать следующим образом:

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

Если равенство сохраняется заданное время (допустим 5 секунд), то формируем сигнал потерю связи.

В owenlogix только сейчас заметил возможность писать модули в ST. Хорошая возможность, вот и воспользуемся ей для написания модуля запоминания по импульсу.

Хотя в библиотеке, функция есть с таким назначением, реализованная на фбд. Много блоков, но дело свое делает.

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

Попробуем сделать в ST.

Вот что у меня получилось.

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

function mem_by_front: udint; //имя функции и тип данных выхода

var_input //объявление входных переменных

puls : bool; //входная переменная с типом данных bool

intvar: udint; //входная переменная

prev_var: udint; //запомненное значение

end_var

var //объявление локальных переменных

end_var

if puls then

mem_by_front := intvar; //запоминаем

else

mem_by_front := prev_var; //держим предыдущее значение

end_if

end_function

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

Запоминание внутри функции реализовать не удалось, к сожалению здесь нет переменных static как в СИ. Эту проблему решил, создав вход prev_var.

Ниже эта функция в программе.

-2

PS. Обнаружилось, что owenlogic не позволяет экспортировать функции ST в файл, и использовать в других проектах. Досадно.

Можно добавить, что мне нужно было транслировались еще числа целого типа, но в пр200 - это множество только положительных чисел. Пришлось в пр200 перед отправкой прибавить 1000, а в мастере после получения вычесть.

#owenlogic