From 49fdc5fc4c5176eb911e4e1eb1b1d70713f4767d Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 14 Aug 2023 18:58:07 +0800 Subject: [PATCH] update --- .../huacheng_sensor/dp600_pressure_sensor.cpp | 26 +++++++ .../huacheng_sensor/dp600_pressure_sensor.hpp | 60 +++++++++++++++ components/modbus/modbus_basic.hpp | 2 +- components/modbus/modbus_block_host.cpp | 28 ++++++- components/modbus/modbus_block_host.hpp | 3 +- .../zcan_module/huacheng_pressure_sensor.cpp | 90 ++++++++++++++++++++++ .../zcan_module/huacheng_pressure_sensor.hpp | 46 +++++++++++ components/zcanreceiver/cmd.hpp | 14 ++-- components/zcanreceiver/zcanreceiver.cpp | 7 ++ components/zcanreceiver/zcanreceiver.hpp | 1 + 10 files changed, 268 insertions(+), 9 deletions(-) create mode 100644 components/huacheng_sensor/dp600_pressure_sensor.cpp create mode 100644 components/huacheng_sensor/dp600_pressure_sensor.hpp create mode 100644 components/zcan_module/huacheng_pressure_sensor.cpp create mode 100644 components/zcan_module/huacheng_pressure_sensor.hpp diff --git a/components/huacheng_sensor/dp600_pressure_sensor.cpp b/components/huacheng_sensor/dp600_pressure_sensor.cpp new file mode 100644 index 0000000..0d21e6f --- /dev/null +++ b/components/huacheng_sensor/dp600_pressure_sensor.cpp @@ -0,0 +1,26 @@ +#include "dp600_pressure_sensor.hpp" + +using namespace iflytop; + +DP600PressureSensor::DP600PressureSensor(/* args */) {} +DP600PressureSensor::~DP600PressureSensor() {} +void DP600PressureSensor::initialize(UART_HandleTypeDef *huart, uint8_t id) { + modbusBlockHost.initialize(huart); + this->id = id; +} +bool DP600PressureSensor::readVal(sensor_data_t *data) { + int16_t val[5] = {0}; + + bool suc = modbusBlockHost.readReg03Muti(id, 0x02, (uint16_t *)val, 5, 50); + if (!suc) { + return false; + } + + data->precision = val[1]; + data->pressure_unit = val[0]; + data->value = val[2]; + data->zero_point = val[3]; + data->range_full_point = val[4]; + + return true; +} \ No newline at end of file diff --git a/components/huacheng_sensor/dp600_pressure_sensor.hpp b/components/huacheng_sensor/dp600_pressure_sensor.hpp new file mode 100644 index 0000000..339b791 --- /dev/null +++ b/components/huacheng_sensor/dp600_pressure_sensor.hpp @@ -0,0 +1,60 @@ +// +// Created by zwsd +// + +#pragma once +#include "sdk\components\modbus\modbus_block_host.hpp" +#include "sdk\hal\zhal.hpp" + +/** + * @brief + * + * service: M3078 + * + * 监听事件: + * 依赖状态: + * 依赖服务: + * 作用: + * + * 推荐配置: + * 1. 识读模式:按键保持 + * 2. 波特率:9600 + * 3. 单次扫码时长:无限时 + * + */ +namespace iflytop { +using namespace std; + +class DP600PressureSensor { + public: + typedef struct { + uint8_t precision; + uint8_t pressure_unit; + int16_t value; + int16_t zero_point; + int16_t range_full_point; + } sensor_data_t; + + private: + /* data */ + + ModbusBlockHost modbusBlockHost; + uint8_t id; + + typedef enum { + kreg_precision = 0x03, + kreg_pressure_unit = 0x02, + kreg_value = 0x04, + kreg_zero_point = 0x05, + kreg_range_full_point = 0x06, + } add_t; + + public: + DP600PressureSensor(/* args */); + ~DP600PressureSensor(); + + void initialize(UART_HandleTypeDef *huart, uint8_t id); + bool readVal(sensor_data_t *data); +}; + +} // namespace iflytop \ No newline at end of file diff --git a/components/modbus/modbus_basic.hpp b/components/modbus/modbus_basic.hpp index 08033ee..35ba61c 100644 --- a/components/modbus/modbus_basic.hpp +++ b/components/modbus/modbus_basic.hpp @@ -1,4 +1,4 @@ -#pragma ocne +#pragma once #include #include diff --git a/components/modbus/modbus_block_host.cpp b/components/modbus/modbus_block_host.cpp index e95145e..222e798 100644 --- a/components/modbus/modbus_block_host.cpp +++ b/components/modbus/modbus_block_host.cpp @@ -61,6 +61,32 @@ bool ModbusBlockHost::readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t *r } return false; } + +bool ModbusBlockHost::readReg03Muti(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int regNum, int overtimems) { + txbuff[0] = slaveAddr; + txbuff[1] = 0x03; + txbuff[2] = regAddr >> 8; + txbuff[3] = regAddr & 0xff; + txbuff[4] = 0x00; + txbuff[5] = regNum; + modbus_pack_crc_to_packet(txbuff, 6 + 2); + + cleanRxBuff(); + + uarttx(txbuff, 6 + 2); + + bool status; + status = uartrx(rxbuff, 7 + regNum * 2, overtimems); + + if (status && modbus_checkcrc16(rxbuff, 7 + regNum * 2)) { + for (int i = 0; i < regNum; i++) { + regVal[i] = rxbuff[3 + i * 2] << 8 | rxbuff[4 + i * 2]; + } + return true; + } + return false; +} + bool ModbusBlockHost::writeReg06(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems) { txbuff[0] = slaveAddr; txbuff[1] = 0x06; @@ -105,4 +131,4 @@ bool ModbusBlockHost::writeReg10(uint8_t slaveAddr, uint16_t regAddr, uint16_t r return true; } return false; -} \ No newline at end of file +} diff --git a/components/modbus/modbus_block_host.hpp b/components/modbus/modbus_block_host.hpp index acb49ea..ec168dc 100644 --- a/components/modbus/modbus_block_host.hpp +++ b/components/modbus/modbus_block_host.hpp @@ -1,4 +1,4 @@ -#pragma ocne +#pragma once #include "sdk/hal/zhal.hpp" // @@ -16,6 +16,7 @@ class ModbusBlockHost { void initialize(UART_HandleTypeDef *huart); bool readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int overtimems); + bool readReg03Muti(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int regNum, int overtimems); bool writeReg06(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems); bool writeReg10(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems); diff --git a/components/zcan_module/huacheng_pressure_sensor.cpp b/components/zcan_module/huacheng_pressure_sensor.cpp new file mode 100644 index 0000000..6107004 --- /dev/null +++ b/components/zcan_module/huacheng_pressure_sensor.cpp @@ -0,0 +1,90 @@ +#include "huacheng_pressure_sensor.hpp" + +#include +#include + +#ifdef HAL_CAN_MODULE_ENABLED + +using namespace iflytop; +using namespace zcr; +#define TAG "HuachengPressureSensor" + +void HuachengPressureSensor::initialize(ZCanReceiver* zcanReceiver) { + zcanReceiver->registerListener(this); + m_zcanReceiver = zcanReceiver; +} + +void HuachengPressureSensor::regSubmodule(int id, UART_HandleTypeDef* huart, uint8_t modbusid) { + ZASSERT(huart != NULL); + + Submodule* submodule = new Submodule(); + ZASSERT(submodule != NULL); + submodule->id = id; + submodule->sensor.initialize(huart, modbusid); + m_submodules.push_back(submodule); +} + +void HuachengPressureSensor::onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) { + Cmdheader_t* cmdheader = (Cmdheader_t*)packet; + if (cmdheader->cmdid == kcmd_read_huacheng_pressure_sensor && cmdheader->subcmdid == 0) { + /** + * @brief 通断控制(0) + * cmd : b0:sensorid + * ack : b0:boardid b2:5:presure pa + * ack_datalen : 6 + */ +#if 0 + [0]:传感器ID +[2] 精度 + 0,1,2,3 +[3] 单位 + 0-Mpa + 1-Kpa + 2-Pa + 3-Bar + 4-Mbar + 5-kg/cm2 + 6-psi + 7-mh2o + 8-mmh2o +[4:5] 数值 +[6:7] 零点 +[8:9] 满量程 +#endif + uint8_t id = cmdheader->data[0]; + Submodule* subm = find(id); + if (subm) { + uint8_t txbuff[10] = {}; + txbuff[0] = id; + DP600PressureSensor::sensor_data_t data; + bool suc = subm->sensor.readVal(&data); + + if (suc) { + txbuff[0] = id; + txbuff[1] = 0; + txbuff[2] = data.precision; + txbuff[3] = data.pressure_unit; + memcpy(txbuff + 4, &data.value, 2); + memcpy(txbuff + 6, &data.zero_point, 2); + memcpy(txbuff + 8, &data.range_full_point, 2); + m_zcanReceiver->sendAck(cmdheader, txbuff, sizeof(txbuff)); + } else { + int16_t errcode = 1002; // 设备不在线 + m_zcanReceiver->sendErrorAck(cmdheader, errcode); + } + + return; + } + } +} + +HuachengPressureSensor::Submodule* HuachengPressureSensor::find(int id) { + for (auto it = m_submodules.begin(); it != m_submodules.end(); it++) { + if ((*it)->id == id) { + return *it; + } + } + return NULL; +} + +#endif \ No newline at end of file diff --git a/components/zcan_module/huacheng_pressure_sensor.hpp b/components/zcan_module/huacheng_pressure_sensor.hpp new file mode 100644 index 0000000..bf442f3 --- /dev/null +++ b/components/zcan_module/huacheng_pressure_sensor.hpp @@ -0,0 +1,46 @@ +// +// Created by zwsd +// + +#pragma once +#include "sdk/hal/zhal.hpp" +// +#include "../zcanreceiver/zcanreceiver.hpp" +#include "sdk/components/huacheng_sensor/dp600_pressure_sensor.hpp" + +#ifdef HAL_CAN_MODULE_ENABLED +namespace iflytop { + +class HuachengPressureSensor : public ZCanRceiverListener { + public: + typedef function readpresure_t; + + class Submodule { + public: + int id; + DP600PressureSensor sensor; + }; + + private: + ZCanReceiver* m_zcanReceiver; + + list m_submodules; + + public: + HuachengPressureSensor(/* args */) {} + ~HuachengPressureSensor() {} + + public: + void initialize(ZCanReceiver* zcanReceiver); + void regSubmodule(int id, UART_HandleTypeDef* huart, uint8_t modbusid); + + public: + virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len); + Submodule* find(int id); + + private: + void loop(); +}; +} // namespace iflytop + +#endif \ No newline at end of file diff --git a/components/zcanreceiver/cmd.hpp b/components/zcanreceiver/cmd.hpp index 0071a4e..3f68c17 100644 --- a/components/zcanreceiver/cmd.hpp +++ b/components/zcanreceiver/cmd.hpp @@ -15,7 +15,8 @@ typedef struct { typedef enum { kpt_cmd = 0, kpt_ack = 1, - kpt_status_report = 2, + kpt_error_ack = 2, + kpt_status_report = 3, } PacketType_t; typedef enum { @@ -23,11 +24,12 @@ typedef enum { kcmd_read_io = 1, kcmd_set_io = 2, - kcmd_m211887_operation = 1000, // 维萨拉压力传感器 - kcmd_read_presure_sensor = 1001, - kcmd_triple_warning_light_ctl = 1002, - kcmd_high_power_electrical_ctl = 1003, - kcmd_peristaltic_pump_ctl = 1004, + kcmd_m211887_operation = 1000, // 维萨拉压力传感器 + kcmd_read_presure_sensor = 1001, + kcmd_triple_warning_light_ctl = 1002, + kcmd_high_power_electrical_ctl = 1003, + kcmd_peristaltic_pump_ctl = 1004, + kcmd_read_huacheng_pressure_sensor = 1005, } CmdID_t; } // namespace zcr diff --git a/components/zcanreceiver/zcanreceiver.cpp b/components/zcanreceiver/zcanreceiver.cpp index 549a653..a144397 100644 --- a/components/zcanreceiver/zcanreceiver.cpp +++ b/components/zcanreceiver/zcanreceiver.cpp @@ -140,6 +140,13 @@ void ZCanReceiver::sendAck(Cmdheader_t *cmdheader, uint8_t *data, size_t len) { sendPacket(txbuff, sizeof(Cmdheader_t) + len); } +void ZCanReceiver::sendErrorAck(Cmdheader_t *cmdheader, int16_t errcode) { + Cmdheader_t *txheader = (Cmdheader_t *)txbuff; + memcpy(txheader, cmdheader, sizeof(Cmdheader_t)); + txheader->packetType = kpt_error_ack; + sendPacket(txbuff, sizeof(Cmdheader_t) + 2); +} + bool ZCanReceiver::sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems) { CAN_TxHeaderTypeDef pHeader; uint8_t aData[8] /*8byte table*/; diff --git a/components/zcanreceiver/zcanreceiver.hpp b/components/zcanreceiver/zcanreceiver.hpp index 95a95fb..c658359 100644 --- a/components/zcanreceiver/zcanreceiver.hpp +++ b/components/zcanreceiver/zcanreceiver.hpp @@ -75,6 +75,7 @@ class ZCanReceiver : public ZCanIRQListener { void registerListener(ZCanRceiverListener *listener); void sendPacket(uint8_t *packet, size_t len); void sendAck(Cmdheader_t *cmdheader, uint8_t *data, size_t len); + void sendErrorAck(Cmdheader_t *cmdheader, int16_t errcode); bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems); uint8_t getDeviceId() { return m_config->deviceId; }