МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра АПУ
отчет
по лабораторной работе №7
по дисциплине «Проектирование распределенных систем управления»
Тема: «Вызов и использование программы преобразования аналогового
сигнала. Проверка состояний»
Студенты гр. 8391 |
|
Орещенко Н.В. |
|
|
Перевертайло Д.А. |
|
|
Петрухина М.С. |
Преподаватель |
|
Абрамкин С.Е. |
Санкт-Петербург
2021
Цель работы: Ознакомление с принципами обработки аналоговых сигналов в контроллере.
Вариант задания:
Таблица 1
№ Вар. |
№ AI |
Диапазон сигнала датчика |
Диапазон измерения |
||||
3 |
1 |
4 |
20 |
мА |
-15 |
35 |
°С |
|
2 |
-1 |
1 |
В |
0 |
100 |
Па |
|
3 |
-5 |
5 |
В |
-50 |
50 |
°С |
|
4 |
0 |
20 |
мА |
0 |
5 |
м |
|
5 |
-10 |
10 |
В |
-15 |
25 |
°С |
Используем проект, созданный в предыдущей работе.
Выполнение работы:
1. Создание пользовательского типа данных
По ходу работу мы немного отклонились от кода, указанного в методичке, а именно: вместо переменных mxS и mnS, были созданы аналоги переменных из предыдущей работы:
input : int;// Код переменной, значение на АЦП
// лимиты “выхода” датчика в мА, В и т.д.
hi_lim:REAL;
lo_lim:REAL;
// градусы, Па и т.д. лимиты "входа" датчика
hi_lim_mes:REAL;
lo_lim_mes:REAL;
Изменения введены для удобства передачи входных переменных в функциональный блок и их последующей обработки. Код описывающий пользовательский тип данных:
TYPE UDT1:STRUCT
// VAR INPUT
input: int;
hi_lim: REAL;
lo_lim: REAL;
hi_lim_mes: REAL;
lo_lim_mes: REAL;
//VAR OUTPUT
state : INT;
val: REAL;
hh: BOOL;
h:BOOL;
l:BOOL;
ll:BOOL;
ovH: BOOL;
ovL:BOOL;
//VAR_IN_OUT
hhv : REAL; hv : REAL;
lv : REAL; llv : REAL;
END_STRUCT;
END_TYPE
2. Создание блока данных
Один экземпляр созданного типа данных задает строку из таблицы 1. Всего таких строк 5, следовательно, нам нужно опрашивать 5 датчиков, для хранения результатов опроса удобно использовать массив.
DATA_BLOCK storage
STRUCT
sensor : ARRAY[1..5] OF UDT1;
END_STRUCT;
3. Создание блока ai_eval
Код с дополнительными комментариями (другим шрифтом) :
FUNCTION_BLOCK AI_eval
TITLE = 'чтение аналог. сигналов периферии в DB'
Объявление входных и выходных переменных.
VAR_INPUT
Input : int;// Код переменной, значение на ацп
hi_lim:REAL; // лимиты выхода датчика в мА, В и т.д.
lo_lim:REAL;
hi_lim_mes:REAL; // градусы, Па и т.д. лимиты "входа" датчика
lo_lim_mes:REAL;
END_VAR
VAR
sensorOut : REAL; // выход датчика
inCode : INT;
END_VAR
VAR_OUTPUT
state : INT; // Состояние технологического параметра
val : REAL; // Значение технологического параметра
hh : BOOL; // Авария: сигнал выше верхней аварийной границы
h : BOOL; // Предупреждение: сигнал выше верхней рабочей границы
l : BOOL; // Предупреждение: сигнал ниже нижней рабочей границы
ll : BOOL; // Авария: сигнал ниже нижней аварийной границы
ovH : BOOL; // Авария: Переполнение или зашкал вверх
ovL : BOOL; // Авария: Переполнение или зашкал вниз
END_VAR
VAR_IN_OUT
hhv : REAL; hv : REAL; // Рабочие и аварийный границы значения
lv : REAL; llv : REAL; // технологического параметра
END_VAR
Задание возможных состояний
CONST
brk := 0; // обрыв
ovsH := 1; //зашкал вверх
ovfL := 2; //зашкал вниз
ovfH := 3; // переполнение вверх
ovsL := 4; // переполнение вниз
wrn := 5; // значение параметра вышло за пределы рабочей зоны
alr := 6; // значение параметра вышло за пределы аварийной зоны
norm := 7; //нормальное значение
END_CONST
Изменили только названия переменных.
// корректировка введенных параметров
hhv := LIMIT (mn := lo_lim_mes, in := hhv, mx := hi_lim_mes);
hv := LIMIT (mn := lo_lim_mes, in := hv, mx := hi_lim_mes);
lv := LIMIT (mn := lo_lim_mes, in := lv, mx := hi_lim_mes);
llv := LIMIT (mn := lo_lim_mes, in := llv, mx := hi_lim_mes);
// Чтение входного кода
Было решено отказаться от доп. преобразования input из WORD в INT, так как все аналоговые переменные входа в таблице символов уже имеют тип INT.
inCode := input; // Преобразование сигнала датчика
В данной части кода определяется слово состояния в зависимости от значения на АЦП. Слово состояния определяет неисправность, связанную с датчиком.
//Переходы состояний сигнала
IF (inCode >= 32767) OR (inCode <= -32768) THEN state:=Brk; // обрыв датчика
ELSIF (inCode < 32767)AND(inCode > 32511) THEN state:=ovsH; // перегрузка по току
ELSIF (inCode < -4684)AND(inCode > -32768) THEN state:=ovsL; // переполнение по току
ELSIF (inCode <= 32511)AND(inCode > 27648) THEN state:=ovfH;
ELSIF (inCode < 0 )AND(inCode >= -4864) THEN state:=ovfL;
ELSE //Норма
Формулу изменили, поскольку нет в необходимости в преобразованиях из WORD в INT и из INT в REAL, последнее делается неявно. Сделали ее более похожей на ту, что была в 6 работе. Значение АЦП интерпретируется, только если находится в рабочем диапазоне.
sensorOut := (inCode / 27648.0)* (hi_lim - lo_lim) + lo_lim; // выход датчика
val := (sensorOut - lo_lim) * (hi_lim_mes - lo_lim_mes) / (hi_lim - lo_lim) + lo_lim_mes;// сигнал в ед. изм.; градусы, паскали и т.д.
// Альтернатива (получим если подставить вместо sensorOut выражение выше)
// val := (inCode / 27648.0) * (hi_lim_mes - lo_lim_mes) + lo_lim_mes
Определение зоны, в которую попадает технологический параметр (рабочую или аварийную)
hh := (val >= hhv);
h := (val >=hv AND val <hhv);
l := (val <=lv AND val >llv);
ll := (val <= llv);
Состояние “авария” —тех. параметр достиг опасных(недопустимых) значений
IF (hh OR ll) THEN state:=alr;
Состояние “предупреждение” —тех. параметр покидает рабочую(допустимую) зону
ELSIF (h OR l) THEN state:=wrn;
ELSE state:=norm;
END_IF;
END_IF;
ovH := (state=ovsH) OR (state=ovfH);
ovL := (state=ovsL) OR (state=ovfL);
END_FUNCTION_BLOCK