Скачиваний:
2
Добавлен:
11.06.2023
Размер:
416.13 Кб
Скачать

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

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

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

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

Кафедра АПУ

отчет

по лабораторной работе №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. Демонстрация работы.

Вывод:

В ходе работы мы научились создавать пользовательские типы данных, ознакомились с принципом работы входных и выходных модулей, а также использовали области ввода и вывода, запись переменных и блоков в таблицу символов.

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