Скачиваний:
8
Добавлен:
08.08.2022
Размер:
2.34 Mб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра АПУ

отчет

по лабораторной работе №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

Соседние файлы в папке УТС 7 семестр