增加了数据库及测试程序

This commit is contained in:
zjk
2025-02-10 16:37:22 +08:00
parent e072f2b9d4
commit 59faa14afb
12 changed files with 326 additions and 82 deletions
+1
View File
@@ -103,3 +103,4 @@ ENDIF( ${WIN32} )
# Add Subdirectories
#=======================================================================
ADD_SUBDIRECTORY( src )
ADD_SUBDIRECTORY( test )
+29 -29
View File
@@ -1,47 +1,47 @@
{
"HVABFTDev123Cur_uint16": 0,
"HVABactCur_uint16": 0,
"HVABbowRudCur_uint16": 0,
"HVABbusBCur_uint16": 0,
"HVABFTDev123Cur_uint16": 34345,
"HVABactCur_uint16": 22235,
"HVABbowRudCur_uint16": 24015,
"HVABbusBCur_uint16": 53248,
"HVABbusBVol_uint16": 0,
"HVABmastSteGeaCur_uint16": 0,
"HVABopenWaterCur_uint16": 0,
"HVABxczCur_uint16": 1,
"HVBBCCUCur_uint16": 0,
"HVBBFCSSecurSysCur_uint16": 0,
"HVABmastSteGeaCur_uint16": 127,
"HVABopenWaterCur_uint16": 64891,
"HVABxczCur_uint16": 63488,
"HVBBCCUCur_uint16": 16752,
"HVBBFCSSecurSysCur_uint16": 22235,
"HVBBbatInsCur_uint16": 0,
"HVBBbowLowVolDisBoxCur_uint16": 0,
"HVBBdcC1InsCur_uint16": 0,
"HVBBemer2BusVol_uint16": 0,
"HVBBbowLowVolDisBoxCur_uint16": 34349,
"HVBBdcC1InsCur_uint16": 22235,
"HVBBemer2BusVol_uint16": 32768,
"HVBBemerBatCur_uint16": 0,
"HVBBinsBusVol_uint16": 0,
"HVBBplcCur_uint16": 0,
"HVBBreservedCur1_uint16": 0,
"HVBBinsBusVol_uint16": 22528,
"HVBBplcCur_uint16": 127,
"HVBBreservedCur1_uint16": 127,
"HVBBreservedCur2_uint16": 0,
"HVBBunit4Cur_uint16": 0,
"HVBFTDev45Cur_uint16": 0,
"HVBbatGroupCur_uint16": 0,
"HVBbowHVolDisBoxCur_uint16": 0,
"HVBFTDev45Cur_uint16": 32598,
"HVBbatGroupCur_uint16": 61904,
"HVBbowHVolDisBoxCur_uint16": 56157,
"HVBbusACur_uint16": 0,
"HVBbusAVol_uint16": 0,
"HVBdcDc5Cur_uint16": 0,
"HVBfbCur_uint16": 0,
"HVBmotorCur_uint16": 0,
"HVBpowerBusCur_uint16": 0,
"HVBpowerBusVol_uint16": 0,
"HVBpowerBusCur_uint16": 6,
"HVBpowerBusVol_uint16": 32598,
"HVBreservedCur1_uint16": 0,
"HVBreservedCur2_uint16": 0,
"HVBreservedCur3_uint16": 0,
"HVBsternRud1Cur_uint16": 0,
"HVBsternRud1Cur_uint16": 1,
"HVBsternRud2Cur_uint16": 0,
"HVBtyzCur_uint16": 0,
"LVBBbowPZDevCur_uint16": 0,
"LVBBemerBatCur_uint16": 0,
"LVBBemerBusVol_uint16": 0,
"LVBBinsBusCur_uint16": 0,
"LVBBunit1Cur_uint16": 0,
"LVBBunit2Cur_uint16": 0,
"LVBBbowPZDevCur_uint16": 127,
"LVBBemerBatCur_uint16": 32768,
"LVBBemerBusVol_uint16": 16752,
"LVBBinsBusCur_uint16": 22235,
"LVBBunit1Cur_uint16": 127,
"LVBBunit2Cur_uint16": 256,
"LVBBunit3Cur_uint16": 0,
"LVBBunit5Cur_uint16": 0,
"LVBinsBusVol_uint16": 0
"LVBBunit5Cur_uint16": 22016,
"LVBinsBusVol_uint16": 16752
}
+2 -2
View File
@@ -1,8 +1,8 @@
{
"HVolABusBreaker_unit16": 0,
"HVolBBusBreaker_unit16": 127,
"HVolBBusBreaker_unit16": 0,
"HVolBusBreaker_uint16": 0,
"LVolBusBreaker_uint16": 127,
"LVolBusBreaker_uint16": 0,
"faultCode_array":
[
0
+24 -24
View File
@@ -1,30 +1,30 @@
{
"backpressure1_fp32": 7.0,
"backpressure2_fp32": 7.0,
"ch4oConcent1_fp32": 75.0,
"ch4oConcent2_fp32": 11.0,
"ch4o_fp32": 0.0,
"excTemp_fp32": 64.0,
"faultCode1_uint16": 0,
"faultCode2_uint16": 0,
"faultCode3_uint16": 0,
"fcuCurIns_fp32": 0.0,
"backpressure1_fp32": 2.0254939324098806e+18,
"backpressure2_fp32": 1.1694265883419146e-38,
"ch4oConcent1_fp32": -2.7734143515560723e-33,
"ch4oConcent2_fp32": 1.1694265883419146e-38,
"ch4o_fp32": 1.1694265883419146e-38,
"excTemp_fp32": 1.1754039670713386e-38,
"faultCode1_uint16": 25312,
"faultCode2_uint16": 56201,
"faultCode3_uint16": 32598,
"fcuCurIns_fp32": 2.5111268480700722e-42,
"fcuCurPower_fp32": 0.0,
"fcuCur_fp32": 22.0,
"fcuCur_fp32": 1.8734974449861263e+18,
"fcuFaultLeve_uint8": 0,
"fcuOutIns_fp32": 99.0,
"fcuOutPower_fp32": 260.0,
"fcuOutIns_fp32": 1.1693958999055459e-38,
"fcuOutPower_fp32": 1.7755460477889746e-38,
"fcuState_uint8": 0,
"fcuVolIns_fp32": 0.0,
"fcuVolPower_fp32": 0.0,
"fcuVol_fp32": 244.0,
"fcuVolIns_fp32": 2.0215532827359314e+18,
"fcuVolPower_fp32": 1.1694265883419146e-38,
"fcuVol_fp32": 1.1694265883419146e-38,
"flameDet_uint8": 0,
"h2Concent1_fp32": 58.0,
"h2Concent2_fp32": 59.0,
"o2Concent1_fp32": 9.0,
"o2Concent2_fp32": 38.0,
"o2Level_fp32": 0.0,
"o2_fp32": 0.0,
"powLimit_fp32": 41.0,
"powerGen_fp32": 911.0
"h2Concent1_fp32": 0.0,
"h2Concent2_fp32": 1.1693958999055459e-38,
"o2Concent1_fp32": -10734197014528.0,
"o2Concent2_fp32": 7.8705161391451957e-39,
"o2Level_fp32": 1.1754039670713386e-38,
"o2_fp32": 1.8514036025451028e-37,
"powLimit_fp32": 0.0,
"powerGen_fp32": 1.4181007727976608e-36
}
+24 -24
View File
@@ -1,38 +1,38 @@
{
"fcuCurToInsLimit1_uint8": 0,
"fcuCurToInsLimit1_uint8": 127,
"fcuCurToinsLimit2_uint8": 0,
"insBatCurElect_uint16": 0,
"insBatLimit_uint16": 39,
"insBatSoc_uint8": 85,
"insBatTotalElect_uint16": 304,
"insBatLimit_uint16": 3817,
"insBatSoc_uint8": 0,
"insBatTotalElect_uint16": 53312,
"insChargeState_uint8": 0,
"insCurSocHold1_uint8": 0,
"insCurSocHold2_uint8": 0,
"insCurSocHold3_uint8": 0,
"insCurrent_uint16": 78,
"insCurSocHold1_uint8": 134,
"insCurSocHold2_uint8": 219,
"insCurSocHold3_uint8": 86,
"insCurrent_uint16": 0,
"insLinkVol_uint16": 0,
"insNegRelayState_uint8": 0,
"insNegRes_uint16": 0,
"insPackVol_uint16": 0,
"insPosRelayState_uint8": 1,
"insPosRes_uint16": 0,
"insfaultCode_uint8": 0,
"insPosRelayState_uint8": 0,
"insPosRes_uint16": 3,
"insfaultCode_uint8": 88,
"powBatCurElect_uint16": 0,
"powBatSoc_uint8": 60,
"powBatTotalElect_uint16": 413,
"powBatSoc_uint8": 0,
"powBatTotalElect_uint16": 31581,
"powChargeState_uint8": 0,
"powCurSocHold1_uint8": 0,
"powCurSocHold2_uint8": 0,
"powCurSocHold3_uint8": 0,
"powCurToInsLimit1_uint8": 0,
"powCurToinsLimit2_uint8": 0,
"powCur_uint16": 72,
"powCurSocHold2_uint8": 208,
"powCurSocHold3_uint8": 241,
"powCurToInsLimit1_uint8": 93,
"powCurToinsLimit2_uint8": 219,
"powCur_uint16": 61767,
"powLinkVol_uint16": 0,
"powNegRelayState_uint8": 0,
"powNegRes_uint16": 0,
"powPosRelayState_uint8": 0,
"powPosRes_uint16": 0,
"powerBatLimit_uint16": 82,
"powNegRelayState_uint8": 85,
"powNegRes_uint16": 32598,
"powPosRelayState_uint8": 208,
"powPosRes_uint16": 56067,
"powerBatLimit_uint16": 0,
"powerPackVol_uint16": 0,
"powfaultCode_uint8": 0
"powfaultCode_uint8": 45
}
+13 -1
View File
@@ -15,12 +15,16 @@ else (${WIN32})
pthread )
endif (${WIN32})
# Find SQLite3 package
find_package(SQLite3 REQUIRED)
SET(SRC
PowerManger.cpp
PowerManger_Info.cpp
udpComm.cpp
fsm.cpp
main.cpp
SQLiteDB.cpp
)
ADD_EXECUTABLE(pPowerManger ${SRC})
@@ -32,5 +36,13 @@ TARGET_LINK_LIBRARIES(pPowerManger
m
pthread
jsoncpp
${SYSTEM_LIBS})
${SYSTEM_LIBS}
SQLiteDB
sqlite3)
# Add SQLiteDB static library
SET(SQLITEDB_SRC
SQLiteDB.cpp
)
ADD_LIBRARY(SQLiteDB STATIC ${SQLITEDB_SRC})
+15
View File
@@ -35,6 +35,12 @@ PowerManger::PowerManger()
m_faultNum = 0;
faultCode.push_back(0);
//初始化数据库
string dbPath = "/home/zjk/project/H100/H100PowerManger/data/power_data.db";
m_db = new SQLiteDB(dbPath);
m_db->createTables();
//注册状态机
m_fsm.RegisterState("Init", 1, m_Inite_s1);
m_fsm.RegisterState("Fault", 99, m_Fault_s99);
@@ -106,6 +112,15 @@ bool PowerManger::Iterate()
updateTime();
//2. 运行状态机
m_fsm.run(m_pmState,this);
// 数据库测试
PowerData data;
data.id = 1;
data.timestamp = "2023-05-22 10:00:00";
data.voltage = 12.3 + rand() % 100 / 100.0;
data.current = 4.5 + rand() % 100 / 100.0;
data.power = 56.7 + rand() % 100 / 100.0;
data.temperature = 25.0 + rand() % 100 / 100.0;
m_db->insertPowerData(data.voltage, data.current, data.power, data.temperature);
//3. 输出报告
buildPowerSysReport();
//4. 打印错误信息
+4 -2
View File
@@ -30,6 +30,7 @@
#include "udpComm.h"
#include "pmSysvariable.h"
#include "fsm.h"
#include "SQLiteDB.h"
#define VAR_TO_STR(var) #var
@@ -69,8 +70,6 @@ class PowerManger : public AppCastingMOOSApp
bool IsSkewed(double dfTimeNow, double * pdfSkew = NULL);
string getTypeName(const string typeName);
//通信相关
XPCUdpSocket* setUdpScoket(long lPort);
bool disSystemOperation(disBreaker optBreaker, disBreakerOpt);
@@ -104,6 +103,9 @@ class PowerManger : public AppCastingMOOSApp
double m_current_time;
unsigned int m_faultNum;
//数据库
SQLiteDB* m_db;
// CMOOSThread m_SendThread;
private: //
bool inline saveStringToJsonFile(const string &strJson, const string &strFileName);
+125
View File
@@ -0,0 +1,125 @@
#include "SQLiteDB.h"
#include <iostream>
#include <ctime>
#include <json/json.h>
SQLiteDB::SQLiteDB(const std::string& dbPath) {
if (sqlite3_open(dbPath.c_str(), &m_db) != SQLITE_OK) {
std::cerr << "Error opening database: " << sqlite3_errmsg(m_db) << std::endl;
m_db = nullptr;
}
}
SQLiteDB::~SQLiteDB() {
if (m_db) {
sqlite3_close(m_db);
}
}
void SQLiteDB::createTables() {
if (!m_db) return;
const char* sql = "CREATE TABLE IF NOT EXISTS power_data ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,"
"voltage REAL NOT NULL,"
"current REAL NOT NULL,"
"power REAL NOT NULL,"
"temperature REAL NOT NULL);";
char* errMsg = nullptr;
if (sqlite3_exec(m_db, sql, nullptr, nullptr, &errMsg) != SQLITE_OK) {
std::cerr << "SQL error: " << errMsg << std::endl;
sqlite3_free(errMsg);
}
}
void SQLiteDB::insertPowerData(float voltage, float current, float power, float temperature) {
if (!m_db) return;
const char* sql = "INSERT INTO power_data (voltage, current, power, temperature) VALUES (?, ?, ?, ?);";
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) == SQLITE_OK) {
sqlite3_bind_double(stmt, 1, voltage);
sqlite3_bind_double(stmt, 2, current);
sqlite3_bind_double(stmt, 3, power);
sqlite3_bind_double(stmt, 4, temperature);
if (sqlite3_step(stmt) != SQLITE_DONE) {
std::cerr << "Error inserting data: " << sqlite3_errmsg(m_db) << std::endl;
}
sqlite3_finalize(stmt);
} else {
std::cerr << "Error preparing statement: " << sqlite3_errmsg(m_db) << std::endl;
}
}
std::vector<PowerData> SQLiteDB::getPowerData(int limit) {
std::vector<PowerData> data;
if (!m_db) return data;
const char* sql = "SELECT id, timestamp, voltage, current, power, temperature FROM power_data ORDER BY timestamp DESC LIMIT ?;";
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, limit);
while (sqlite3_step(stmt) == SQLITE_ROW) {
PowerData record;
record.id = sqlite3_column_int(stmt, 0);
record.timestamp = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1));
record.voltage = sqlite3_column_double(stmt, 2);
record.current = sqlite3_column_double(stmt, 3);
record.power = sqlite3_column_double(stmt, 4);
record.temperature = sqlite3_column_double(stmt, 5);
data.push_back(record);
}
sqlite3_finalize(stmt);
} else {
std::cerr << "Error preparing statement: " << sqlite3_errmsg(m_db) << std::endl;
}
return data;
}
// 显式实例化模板
template void SQLiteDB::insertStructData<PowerData>(const std::string&, const PowerData&);
template<typename T>
std::string SQLiteDB::serializeStruct(const T& data) {
Json::Value j;
j["id"] = data.id;
j["timestamp"] = data.timestamp;
j["voltage"] = data.voltage;
j["current"] = data.current;
j["power"] = data.power;
j["temperature"] = data.temperature;
Json::StreamWriterBuilder writer;
return Json::writeString(writer, j);
}
template<typename T>
void SQLiteDB::insertStructData(const std::string& tableName, const T& data) {
if (!m_db) return;
std::string jsonData = serializeStruct(data);
std::string sql = "INSERT INTO " + tableName + " (data) VALUES (?);";
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(m_db, sql.c_str(), -1, &stmt, nullptr) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, jsonData.c_str(), -1, SQLITE_TRANSIENT);
if (sqlite3_step(stmt) != SQLITE_DONE) {
std::cerr << "Error inserting data: " << sqlite3_errmsg(m_db) << std::endl;
}
sqlite3_finalize(stmt);
} else {
std::cerr << "Error preparing statement: " << sqlite3_errmsg(m_db) << std::endl;
}
}
+39
View File
@@ -0,0 +1,39 @@
#ifndef SQLITEDB_H
#define SQLITEDB_H
#include <sqlite3.h>
#include <string>
#include <vector>
#include "json/json.h"
// #include <nlohmann/json.hpp>
struct PowerData {
int id;
std::string timestamp;
double voltage;
double current;
double power;
double temperature;
};
class SQLiteDB {
public:
SQLiteDB(const std::string& dbPath);
~SQLiteDB();
void createTables();
void insertPowerData(float voltage, float current, float power, float temperature);
std::vector<PowerData> getPowerData(int limit = 100);
template<typename T>
void insertStructData(const std::string& tableName, const T& data);
private:
sqlite3* m_db;
template<typename T>
std::string serializeStruct(const T& data);
};
#endif // SQLITEDB_H
+26
View File
@@ -0,0 +1,26 @@
cmake_minimum_required(VERSION 3.10)
project(SQLiteDBTest)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 查找 SQLiteDB 项目库
find_library(SQLiteDB_LIB NAMES SQLiteDB PATHS /home/zjk/project/H100/H100PowerManger/lib)
if(NOT SQLiteDB_LIB)
message(FATAL_ERROR "SQLiteDB library not found!")
endif()
# 查找 Catch2 测试框架
find_package(Catch2 REQUIRED)
# 添加测试可执行文件
add_executable(SQLiteDBTest SQLiteDBTest.cpp)
# 链接库文件(注意顺序:先项目库后系统库)
target_link_libraries(SQLiteDBTest
${SQLiteDB_LIB} # 项目SQLiteDB库
Catch2::Catch2WithMain # 测试框架
sqlite3
jsoncpp
)
+24
View File
@@ -0,0 +1,24 @@
#include "catch2/catch.hpp"
#include "../src/pPowerManger/SQLiteDB.h"
TEST_CASE("SQLiteDB Test", "[SQLiteDB]") {
SQLiteDB db("test.db");
SECTION("Create Tables") {
db.createTables();
}
SECTION("Insert Data") {
PowerData data = {0, "2025-02-10 14:09:00", 12.5, 2.5, 31.25, 25.0};
db.insertStructData("power_data", data);
}
SECTION("Query Data") {
std::vector<PowerData> results = db.getPowerData();
REQUIRE(results.size() == 1);
REQUIRE(results[0].voltage == 12.5);
REQUIRE(results[0].current == 2.5);
REQUIRE(results[0].power == 31.25);
REQUIRE(results[0].temperature == 25.0);
}
}