Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
fe4d22c
ТЗ на бэкенд
EugeniusMiroshnichenko Apr 29, 2026
b10c711
ТЗ версии 2
lefff123 Apr 30, 2026
ba52df9
Добавление Unit тестов
Rikitick May 1, 2026
5ae8fe3
Добавление CMakeLists
Rikitick May 1, 2026
680627c
Черновик кода для модуля обработки данных
karskanovas May 2, 2026
2cd7560
Сделал новую структуру git. Все разложил по папочкам. Удалил блок ком…
lefff123 May 2, 2026
5397371
feat: add first version of modbus bridge and it's config builder
GanjaMember May 2, 2026
86b2c24
docs: update modbus bridge part in the ToR
GanjaMember May 2, 2026
78b8626
Реализация хэдэра и основных конструкторов State machine
lefff123 May 3, 2026
a31cb1b
feat: implement raw DataStore.h
ilyamikhailov16 May 4, 2026
767e662
Merge branch 'backend' of https://github.com/VaryVA/ScadaForDiesel in…
ilyamikhailov16 May 4, 2026
4ec9aec
chore: move the ModbusConfig to DataTypes.h and restructure modbus cl…
GanjaMember May 5, 2026
c2fa74a
change DataTypes.h
igor66ru May 5, 2026
eee6e34
Реализованы классы BackendWorker и BackendCommunicator. Реализована з…
igor66ru May 6, 2026
cc04231
Исправил ошибки в реализации ConfigData
igor66ru May 6, 2026
a674f55
chore: update registers mapping according to new ModelConfig, ModelCo…
GanjaMember May 6, 2026
3ebed0b
update: DataProcessor.cpp
karskanovas May 6, 2026
b88ce36
Add: необходимы для DataProcessor
karskanovas May 6, 2026
ec18c4f
Update CMake files
Rikitick May 6, 2026
5324930
Update CMake files
Rikitick May 6, 2026
2416fbb
Delete src/backend/data_processing/DataProcessor.h
karskanovas May 6, 2026
2c07e1a
chore: fix errors to build project
GanjaMember May 6, 2026
64c6765
chore: update CMakeLists for QtCreator to show header files in the si…
GanjaMember May 6, 2026
dd7343b
chore: move headers to folders and add .gitignore
ilyamikhailov16 May 6, 2026
05af801
chore: update DataTypes.h and IModbusBridge.h
GanjaMember May 6, 2026
45201cc
Merge branch 'backend' of https://github.com/VaryVA/ScadaForDiesel in…
GanjaMember May 6, 2026
98c4a26
Merge branch 'backend' of https://github.com/VaryVA/ScadaForDiesel in…
GanjaMember May 6, 2026
7b7dd1c
chore: change onWriteControl to onWriteDecision
GanjaMember May 6, 2026
f77436d
Сырая реализация Statemachine
lefff123 May 6, 2026
cd3add2
Merge branch 'backend' of github.com:VaryVA/ScadaForDiesel into backend
lefff123 May 6, 2026
f6d3439
chore: require SerialBus in the CMakeLists
GanjaMember May 6, 2026
b2c476c
change project configuration to 'dynamic library'
Rikitick May 6, 2026
3ef59e2
Update DataProcessor.h
karskanovas May 7, 2026
7fbdc19
chore: update register mappings according to the model's register bank
GanjaMember May 7, 2026
6505700
Update DataProcessor.cpp
karskanovas May 7, 2026
43d037b
feat: implement read operations for modbus client
GanjaMember May 7, 2026
1ee8b8b
Merge branch 'backend' of https://github.com/VaryVA/ScadaForDiesel in…
GanjaMember May 7, 2026
d63cb88
Merge branch 'backend' of https://github.com/VaryVA/ScadaForDiesel in…
GanjaMember May 7, 2026
9954b3d
Изменил методы для коммуникации с фронтом и наоборот. Вернул удаленны…
igor66ru May 8, 2026
bb25824
Добавлена возможность отправки информации фронту об успешном завершен…
igor66ru May 8, 2026
a746178
Unit tests
vova22013 May 8, 2026
561509b
feat: implement FileConnector
ilyamikhailov16 May 8, 2026
f5bfbb3
Merge branch 'backend' of https://github.com/VaryVA/ScadaForDiesel in…
ilyamikhailov16 May 8, 2026
80a3764
Merge branch 'backend' of https://github.com/VaryVA/ScadaForDiesel in…
vova22013 May 8, 2026
3ca1e0a
fix: delete some bugs and refactor
ilyamikhailov16 May 8, 2026
117aefc
Merge branch 'backend' of https://github.com/VaryVA/ScadaForDiesel in…
ilyamikhailov16 May 8, 2026
846edd7
feat: add first DataStore implementation
ilyamikhailov16 May 8, 2026
4ba7e93
fix: add necessary includes
ilyamikhailov16 May 8, 2026
ab3b0ca
refactor: DataStore
ilyamikhailov16 May 8, 2026
286ae11
feat: add rounding of numbers to serializeData
ilyamikhailov16 May 8, 2026
1012968
Поправил Statemachine под новые структуры
lefff123 May 8, 2026
ae1457f
Merge branch 'backend' of github.com:VaryVA/ScadaForDiesel into backend
lefff123 May 8, 2026
e351de9
feat: implement register converter
GanjaMember May 8, 2026
b5efbfa
Merge branch 'backend' of https://github.com/VaryVA/ScadaForDiesel in…
GanjaMember May 8, 2026
089c4ca
Поправил ошибки в ConfigData
igor66ru May 9, 2026
658c06b
Merge branch 'backend' of github.com:VaryVa/ScadaForDiesel into backend
igor66ru May 9, 2026
d2c354f
Update DataProcessor.h
karskanovas May 9, 2026
80e884d
Update DataProcessor.cpp
karskanovas May 9, 2026
54c71fb
feat: implement write methods for modbus client
GanjaMember May 10, 2026
36d75ed
chore: update C++ version and remove leftover line
GanjaMember May 10, 2026
ddcf3d4
fix: fix undefined reference error for RegisterConverter
GanjaMember May 10, 2026
1cc1209
Изменил управляющие воздействия в DataTypes.h
igor66ru May 10, 2026
15edd81
fix: make modbus client signals work
GanjaMember May 10, 2026
56fead1
fix: prevent unwanted rewriting of all registers
GanjaMember May 11, 2026
65fbbc0
fix: update modbus client to new DataTypes
GanjaMember May 11, 2026
17a4fe8
Update DataProcessor.cpp
karskanovas May 12, 2026
b8e9fa1
chore: update path to header
GanjaMember May 12, 2026
4f91d86
chore: hot fix issues to successfully compile project
GanjaMember May 12, 2026
3cdd6bf
fix: add generateId method and implement ID update on deletion
ilyamikhailov16 May 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/build
.vscode
30 changes: 30 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
cmake_minimum_required(VERSION 3.16)

