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 0000000..45ba51e Binary files /dev/null and b/src/pPowerManger/sqlit3/SQLite.zip differ 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