МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра АПУ
отчет
по лабораторной работе №7
по дисциплине «Проектирование распределенных систем управления»
Тема: “ Вызов и использование программы преобразования аналогового сигнала. Проверка состояний”
Студенты гр. 8391 |
|
Маликов А.А. |
|
|
Макарова А.В. |
|
|
Гоглев А.А. |
|
|
Шушков Д.А. |
|
|
|
Преподаватель |
|
Абрамкин Е.С. |
Санкт-Петербург
2021
Цель работы: ознакомление с принципами обработки аналоговых сигналов в контроллере.
Содержание работы
1. Использование области ввода и вывода, запись переменных и
блоков в таблицу символов.
2. Создание блоков данных DB.
3. Программирование функционального блока FB для чтения
аналоговой величины.
4. Программирование блока OB1 на языке SCL.
5. Загрузка аппаратной конфигурации в PLC. Подтверждение отсутствия ошибок на PLC и модуле расширения.
Вариант №2
Рис. 1. Вариант 2
Выполнение работы.
Создадим пользовательский тип данных UDTs.
Код программы:
TYPE UDTs
STRUCT
input: WORD;
// код переменной
mxS: REAL := 0.0;
// верхнее значение диапазона измерения параметра среды
mnS: REAL := 0.0;
// нижнее значение диапазона измерения параметра среды
mxP: REAL := 0.0;
// верхнее значение диапазона измерения датчика
mnP: REAL := 0.0;
// нижнее значение диапазона измерения датчика
state: INT := 0;
// состояние технологического параметра
val: REAL := 0.0;
// значение технологического параметра
hh: BOOL := FALSE;
// авария: сигнал выше верхней аварийной границы
h: BOOL := FALSE;
// предупреждение: сигнал выше верхней рабочей границы
l: BOOL := FALSE;
// предупреждение: сигнал ниже нижней рабочей границы
ll: BOOL := FALSE;
// авария: сигнал ниже нижней аварийной границы
ovH: BOOL := FALSE;
// авария: переполнение или зашкал вверх
ovL: BOOL := FALSE;
// авария: переполнение или зашкал вниз
hhv: REAL := 0.0;
hv: REAL := 0.0;
lv: REAL := 0.0;
llv: REAL:= 0.0;
// рабочие и аварийные границы значения
// технологического параметра
END_STRUCT
END_TYPE
DATA_BLOCK DBt
STRUCT
sextion: ARRAY[1..5] OF UDTs;
ALREADY_INIT: BOOL := FALSE;
END_STRUCT
BEGIN
END_DATA_BLOCK
FUNCTION_BLOCK AI_eval
TITLE = 'Чтение аналоговых сигналов периферии в DB'
VAR_INPUT
input: WORD;
// код переменной
mxS: REAL;
// верхнее значение диапазона измерения датчика
mnS: REAL;
// нижнее значение диапазона измерения датчика
mxP: REAL;
// верхнее значение диапазона измерения датчика
mnP: REAL;
// Нижнее значение диапазона измерения датчика
END_VAR
VAR
sensorOut:REAL;
sens: REAL;
sens1: 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 := mnS, in := hhv, mx := mxS);
hv := LIMIT (mn := mnS, in := hv, mx := mxS);
lv := LIMIT (mn := mnS, in := lv, mx := mxS);
llv := LIMIT (mn := mnS, in := llv, mx := mxS);
// чтение входного кода
inCode := WORD_TO_INT(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 // если норма
sensorOut := DINT_TO_REAL(INT_TO_DINT(inCode)) /
(INT_TO_DINT(27648)) * (mxP - mnP) + mnP;
// мА
// коэффициенты датчика
sens1 := (mxS - mnS);
// столько единиц измерения параметра в 1 мА
sens := sens1/(mxP - mnP);
// столько единиц измерения параметра в 1 мА
// преобразуем выходное значение датчика в значение измеряемой величины
val := (sensorOut - mnP) * sens + mnS;
// сигнал в единицу измерения
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
FUNCTION_BLOCK FBs
VAR_IN_OUT
Inj : UDTs;
END_VAR
VAR
Convert : AI_eval;
END_VAR
BEGIN
Convert(
Input:= Inj.input,
mnS := Inj.mnS,
mxS := Inj.mxS,
mnP := Inj.mnP,
mxP := Inj.mxP,
hhv := Inj.hhv,
hv := Inj.hv,
lv := Inj.lv,
llv := Inj.llv
);
END_FUNCTION_BLOCK
DATA_BLOCK DB1 FBs
BEGIN
END_DATA_BLOCK
DATA_BLOCK DB2 FBs
BEGIN
END_DATA_BLOCK
DATA_BLOCK DB3 FBs
BEGIN
END_DATA_BLOCK
DATA_BLOCK DB4 FBs
BEGIN
END_DATA_BLOCK
DATA_BLOCK DB5 FBs
BEGIN
END_DATA_BLOCK
ORGANIZATION_BLOCK OB1
VAR_TEMP
info: ARRAY [0..19] OF BYTE;
// ARRAY [1..5,1..4] OF REAL :=
// -10, 10, -15, 35,
// 0, 20, 0, 90,
// -5, 5, 0, 5,
// 0, 20, -50, 50,
// 0, 5, -60, 200;
END_VAR
DBt.sextion[1].input := AN_IN1;
DBt.sextion[2].input := AN_IN2;
DBt.sextion[3].input := AN_IN3;
DBt.sextion[4].input := AN_IN4;
DBt.sextion[5].input := AN_IN5;
IF NOT DBt.ALREADY_INIT THEN
DBt.ALREADY_INIT := TRUE;
DBt.sextion[1].mnS := -15;
DBt.sextion[1].mxS := 35;
DBt.sextion[1].mnP := -10;
DBt.sextion[1].mxP := 10;
DBt.sextion[1].hhv := 30.0;
DBt.sextion[1].hv := 20.0;
DBt.sextion[1].lv := -5.0;
DBt.sextion[1].llv := -15.0;
DBt.sextion[2].mnS := 0;
DBt.sextion[2].mxS := 90;
DBt.sextion[2].mnP := 0;
DBt.sextion[2].mxP := 20;
DBt.sextion[2].hhv := 80.0;
DBt.sextion[2].hv := 70.0;
DBt.sextion[2].lv := 10.0;
DBt.sextion[2].llv := 0.0;
DBt.sextion[3].mnS := -15;
DBt.sextion[3].mxS := 35;
DBt.sextion[3].mnP := -10;
DBt.sextion[3].mxP := 10;
DBt.sextion[3].hhv := 30.0;
DBt.sextion[3].hv := 20.0;
DBt.sextion[3].lv := -5.0;
DBt.sextion[3].llv := -15.0;
DBt.sextion[4].mnS := -50;
DBt.sextion[4].mxS := 50;
DBt.sextion[4].mnP := 0;
DBt.sextion[4].mxP := 20;
DBt.sextion[4].hhv := 45.0;
DBt.sextion[4].hv := 40.0;
DBt.sextion[4].lv := -40.0;
DBt.sextion[4].llv := -45.0;
DBt.sextion[5].mnS := -60;
DBt.sextion[5].mxS := 200;
DBt.sextion[5].mnP := 0;
DBt.sextion[5].mxP := 5;
DBt.sextion[5].hhv := 4.75;
DBt.sextion[5].hv := 4.3;
DBt.sextion[5].lv := 0.5;
DBt.sextion[5].llv := 0.0;
END_IF;
FBs.DB1(Inj := DBt.sextion[1]);
FBs.DB2(Inj := DBt.sextion[2]);
FBs.DB3(Inj := DBt.sextion[3]);
FBs.DB4(Inj := DBt.sextion[4]);
FBs.DB5(Inj := DBt.sextion[5]);
END_ORGANIZATION_BLOCK
Рис. 2. Таблица символов.
Рис. 3. Демонстрация работы.
Вывод:
В ходе работы мы научились создавать пользовательские типы данных, ознакомились с принципом работы входных и выходных модулей, а также использовали области ввода и вывода, запись переменных и блоков в таблицу символов.