Занимался проектом, в котором головной контроллер - овен СПК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.
Ниже эта функция в программе.
PS. Обнаружилось, что owenlogic не позволяет экспортировать функции ST в файл, и использовать в других проектах. Досадно.
Можно добавить, что мне нужно было транслировались еще числа целого типа, но в пр200 - это множество только положительных чисел. Пришлось в пр200 перед отправкой прибавить 1000, а в мастере после получения вычесть.
#owenlogic