/
Vladimir_Solo
/
RZA_LAB
Обзор
Документация
Войти
/
Vladimir_Solo
/
RZA_LAB
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
main.cpp
148 строк
6 KB
Федотов Руслан
LR3
05 май 2026, 15:38
05 май 2026, 15:38
74bfc5a
Код
Авторство
О чём код?
#include "GlobalController/IED/IED.h" #include "GlobalController/GlobalController.h" #include "include.h" #include <chrono> #include <thread> #include <mutex> #include <condition_variable> int main() { // setlocale(LC_ALL, "ru"); mutex mtx; condition_variable cv; int finished_count = 0; // Сколько потоков дошли до барьера int current_step = 0; // Номер текущей итерации (поколение) // Функция-синхронизатор auto sync_lambda = [&](int total) { unique_lock<mutex> lock(mtx); int step = current_step; // Запоминаем, на каком шаге мы вошли if (++finished_count == total) { finished_count = 0; current_step++; cv.notify_all(); } else { cv.wait(lock, [&] { return current_step > step; }); } }; IED ied1("IED1"); IED ied2("IED2"); bool internal_fault = true; // Выбираем имена файлов в зависимости от режима string cfg_file1 = internal_fault ? "Test2/BRK1_Ain.cfg" : "Test2/BRK1_ABout.cfg"; string dat_file1 = internal_fault ? "Test2/BRK1_Ain.dat" : "Test2/BRK1_ABout.dat"; string cfg_file2 = internal_fault ? "Test2/BRK2_Ain.cfg" : "Test2/BRK2_ABout.cfg"; string dat_file2 = internal_fault ? "Test2/BRK2_Ain.dat" : "Test2/BRK2_ABout.dat"; ParserComtrade parser1(cfg_file1, dat_file1); ParserComtrade parser2(cfg_file2, dat_file2); string output_file1 = "output1.txt"; string plotscript_file1 = "plotscript1.gp"; string png_file1 = "png1.png"; string output_file2 = "output2.txt"; string plotscript_file2 = "plotscript2.gp"; string png_file2 = "png2.png"; int i1 = 0; int i2 = 0; auto start = chrono::high_resolution_clock::now(); thread t1([&]() { const auto × = parser1.getTimeData(); const auto ¤tsА = parser1.getChannelData(0); const auto ¤tsB = parser1.getChannelData(1); const auto ¤tsC = parser1.getChannelData(2); ied1.setProtSettings(0.05, 1000, 0.1, 500, 0.6); // Прогоняем все выборки через IED, чтобы DR заполнил данные while (i1 < times.size()) { vector<double> SVMessage; SVMessage.push_back(currentsА[i1]); SVMessage.push_back(currentsB[i1]); SVMessage.push_back(currentsC[i1]); ied1.LD_MEAS(SVMessage, times[i1]); sync_lambda(2); ied1.LD_PROT(SVMessage, times[i1], ied2.MEAS.MMXU1.A); ied1.LD_CTRL(); ied1.LD_DR(SVMessage, times[i1]); ied1.IEDReciverData(times[i1], ied2.MMXUData); i1++; } ied1.watchOscill(parser1, output_file1, plotscript_file1, png_file1, ied1.PROT.PTOC1.StrVal.setMag.f.value, ied1.PROT.PTOC2.StrVal.setMag.f.value, ied2.PROT.PTOC1.StrVal.setMag.f.value, ied2.PROT.PTOC2.StrVal.setMag.f.value); // for (int i = 0; i < times.size(); ++i) // { // vector<double> SVMessage; // SVMessage.push_back(currentsА[i]); // SVMessage.push_back(currentsB[i]); // SVMessage.push_back(currentsC[i]); // ied1.LD_MEAS(SVMessage, times[i]); // ied1.LD_PROT(SVMessage, times[i], ied2.MEAS.MMXU1.A); // ied1.LD_CTRL(); // ied1.LD_DR(SVMessage, times[i], ied2.MMXUData); // } }); thread t2([&]() { const auto × = parser2.getTimeData(); const auto ¤tsА = parser2.getChannelData(0); const auto ¤tsB = parser2.getChannelData(1); const auto ¤tsC = parser2.getChannelData(2); ied2.setProtSettings(0.05, 1000, 0.1, 500, 0.6); // Прогоняем все выборки через IED, чтобы DR заполнил данные while (i2 < times.size()) { vector<double> SVMessage; SVMessage.push_back(currentsА[i2]); SVMessage.push_back(currentsB[i2]); SVMessage.push_back(currentsC[i2]); ied2.LD_MEAS(SVMessage, times[i2]); sync_lambda(2); ied2.LD_PROT(SVMessage, times[i2], ied1.MEAS.MMXU1.A); ied2.LD_CTRL(); ied2.LD_DR(SVMessage, times[i2]); ied2.IEDReciverData(times[i2], ied1.MMXUData); i2++; } ied2.watchOscill(parser2, output_file2, plotscript_file2, png_file2, ied2.PROT.PTOC1.StrVal.setMag.f.value, ied2.PROT.PTOC2.StrVal.setMag.f.value, ied1.PROT.PTOC1.StrVal.setMag.f.value, ied1.PROT.PTOC2.StrVal.setMag.f.value); // for (int i = 0; i < times.size(); ++i) // { // vector<double> SVMessage; // SVMessage.push_back(currentsА[i]); // SVMessage.push_back(currentsB[i]); // SVMessage.push_back(currentsC[i]); // ied2.LD_MEAS(SVMessage, times[i]); // ied2.LD_PROT(SVMessage, times[i], ied1.MEAS.MMXU1.A); // ied2.LD_CTRL(); // ied2.LD_DR(SVMessage, times[i], ied1.MMXUData); // } }); t1.join(); t2.join(); auto end = chrono::high_resolution_clock::now(); chrono::duration<double> diff = end - start; // Превращаем в конкретные единицы : auto ms = chrono::duration_cast<chrono::milliseconds>(diff).count(); // Миллисекунды auto us = chrono::duration_cast<chrono::microseconds>(diff).count(); // Микросекунды auto ns = chrono::duration_cast<chrono::nanoseconds>(diff).count(); // Наносекунды cout << "Program's duration = " << ms << "ms" << endl; return 0; }