# Главный проект
project(ScadaForDiesel
LANGUAGES CXX
DESCRIPTION "SCADA система стенда тестирования ДВС (дизельных двигателей)"
VERSION 1.0.0
)

# Глобальные настройки
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Директория для собранных файлов
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# Backend библиотека
add_subdirectory(src/backend)

# Информация о сборке
message(STATUS "")
message(STATUS "=== ScadaForDiesel ===")
message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "CMake version: ${CMAKE_VERSION}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "")
326 changes: 326 additions & 0 deletions Tz_backend.md

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions include/backend/BackendGlobal.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#pragma once
#include <QtCore/QtGlobal>

#if defined(BACKEND_LIBRARY)
# define BACKEND_EXPORT Q_DECL_EXPORT
#else
# define BACKEND_EXPORT Q_DECL_IMPORT
#endif
255 changes: 255 additions & 0 deletions include/backend/DataTypes.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
// DataTypes.h (фрагмент, относящийся к DataProcessor)

#ifndef DATATYPES_H
#define DATATYPES_H
#include <QString>
#include <QVector>
#include <QMetaType>
// InputRegisters offset (sensors data, only read operations)
namespace InputRegisters
{
static constexpr qsizetype count = 50;
// Температура охлаждающей жидкости
static constexpr uint16_t T_cool = 0;
// Давление масла
static constexpr uint16_t P_oil = 4;
// Частота вращения ДВС в режиме притирки
static constexpr uint16_t omega_ICE_prir = 8;
// Частота вращения ДВС в режиме обкатки
static constexpr uint16_t omega_ICE_run = 12;
// Температура АД
static constexpr uint16_t T_AD = 16;
// Температура балластных резисторов
static constexpr uint16_t T_ballast = 20;
// Момент АД
static constexpr uint16_t M_AD = 24;
// Частота АД
static constexpr uint16_t f_AD = 28;
// Ревизия входных данных / версия источника
static constexpr uint16_t revision = 32;
// Ревизия источника входных данных
static constexpr uint16_t sourceInputRevision = 36;
// Время модели
static constexpr uint16_t modelTime = 40;
// Временная метка регистра Input Registers
static constexpr uint16_t timestamp_ir = 44;
// Состояние Input Registers
static constexpr uint16_t state_ir = 48;
// Код неисправности
static constexpr uint16_t faultCode = 49;
}

