From e5193bd7f73d65f00a91a11974bf397c15d72274 Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Tue, 27 Jan 2026 20:45:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E5=9C=A8=E5=90=AF=E5=8A=A8=E6=97=B6=E5=81=B6=E5=B0=94=E5=B4=A9?= =?UTF-8?q?=E6=BA=83=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/pPowerManger.moos | 9 -- bin/t.sh | 34 +++++ bin/td.sh | 148 +++++++++++++++++++ build_debug.sh | 61 ++++++++ src/pPowerManger/LowerCommManager.cpp | 188 +++++++++++++----------- src/pPowerManger/PowerManger.cpp | 7 +- src/pPowerManger/sqlit3/SQLite.zip | Bin 0 -> 5895 bytes src/pPowerManger/systemData.h | 102 +++++++++---- test/disSysTest/PowerManagerApp copy.py | 40 +++-- 9 files changed, 456 insertions(+), 133 deletions(-) delete mode 100644 bin/pPowerManger.moos create mode 100755 bin/t.sh create mode 100755 bin/td.sh create mode 100755 build_debug.sh create mode 100644 src/pPowerManger/sqlit3/SQLite.zip diff --git a/bin/pPowerManger.moos b/bin/pPowerManger.moos deleted file mode 100644 index afd3d78..0000000 --- a/bin/pPowerManger.moos +++ /dev/null @@ -1,9 +0,0 @@ -//SERVERHOST = 192.168.0.223 -//SERVERPORT = 9000 -ProcessConfig = pPowerManger -{ - AppTick = 4 - CommsTick = 4 - log_level = INFO - log_file = ./logfile.log -} \ No newline at end of file diff --git a/bin/t.sh b/bin/t.sh new file mode 100755 index 0000000..02a8c35 --- /dev/null +++ b/bin/t.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +echo "开始测试pPowerManger程序启动稳定性..." + +LOOP_COUNT=0 +while true; do + LOOP_COUNT=$((LOOP_COUNT + 1)) + echo "\n===== 第 $LOOP_COUNT 次循环 =====" + + # 启动pPowerManger程序 + echo "启动pPowerManger..." + ./pPowerManger pPowerManger.moos & + PROCESS_ID=$! + + # 等待5秒让程序启动 + sleep 0.1 + + # 检查程序是否还在运行 + if kill -0 $PROCESS_ID 2>/dev/null; then + echo "程序启动成功,PID: $PROCESS_ID" + + # 等待2秒后关闭程序 + sleep 2 + echo "关闭程序..." + kill $PROCESS_ID + + # 等待1秒让程序彻底关闭 + sleep 0.1 + else + echo "程序启动失败!" + echo "故障发生在第 $LOOP_COUNT 次循环" + exit 0.1 + fi +done \ No newline at end of file diff --git a/bin/td.sh b/bin/td.sh new file mode 100755 index 0000000..882101b --- /dev/null +++ b/bin/td.sh @@ -0,0 +1,148 @@ +#!/bin/bash + +# 核心配置 +CRASH_LOG_DIR="./crash_logs" +RUN_DURATION=2 +GDB_TIMEOUT=$((RUN_DURATION + 2)) # 延长超时,确保GDB完全初始化 +MAX_LOOP=0 +# 强制捕获所有致命信号 +CRASH_SIGNALS=("SIGSEGV" "SIGABRT" "SIGILL" "SIGFPE" "SIGBUS") + +# 创建日志目录 +mkdir -p ${CRASH_LOG_DIR} +rm -f ${CRASH_LOG_DIR}/* # 清空旧日志(可选) + +# 清理进程函数 +cleanup() { + pkill -9 gdb >/dev/null 2>&1 + pkill -9 pPowerManger >/dev/null 2>&1 + sleep 0.2 +} + +# 检查是否是真崩溃(从日志+系统日志双重验证) +is_real_crash() { + local log_file=$1 + local loop=$2 + # 1. 检查GDB日志中的崩溃关键字 + if grep -qiE "segmentation fault|sigsegv|crash detected|backtrace" "${log_file}"; then + return 0 + fi + # 2. 检查系统dmesg中的段错误记录(终极验证) + if dmesg | grep -i "pPowerManger.*segfault" | grep -i "loop_${loop}"; then + return 0 + fi + return 1 +} + +# 打印系统级崩溃日志(dmesg) +print_system_crash_log() { + local loop=$1 + echo -e "\033[33m===== 系统级崩溃日志(dmesg)=====\033[0m" + dmesg | grep -A 5 -B 2 "pPowerManger.*segfault" | tail -10 + echo -e "\033[33m===================================\033[0m" +} + +echo -e "🔍 启动pPowerManger稳定性测试(强制捕获段错误)\n" +echo "📂 崩溃日志目录: ${CRASH_LOG_DIR}" +echo "⏱ 程序运行时长: ${RUN_DURATION}秒" +echo "📌 捕获信号: ${CRASH_SIGNALS[*]}" +echo -e "========================================\n" + +cleanup # 初始清理 +LOOP_COUNT=0 + +while true; do + LOOP_COUNT=$((LOOP_COUNT + 1)) + if [ ${MAX_LOOP} -ne 0 ] && [ ${LOOP_COUNT} -gt ${MAX_LOOP} ]; then + echo -e "\n✅ 测试完成(${MAX_LOOP}次循环无崩溃)" + cleanup + exit 0 + fi + + echo -e "===== 第 ${LOOP_COUNT} 次循环 =====" + CRASH_LOG="${CRASH_LOG_DIR}/crash_loop_${LOOP_COUNT}.log" + GDB_CMD="${CRASH_LOG_DIR}/gdb_cmds_${LOOP_COUNT}.gdb" + + # 生成强化版GDB脚本:强制捕获所有信号,优先初始化信号处理 + cat > ${GDB_CMD} << EOF +# 核心:GDB启动后先设置信号捕获,再启动程序 +set args pPowerManger.moos +set timeout ${GDB_TIMEOUT} +set print pretty on +set print frame-arguments all +set logging file ${CRASH_LOG}.gdb_raw +set logging on # 开启GDB原始日志(双重保障) + +# 强制捕获所有致命信号 +EOF + +# 为每个崩溃信号添加捕获规则(追加到GDB脚本) +for sig in "${CRASH_SIGNALS[@]}"; do + cat >> ${GDB_CMD} << EOF +handle ${sig} stop print pass nostop # 即使子线程崩溃也捕获 +EOF +done + +# 追加程序启动和崩溃处理逻辑 +cat >> ${GDB_CMD} << EOF +# 延迟10ms启动程序,确保GDB完全初始化 +sleep 0.01 +run + +# 崩溃后强制打印所有信息(无论是否主线程) +if \$exitcode != 0 || \$signal_number != 0 + echo "\n=====================================" + echo " CRASH DETECTED" + echo "=====================================" + echo "Loop: ${LOOP_COUNT}" + echo "Exit code: \$exitcode" + echo "Signal: \$signal_name (\$signal_number)" + echo "=====================================" + thread apply all bt full # 打印所有线程的调用栈(关键!) + info threads + info proc mappings # 打印内存映射(排查内存越界) + info locals + info registers +endif + +set logging off +quit +EOF + + # 核心:用nohup+GDB启动,避免输出丢失;同时记录进程ID + echo "启动程序(GDB强化模式)..." + nohup timeout ${GDB_TIMEOUT} gdb -batch -x ${GDB_CMD} ./pPowerManger > ${CRASH_LOG} 2>&1 & + GDB_PID=$! + wait ${GDB_PID} # 等待GDB执行完成 + + # 双重验证:检查是否真崩溃 + if is_real_crash ${CRASH_LOG} ${LOOP_COUNT}; then + # 捕获到真崩溃 + echo -e "\033[31m❌ 第 ${LOOP_COUNT} 次循环捕获到段错误!\033[0m" + echo -e "\033[31m📄 崩溃日志: ${CRASH_LOG}\033[0m" + print_system_crash_log ${LOOP_COUNT} + + # 打印最关键的调用栈(所有线程) + echo -e "\033[31m===== 所有线程崩溃调用栈 =====\033[0m" + grep -A 50 "thread apply all bt full" ${CRASH_LOG} | grep -v "No stack frame" + echo -e "\033[31m==============================\033[0m" + + cleanup + echo -e "\n🛑 测试终止,完整日志在 ${CRASH_LOG}" + exit 1 + else + # 无崩溃(正常退出/启动失败) + if grep -qi "Program exited normally" ${CRASH_LOG}; then + echo "✅ 程序正常运行${RUN_DURATION}秒后退出" + else + echo "⚠️ 程序启动失败(非段错误),继续循环" + # 保留启动失败日志(方便排查) + mv ${CRASH_LOG} ${CRASH_LOG}.start_fail + fi + rm -f ${GDB_CMD} ${CRASH_LOG}.gdb_raw + fi + + cleanup + echo -e "第 ${LOOP_COUNT} 次循环完成\n" + sleep 0.5 +done \ No newline at end of file diff --git a/build_debug.sh b/build_debug.sh new file mode 100755 index 0000000..3f27600 --- /dev/null +++ b/build_debug.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +INVOCATION_ABS_DIR=`pwd` +# 默认设为Debug模式,避免无符号编译(核心修改1) +BUILD_TYPE="Debug" +CMD_LINE_ARGS="" + +#------------------------------------------------------------------- +# Part 1: Check for and handle command-line arguments +#------------------------------------------------------------------- +for ARGI; do + if [ "${ARGI}" = "--help" -o "${ARGI}" = "-h" ] ; then + printf "%s [SWITCHES] \n" $0 + printf "Switches: \n" + printf " --help, -h \n" + printf " --debug, -d \n" + printf " --release, -r \n" + printf "Notes: \n" + printf " (1) All other command line args will be passed as args \n" + printf " to \"make\" when it is eventually invoked. \n" + printf " (2) For example -k will continue making when/if a failure \n" + printf " is encountered in building one of the subdirectories. \n" + printf " (3) For example -j2 will utilize a 2nd core in the build \n" + printf " if your machine has two cores. -j4 etc for quad core. \n" + exit 0; + elif [ "${ARGI}" = "--debug" -o "${ARGI}" = "-d" ] ; then + BUILD_TYPE="Debug" + elif [ "${ARGI}" = "--release" -o "${ARGI}" = "-r" ] ; then + BUILD_TYPE="Release" + else + CMD_LINE_ARGS=$CMD_LINE_ARGS" "$ARGI + fi +done + +#------------------------------------------------------------------- +# Part 2: Invoke the call to make in the build directory +#------------------------------------------------------------------- + +mkdir -p build +cd build + +# 核心修改2:添加RK3588 ARM64编译选项+强制调试符号 +# -DCMAKE_CXX_FLAGS:全局C++编译选项,适配RK3588的cortex-a76架构 +# -DCMAKE_BUILD_TYPE:指定编译模式 +# -DCMAKE_CXX_FLAGS_DEBUG:Debug模式强制-O0 + 完整调试符号 +# -DCMAKE_CXX_FLAGS_RELEASE:Release模式保留-g(调试符号),仅优化级别-O2 +cmake \ + -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DCMAKE_CXX_FLAGS="-march=armv8-a -mtune=cortex-a76 -mstrict-align -fPIC" \ + -DCMAKE_CXX_FLAGS_DEBUG="-O0 -g -ggdb" \ + -DCMAKE_CXX_FLAGS_RELEASE="-O2 -g -ggdb" \ + ../ + +# 核心修改3:添加-j参数加速编译(适配RK3588多核),默认用4核(可根据板卡调整) +# 若你传了-j参数,会覆盖默认的-j4 +# if [[ ! $CMD_LINE_ARGS =~ "-j" ]]; then +# CMD_LINE_ARGS="-j4 ${CMD_LINE_ARGS}" +# fi + +make ${CMD_LINE_ARGS} +cd ${INVOCATION_ABS_DIR} \ No newline at end of file diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index 0a3d8d9..c485ae4 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -189,111 +189,126 @@ bool LowerCommManager::updatePoweSystemStates(){ if(!m_udpComm->m_qReceiveCcuStateBuffer.empty()) { double time; - m_udpComm->popMsgFormQueue(time,m_CcuCurrentState); - m_pm->m_pmCurrentState.ccustate = m_CcuCurrentState.data; - m_pm->m_db->insertData(m_pm->m_pmCurrentState.ccustate); //写入数据库 + if(m_udpComm->popMsgFormQueue(time, m_CcuCurrentState)); + { + m_pm->m_pmCurrentState.ccustate = m_CcuCurrentState.data; + m_pm->m_db->insertData(m_pm->m_pmCurrentState.ccustate); //写入数据库 + msg_CcuStateFbMsg_Update_time = time; + m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.ccustate); + m_pm->m_systemData->device_common_status.ccu_status.lastUpdateTime = m_pm->m_lowerCommManager->msg_CcuStateFbMsg_Update_time; + + } //DEBUG //写入文件 // std::ofstream outFile("ccuState.txt", std::ios::app); // coutMsg(m_CcuCurrentState, outFile); // coutMsg(m_CcuCurrentState,std::cout); - msg_CcuStateFbMsg_Update_time = time; } if(!m_udpComm->m_qReceiveDisHighVolBusBuffer.empty()) { double time; - m_udpComm->popMsgFormQueue(time,m_disHighVolBusCurrentState); - m_pm->m_pmCurrentState.bus1State = m_disHighVolBusCurrentState.data; - m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus1State); //写入数据库 - msg_disHighVolBusFbMsg_Update_time = time; + if(m_udpComm->popMsgFormQueue(time, m_disHighVolBusCurrentState)); + { + // m_udpComm->popMsgFormQueue(time,m_disHighVolBusCurrentState); + m_pm->m_pmCurrentState.bus1State = m_disHighVolBusCurrentState.data; + m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus1State); //写入数据库 + msg_disHighVolBusFbMsg_Update_time = time; - disBus1Breaker* pdis1=new disBus1Breaker; - (m_pm->m_pmCurrentState.bus1State.fuelCellCircuitBreaker == BREAK_ON) ? pdis1 -> fuelCellCircuitBreaker = 1 : pdis1 -> fuelCellCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.powerLithiumBatteryCircuitBreaker == BREAK_ON) ? pdis1 -> powerLithiumBatteryCircuitBreaker = 1 : pdis1 -> powerLithiumBatteryCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.propulsionMotorCircuitBreaker == BREAK_ON) ? pdis1 -> propulsionMotorCircuitBreaker = 1 : pdis1 -> propulsionMotorCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON) ? pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.dcDc5ModuleCircuitBreaker == BREAK_ON) ? pdis1 -> dcDc5ModuleCircuitBreaker = 1 : pdis1 -> dcDc5ModuleCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCircuitBreaker == BREAK_ON) ? pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 1 : pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.sternFTDevice45CircuitBreaker == BREAK_ON) ? pdis1 -> sternFTDevice45CircuitBreaker = 1 : pdis1 -> sternFTDevice45CircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.sternRudderSwitch1CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch1CircuitBreaker = 1 : pdis1 -> sternRudderSwitch1CircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.sternRudderSwitch2CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch2CircuitBreaker = 1 : pdis1 -> sternRudderSwitch2CircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.fbReservedCircuitBreaker == BREAK_ON) ? pdis1 -> fbReservedCircuitBreaker = 1 : pdis1 -> fbReservedCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.tyzReservedCircuitBreaker == BREAK_ON) ? pdis1 -> tyzReservedCircuitBreaker = 1 : pdis1 -> tyzReservedCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus1State.reservedCircuitBreaker == BREAK_ON) ? pdis1 -> reservedCircuitBreaker = 1 : pdis1 -> reservedCircuitBreaker = 0; - pdis1 -> paceholder = 0; - m_pm->m_currentDisBreakerState.bus1Breaker = *pdis1; - delete pdis1; + disBus1Breaker* pdis1=new disBus1Breaker; + (m_pm->m_pmCurrentState.bus1State.fuelCellCircuitBreaker == BREAK_ON) ? pdis1 -> fuelCellCircuitBreaker = 1 : pdis1 -> fuelCellCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.powerLithiumBatteryCircuitBreaker == BREAK_ON) ? pdis1 -> powerLithiumBatteryCircuitBreaker = 1 : pdis1 -> powerLithiumBatteryCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.propulsionMotorCircuitBreaker == BREAK_ON) ? pdis1 -> propulsionMotorCircuitBreaker = 1 : pdis1 -> propulsionMotorCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON) ? pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.dcDc5ModuleCircuitBreaker == BREAK_ON) ? pdis1 -> dcDc5ModuleCircuitBreaker = 1 : pdis1 -> dcDc5ModuleCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCircuitBreaker == BREAK_ON) ? pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 1 : pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.sternFTDevice45CircuitBreaker == BREAK_ON) ? pdis1 -> sternFTDevice45CircuitBreaker = 1 : pdis1 -> sternFTDevice45CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.sternRudderSwitch1CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch1CircuitBreaker = 1 : pdis1 -> sternRudderSwitch1CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.sternRudderSwitch2CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch2CircuitBreaker = 1 : pdis1 -> sternRudderSwitch2CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.fbReservedCircuitBreaker == BREAK_ON) ? pdis1 -> fbReservedCircuitBreaker = 1 : pdis1 -> fbReservedCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.tyzReservedCircuitBreaker == BREAK_ON) ? pdis1 -> tyzReservedCircuitBreaker = 1 : pdis1 -> tyzReservedCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.reservedCircuitBreaker == BREAK_ON) ? pdis1 -> reservedCircuitBreaker = 1 : pdis1 -> reservedCircuitBreaker = 0; + pdis1 -> paceholder = 0; + m_pm->m_currentDisBreakerState.bus1Breaker = *pdis1; + delete pdis1; + + m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus1State); + m_pm->m_systemData->device_common_status.dis_hv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighVolBusFbMsg_Update_time; + } } if(!m_udpComm->m_qReceiveDisHighAVolBusBuffer.empty()) { double time; - m_udpComm->popMsgFormQueue(time,m_disHighAVolBusCurrentState); - m_pm->m_pmCurrentState.bus2State = m_disHighAVolBusCurrentState.data; - m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus2State); //写入数据库 - msg_disHighAVolBusFbMsg_Update_time = time; + if(m_udpComm->popMsgFormQueue(time,m_disHighAVolBusCurrentState)); + { + m_pm->m_pmCurrentState.bus2State = m_disHighAVolBusCurrentState.data; + m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus2State); //写入数据库 + msg_disHighAVolBusFbMsg_Update_time = time; - disBus2Breaker* pdis2=new disBus2Breaker; - (m_pm->m_pmCurrentState.bus2State.bowFTDevice123CircuitBreaker == BREAK_ON)? pdis2 -> bowFTDevice123CircuitBreaker = 1 : pdis2 -> bowFTDevice123CircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus2State.actuatorCircuitBreaker == BREAK_ON)? pdis2 -> actuatorCircuitBreaker = 1 : pdis2 -> actuatorCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus2State.mastSteeringGearControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 1 : pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus2State.xczCircuitBreaker == BREAK_ON)? pdis2 -> xczCircuitBreaker = 1 : pdis2 -> xczCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus2State.bowRudderControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> bowRudderControlBoxCircuitBreaker = 1 : pdis2 -> bowRudderControlBoxCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus2State.openWaterCoverStartCylinderCircuitBreaker == BREAK_ON)? pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 1 : pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 0; - pdis2 -> paceholder = 0; - m_pm->m_currentDisBreakerState.bus2Breaker = *pdis2; - delete pdis2; + disBus2Breaker* pdis2=new disBus2Breaker; + (m_pm->m_pmCurrentState.bus2State.bowFTDevice123CircuitBreaker == BREAK_ON)? pdis2 -> bowFTDevice123CircuitBreaker = 1 : pdis2 -> bowFTDevice123CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.actuatorCircuitBreaker == BREAK_ON)? pdis2 -> actuatorCircuitBreaker = 1 : pdis2 -> actuatorCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.mastSteeringGearControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 1 : pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.xczCircuitBreaker == BREAK_ON)? pdis2 -> xczCircuitBreaker = 1 : pdis2 -> xczCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.bowRudderControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> bowRudderControlBoxCircuitBreaker = 1 : pdis2 -> bowRudderControlBoxCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.openWaterCoverStartCylinderCircuitBreaker == BREAK_ON)? pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 1 : pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 0; + pdis2 -> paceholder = 0; + m_pm->m_currentDisBreakerState.bus2Breaker = *pdis2; + delete pdis2; + + m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus2State); + m_pm->m_systemData->device_common_status.dis_hv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighAVolBusFbMsg_Update_time; + + } } if(!m_udpComm->m_qReceiveDisHighBVolBusBuffer.empty()) { double time; - m_udpComm->popMsgFormQueue(time,m_disHighBVolBusCurrentState); - m_pm->m_pmCurrentState.bus3State = m_disHighBVolBusCurrentState.data; - m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus3State); //写入数据库 - msg_disHighBVolBusFbMsg_Update_time = time; + if(m_udpComm->popMsgFormQueue(time,m_disHighBVolBusCurrentState)); + { + m_pm->m_pmCurrentState.bus3State = m_disHighBVolBusCurrentState.data; + m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus3State); //写入数据库 + msg_disHighBVolBusFbMsg_Update_time = time; - disBus3Breaker* pdis3=new disBus3Breaker; - (m_pm->m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON)? pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCircuitBreaker == BREAK_ON)? pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 1 : pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus3State.unit4InstrumentDC48VCircuitBreaker == BREAK_ON)? pdis3 -> unit4InstrumentDC48VCircuitBreaker = 1 : pdis3 -> unit4InstrumentDC48VCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus3State.dcC1DCDistributionPanelCircuitBreaker == BREAK_ON)? pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 1 : pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus3State.reservedCircuitBreaker1 == BREAK_ON)? pdis3 -> reservedCircuitBreaker1 = 1 : pdis3 -> reservedCircuitBreaker1 = 0; - (m_pm->m_pmCurrentState.bus3State.reservedCircuitBreaker2 == BREAK_ON)? pdis3 -> reservedCircuitBreaker2 = 1 : pdis3 -> reservedCircuitBreaker2 = 0; - (m_pm->m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2CircuitBreaker == BREAK_ON)? pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 1 : pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 0; - pdis3->paceholder = 0; - m_pm->m_currentDisBreakerState.bus3Breaker = *pdis3; - delete pdis3; + disBus3Breaker* pdis3=new disBus3Breaker; + (m_pm->m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON)? pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCircuitBreaker == BREAK_ON)? pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 1 : pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus3State.unit4InstrumentDC48VCircuitBreaker == BREAK_ON)? pdis3 -> unit4InstrumentDC48VCircuitBreaker = 1 : pdis3 -> unit4InstrumentDC48VCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus3State.dcC1DCDistributionPanelCircuitBreaker == BREAK_ON)? pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 1 : pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus3State.reservedCircuitBreaker1 == BREAK_ON)? pdis3 -> reservedCircuitBreaker1 = 1 : pdis3 -> reservedCircuitBreaker1 = 0; + (m_pm->m_pmCurrentState.bus3State.reservedCircuitBreaker2 == BREAK_ON)? pdis3 -> reservedCircuitBreaker2 = 1 : pdis3 -> reservedCircuitBreaker2 = 0; + (m_pm->m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2CircuitBreaker == BREAK_ON)? pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 1 : pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 0; + pdis3->paceholder = 0; + m_pm->m_currentDisBreakerState.bus3Breaker = *pdis3; + delete pdis3; + m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus3State); + m_pm->m_systemData->device_common_status.dis_lv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighBVolBusFbMsg_Update_time; + } } if(!m_udpComm->m_qReceiveDisLowBusBuffer.empty()) { double time; - m_udpComm->popMsgFormQueue(time,m_disLowBusState); - m_pm->m_pmCurrentState.bus4State = m_disLowBusState.data; - m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus4State); //写入数据库 - msg_disLowBusFbMsg_Update_time = time; + if(m_udpComm->popMsgFormQueue(time,m_disLowBusState)); + { + m_pm->m_pmCurrentState.bus4State = m_disLowBusState.data; + m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus4State); //写入数据库 + msg_disLowBusFbMsg_Update_time = time; - disBus4Breaker* pdis4=new disBus4Breaker; - (m_pm->m_pmCurrentState.bus4State.unit1CircuitBreaker == BREAK_ON)? pdis4 -> unit1CircuitBreaker = 1 : pdis4 -> unit1CircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus4State.unit2CircuitBreaker == BREAK_ON)? pdis4 -> unit2CircuitBreaker = 1 : pdis4 -> unit2CircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus4State.unit3CircuitBreaker == BREAK_ON)? pdis4 -> unit3CircuitBreaker = 1 : pdis4 -> unit3CircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus4State.unit5CircuitBreaker == BREAK_ON)? pdis4 -> unit5CircuitBreaker = 1 : pdis4 -> unit5CircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus4State.bowPZDeviceCircuitBreaker == BREAK_ON)? pdis4 -> bowPZDeviceCircuitBreaker = 1 : pdis4 -> bowPZDeviceCircuitBreaker = 0; - (m_pm->m_pmCurrentState.bus4State.reservedCircuitBreaker1 == BREAK_ON)? pdis4 -> reservedCircuitBreaker1 = 1 : pdis4 -> reservedCircuitBreaker1 = 0; - (m_pm->m_pmCurrentState.bus4State.reservedCircuitBreaker2 == BREAK_ON)? pdis4 -> reservedCircuitBreaker2 = 1 : pdis4 -> reservedCircuitBreaker2 = 0; - (m_pm->m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1CircuitBreaker == BREAK_ON)? pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 1 : pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 0; - pdis4 -> paceholder = 0; - m_pm->m_currentDisBreakerState.bus4Breaker = *pdis4; - delete pdis4; + disBus4Breaker* pdis4=new disBus4Breaker; + (m_pm->m_pmCurrentState.bus4State.unit1CircuitBreaker == BREAK_ON)? pdis4 -> unit1CircuitBreaker = 1 : pdis4 -> unit1CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.unit2CircuitBreaker == BREAK_ON)? pdis4 -> unit2CircuitBreaker = 1 : pdis4 -> unit2CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.unit3CircuitBreaker == BREAK_ON)? pdis4 -> unit3CircuitBreaker = 1 : pdis4 -> unit3CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.unit5CircuitBreaker == BREAK_ON)? pdis4 -> unit5CircuitBreaker = 1 : pdis4 -> unit5CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.bowPZDeviceCircuitBreaker == BREAK_ON)? pdis4 -> bowPZDeviceCircuitBreaker = 1 : pdis4 -> bowPZDeviceCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.reservedCircuitBreaker1 == BREAK_ON)? pdis4 -> reservedCircuitBreaker1 = 1 : pdis4 -> reservedCircuitBreaker1 = 0; + (m_pm->m_pmCurrentState.bus4State.reservedCircuitBreaker2 == BREAK_ON)? pdis4 -> reservedCircuitBreaker2 = 1 : pdis4 -> reservedCircuitBreaker2 = 0; + (m_pm->m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1CircuitBreaker == BREAK_ON)? pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 1 : pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 0; + pdis4 -> paceholder = 0; + m_pm->m_currentDisBreakerState.bus4Breaker = *pdis4; + delete pdis4; + m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus4State); + m_pm->m_systemData->device_common_status.dis_lv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disLowBusFbMsg_Update_time; + } } - m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.ccustate); - m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus1State); - m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus2State); - m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus3State); - m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus4State); - m_pm->m_systemData->device_common_status.ccu_status.lastUpdateTime = m_pm->m_lowerCommManager->msg_CcuStateFbMsg_Update_time; - m_pm->m_systemData->device_common_status.dis_hv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighVolBusFbMsg_Update_time; - m_pm->m_systemData->device_common_status.dis_hv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighAVolBusFbMsg_Update_time; - m_pm->m_systemData->device_common_status.dis_lv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighBVolBusFbMsg_Update_time; - m_pm->m_systemData->device_common_status.dis_lv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disLowBusFbMsg_Update_time; return true; } @@ -310,18 +325,21 @@ bool LowerCommManager::listenThreadFunc() if(nRead > 0) { try { - if(!m_udpComm->pushMsgToQueue(Buff)) + if(m_udpComm->pushMsgToQueue(Buff)) + { + //更新当前状态 + if(!updatePoweSystemStates()) + { + std::cerr << "Error updating power system states" << std::endl; + } + } + else { for(int i=0; isError.size(); i++) { cout<sError[i] << MOOS::ConsoleColours::reset() << endl; } } - //更新当前状态 - if(!updatePoweSystemStates()) - { - std::cerr << "Error updating power system states" << std::endl; - } } catch(const std::exception& e) { cerr << "Error processing message: " << e.what() << endl; diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index 3f1b1f2..f79ecde 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -55,6 +55,10 @@ PowerManger::PowerManger() m_subDisSysCmd = {}; m_subDisSysState = {}; m_subDisSysFault = {}; + + //初始化系统数据 + m_systemData = new SystemData(); + //初始化控制指令 initControlCmd(); @@ -70,9 +74,6 @@ PowerManger::PowerManger() m_db = new SQLite("power_data.db"); m_db->createTable(); - //初始化系统数据 - m_systemData = new SystemData(); - //初始化http服务器 m_httpServer = new HttpServer(8090); m_httpServer->setPowerManger(this); diff --git a/src/pPowerManger/sqlit3/SQLite.zip b/src/pPowerManger/sqlit3/SQLite.zip new file mode 100644 index 0000000000000000000000000000000000000000..45ba51e2ab9f060119920ff46007bf2cfb0d77a7 GIT binary patch literal 5895 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 x3Hh`7|0Cu9?)%4G|9$5lcm1uB5Gl|!kny literal 0 HcmV?d00001 diff --git a/src/pPowerManger/systemData.h b/src/pPowerManger/systemData.h index 71d9a05..42f98a9 100644 --- a/src/pPowerManger/systemData.h +++ b/src/pPowerManger/systemData.h @@ -36,7 +36,7 @@ public: uint8_t maxLevel = 0; // 遍历 sysFaultCodes 集合中的每个故障码 for (auto code : sysFaultCodes) { - // 提取0xabcd中的b位 (右移8位后取低4位) + // 提取0xabcd中的b位 uint8_t level = (code >> 8) & 0xF; if (level > maxLevel) { maxLevel = level; @@ -46,9 +46,10 @@ public: } /** * @brief 获取系统当前的故障码集合 - * @return std::set& 系统当前的故障码集合 + * @return std::set 系统当前的故障码集合 */ - const std::set& getFaultCode() const { + std::set getFaultCode() const { + std::lock_guard lock(sysFaultCodesMutex); return sysFaultCodes; } //燃料电池系统参数 @@ -524,11 +525,70 @@ public: return code; } public: - SystemData(){ - //初始化变量全部为0 - memset(this, 0, sizeof(SystemData)); - disSysFaultCode.clear(); - sysFaultCodes.clear(); + SystemData() : + m_db(nullptr), + fc_mode(0), fc_status(0), fc_fault_level(0), + output_power_limit(0.0f), total_generation_time(0.0f), total_generation_power(0.0f), + fc_fault_level_1(0), fc_fault_level_2(0), fc_fault_level_3(0), fc_fault_level_4(0), + hydrogen_capacity(0.0f), liquid_oxygen_capacity(0.0f), + palladium_temp(0.0f), main_pipe_pressure(0.0f), aux_pipe_pressure(0.0f), + cabin_pressure1(0.0f), cabin_pressure2(0.0f), cabin_temp1(0.0f), cabin_temp2(0.0f), + cabin_humidity1(0.0f), cabin_humidity2(0.0f), + flame_detector1(0), flame_detector2(0), + h2_concentration1(0.0f), h2_concentration2(0.0f), h2_concentration3(0.0f), + o2_concentration1(0.0f), o2_concentration2(0.0f), + ch3oh_concentration1(0.0f), ch3oh_concentration2(0.0f), + cabin_ox_concentration(0.0f), cabin_temperature(0.0f), cabin_humidity(0.0f), cabin_pressure(0.0f), + power_cabin_ox_concentration(0.0f), power_cabin_temperature(0.0f), power_cabin_humidity(0.0f), power_cabin_pressure(0.0f), + ins_relay_status1(0), ins_relay_status2(0), dyn_relay_status1(0), dyn_relay_status2(0), + ins_pos_relay_status(0), ins_charge_relay_status(0), ins_precharge_relay_status(0), ins_neg_relay_status(0), + dyn_pos_relay_status(0), dyn_charge_relay_status(0), dyn_precharge_relay_status(0), dyn_neg_relay_status(0), + ins_max_discharge_power(0.0f), dyn_max_discharge_power(0.0f), + ins_soc(0), dyn_soc(0), + ins_total_energy(0.0f), dyn_total_energy(0.0f), + ins_power_input(0.0f), dyn_power_input(0.0f), + ins_charge_status(0), dyn_charge_status(0), + ins_voltage_link(0.0f), ins_voltage_pack(0.0f), ins_current(0.0f), + ins_resistance_pos(0.0f), ins_resistance_neg(0.0f), + dyn_voltage_link(0.0f), dyn_voltage_pack(0.0f), dyn_current(0.0f), + dyn_resistance_pos(0.0f), dyn_resistance_neg(0.0f), + ins_emergency_status(0), dyn_emergency_status(0), + ins_soc_threshold1(0.0f), ins_soc_threshold2(0.0f), ins_soc_threshold3(0.0f), + dyn_soc_threshold1(0.0f), dyn_soc_threshold2(0.0f), dyn_soc_threshold3(0.0f), + ins_power_limit1(0.0f), ins_power_limit2(0.0f), + dyn_power_limit1(0.0f), dyn_power_limit2(0.0f), + device_online_flag1(0), device_online_flag2(0), + dyn_charge_level(0), dyn_water_leak_status(0), ins_water_leak_dcdc_status(0), reserved4(0), + water_leak_status_from_insbat(0), water_leak_status_from_dynbat(0), dcdc_status_from_insbat(0), + heartbeat(0), + powfaultCode(0), insfaultCode(0), + emergency_battery1_voltage(0.0), emergency_battery1_current(0.0), emergency_battery1_max_temp(0.0), + emergency_battery1_fault_word(0), + emergency_battery2_voltage(0.0), emergency_battery2_current(0.0), emergency_battery2_max_temp(0.0), + emergency_battery2_fault_word(0), + moosd_status(false), + leakageCode(0) + { + // 初始化数组 + for (int i = 0; i < 10; ++i) reserved1[i] = 0.0f; + for (int i = 0; i < 2; ++i) reserved2[i] = 0; + for (int i = 0; i < 6; ++i) { dyn_alarm_flag[i] = 0; ins_alarm_flag[i] = 0; } + for (int i = 0; i < 2; ++i) reserved3[i] = 0; + for (int i = 0; i < 8; ++i) leakStatus[i] = false; + + // 初始化嵌套结构体(它们有自己的构造函数) + // m_dcdcStatus 有构造函数,会自动初始化 + // power_bus_status 等 POD 结构体,使用 memset 局部初始化 + memset(&power_bus_status, 0, sizeof(power_bus_status)); + memset(&power_a_bus_status, 0, sizeof(power_a_bus_status)); + memset(&instrument_main_bus_status, 0, sizeof(instrument_main_bus_status)); + memset(&instrument_bus_status, 0, sizeof(instrument_bus_status)); + memset(&device_common_status, 0, sizeof(device_common_status)); + memset(&device_online_status, 0, sizeof(device_online_status)); + + // std::set 和 std::mutex 已经通过它们的默认构造函数正确初始化 + // 默认构造的 std::set 已经是空的,不需要调用 clear() + // disSysFaultCode 和 sysFaultCodes 会在后续操作中被填充 }; ~SystemData(){}; @@ -544,7 +604,6 @@ public: }; void updateSystemData(ccuState data){ - fc_mode = data.fc_mode; fc_status = data.fc_status; fc_fault_level = data.fc_fault_level; @@ -592,10 +651,12 @@ public: ch3oh_concentration1 = data.ch3oh_concentration1 * 0.01; ch3oh_concentration2 = data.ch3oh_concentration2 * 0.01; - //保留字段 - for(int i=0; i<10; i++) { - reserved1[i] = data.reserved1[i]; + //保留字段 :ccuState中的reserved1只有2个元素,但SystemData中的reserved1有10个元素 + // 只复制前2个元素,其余保持原值 + for(int i=0; i<2; i++) { + reserved1[i] = static_cast(data.reserved1[i]); } + // 注意:reserved1[2]到reserved1[9]保持原值(0.0f) //仪表舱参数 cabin_ox_concentration = data.cabin_ox_concentration * 0.1; @@ -705,15 +766,7 @@ public: water_leak_status_from_dynbat = (data.dyn_water_leak_status >> 4) & 0x0F; // 00 正常,01 异常漏水 dcdc_status_from_insbat = (data.ins_water_leak_dcdc_status) & 0x0F; // 00 正常,01 故障 //更新漏水状态 - if(water_leak_status_from_insbat == 0x01) - { - leakStatus[LEAKAGE_LI_BATTERY] = true; - } - else - { - leakStatus[LEAKAGE_LI_BATTERY] = false; - } - if(water_leak_status_from_dynbat == 0x01) + if(water_leak_status_from_insbat == 0x01 || water_leak_status_from_dynbat == 0x01) { leakStatus[LEAKAGE_LI_BATTERY] = true; } @@ -775,18 +828,13 @@ public: //绝缘状态 power_bus_status.powerBusInsulationStatus = data.powerBusInsulationStatus == 0x55 ? 0 : 1; - // if(power_bus_status.powerBusInsulationStatus == 1) disSysFaultCode.insert(34); else disSysFaultCode.erase(34); - power_bus_status.aBusInsulationStatus = data.aBusInsulationStatus == 0x55 ? 0 : 1; - // if(power_bus_status.aBusInsulationStatus == 1) disSysFaultCode.insert(35); else disSysFaultCode.erase(35); //电源状态 power_bus_status.meterPowerLossSignal = data.meterPowerLossSignal == 0x55 ? 0 : 1; - // if(power_bus_status.meterPowerLossSignal == 1) disSysFaultCode.insert(36); else disSysFaultCode.erase(36); - power_bus_status.emergencyPowerLossSignal = data.emergencyPowerLossSignal == 0x55 ? 0 : 1; - // if(power_bus_status.emergencyPowerLossSignal == 1) disSysFaultCode.insert(37); else disSysFaultCode.erase(37); + // 所有对 disSysFaultCode 的访问都在锁保护下 { std::lock_guard lock(faultCodeMutex); if(power_bus_status.emergencyPowerLossSignal == 1) disSysFaultCode.insert(37); else disSysFaultCode.erase(37); diff --git a/test/disSysTest/PowerManagerApp copy.py b/test/disSysTest/PowerManagerApp copy.py index 5621914..6a14035 100644 --- a/test/disSysTest/PowerManagerApp copy.py +++ b/test/disSysTest/PowerManagerApp copy.py @@ -1764,15 +1764,37 @@ class PowerManagerApp: self.simulation_LowBusFbMsg.reservedCircuitBreaker2 = self.simulation_LVBCmdMsg.reservedCircuitBreaker2 self.simulation_LowBusFbMsg.emergencyLithiumBatteryGroup1CircuitBreaker = self.simulation_LVBCmdMsg.emergencyLithiumBatteryGroup1CircuitBreaker - self.send_udp_command(self.simulation_HighVolBusFbMsg.pack(), self.udp_ip, self.udp_port) - time.sleep(1) - self.send_udp_command(self.simulation_HighAVolBusFbMsg.pack(), self.udp_ip, self.udp_port) - time.sleep(1) - self.send_udp_command(self.simulation_LowBusFbMsg.pack(), self.udp_ip, self.udp_port) - time.sleep(1) - self.send_udp_command(self.simulation_LowMainBusFbMsg.pack(), self.udp_ip, self.udp_port) - time.sleep(1) # 1秒间隔 + # self.send_udp_command(self.simulation_HighVolBusFbMsg.pack(), self.udp_ip, self.udp_control_port) + # time.sleep(0.1) + # self.send_udp_command(self.simulation_HighAVolBusFbMsg.pack(), self.udp_ip, self.udp_control_port) + # time.sleep(0.1) + # self.send_udp_command(self.simulation_LowBusFbMsg.pack(), self.udp_ip, self.udp_control_port) + # time.sleep(0.1) + # self.send_udp_command(self.simulation_LowMainBusFbMsg.pack(), self.udp_ip, self.udp_control_port) + # time.sleep(0.1) # 1秒间隔 + # 处理高压母线数据 + packed_data = self.simulation_HighVolBusFbMsg.pack() + error_packed_data = packed_data[:-1] + b'\x00' # 修改校验位为0x00 + self.send_udp_command(error_packed_data, self.udp_ip, self.udp_control_port) + # time.sleep(0.1) + # 处理高压A母线数据 + packed_data = self.simulation_HighAVolBusFbMsg.pack() + error_packed_data = packed_data[:-1] + b'\x00' # 修改校验位为0x00 + self.send_udp_command(error_packed_data, self.udp_ip, self.udp_control_port) + # time.sleep(0.01) + + # 处理低压母线数据 + packed_data = self.simulation_LowBusFbMsg.pack() + error_packed_data = packed_data[:-1] + b'\x00' # 修改校验位为0x00 + self.send_udp_command(error_packed_data, self.udp_ip, self.udp_control_port) + # time.sleep(0.01) + + # 处理仪表主母线数据 + packed_data = self.simulation_LowMainBusFbMsg.pack() + error_packed_data = packed_data[:-1] + b'\x00' # 修改校验位为0x00 + self.send_udp_command(error_packed_data, self.udp_ip, self.udp_control_port) + time.sleep(0.01) # 1秒间隔 def on_connection_changed(self, *args): """连接状态改变回调""" if self.Start_Connection.get(): @@ -1899,4 +1921,4 @@ if __name__ == "__main__": root.protocol("WM_DELETE_WINDOW", app.on_closing) print('start') root.mainloop() - print('end') + print('end') \ No newline at end of file