Browse Source

update

master
zhaohe 2 years ago
parent
commit
49fdc5fc4c
  1. 26
      components/huacheng_sensor/dp600_pressure_sensor.cpp
  2. 60
      components/huacheng_sensor/dp600_pressure_sensor.hpp
  3. 2
      components/modbus/modbus_basic.hpp
  4. 28
      components/modbus/modbus_block_host.cpp
  5. 3
      components/modbus/modbus_block_host.hpp
  6. 90
      components/zcan_module/huacheng_pressure_sensor.cpp
  7. 46
      components/zcan_module/huacheng_pressure_sensor.hpp
  8. 14
      components/zcanreceiver/cmd.hpp
  9. 7
      components/zcanreceiver/zcanreceiver.cpp
  10. 1
      components/zcanreceiver/zcanreceiver.hpp

26
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;
}

60
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

2
components/modbus/modbus_basic.hpp

@ -1,4 +1,4 @@
#pragma ocne
#pragma once
#include <stdbool.h>
#include <stdint.h>

28
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;
}
}

3
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);

90
components/zcan_module/huacheng_pressure_sensor.cpp

@ -0,0 +1,90 @@
#include "huacheng_pressure_sensor.hpp"
#include <stdio.h>
#include <string.h>
#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

46
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<int32_t()> readpresure_t;
class Submodule {
public:
int id;
DP600PressureSensor sensor;
};
private:
ZCanReceiver* m_zcanReceiver;
list<Submodule*> 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

14
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

7
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*/;

1
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; }

Loading…
Cancel
Save