%% Скрипт визуализации тиристорного устройства плавного пуска % Автоматически создает графики входных и выходных напряжений % с возможностью изменения угла открытия тиристоров %% Основные параметры системы clear; close all; clc; % Параметры сети f = 50; % Частота, Гц T = 1/f; % Период, с U_phase = 220; % Фазное напряжение (действующее), В U_line = U_phase*sqrt(3); % Линейное напряжение (действующее), В % Временной вектор t = linspace(0, 3*T, 1000); % 3 периода % Начальный угол открытия (градусы) alpha_deg = 30; alpha_rad = deg2rad(alpha_deg); %% Создание графического интерфейса fig = figure('Name', 'Тиристорное устройство плавного пуска', ... 'Position', [100, 100, 1200, 800], ... 'NumberTitle', 'off'); % Создание панели для ползунка control_panel = uipanel('Title', 'Управление', ... 'Position', [0.75, 0.85, 0.23, 0.14]); % Текст с текущим значением угла angle_text = uicontrol('Parent', control_panel, ... % Добавляем Parent 'Style', 'text', ... 'String', sprintf('Угол α = %d°', alpha_deg), ... 'Units', 'normalized', ... 'Position', [0.05, 0.6, 0.9, 0.3], ... % Относительно панели 'FontSize', 12, 'FontWeight', 'bold'); % Ползунок для управления углом slider = uicontrol('Parent', control_panel, ... % Добавляем Parent 'Style', 'slider', ... 'Min', -30, 'Max', 180, 'Value', alpha_deg, ... 'Units', 'normalized', ... 'Position', [0.05, 0.1, 0.9, 0.4], ... % Относительно панели 'Callback', @set_alpha); %% Создание осей для графиков % Входные напряжения (фазные и линейные на одном графике) ax1 = subplot(3, 1, 1); % Было (3, 2, 1) title('Входные напряжения'); xlabel('Время, с'); ylabel('Напряжение, В'); grid on; hold on; % Выходные линейные напряжения ax3 = subplot(3, 1, 3); % Было (3, 2, [3, 4]) title('Выходные линейные напряжения (после тиристоров)'); xlabel('Время, с'); ylabel('Напряжение, В'); grid on; hold on; % Визуализация открытия тиристоров ax4 = subplot(3, 1, 2); % Было (3, 2, [5, 6]) title('Состояние тиристоров'); xlabel('Время, с'); ylabel('Тиристор'); grid on; hold on; ylim([0.5, 6.5]); yticks(1:6); yticklabels({'VS1+', 'VS1-', 'VS2+', 'VS2-', 'VS3+', 'VS3-'}); %% Инициализация графиков % Обновляем графики с начальными значениями update_plots(alpha_deg, alpha_rad, t, f, U_phase, U_line, angle_text); %% Пояснительная информация disp('==============================================='); disp('ТИРИСТОРНОЕ УСТРОЙСТВО ПЛАВНОГО ПУСКА'); disp('==============================================='); disp('Управление:'); disp(' - Используйте ползунок для изменения угла α от 0° до 180°'); disp(' - α = 0° - полное напряжение на выходе'); disp(' - α = 90° - половина напряжения на выходе'); disp(' - α = 180° - напряжение отключено'); disp(' '); disp('Обозначения тиристоров:'); disp(' VS1+ - тиристор положительной полуволны фазы A'); disp(' VS1- - тиристор отрицательной полуволны фазы A'); disp(' VS2+ - тиристор положительной полуволны фазы B'); disp(' VS2- - тиристор отрицательной полуволны фазы B'); disp(' VS3+ - тиристор положительной полуволны фазы C'); disp(' VS3- - тиристор отрицательной полуволны фазы C'); %% Функция обновления графиков function update_plots(alpha_deg, alpha_rad, t, f, U_phase, U_line, angle_text) % Расчет синусоидальных напряжений omega = 2*pi*f; % Входные фазные напряжения Ua = U_phase*sqrt(2)*sin(omega*t); Ub = U_phase*sqrt(2)*sin(omega*t - 2*pi/3); Uc = U_phase*sqrt(2)*sin(omega*t + 2*pi/3); % Входные линейные напряжения Uab_in = Ua - Ub; Ubc_in = Ub - Uc; Uca_in = Uc - Ua; % Выходные линейные напряжения (после тиристоров) Uab_out = zeros(size(t)); Ubc_out = zeros(size(t)); Uca_out = zeros(size(t)); % Состояния тиристоров (1 - открыт, 0 - закрыт) thyristor_state = zeros(6, length(t)); % Физическое состояние тиристоров (1 - открыт, 0 - закрыт) thyristor_conducting = zeros(6, length(t)); % Для каждого момента времени определяем состояние тиристоров for i = 1:length(t) % Фазовый угол для каждой фазы theta = omega*t(i); theta_a = theta; theta_b = theta - 2*pi/3; theta_c = theta + 2*pi/3; % Модулированные углы (для определения полуволны) theta_a_mod = mod(theta_a, 2*pi); theta_b_mod = mod(theta_b, 2*pi); theta_c_mod = mod(theta_c, 2*pi); %% 1. Определяем, когда ПОДАНЫ управляющие импульсы % Исправление для поддержки отрицательных углов % VS1+ (положительная полуволна фазы A) % Нормализуем угол: если alpha_rad < 0, добавляем 2π для корректной работы alpha_norm = mod(alpha_rad, 2*pi); pulse_start = alpha_norm; pulse_end = pulse_start + 3*pi/4; % Проверяем два случая: импульс в пределах одного периода % и импульс, пересекающий границу 2π if pulse_end <= 2*pi % Импульс не пересекает границу периода if theta_a_mod >= pulse_start && theta_a_mod <= pulse_end thyristor_state(1, i) = 1; end else % Импульс пересекает границу периода (pulse_end > 2π) % Импульс состоит из двух частей: [pulse_start, 2π) и [0, pulse_end-2π] if theta_a_mod >= pulse_start || theta_a_mod <= pulse_end - 2*pi thyristor_state(1, i) = 1; end end % VS1- (отрицательная полуволна фазы A) pulse_start_neg = pi + alpha_norm; pulse_end_neg = pulse_start_neg + 3*pi/4; % Нормализуем start_neg и end_neg к диапазону [0, 4π) if pulse_start_neg >= 2*pi pulse_start_neg = pulse_start_neg - 2*pi; pulse_end_neg = pulse_end_neg - 2*pi; end if pulse_end_neg <= 2*pi if theta_a_mod >= pulse_start_neg && theta_a_mod <= pulse_end_neg thyristor_state(2, i) = 1; end else % Импульс пересекает границу периода if theta_a_mod >= pulse_start_neg || theta_a_mod <= pulse_end_neg - 2*pi thyristor_state(2, i) = 1; end end % VS2+ (положительная полуволна фазы B) pulse_start = alpha_norm; pulse_end = pulse_start + 3*pi/4; if pulse_end <= 2*pi if theta_b_mod >= pulse_start && theta_b_mod <= pulse_end thyristor_state(3, i) = 1; end else if theta_b_mod >= pulse_start || theta_b_mod <= pulse_end - 2*pi thyristor_state(3, i) = 1; end end % VS2- (отрицательная полуволна фазы B) pulse_start_neg = pi + alpha_norm; pulse_end_neg = pulse_start_neg + 3*pi/4; % Нормализуем start_neg и end_neg к диапазону [0, 4π) if pulse_start_neg >= 2*pi pulse_start_neg = pulse_start_neg - 2*pi; pulse_end_neg = pulse_end_neg - 2*pi; end if pulse_end_neg <= 2*pi if theta_b_mod >= pulse_start_neg && theta_b_mod <= pulse_end_neg thyristor_state(4, i) = 1; end else if theta_b_mod >= pulse_start_neg || theta_b_mod <= pulse_end_neg - 2*pi thyristor_state(4, i) = 1; end end % VS3+ (положительная полуволна фазы C) pulse_start = alpha_norm; pulse_end = pulse_start + 3*pi/4; if pulse_end <= 2*pi if theta_c_mod >= pulse_start && theta_c_mod <= pulse_end thyristor_state(5, i) = 1; end else if theta_c_mod >= pulse_start || theta_c_mod <= pulse_end - 2*pi thyristor_state(5, i) = 1; end end % VS3- (отрицательная полуволна фазы C) pulse_start_neg = pi + alpha_norm; pulse_end_neg = pulse_start_neg + 3*pi/4; % Нормализуем start_neg и end_neg к диапазону [0, 4π) if pulse_start_neg >= 2*pi pulse_start_neg = pulse_start_neg - 2*pi; pulse_end_neg = pulse_end_neg - 2*pi; end if pulse_end_neg <= 2*pi if theta_c_mod >= pulse_start_neg && theta_c_mod <= pulse_end_neg thyristor_state(6, i) = 1; end else if theta_c_mod >= pulse_start_neg || theta_c_mod <= pulse_end_neg - 2*pi thyristor_state(6, i) = 1; end end %% 2. Определяем, когда тиристоры ФИЗИЧЕСКИ открыты % VS1+ (A+): открыт, если есть импульс и положительная полуволна фазы A if thyristor_state(1, i) == 1 && (theta_a_mod >= 0 && theta_a_mod <= pi) && (Ua(i) > Ub(i) && Ua(i) > Uc(i)) thyristor_conducting(1, i) = 1; end % VS1- (A-): открыт, если есть импульс и отрицательная полуволна фазы A if thyristor_state(2, i) == 1 && (theta_a_mod >= pi && theta_a_mod <= 2*pi) && (Ua(i) < Ub(i) && Ua(i) < Uc(i)) thyristor_conducting(2, i) = 1; end % VS2+ (B+): открыт, если есть импульс и положительная полуволна фазы B if thyristor_state(3, i) == 1 && (theta_b_mod >= 0 && theta_b_mod <= pi) && (Ub(i) > Ua(i) && Ub(i) > Uc(i)) thyristor_conducting(3, i) = 1; end % VS2- (B-): открыт, если есть импульс и отрицательная полуволна фазы B if thyristor_state(4, i) == 1 && (theta_b_mod >= pi && theta_b_mod <= 2*pi) && (Ub(i) < Ua(i) && Ub(i) < Uc(i)) thyristor_conducting(4, i) = 1; end % VS3+ (C+): открыт, если есть импульс и положительная полуволна фазы C if thyristor_state(5, i) == 1 && (theta_c_mod >= 0 && theta_c_mod <= pi) && (Uc(i) > Ub(i) && Uc(i) > Ua(i)) thyristor_conducting(5, i) = 1; end % VS3- (C-): открыт, если есть импульс и отрицательная полуволна фазы C if thyristor_state(6, i) == 1 && (theta_c_mod >= pi && theta_c_mod <= 2*pi) && (Uc(i) < Ub(i) && Uc(i) < Ua(i)) thyristor_conducting(6, i) = 1; end %% 3. Расчет выходных напряжений % Фазные выходные напряжения Ua_out = 0; if thyristor_conducting(1, i) || thyristor_conducting(2, i) Ua_out = Ua(i); end Ub_out = 0; if thyristor_conducting(3, i) || thyristor_conducting(4, i) Ub_out = Ub(i); end Uc_out = 0; if thyristor_conducting(5, i) || thyristor_conducting(6, i) Uc_out = Uc(i); end % Линейные выходные напряжения Uab_out(i) = Ua_out - Ub_out; Ubc_out(i) = Ub_out - Uc_out; Uca_out(i) = Uc_out - Ua_out; end %% Обновление графиков (ВАЖНО: без изменений!) % Входные фазные напряжения subplot(3, 1, 1); cla; grid on; hold on; plot(t, zeros(size(t)), 'k', 'LineWidth', 0.5); plot(t, Ua, 'r', 'LineWidth', 2, 'DisplayName', 'Фаза A'); plot(t, Ub, 'g', 'LineWidth', 2, 'DisplayName', 'Фаза B'); plot(t, Uc, 'b', 'LineWidth', 2, 'DisplayName', 'Фаза C'); plot(t, Uab_in, 'r--', 'LineWidth', 0.5, 'DisplayName', 'Uab'); plot(t, Ubc_in, 'g--', 'LineWidth', 0.5, 'DisplayName', 'Ubc'); plot(t, Uca_in, 'b--', 'LineWidth', 0.5, 'DisplayName', 'Uca'); title('Входные напряжения (сплошные - фазные, пунктир - линейные)'); xlabel('Время, с'); ylabel('Напряжение, В'); legend('Location', 'best'); xlim([0, max(t)]); ylim([-700, 700]); % Выходные линейные напряжения subplot(3, 1, 3); cla; grid on; hold on; plot(t, zeros(size(t)), 'k', 'LineWidth', 0.5); plot(t, Uab_out, 'r', 'LineWidth', 1.5, 'DisplayName', 'Uab вых'); plot(t, Ubc_out, 'g', 'LineWidth', 1.5, 'DisplayName', 'Ubc вых'); plot(t, Uca_out, 'b', 'LineWidth', 1.5, 'DisplayName', 'Uca вых'); title(sprintf('Выходные линейные напряжения (α = %d°)', alpha_deg)); xlabel('Время, с'); ylabel('Напряжение, В'); legend('Location', 'best'); xlim([0, max(t)]); ylim([-700, 700]); % Визуализация состояния тиристоров - показываем управляющие импульсы subplot(3, 1, 2); cla; grid on; hold on; % Цвета для тиристоров colors = {'r', 'r', 'g', 'g', 'b', 'b'}; line_styles = {'-', '--', '-', '--', '-', '--'}; for k = 1:6 % Находим интервалы, где подан управляющий импульс state = thyristor_state(k, :); diff_state = diff([0, state, 0]); start_idx = find(diff_state == 1); end_idx = find(diff_state == -1) - 1; % Рисуем горизонтальные линии для каждого интервала for m = 1:length(start_idx) plot(t(start_idx(m):end_idx(m)), k*ones(1, length(start_idx(m):end_idx(m))), ... 'Color', colors{k}, 'LineStyle', line_styles{k}, 'LineWidth', 2); end end title(sprintf('Управляющие импульсы тиристоров (α = %d°)', alpha_deg)); xlabel('Время, с'); ylabel('Тиристор'); ylim([0.5, 6.5]); yticks(1:6); yticklabels({'VS1+', 'VS1-', 'VS2+', 'VS2-', 'VS3+', 'VS3-'}); xlim([0, max(t)]); % Обновление текста с текущим углом set(angle_text, 'String', sprintf('Угол α = %d°', alpha_deg)); % Добавление пояснений к тиристорам legend({'Фаза A (+)', 'Фаза A (-)', 'Фаза B (+)', 'Фаза B (-)', ... 'Фаза C (+)', 'Фаза C (-)'}, 'Location', 'best'); end %% Функция обратного вызова для ползунка function set_alpha(source, ~) % Получаем значение из ползунка alpha_deg = round(get(source, 'Value')); % Обновляем глобальные переменные evalin('base', sprintf('alpha_deg = %d;', alpha_deg)); evalin('base', 'alpha_rad = deg2rad(alpha_deg);'); % Получаем ссылки на переменные из базового рабочего пространства t = evalin('base', 't'); f = evalin('base', 'f'); U_phase = evalin('base', 'U_phase'); U_line = evalin('base', 'U_line'); angle_text = evalin('base', 'angle_text'); % Обновляем графики update_plots(alpha_deg, deg2rad(alpha_deg), t, f, U_phase, U_line, angle_text); end