-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathFbStpForPD.SCL
More file actions
224 lines (201 loc) · 9.03 KB
/
Copy pathFbStpForPD.SCL
File metadata and controls
224 lines (201 loc) · 9.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
FUNCTION_BLOCK "FbStpForPD"
TITLE = 'Аналоговый ПД-регулятор превращаем в дискретный ПИ.'
{ S7_read_back := 'true' ;
S7_blockview := 'big' }
AUTHOR : VA
FAMILY : LIB_PLC
VERSION : '0.2'
VAR_INPUT // Входные переменные, сохраняемые.
InFromPD :REAL := 0.0 ; // Задание скорости с обычного ПД- регулятора -100...+100 [%/c].
TimeOpen :REAL := 60.0 ; // Время открытия задвижки [c].
TimeClose :REAL := 50.0 ; // Время закрытия задвижки [c].
TimeMin :REAL := 0.5 ; // Минимальное время импульса [c].
Smax :REAL := 10.0 ; // Ограничение внутреннего интегратора положения максимум [%].
Smin :REAL := -10.0; // Ограничение внутреннего интегратора положения минимум [%].
SensorOpen :BOOL := FALSE; // Датчик на открытие задвижки 100 [%].
SensorClose :BOOL := FALSE; // Датчик на закрытие задвижки 0 [%].
Ts :REAL := 0.1 ; // Шаг дискретизации по времени в секундах.
Reset :BOOL := FALSE; // Сброс при перезагрузке.
END_VAR
VAR_OUTPUT // Выходные переменные, сохраняемые.
CmdOpen :BOOL := FALSE; // Команда на открытие +.
CmdClose :BOOL := FALSE; // Команда на закрытие -.
END_VAR
VAR // Внутренние переменные, сохраняемые.
Pos :REAL := 0.0; // Положение клапана интеграл скорости по времени есть путь [%].
END_VAR
VAR_TEMP // Временные переменные, не сохраняемые.
Vin :REAL; // Скорость на входе [%/с].
Vopen :REAL; // Скорость открытия [%/с].
Vclose :REAL; // Скорость закрытия [%/с].
SopenMin :REAL; // Минимальная дистанция доступная для перемещения на открытие[%].
ScloseMin :REAL; // Минимальная дистанция доступная для перемещения на закрытие[%].
END_VAR
BEGIN
// Аналоговый ПД-регулятор превращаем в дискретный ПИ.
// DbStpForPD
// +----------------------+
// | FbStpForPD |
// ->-|InFromPD CmdOpen|->-
// -|TimeOpen CmdClose|->-
// -|TimeClose |
// -|TimeMin |
// -|Smax |
// -|Smin |
// -|SensorOpen |
// -|SensorClose |
// -|Ts |
// -|Reset |
// +----------------------+
// Вычисления основаны на том, что интегрирующий исполнительный механизм работает в пределах 0...100 [%].
Vin := InFromPD; // [%/с].
Vopen := 100.0 / TimeOpen; // [%/с].
Vclose := 100.0 / TimeClose; // [%/с].
SopenMin := Vopen * TimeMin; // [%].
ScloseMin := Vclose * TimeMin; // [%].
Pos := Pos + Vin * Ts; // [%].
IF(Reset) THEN
Pos := 0.0;
END_IF;
// Импульс открытия (положительный).
IF(Pos >= SopenMin) THEN // RS-Триггер на открытие.
CmdOpen := TRUE;
END_IF;
IF((Pos <= 0.0) OR SensorOpen) THEN // RS-Триггер на открытие.
CmdOpen := FALSE;
END_IF;
IF(CmdOpen) THEN // Вход положительный итератор отрицательный.
Pos := Pos - Vopen * Ts; // [%].
END_IF;
// Импульс закрытия (отрицательный).
IF(Pos <= (ScloseMin * (-1.0))) THEN // RS-Триггер на закрытие.
CmdClose := TRUE;
END_IF;
IF((Pos >= 0.0) OR SensorClose) THEN // RS-Триггер на закрытие.
CmdClose := FALSE;
END_IF;
IF(CmdClose) THEN // Вход отрицательный интегратор положительный.
Pos := Pos + Vclose * Ts; // [%].
END_IF;
// Амплитудный ограничитель интегратора.
IF(Pos >= Smax) THEN
Pos := Smax;
END_IF;
IF(Pos <= Smin) THEN
Pos := Smin;
END_IF;
// Описание.
// Данный блок это приставка к обычному аналоговому ПИД- регулятору которая превращает его в регулятор с двумя дискретными выходами.
// Применять данный блок можно на котлах с интегральными исполнительными механизмами.
// Например, если у вас есть мотор редуктор, который управляется двумя пускателями и выходной вал имеет датчик положения и концевики положений 0% и 100%,
// то данный блок в паре с ПИД- регулятором позволит управлять положением этого механизма.
// Вместо датчика положения можно завести датчик температуры или давления и получить соответственно систему стабилизации температуры или давления.
//
// Основная идея данного блока состоит в том, что интегральный исполнительный механизм вместе с регулятором должен иметь передаточную функцию ПИ-регулятора.
// Из чего следует что интегральный исполнительный механизм должен управляться ПД- регулятором и тогда они вместе дадут передаточную функцию ПИ-регулятора.
// Но выход с ПД- регулятора аналоговый а исполнительный механизм дискретный.
// Так как аналоговый выход с ПД- регулятора это по сути задание скорости на интегральный исполнительный механизм, а
// дискретные сигналы это тоже суть задание положительной и отрицательной постоянной скорости,
// то остается вычислить площадь аналоговой кривой который дает ПД- регулятор, и выдать эту площадь в виде эквивалентных по площади дискретных импульсах управления.
// Другими словами можно сказать, что данный блок считает площадь сигнала произвольной формы на входе
// и выдает эквивалентную площадь дискретных сигналов на выходе с учетом его полярности.
// Так же необходимо учесть, что есть минимальное значение импульса, который может отработать исполнительный механизм.
// Еще учесть, что в общем случае, что время открытия и закрытия исполнительного механизма может быть разное.
//
// Изначальной данный блок планировался как самостоятельный ПИ- регулятор с двумя дискретными выходами для интегральных исполнительных механизмов.
// Но во время реализации стало понятно что более оптимально сделать приставке к обычному ПИД- регулятору который должен работать как ПД- регулятор.
// Между ПИД- регулятором и данным блоком на время отладки можно поставить дополнительный амплитудный ограничитель и зону не чувствительности.
//
// Данный блок проектировался ручкой в тетрадке в терминах языка CFC.
// При трансляции на структурированный текст сумматор и триггеры были реализованны не явно.
// Блок схема.
//
// Сумматор
// +---+ Интегратор
// | | +----------+
// Vopen->-|- | | |
// | | | Z * Ts |
// Vin->-|+ |->-| -------- |->-S
// | | | Z - 1 |
// Vclose->-|+ | | |
// | | +----------+
// +---+
//
// Амплитудный ограничитель
// Smax
// +-----------+
// | |
// | +-- |
// | / |
// Pos->-| / |->-Pos
// | / |
// | --+ |
// | |
// +-----------+
// Smin
//
// Триггер на открытие
// +-------------+
// | FbTriggerRS |
// +--------------+ | |
// Pos->-| Pos >= Smin |--------->-|Set Out|->-CmdOpen
// +--------------+ | |
// | |
// +--------------+ +---+ | |
// Pos->-| Pos <= 0 |->-| 1 |->-|Rst |
// +--------------+ | | | |
// | | +-------------+
// SensorOpen->-| |
// | |
// +---+
//
// +--------------+ +---+
// CmdOpen->-| BOOL_TO_REAL |->-| * |->-Vopen
// +--------------+ | |
// | |
// 100.0 / TimeOpen->-| |
// | |
// +---+
//
// Триггер на закрытие
// +-------------+
// | FbTriggerRS |
// +--------------+ | |
// Pos->-| Pos <= -Smin |--------->-|Set Out|->-CmdClose
// +--------------+ | |
// | |
// +--------------+ +---+ | |
// Pos->-| Pos >= 0 |->-| 1 |->-|Rst |
// +--------------+ | | | |
// | | +-------------+
// SensorClose->-| |
// | |
// +---+
//
// +--------------+ +---+
// CmdClose->-| BOOL_TO_REAL |->-| * |->-Vclose
// +--------------+ | |
// | |
// 100.0 / TimeClose->-| |
// | |
// +---+
// <-Pos->
// |
// V
// <----------|-----------|-----------|----------->
// -Smin 0 +Smin
// CmdClose CmdOpen
// @COPYLEFT ALL WRONGS RESERVED :)
// Author: VA
// Contacts: DIY.PLC.314@gmail.com
// Date start LIB_PLC: 2014
// License: GNU GPL-2.0-or-later
// https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
// https://www.youtube.com/watch?v=n1F_MfLRlX0
// https://www.youtube.com/@DIY_PLC
// https://github.com/DIYPLC/LIB_PLC
// https://oshwlab.com/diy.plc.314/PLC_HW1_SW1
// https://3dtoday.ru/3d-models/mechanical-parts/body/korpus-na-din-reiku
// https://t.me/DIY_PLC
// https://drive.google.com/drive/folders/16GDX0i07rwDrl_oPzL-lQAqMiAz3ouJV?usp=sharing
END_FUNCTION_BLOCK