// HoldingRegisters offset (settings and variables, read/write operations)
namespace HoldingRegisters
{
static constexpr qsizetype count = 59;
// Максимально допустимая температура охлаждающей жидкости
static constexpr uint16_t T_cool_max = 0;
// Минимально допустимое давление масла
static constexpr uint16_t P_oil_min = 4;
// Максимально допустимое давление масла
static constexpr uint16_t P_oil_max = 8;
// Максимально допустимая частота вращения ДВС в режиме притирки
static constexpr uint16_t omega_ICE_max_prir = 12;
// Максимально допустимая частота вращения ДВС в режиме обкатки
static constexpr uint16_t omega_ICE_max_run = 16;
// Лишний регистр
static constexpr uint16_t rpm_max_lapping = 20;
// Лишний регистр
static constexpr uint16_t rpm_max_run = 24;
// Лишний регистр
static constexpr uint16_t target_brake_torque_nm = 28;
static constexpr uint16_t throttle_position = 32;
// Максимально допустимая температура АД
static constexpr uint16_t T_AD_max = 36;
// Максимально допустимая температура балластных резисторов
static constexpr uint16_t T_ballast_max = 40;
// Входная частота для АД / задание частоты АД
static constexpr uint16_t f_AD_Input = 44;
// Целевая механическая нагрузка / момент АД
static constexpr uint16_t M_AD_target = 48;
// Версия (ревизия) настроек holding-регистров
static constexpr uint16_t revision_h = 52;
// Команда на симуляцию
static constexpr uint16_t simulationCommand = 56;
// Запрос на симуляцию
static constexpr uint16_t simulationRequest = 57;
// Режим симуляции
static constexpr uint16_t simulationMode = 58;
}

// Coils offset (control registers, read/write operations)
namespace CoilsRegisters
{
static constexpr uint16_t count = 3;
static constexpr uint16_t fan_ICE = 0;
static constexpr uint16_t fan_AD = 1;
static constexpr uint16_t fan_ballast = 2;
}

// Discrete Inputs offset (device status, only read operations)
namespace DiscreteRegisters
{
static constexpr uint16_t count = 2;
static constexpr uint16_t hasFault = 0;
static constexpr uint16_t hasLimitViolations = 1;
}

//Структра для задания конфигурации Modbus-клиента
struct ModbusConfig
{
//Ip-адрес Modbus-сервера
QString host = "127.0.0.1";
//Порт Modbus-сервера
quint16 port = 1502;
int pollFrequencyMs = 1000;
int timeoutMs = 1000;
int retries = 3;
int unitId = 1; // we assume one modbus device, so unitId will be ignored
};

//Снимок датчиков
struct SensorFrame
{
//Температура ДВС(температура охлаждающей жидкости)
double dieselTemp;
//Температура АД
double motorTemp;
//Температура балластных резисторов
double resistorTemp;
//Давление масла
double dieselPressure;
//Момент АД
double torque;
//Частота вращения ДВС
double rpm;
//Метка времени в UNIX-формате
qint64 timestampMs;
// Этап диагностики
int stage;
};
Q_DECLARE_METATYPE(SensorFrame)

// лимиты, передаются в конструктор DataProcessor и в IModbusBridge для записи в модель
struct ModelConfig
{
//Максимальная температура ДВС(температура охлаждающей жидкости)
double maxDieselTemp;
//Максимальная температура АД
double maxMotorTemp;
//Максимальная температура балластных резисторов
double maxResistorTemp;
//Максимальное давление масла в ДВС
double maxDieselPressure;
//Минимальное давление масла в ДВС
double minDieselPressure;
//Общая частота оборотов в режиме притирки
int maxRpmPrir;
//Общая частота оборотов в режиме обкатки
int maxRpmRun;
//Частота АД
double freqAD;
//Момент АД
double momentAD;
};
Q_DECLARE_METATYPE(ModelConfig)


//Команды на симуляцию
enum class SimulationCommand : uint8_t
{
None,
Start,
Stop,
Reset,
EmergencyStop
};

//Запрос на симуляцию
enum class SimulationRequest : uint8_t
{
None,
ReadCurrentState,
StepAndRead
};

//Режим симуляции
enum class SimulationMode : uint8_t
{
ColdRun,
StartWarmup,
HotNoLoad,
HotLoad
};

// тип управляющего воздействия (это требует уточнения)
enum class ControlType
{
None,
SimulationCommand, // Команда на симуляцию (simulationCommand)
SimulationRequest, // Запрос на симуляцию (simulationRequest)
SimulationMode, // Режим симуляции (simulationMode)
Fan_ICE,
Fan_AD,
Fan_Ballast
};

// одно управляющее воздействие (тип + значение)
struct ModelControl
{
ControlType type = ControlType::None;
uint8_t value = 0;
};
Q_DECLARE_METATYPE(ModelControl)

