From 99510a0e3621dc493555fafd0b060ac3f2b27e35 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sat, 17 Aug 2024 16:43:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86=E8=AE=BE?= =?UTF-8?q?=E5=A4=87ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 +++++++++ appsrc/appsetting/project_port/project_port.cpp | 111 ++++++++++++++------- appsrc/appsetting/project_port/project_port.hpp | 30 ++++-- appsrc/service/app/add_liquid_service.cpp | 6 +- appsrc/service/app/drain_liquid_service.cpp | 4 +- appsrc/service/disinfection_logs_service.cpp | 4 +- .../service/hardware/base/h2o2_sensor_data_mgr.cpp | 8 +- doc/压力传感器.md | 7 ++ 8 files changed, 160 insertions(+), 55 deletions(-) create mode 100644 doc/压力传感器.md diff --git a/README.md b/README.md index a6d97c5..470112b 100644 --- a/README.md +++ b/README.md @@ -28,4 +28,49 @@ TODO: iconv sudo apt install fonts-noto-cjk +``` + + +# 多设备编码规范,异常处理规范 +``` +0. 单片机按照当前产品真实安装的设备编写代码。有设备则实现对应的协议,没有该设备则不实现。 +1. LinuxID路由,则只路由真实存在的设备。 +2. app目录下的代码,根据项目的不同,写不同的代码。 +3. 整个程序根据Host名字自动生成不同的配置。 +4. config.json中在正式代码中应该为空。 +5. Hardware启动时,校验单片机的板子类型,如果板子类型不匹配,则设置标志位。 +``` +# 设备异常处理和前端现实 + +``` + 1.状态异常 + 2.事件异常 +-------------------------------------------- + 1.存在一个服务,主动上报全局状态(传感器状态,设备工作状态,设备状态异常,等状态信息),不可停止。 + 2.每个页面,根据自身的业务逻辑,会存在一个上报状态的接口,该上报接口,会上报当前页面需要动态更新的状态。 + + 1.后台服务 + 2.前端直驱 + + 1.异常属于代码严重错误,如果发生异常,则停止设备运行,通过广播板子复位指令,尽可能的让设备停下来。 + 2.后台服务运行中,如果触发异常,则 +``` + +``` +TODO: +-------------------------------------------- + + +1. 整理大空间,小空间,管道式的单片机代码,满足多设备编码规范。(按照真实的设备情况编写代码)OK +2. 整理大空间,小空间,管道式的ID路由代码。 +3. 填充硬件测试页面。 +4. 指令重发代码功能。 +6. 所有后台程序添加异常检查,当异常发生过,则设置全局标志位(硬件异常)。此时后台程序相应的线程将不再继续工作。(直到设备重启) +7. 所有后台程序(有前端启动的),则是检查全局标志位,如果触发错误,则报错。 +8. 添加消毒日志打印程序 +8. 消毒测试 + + +8. 添加一个程序根据全局异常标志位,对设备进行相应的检查,如果检查通过则清空标志位。同时如果发生异常,则发送板子复位指令,对板子进行复位。 +5. 单片机支持自动过滤掉重发的指令。 ``` \ No newline at end of file diff --git a/appsrc/appsetting/project_port/project_port.cpp b/appsrc/appsetting/project_port/project_port.cpp index 368b5bf..94b8168 100644 --- a/appsrc/appsetting/project_port/project_port.cpp +++ b/appsrc/appsetting/project_port/project_port.cpp @@ -42,26 +42,6 @@ void ProjectPort::initProjectSetting(int projectTypeInt) { projectTypeInt = projectTypeInt; projectType = projectType2Str(projectTypeInt); - if (projectTypeInt == klarge_space_disinfection_machine) { - extSensorNum = LARGE_SPACE_DM_EXT_SENSOR_NUM; - gpmToSpeedRadio = LARGE_SPACE_DM__GPM_TO_SPEED_RADIO; - disinfectantBucketCapacity = LARGE_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY; - } else if (projectTypeInt == ksmall_space_disinfection_machine) { - extSensorNum = SMALL_SPACE_DM_EXT_SENSOR_NUM; - gpmToSpeedRadio = SMALL_SPACE_DM__GPM_TO_SPEED_RADIO; - disinfectantBucketCapacity = SMALL_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY; - } else if (projectTypeInt == kpipe_disinfection_machine) { - extSensorNum = PIPE_DM_EXT_SENSOR_NUM; - gpmToSpeedRadio = PIPE_DM_GPM_TO_SPEED_RADIO; - disinfectantBucketCapacity = PIPE_DM__DISINFECTANT_BUCKET_CAPACITY; - } else if (projectTypeInt == kdraw_bar_disinfection_box) { - extSensorNum = DRAW_BAR_DM_EXT_SENSOR_NUM; - gpmToSpeedRadio = DRAW_BAR_DM_GPM_TO_SPEED_RADIO; - disinfectantBucketCapacity = DRAW_BAR_DM__DISINFECTANT_BUCKET_CAPACITY; - } else { - ZCHECK(false, "projectTypeInt not support: " + to_string(projectTypeInt)); - } - // 设备ID初始化 if (isLageSpaceDM() || isSmallSpaceDM() || isPipeDM()) { // 加液泵 @@ -85,21 +65,17 @@ void ProjectPort::initProjectSetting(int projectTypeInt) { // 液体重量传感器 INSERT(HardwareComponent::kLiquidWeightPS, kFixBoardId_LiquidCtrl, 1); // 空压机后压力传感器 - INSERT(HardwareComponent::kACPostPS, kFixBoardId_LiquidCtrl, 0); + INSERT(HardwareComponent::kACPostPS, kFixBoardId_LiquidCtrl, 2); // 喷雾泵后压力传感器 - INSERT(HardwareComponent::kSprayPumpPostPS, kFixBoardId_LiquidCtrl, 0); + INSERT(HardwareComponent::kSprayPumpPostPS, kFixBoardId_LiquidCtrl, 3); // 加液泵后压力传感器 - INSERT(HardwareComponent::kAddLiquidPumpPostPS, kFixBoardId_LiquidCtrl, 0); + INSERT(HardwareComponent::kAddLiquidPumpPostPS, kFixBoardId_LiquidCtrl, 4); if (isPipeDM()) { // 正压比例阀 INSERT(HardwareComponent::kPositivePressureProportional, kFixBoardId_LiquidCtrl, POSITIVE_PRESSURE_PROPORTIONAL_ID); // 负压比例阀 INSERT(HardwareComponent::kNegativePressureProportional, kFixBoardId_LiquidCtrl, NEGATIVE_PRESSURE_PROPORTIONAL_ID); - // 气密传感器 - INSERT(HardwareComponent::kAirLeakDetectPS, kFixBoardId_LiquidCtrl, 0); - // 空气密度测试空压机 - INSERT(HardwareComponent::kAirLeakDetectTestAC, kFixBoardId_LiquidCtrl, 0); // 空气密度测试通道控制 INSERT(HardwareComponent::kAirLeakDetectTestChannelCtrl, kFixBoardId_LiquidCtrl, 0); } @@ -114,8 +90,30 @@ float ProjectPort::LiquidWeightPS_To_Pa(int rawval) { return rawval; } float ProjectPort::SprayPumpPostPS_To_Pa(int rawval) { return rawval; } float ProjectPort::AddLiquidPumpPostPS_To_Pa(int rawval) { return rawval; } -double ProjectPort::gpm2speed(double gpm) { return gpm * gpmToSpeedRadio; } -double ProjectPort::speed2gpm(double speed) { return (speed / gpmToSpeedRadio) + 0.5; } +double ProjectPort::getGpm2SpeedRadio() { + float gpmToSpeedRadio = 0; + if (isLageSpaceDM()) { + gpmToSpeedRadio = LARGE_SPACE_DM__GPM_TO_SPEED_RADIO; + } else if (isSmallSpaceDM()) { + gpmToSpeedRadio = SMALL_SPACE_DM__GPM_TO_SPEED_RADIO; + } else if (isPipeDM()) { + gpmToSpeedRadio = PIPE_DM_GPM_TO_SPEED_RADIO; + } else if (isDrawBarDM()) { + gpmToSpeedRadio = DRAW_BAR_DM_GPM_TO_SPEED_RADIO; + } else { + THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt); + } + return gpmToSpeedRadio; +} + +double ProjectPort::gpm2speed(double gpm) { + float gpmToSpeedRadio = getGpm2SpeedRadio(); + return gpm * gpmToSpeedRadio; +} +double ProjectPort::speed2gpm(double speed) { + float gpmToSpeedRadio = getGpm2SpeedRadio(); + return (speed / gpmToSpeedRadio) + 0.5; +} float ProjectPort::pressurePa2VolumeG(int pa) { if (isLageSpaceDM()) { @@ -130,23 +128,68 @@ float ProjectPort::pressurePa2VolumeG(int pa) { if (isDrawBarDM()) { return VolumeConvertor(VolumeConvertor::drawBarBoxParam).pressurePa2VolumeG(pa); } + THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt); return 0; - // } - int32_t ProjectPort::getMainH2O2SensorId() { return getId(HardwareComponent::MainH2O2Sensor).boardId; } int32_t ProjectPort::getSprayLiquidPumpMaxRPM() { if (isLageSpaceDM()) { - return 400; + return 600; + } + if (isSmallSpaceDM()) { + return 600; + } + if (isPipeDM()) { + return 600; + } + if (isDrawBarDM()) { + return 100; + } + return 0; +} +int32_t ProjectPort::getEmptyPipeSprayPumpRPM() { + if (isLageSpaceDM()) { + return 600; } if (isSmallSpaceDM()) { - return 400; + return 600; } if (isPipeDM()) { - return 400; + return 600; } if (isDrawBarDM()) { return 100; } return 0; } + +int32_t ProjectPort::getDisinfectantBucketCapacity() { + if (isLageSpaceDM()) { + return LARGE_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY; + } + if (isSmallSpaceDM()) { + return SMALL_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY; + } + if (isPipeDM()) { + return PIPE_DM__DISINFECTANT_BUCKET_CAPACITY; + } + if (isDrawBarDM()) { + return DRAW_BAR_DM__DISINFECTANT_BUCKET_CAPACITY; + } + return 0; +} +int32_t ProjectPort::getExtH2O2SensorNum() { + if (isLageSpaceDM()) { + return 2; + } + if (isSmallSpaceDM()) { + return 2; + } + if (isPipeDM()) { + return 0; + } + if (isDrawBarDM()) { + return 0; + } + return 0; +} diff --git a/appsrc/appsetting/project_port/project_port.hpp b/appsrc/appsetting/project_port/project_port.hpp index 6ba2889..831223b 100644 --- a/appsrc/appsetting/project_port/project_port.hpp +++ b/appsrc/appsetting/project_port/project_port.hpp @@ -39,12 +39,7 @@ class ProjectPort { // // some properties // - int extSensorNum = 0; - double gpmToSpeedRadio = 0; - bool isInited = false; - int disinfectantBucketCapacity = 0; - - int emptyPipeSprayPumpRPM = 700; + bool isInited = false; public: static ProjectPort &ins() { @@ -59,9 +54,10 @@ class ProjectPort { public: int32_t getProjType(); - int32_t getMainH2O2SensorId(); - int32_t getSprayLiquidPumpMaxRPM(); + /******************************************************************************* + * //设备类型判断 * + *******************************************************************************/ bool isLageSpaceDM() { return projectTypeInt == klarge_space_disinfection_machine; } bool isSmallSpaceDM() { return projectTypeInt == ksmall_space_disinfection_machine; } bool isPipeDM() { return projectTypeInt == kpipe_disinfection_machine; } @@ -72,6 +68,9 @@ class ProjectPort { bool isProjectType(int id0, int id1, int id2) { return id0 == projectTypeInt || id1 == projectTypeInt || id2 == projectTypeInt; } bool isProjectType(int id0, int id1, int id2, int id3) { return id0 == projectTypeInt || id1 == projectTypeInt || id2 == projectTypeInt || id3 == projectTypeInt; } + /******************************************************************************* + * 组建ID获取 * + *******************************************************************************/ ComponentId getId(HardwareComponent component) { auto it = componentIdMap.find(component); if (it != componentIdMap.end()) { @@ -80,7 +79,11 @@ class ProjectPort { THROW_APP_EXCEPTION(err::kappe_code_error, "ComponentIdMgr::getId: component not found"); } + /******************************************************************************* + * 公式 * + *******************************************************************************/ // 单位转换 + double getGpm2SpeedRadio(); double gpm2speed(double gpm); double speed2gpm(double speed); @@ -90,10 +93,17 @@ class ProjectPort { float LiquidWeightPS_To_Pa(int rawval); float SprayPumpPostPS_To_Pa(int rawval); float AddLiquidPumpPostPS_To_Pa(int rawval); - - // 液体重量计算 float pressurePa2VolumeG(int pa); + /******************************************************************************* + * 产品不同参数 * + *******************************************************************************/ + int32_t getMainH2O2SensorId(); + int32_t getSprayLiquidPumpMaxRPM(); + int32_t getDisinfectantBucketCapacity(); + int32_t getExtH2O2SensorNum(); + int32_t getEmptyPipeSprayPumpRPM(); + private: void initProjectSetting(int projectTypeInt); }; diff --git a/appsrc/service/app/add_liquid_service.cpp b/appsrc/service/app/add_liquid_service.cpp index 4db7459..b724a6d 100644 --- a/appsrc/service/app/add_liquid_service.cpp +++ b/appsrc/service/app/add_liquid_service.cpp @@ -24,7 +24,7 @@ void AddLiquidService::start(int stopatg) { int32_t nowvolume = m_dwus->getWeight(); - int maxg = PORT.disinfectantBucketCapacity; + int maxg = PORT.getDisinfectantBucketCapacity(); if (nowvolume > stopatg) { logger->warn("start add liquid fail, nowvolume {} > stopatg {}", nowvolume, stopatg); THROW_APP_EXCEPTION(err::kappe_adding_liquid_is_already_in_place, ""); @@ -62,7 +62,7 @@ void AddLiquidService::addLiquidWork(int stopatg) { */ m_workstate = kemptyLineLiquid; logger->info("start drain the liquid from the line"); - m_dcs->SprayPump_startInRPM(-PORT.emptyPipeSprayPumpRPM); + m_dcs->SprayPump_startInRPM(-PORT.getEmptyPipeSprayPumpRPM()); thisThread.sleepForMs(1000); m_dcs->AddLiquidPump_run(-23); // @TODO:提取常数到系统配置中 #define EMTPTY_LINE_WHEN_ADDING_DISINFECTANT_TIMES 1000 @@ -111,7 +111,7 @@ void AddLiquidService::fn_getState(shared_ptr cxt) { // } void AddLiquidService::fn_getServiceConfig(shared_ptr cxt) { json cfg; - cfg["maxLiquid"] = PORT.disinfectantBucketCapacity; + cfg["maxLiquid"] = PORT.getDisinfectantBucketCapacity(); cfg["show"] = true; cfg["updatePeriod"] = 300; cxt->content = cfg; diff --git a/appsrc/service/app/drain_liquid_service.cpp b/appsrc/service/app/drain_liquid_service.cpp index 9bd7853..0ae4235 100644 --- a/appsrc/service/app/drain_liquid_service.cpp +++ b/appsrc/service/app/drain_liquid_service.cpp @@ -42,7 +42,7 @@ void DrainLiquidService::fn_getState(shared_ptr cxt) { // void DrainLiquidService::fn_getServiceConfig(shared_ptr cxt) { json cfg; - cfg["maxLiquid"] = PORT.disinfectantBucketCapacity; + cfg["maxLiquid"] = PORT.getDisinfectantBucketCapacity(); cfg["show"] = true; cfg["updatePeriod"] = 300; cxt->content = cfg; @@ -52,7 +52,7 @@ void DrainLiquidService::workThread() { ThisThread thisThread; m_dcs->AddLiquidPump_drainLiquid(); - m_dcs->SprayPump_startInRPM(-PORT.emptyPipeSprayPumpRPM); + m_dcs->SprayPump_startInRPM(-PORT.getEmptyPipeSprayPumpRPM()); logger->info("startDraining "); auto startdrainingtime = zsteady_clock().now(); diff --git a/appsrc/service/disinfection_logs_service.cpp b/appsrc/service/disinfection_logs_service.cpp index dfa9572..d483333 100644 --- a/appsrc/service/disinfection_logs_service.cpp +++ b/appsrc/service/disinfection_logs_service.cpp @@ -184,14 +184,14 @@ void DisinfectionLogsService::dumpDisinfectionRecord(string sessionId, listrh[0])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rs_0), /******************/ formatSensorVal(s->rs[0])); - if (ProjectPort::ins().extSensorNum >= 1) { + if (ProjectPort::ins().getExtH2O2SensorNum() >= 1) { csv.addValue(m_csvHeaderDict.getChName(CSVHeader::ho2o2_1), /***************/ formatSensorVal(s->h2o2[1])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::temp_1), /****************/ formatSensorVal(s->temp[1])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_1), /******************/ formatSensorVal(s->rh[1])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rs_1), /******************/ formatSensorVal(s->rs[1])); } - if (ProjectPort::ins().extSensorNum >= 2) { + if (ProjectPort::ins().getExtH2O2SensorNum() >= 2) { csv.addValue(m_csvHeaderDict.getChName(CSVHeader::ho2o2_2), /***************/ formatSensorVal(s->h2o2[2])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::temp_2), /****************/ formatSensorVal(s->temp[2])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_2), /******************/ formatSensorVal(s->rh[2])); diff --git a/appsrc/service/hardware/base/h2o2_sensor_data_mgr.cpp b/appsrc/service/hardware/base/h2o2_sensor_data_mgr.cpp index a6fe4bf..18ec05c 100644 --- a/appsrc/service/hardware/base/h2o2_sensor_data_mgr.cpp +++ b/appsrc/service/hardware/base/h2o2_sensor_data_mgr.cpp @@ -13,16 +13,16 @@ shared_ptr H2O2SensorDataMgr::getCacheData(uint8_t sensorId shared_ptr H2O2SensorDataMgr::takeSnapshot() { lock_guard lock(m_lock); shared_ptr snapshot = make_shared(); - ZASSERT(PORT.extSensorNum <= 2); + ZASSERT(PORT.getExtH2O2SensorNum() <= 2); vector> sensorDataList; - if (PORT.extSensorNum == 0) { + if (PORT.getExtH2O2SensorNum() == 0) { sensorDataList.push_back(getSensorDataCache(0)); - } else if (PORT.extSensorNum == 1) { + } else if (PORT.getExtH2O2SensorNum() == 1) { sensorDataList.push_back(getSensorDataCache(0)); sensorDataList.push_back(getSensorDataCache(1)); - } else if (PORT.extSensorNum == 2) { + } else if (PORT.getExtH2O2SensorNum() == 2) { sensorDataList.push_back(getSensorDataCache(0)); sensorDataList.push_back(getSensorDataCache(1)); sensorDataList.push_back(getSensorDataCache(2)); diff --git a/doc/压力传感器.md b/doc/压力传感器.md new file mode 100644 index 0000000..6476564 --- /dev/null +++ b/doc/压力传感器.md @@ -0,0 +1,7 @@ + +``` +00003069 INFO [PxxSensor] Sensor[1] id:1 ptype:DP600 detected:1 +00003070 INFO [PxxSensor] Sensor[2] id:2 ptype:P100 precision:1 unit:kpa zero:0 full:8000 +00003071 INFO [PxxSensor] Sensor[3] id:3 ptype:P100 precision:1 unit:kpa zero:-900 full:1000 +00003072 INFO [PxxSensor] Sensor[4] id:4 ptype:P100 precision:1 unit:kpa zero:-900 full:1000 +``` \ No newline at end of file