Материал: ПРСУ7

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

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

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

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

Кафедра АПУ

отчет

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

5. Вызов функционального блока

Вызов целевого FB AI_eval осуществляется с помощью дополнительного вызывающего функционального блока AI_call.

С помощью такого подхода удобно создавать несколько экземпляров целевого функционального блока. Но мы создали только один, сам функциональный блок служит сервисом опроса, мы последовательно указываем ему объекты опроса и характеристики, по которым он должен определить состояния тех. параметра и датчика, а выводы сохраняются в созданную ранее структуру. Таким образом нам доступны результаты опроса всех 5 датчиков.

FUNCTION_BLOCK AI_call

VAR

I:INT;

converter : AI_eval;

END_VAR

storage.sensor[1].input := ANI.AI1;

storage.sensor[1].hi_lim := 20;

storage.sensor[1].lo_lim := 4;

storage.sensor[1].hi_lim_mes := 35;

storage.sensor[1].lo_lim_mes := -15;

storage.sensor[1].hhv := 32;

storage.sensor[1].hv := 30;

storage.sensor[1].lv := -12;

storage.sensor[1].llv := -14;

storage.sensor[2].input := ANI.AI2;

storage.sensor[2].hi_lim := 1;

storage.sensor[2].lo_lim := -1;

storage.sensor[2].hi_lim_mes := 100;

storage.sensor[2].lo_lim_mes := 0;

storage.sensor[2].hhv := 90;

storage.sensor[2].hv := 80;

storage.sensor[2].lv := 10;

storage.sensor[2].llv := 5;

storage.sensor[3].input := ANI.AI3;

storage.sensor[3].hi_lim := 5;

storage.sensor[3].lo_lim := -5;

storage.sensor[3].hi_lim_mes := 50;

storage.sensor[3].lo_lim_mes := -50;

storage.sensor[3].hhv := 45;

storage.sensor[3].hv := 40;

storage.sensor[3].lv := -40;

storage.sensor[3].llv := -45;

storage.sensor[4].input := ANI.AI4;

storage.sensor[4].hi_lim := 20;

storage.sensor[4].lo_lim := 0;

storage.sensor[4].hi_lim_mes := 5;

storage.sensor[4].lo_lim_mes := 0;

storage.sensor[4].hhv := 4.5;

storage.sensor[4].hv := 4;

storage.sensor[4].lv := 1.5;

storage.sensor[4].llv := 1.2;

storage.sensor[5].input := ANI.AI5;

storage.sensor[5].hi_lim := 10;

storage.sensor[5].lo_lim := -10;

storage.sensor[5].hi_lim_mes := 25;

storage.sensor[5].lo_lim_mes := -15;

storage.sensor[5].hhv := 9.5;

storage.sensor[5].hv := 8.5;

storage.sensor[5].lv := -8.5;

storage.sensor[5].llv := -9.5;

FOR I:= 1 TO 5 DO

converter(input:=storage.sensor[I].input,

hi_lim:=storage.sensor[I].hi_lim,

lo_lim:=storage.sensor[I].lo_lim,

hi_lim_mes:=storage.sensor[I].hi_lim_mes,

lo_lim_mes:=storage.sensor[I].lo_lim_mes,

hhv := storage.sensor[I].hhv,

hv:=storage.sensor[I].hv,

lv:=storage.sensor[I].lv,

llv:=storage.sensor[I].llv);

storage.sensor[I].state:= converter1.state;

storage.sensor[I].val:= converter1.val;

storage.sensor[I].hh:= converter1.hh;

storage.sensor[I].h:= converter1.h;

storage.sensor[I].ll:= converter1.ll;

storage.sensor[I].l:= converter1.l;

storage.sensor[I].ovH:= converter1.ovH;

storage.sensor[I].ovL:= converter1.ovL;

END_FOR;

END_FUNCTION_BLOCK

Экземпляр доп. функц. блока

DATA_BLOCK AI_EKZ AI_call

BEGIN

END_DATA_BLOCK

6. Тестирование.

Ниже представлены все возможные состояния первого датчика:

Рис. 1. Авария: сигнал выше верхней аварийной границы hh=1, status = alr

Рис. 2. Предупреждение: сигнал выше верхней рабочей границы h=1, status = wrn

Рис. 3. Предупреждение: сигнал ниже нижней рабочей границы l=1, status = wrn

Рис. 4. Авария: сигнал ниже нижней аварийной границы

Рис. 5. Status = brk обрыв датчика

Рис. 6. Status = ovsH перегрузка по току. Авария: Переполнение или зашкал вверх

Рис. 7. Status = ovsL переполнение по току. Авария: Переполнение или зашкал вниз.

Рис. 8. Status = ovfH переполнение вверх

Рис. 9. Status = ovfL зашкал вниз

7. Выводы.

Основное различие между программами 7-ой и 6-ой работ в том, что функционал 7-ой расширен отслеживанием состояния технологического параметра, и отслеживанием показаний АЦП датчика, по которым определяется его исправность. Обе программы обладают возможностью сопоставлять значения АЦП с значением тех. параметра и выходом датчика.

Также в данной лабораторной работе мы ознакомились со способом создание экземпляров функциональных блоков с помощью дополнительного вызывающего функц. блока; данный способ более удобен для применения и представляет тот же функционал.

Источник: https://studfile.net/preview/16680771/