-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathFbMotor.SCL
More file actions
219 lines (196 loc) · 6.99 KB
/
Copy pathFbMotor.SCL
File metadata and controls
219 lines (196 loc) · 6.99 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
FUNCTION_BLOCK "FbMotor"
TITLE = 'Двигатель с частотником и контактором.'
{ S7_read_back := 'true' ;
S7_blockview := 'big' }
AUTHOR : VA
FAMILY : LIB_PLC
VERSION : '2.1'
VAR_INPUT // Входные переменные, сохраняемые.
MotorRun :BOOL := FALSE; // Команда: включить двигатель.
VoltageOk :BOOL := FALSE; // Схема собрана 380VAC Ok.
DriveOk :BOOL := FALSE; // Обратная связь: нет ошибок на частотном приводе.
ContactorOk :BOOL := FALSE; // Обратная связь: контактор включился.
TimeMonitoring :DINT := 1000 ; // Время гарантированного включения контактора [мс].
TimeDelayOn :DINT := 1000 ; // Время задержки включения частотника [мс].
TimeDelayOff :DINT := 5000 ; // Время задержки выключения контактора [мс].
MotorLoad :REAL := 0.0 ; // Нагрузка электродвигателя 100*Im/In [%].
Ts_ms :DINT := 100 ; // Шаг дискретизации по времени [мс].
Reset :BOOL := FALSE; // Сброс при перезагрузке.
END_VAR
VAR_OUTPUT // Выходные переменные, сохраняемые.
MotorOn :BOOL := FALSE; // Включить двигатель.
ContactorOn :BOOL := FALSE; // Включить контактор.
ErrorVoltage :BOOL := FALSE; // Схема разобрана нет 380VAC.
ErrorDrive :BOOL := FALSE; // Ошибка частотного привода.
ErrorContactor :BOOL := FALSE; // Ошибка контактора.
END_VAR
VAR // Внутренние переменные, сохраняемые.
State1 :INT := 0; // Граф сосояния частотника и контактора.
Timer1 :DINT := 0; // Таймер для задержки переключения между частотником и контактором [мс].
Timer2 :DINT := 0; // Таймер для формирования ошибки контактора [мс].
END_VAR
CONST // Константы.
STATE_STOP := 0; // Состояние "Стоп".
STATE_CONTACTOR_ON := 1; // Состояние "Включение контактора".
STATE_DRIVE_ON := 2; // Состояние "Включение частотного привода".
STATE_RUN := 3; // Состояние "Работа".
STATE_DRIVE_OFF := 4; // Состояние "Выключение частотного привода".
STATE_CONTACTOR_OFF := 5; // Состояние "Выключение контактора".
END_CONST
BEGIN
// Двигатель с частотником и контактором.
// DbMotor
// +-------------------------------+
// | FbMotor |
// ->-|MotorRun MotorOn|->-
// -|VoltageOk ContactorOn|-
// -|DriveOk ErrorVoltage|-
// -|ContactorOk ErrorDrive|-
// -|TimeMonitoring ErrorContactor|-
// -|TimeDelayOn |
// -|TimeDelayOff |
// -|Ts_ms |
// -|Reset |
// +-------------------------------+
// Схема разобрана нет 380VAC.
ErrorVoltage := NOT(VoltageOk);
// Ошибка частотного привода.
ErrorDrive := NOT(DriveOk);
// Формируем ошибку контактора.
// Контактор включается не сразу.
// За время TimeMonitoring контактор обязан включиться, иначе ошибка.
// Так же следим чтобы контактор выключился и контакты не залипли.
IF (ContactorOn) THEN
// Следим чтобы контактор вовремя включился.
IF (ContactorOk) THEN
// Контактор включился.
Timer2 := 0;
ErrorContactor := FALSE;
ELSE
IF (Timer2 <= TimeMonitoring) THEN
// Контактор еще не включился.
Timer2 := Timer2 + Ts_ms;
ErrorContactor := FALSE;
ELSE
// Ошибка контактор не включился за время TimeMonitoring
ErrorContactor := TRUE;
END_IF;
END_IF;
ELSE
// Следим чтобы контактор вовремя выключился.
IF NOT(ContactorOk) THEN
// Контактор выключился.
Timer2 := 0;
ErrorContactor := FALSE;
ELSE
IF (Timer2 <= TimeMonitoring) THEN
// Контактор еще не выключился.
Timer2 := Timer2 + Ts_ms;
ErrorContactor := FALSE;
ELSE
// Ошибка контактор не выключился за время TimeMonitoring
ErrorContactor := TRUE;
END_IF;
END_IF;
END_IF;
// Сброс при перезагрузке или ошибке.
IF (Reset OR ErrorVoltage OR ErrorDrive) THEN
State1 := STATE_STOP;
END_IF;
// При включении двигателя должен сначала включиться контактор затем частотный привод.
// При выключении двигателя должен сначала выключиться частотный привод, а затем контактор.
// Это необходимо для увеличения времени жизни контактора.
// Граф состояний.
CASE State1 OF
// Состояние "Стоп".
STATE_STOP:
MotorOn := FALSE;
ContactorOn := FALSE;
Timer1 := 0;
// Если получили разрешение на включение то включаем контактор.
IF (MotorRun) THEN
State1 := STATE_CONTACTOR_ON;
END_IF;
// Состояние "Включение контактора".
STATE_CONTACTOR_ON:
MotorOn := FALSE;
ContactorOn := TRUE;
Timer1 := Timer1 + Ts_ms;
// Перед включением частотника делаем паузу чтоб контактор успел включиться.
IF (Timer1 >= TimeDelayOn) THEN
State1 := STATE_DRIVE_ON;
END_IF;
// Состояние "Включение частотного привода".
STATE_DRIVE_ON:
MotorOn := TRUE;
ContactorOn := TRUE;
Timer1 := 0;
State1 := STATE_RUN;
// Состояние "Работа".
STATE_RUN:
MotorOn := TRUE;
ContactorOn := TRUE;
Timer1 := 0;
// Если пришла команда выключить двигатель то сначала выключаем частотник.
IF NOT(MotorRun) THEN
State1 := STATE_DRIVE_OFF;
END_IF;
// Состояние "Выключение частотного привода".
STATE_DRIVE_OFF:
MotorOn := FALSE;
ContactorOn := TRUE;
Timer1 := Timer1 + Ts_ms;
// Перед выключением контактора делаем паузу чтоб выключится без нагрузки.
IF (Timer1 >= TimeDelayOff) THEN
State1 := STATE_CONTACTOR_OFF;
END_IF;
// Состояние "Выключение контактора".
STATE_CONTACTOR_OFF:
MotorOn := FALSE;
ContactorOn := FALSE;
Timer1 := 0;
// Переходим в состояние стоп.
State1 := STATE_STOP;
// СТОП при неопределенном состоянии.
ELSE
State1 := STATE_STOP;
END_CASE;
// Схема подключения блока FbMotor.
//
// +-------------------+
// | 380 VAC |
// +-------------------+
// |
// v
// +-------------------+
// | Вводной автомат |--> VoltageOk
// +-------------------+
// |
// v
// +-------------------+
// MotorOn -->| Частотный привод |--> DriveOk
// +-------------------+
// |
// v
// +-------------------+
// ContactorOn -->| Контактор |--> ContactorOk
// +-------------------+
// |
// v
// +-------------------+
// | Двигатель |
// +-------------------+
// @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