// диагностическое состояние модели (добавлены предаварийные)
enum class DiagState
{
IDLE,
Ok,
PreWarn_RpmHigh,
PreWarn_DieselTempHigh,
PreWarn_MotorTempHigh,
PreWarn_ResistorHigh,
PreWarn_PressureHigh,
PreWarn_PressureLow,
Alarm_RpmOverspeed,
Alarm_DieselOverheat,
Alarm_MotorOverheat,
Alarm_ResistorOverheat,
Alarm_PressureOver,
Alarm_PressureUnder,
Alarm_Generic
};

//Структра для управления моделью фронтом
struct FrontControl
{
//Время обкатки ДВС в режиме притирки(в минутах)
unsigned int timePrir;
//Время горячей обкатки ДВС(в минутах)
unsigned int timeHot;
//Время горячей обкатки ДВС с нагрузкой(в минутах)
unsigned int timeHotWithLoad;
//Структура для задания минимальных/максимальных значений в модели
ModelConfig config;
};

// вектор управляющих воздействий + диагностика
struct Decision
{
QVector<ModelControl> controls;
DiagState state = DiagState::Ok;
QString reason; // причина (для последующей записи в БД, если надо записывать, требует уточнения)
};
Q_DECLARE_METATYPE(Decision)

//Структра для DataStore
struct Data
{
//Снимок датчиков
SensorFrame frame;
//Этап эксперимента
DiagState state;
};
#endif // DATATYPES_H
44 changes: 44 additions & 0 deletions include/backend/backend_worker/backendcommunicator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#ifndef BACKENDCOMMUNICATOR_H
#define BACKENDCOMMUNICATOR_H

#include <QObject>
#include "backend/DataTypes.h"

class BackendCommunicator : public QObject
{
Q_OBJECT
public:
explicit BackendCommunicator(QObject *parent = nullptr);

//Метод для отправки нового снимка датчиков фронту
void SendSensorFrameToFrontend(SensorFrame& sensorFrame);
//Метод для отправки информации фронту об аварийной остановке
void SendEmergencyStopInfoToFrontend();
//Метод для отправки фидбека фронту на операцию
void SendFeedbackToFrontend(DiagState state);
//Метод для отправки данных фронту
void SendDataToFrontend(QVector<Data>& data);
//Метод для отправки предупреждений фронту
void SendWarnToFrontend(DiagState state);
//Метод для отправки сообщения о завершенном этапе
void SendStageCompleteInfoToFrontend();

signals:
//Сигналы для отправки(внутренние)
void SendedSensorFrame(SensorFrame& sensorFrame);
void SendedEmergencyStopInfo();
void SendedFeedback(DiagState state);
void SendedData(QVector<Data>& data);
void SendedWarnToFrontend(DiagState state);
void SendedStageCompleteInfoToFrontend();

//Сигналы для получения
//Сигнал на приход запроса на изменения этапа эксперимента
void ReceivedFrontControl(FrontControl control);
//Сигнал на запуск обкатки
void ReceivedStartEngine();
//Сигнал на остановку обкатки
void ReceivedStopEngine();
};

#endif // BACKENDCOMMUNICATOR_H
54 changes: 54 additions & 0 deletions include/backend/backend_worker/backendworker.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#ifndef BACKENDWORKER_H
#define BACKENDWORKER_H

#include <QObject>
#include <QThread>
#include "backend/state_machine/state_machine.h"
#include "backend/DataTypes.h"

//Класс взаимодействия с фронтом
class BackendWorker : public QObject
{
Q_OBJECT
public:
explicit BackendWorker(QObject *parent = nullptr);
~BackendWorker();

//Запуск бэкэнда
void Run();
//Остановка бэкэнда
void Stop();

//Метод для отправки параметров модели бэкэнду
void SendFrontControlToBackend(FrontControl& control);
//Запустить обкатку
void StartEngine();
//Остановить обкатку
void StopEngine();

signals:
//Сигналы для получения(для фронта)
//Сигнал на приход нового снимка датчиков
void ReceivedSensorFrame(SensorFrame sensorFrame);
//Сигнал на приход информации об аварийной остановке
void ReceivedEmergencyStopInfo();
//Сигнал на приход фидбека на изменение этапа
void ReceivedFeedback(DiagState state);
//Сигнал на приход данных
void ReceivedData(QVector<Data>& data);
//Сигнал на приход предупреждений в работе двигателя
void ReceivedWarn(DiagState state);
//Сигнал при окончании выполнения этапа обкатки
void ReceivedStageCompleteInfo();

//Сигналы для отправки(внутренние)
void SendedFrontControlToBackend(FrontControl control);
void StartedEngine();
void StopedEngine();

private:
QThread m_machineThread;
StateMachine* m_machine;
};

#endif // BACKENDWORKER_H
Loading