Сделано базовое управление по модбас

- сохранение температур в модбас
- чтение параметров датчика
- инициализация нового датчика
- деинициализация старого датчика

Проект связанный с PY32модулем и температурами ПЧ перенесен в отдельную папку
This commit is contained in:
2025-03-04 13:48:28 +03:00
parent 369e4a4b82
commit 9f438ccd2f
14 changed files with 860 additions and 493 deletions

View File

@@ -0,0 +1,297 @@
/**
******************************************************************************
* @file pch_sensors.c
* @brief Работа с датчиками температуры DS18B20 в ПЧ
*****************************************************************************/
/* Includes ----------------------------------------------------------------*/
#include "PY32module_main.h"
#include "rs_message.h"
/* Declarations and definitions --------------------------------------------*/
PCHSens_TypeDef pchsens;
/* Functions ---------------------------------------------------------------*/
void PYModule_main(void)
{
if(MB_DATA.Coils.RunConvertions)
{
if(DS18B20_WaitForEndConvertion_NonBlocking(hdallas1.onewire) == HAL_OK)
{
PCHSens_StartCovert(&DallasBus);
GPIOA->ODR ^= GPIO_LED_2;
}
}
if(MB_DATA.Coils.ReadSensor)
{
PYModule_ReadSensor(&hdallas1, &pchsens);
MB_DATA.Coils.ReadSensor = 0;
}
if(MB_DATA.Coils.InitSensor)
{
PYModule_InitSensor(&pchsens);
MB_DATA.Coils.InitSensor = 0;
}
if(MB_DATA.Coils.DeInitSensor != NULL)
{
PYModule_DeInitSensor(&pchsens);
MB_DATA.Coils.DeInitSensor = 0;
}
PYModule_CheckLosted(&pchsens);
if(MB_DATA.Coils.RunConvertions)
{
if(DS18B20_WaitForEndConvertion_NonBlocking(hdallas1.onewire) == HAL_OK)
{
PCHSens_ModuleReadTemperature(&pchsens.module1);
// PCHSens_ModuleReadTemperature(&pchsens.module2);
// PCHSens_ModuleReadTemperature(&pchsens.module3);
// PCHSens_ModuleReadTemperature(&pchsens.module4);
// PCHSens_ModuleReadTemperature(&pchsens.module5);
// PCHSens_ModuleReadTemperature(&pchsens.module6);
PYModule_StoreModbus(&pchsens);
}
}
}
void PYModule_FirstInit(void)
{
OW.DataPin = DS_Pin;
OW.DataPort = DS_GPIO_Port;
DS.Resolution = DS18B20_RESOLUTION_9BITS;
/* Инициализация onewire и поиск датчиков*/
OneWire_Init(&OW);
DS18B20_Search(&DS, &OW);
/* Инициализация modbus */
MODBUS_FirstInit();
RS_Receive_IT(&hmodbus1, &MODBUS_MSG);
/* Инициализация структур датчиков ПЧ */
DallasBus.hdallas = &hdallas1;
DallasBus.hdallas->onewire = &OW;
PCHSens_InitModule(&hdallas1, &pchsens.module1, REG_PCH_NUMB_11|REG_PCH_DIODE_NUMB_1);
PCHSens_InitModule(&hdallas1, &pchsens.module2, REG_PCH_NUMB_12|REG_PCH_DIODE_NUMB_1);
PCHSens_InitModule(&hdallas1, &pchsens.module3, REG_PCH_NUMB_13|REG_PCH_DIODE_NUMB_1);
PCHSens_InitModule(&hdallas1, &pchsens.module4, REG_PCH_NUMB_21|REG_PCH_DIODE_NUMB_1);
PCHSens_InitModule(&hdallas1, &pchsens.module5, REG_PCH_NUMB_22|REG_PCH_DIODE_NUMB_1);
PCHSens_InitModule(&hdallas1, &pchsens.module6, REG_PCH_NUMB_23|REG_PCH_DIODE_NUMB_1);
/* Поиск неизвестных сенсоров */
PCHSens_FindUnknownSensors(&DallasBus);
MB_DATA.Coils.RunConvertions = 1;
}
void PYModule_ReadSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_TypeDef *pchsens)
{
// чтение по локации
if(MB_DATA.HoldRegs.InitStruct.Location != 0) // если локация не равна нулю
{
PCHSens_SensorTypeDef *sensor;
if(PCHSens_GetSensorByLocation(pchsens, (PCHSens_LocationTypeDef)MB_DATA.HoldRegs.InitStruct.Location, &sensor) != HAL_OK)
return;
if(Dallas_ReadScratchpad(&sensor->sens) == HAL_OK)
{
MB_DATA.InRegs.Response.Location = *(uint16_t *)&sensor->sens.hdallas->scratchpad.tHighRegister;
MB_DATA.InRegs.Response.Resolution = sensor->sens.hdallas->scratchpad.ConfigRegister;
MB_DATA.InRegs.Response.ROM[0] = __REV16((sensor->sens.sensROM) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[1] = __REV16((sensor->sens.sensROM >> 16) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[2] = __REV16((sensor->sens.sensROM >> 32) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[3] = __REV16((sensor->sens.sensROM >> 48) & 0xFFFF);
MB_DATA.InRegs.Response.Status = 0x1;
}
else
{
MB_DATA.InRegs.Response.Location = MB_DATA.HoldRegs.InitStruct.Location;
MB_DATA.InRegs.Response.Resolution = 0;
MB_DATA.InRegs.Response.ROM[0] = 0;
MB_DATA.InRegs.Response.ROM[1] = 0;
MB_DATA.InRegs.Response.ROM[2] = 0;
MB_DATA.InRegs.Response.ROM[3] = 0;
MB_DATA.InRegs.Response.Status = 0xFF;
}
}
// чтение по ROM
else if(MB_DATA.HoldRegs.InitStruct.ROM[0] | MB_DATA.HoldRegs.InitStruct.ROM[1] | // если РОМ не равен нулю
MB_DATA.HoldRegs.InitStruct.ROM[2] | MB_DATA.HoldRegs.InitStruct.ROM[3] != 0)
{
if(DS18B20_ReadScratchpad(hdallas->onewire, (uint8_t *)MB_DATA.HoldRegs.InitStruct.ROM, (uint8_t *)&hdallas->scratchpad) == HAL_OK)
{
MB_DATA.InRegs.Response.Location = *(uint16_t *)&hdallas->scratchpad.tHighRegister;
MB_DATA.InRegs.Response.Resolution = hdallas->scratchpad.ConfigRegister;
MB_DATA.InRegs.Response.ROM[0] = MB_DATA.HoldRegs.InitStruct.ROM[0];
MB_DATA.InRegs.Response.ROM[1] = MB_DATA.HoldRegs.InitStruct.ROM[1];
MB_DATA.InRegs.Response.ROM[2] = MB_DATA.HoldRegs.InitStruct.ROM[2];
MB_DATA.InRegs.Response.ROM[3] = MB_DATA.HoldRegs.InitStruct.ROM[3];
MB_DATA.InRegs.Response.Status = 0x1;
}
else
{
MB_DATA.InRegs.Response.Location = 0;
MB_DATA.InRegs.Response.Resolution = 0;
MB_DATA.InRegs.Response.ROM[0] = MB_DATA.HoldRegs.InitStruct.ROM[0];
MB_DATA.InRegs.Response.ROM[1] = MB_DATA.HoldRegs.InitStruct.ROM[1];
MB_DATA.InRegs.Response.ROM[2] = MB_DATA.HoldRegs.InitStruct.ROM[2];
MB_DATA.InRegs.Response.ROM[3] = MB_DATA.HoldRegs.InitStruct.ROM[3];
MB_DATA.InRegs.Response.Status = 0xFF;
}
}
}
void PYModule_InitSensor(PCHSens_TypeDef *pchsens)
{
if( (MB_DATA.HoldRegs.InitStruct.Location != 0) && // если локация не равна нулю
(MB_DATA.HoldRegs.InitStruct.ROM[0] | MB_DATA.HoldRegs.InitStruct.ROM[1] | // И если РОМ не равен нулю
MB_DATA.HoldRegs.InitStruct.ROM[2] | MB_DATA.HoldRegs.InitStruct.ROM[3] != 0) )
{
PCHSens_SensorTypeDef *sensor;
if(PCHSens_GetSensorByLocation(pchsens, (PCHSens_LocationTypeDef)MB_DATA.HoldRegs.InitStruct.Location, &sensor) != HAL_OK)
return;
uint64_t connectROM = 0;
connectROM = ((uint64_t)(MB_DATA.HoldRegs.InitStruct.ROM[0]))<<48;
connectROM |= ((uint64_t)(MB_DATA.HoldRegs.InitStruct.ROM[1]))<<32;
connectROM |= ((uint64_t)(MB_DATA.HoldRegs.InitStruct.ROM[2]))<<16;
connectROM |= ((uint64_t)(MB_DATA.HoldRegs.InitStruct.ROM[3]));
if(PCHSens_InitNewSensor(&hdallas1, sensor, connectROM) == HAL_OK)
{
MB_DATA.InRegs.Response.Location = *(uint16_t *)&sensor->sens.hdallas->scratchpad.tHighRegister;
MB_DATA.InRegs.Response.Resolution = sensor->sens.hdallas->scratchpad.ConfigRegister;
MB_DATA.InRegs.Response.ROM[0] = __REV16((sensor->sens.sensROM) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[1] = __REV16((sensor->sens.sensROM >> 16) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[2] = __REV16((sensor->sens.sensROM >> 32) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[3] = __REV16((sensor->sens.sensROM >> 48) & 0xFFFF);
MB_DATA.InRegs.Response.Status = 0x1;
}
else
{
MB_DATA.InRegs.Response.Location = MB_DATA.HoldRegs.InitStruct.Location;
MB_DATA.InRegs.Response.Resolution = 0;
MB_DATA.InRegs.Response.ROM[0] = MB_DATA.HoldRegs.InitStruct.ROM[0];
MB_DATA.InRegs.Response.ROM[1] = MB_DATA.HoldRegs.InitStruct.ROM[1];
MB_DATA.InRegs.Response.ROM[2] = MB_DATA.HoldRegs.InitStruct.ROM[2];
MB_DATA.InRegs.Response.ROM[3] = MB_DATA.HoldRegs.InitStruct.ROM[3];
MB_DATA.InRegs.Response.Status = 0xFF;
}
}
}
void PYModule_DeInitSensor(PCHSens_TypeDef *pchsens)
{
if(MB_DATA.HoldRegs.InitStruct.Location != 0) // если локация не равна нулю
{
PCHSens_SensorTypeDef *sensor;
if(PCHSens_GetSensorByLocation(pchsens, (PCHSens_LocationTypeDef)MB_DATA.HoldRegs.InitStruct.Location, &sensor) != HAL_OK)
return;
if(PCHSens_UndefineSensor(sensor) != HAL_OK)
{
MB_DATA.InRegs.Response.Location = *(uint16_t *)&sensor->sens.hdallas->scratchpad.tHighRegister;
MB_DATA.InRegs.Response.Resolution = sensor->sens.hdallas->scratchpad.ConfigRegister;
MB_DATA.InRegs.Response.ROM[0] = __REV16((sensor->sens.sensROM) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[1] = __REV16((sensor->sens.sensROM >> 16) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[2] = __REV16((sensor->sens.sensROM >> 32) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[3] = __REV16((sensor->sens.sensROM >> 48) & 0xFFFF);
MB_DATA.InRegs.Response.Status = 0xFF;
}
else
{
MB_DATA.InRegs.Response.Location = *(uint16_t *)&sensor->sens.hdallas->scratchpad.tHighRegister;
MB_DATA.InRegs.Response.Resolution = sensor->sens.hdallas->scratchpad.ConfigRegister;
MB_DATA.InRegs.Response.ROM[0] = __REV16((sensor->sens.sensROM) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[1] = __REV16((sensor->sens.sensROM >> 16) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[2] = __REV16((sensor->sens.sensROM >> 32) & 0xFFFF);
MB_DATA.InRegs.Response.ROM[3] = __REV16((sensor->sens.sensROM >> 48) & 0xFFFF);
MB_DATA.InRegs.Response.Status = 1;
}
}
}
void PYModule_CheckModuleLosted(PCHSens_ModuleTypeDef *module, uint8_t *losted_flag)
{
if(module->sens1.not_found)
*losted_flag |= 1;
if(module->sens2.not_found)
*losted_flag |= 1;
if(module->sens3.not_found)
*losted_flag |= 1;
if(module->sens4.not_found)
*losted_flag |= 1;
}
void PYModule_CheckLosted(PCHSens_TypeDef *pchsens)
{
uint8_t losted = 0;
// module1
PYModule_CheckModuleLosted(&pchsens->module1, &losted);
PYModule_CheckModuleLosted(&pchsens->module2, &losted);
PYModule_CheckModuleLosted(&pchsens->module3, &losted);
PYModule_CheckModuleLosted(&pchsens->module4, &losted);
PYModule_CheckModuleLosted(&pchsens->module5, &losted);
PYModule_CheckModuleLosted(&pchsens->module6, &losted);
if(losted)
MB_DATA.Coils.LostedSensors = 1;
else
MB_DATA.Coils.LostedSensors = 0;
}
void PYModule_StoreModuleToModbus(PCHSens_ModuleTypeDef *module)
{
uint8_t mb_location;
uint8_t pch_numb = (module->refLocation.param.PCHdig1 - 1)*3 + (module->refLocation.param.PCHdig2 - 1);
pch_numb *= 4;
mb_location = pch_numb + module->sens1.Location.param.Location;
if (mb_location < DS18B20_DEVICE_AMOUNT)
MB_DATA.InRegs.SensTemperature[mb_location] = module->sens1.sens.temperature*100;
mb_location = pch_numb + module->sens2.Location.param.Location;
if (mb_location < DS18B20_DEVICE_AMOUNT)
MB_DATA.InRegs.SensTemperature[mb_location] = module->sens2.sens.temperature*100;
mb_location = pch_numb + module->sens3.Location.param.Location;
if (mb_location < DS18B20_DEVICE_AMOUNT)
MB_DATA.InRegs.SensTemperature[mb_location] = module->sens3.sens.temperature*100;
mb_location = pch_numb + module->sens4.Location.param.Location;
if (mb_location < DS18B20_DEVICE_AMOUNT)
MB_DATA.InRegs.SensTemperature[mb_location] = module->sens4.sens.temperature*100;
}
void PYModule_StoreModbus(PCHSens_TypeDef *pchsens)
{
uint8_t losted = 0;
// module1
PYModule_StoreModuleToModbus(&pchsens->module1);
PYModule_StoreModuleToModbus(&pchsens->module2);
PYModule_StoreModuleToModbus(&pchsens->module3);
PYModule_StoreModuleToModbus(&pchsens->module4);
PYModule_StoreModuleToModbus(&pchsens->module5);
PYModule_StoreModuleToModbus(&pchsens->module6);
MB_DATA.Coils.ConvertionDone |= 1;
}

View File

@@ -0,0 +1,26 @@
/**
******************************************************************************
* @file pch_sensors.h
* @brief Работа с датчиками температуры DS18B20 в ПЧ
******************************************************************************
*****************************************************************************/
#ifndef MODULE_MAIN_H
#define MODULE_MAIN_H
/* Includes -----------------------------------------------------------------*/
#include "main.h"
#include "pch_sensors.h"
#include "modbus_data.h"
/* Declarations and definitions ---------------------------------------------*/
/* Functions ---------------------------------------------------------------*/
void PYModule_main(void);
void PYModule_FirstInit(void);
void PYModule_ReadSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_TypeDef *pchsens);
void PYModule_InitSensor(PCHSens_TypeDef *pchsens);
void PYModule_DeInitSensor(PCHSens_TypeDef *pchsens);
void PYModule_CheckLosted(PCHSens_TypeDef *pchsens);
void PYModule_StoreModbus(PCHSens_TypeDef *pchsens);
#endif // #ifndef MODULE_MAIN_H

View File

@@ -0,0 +1,273 @@
/**
******************************************************************************
* @file pch_sensors.c
* @brief Работа с датчиками температуры DS18B20 в ПЧ
*****************************************************************************/
/* Includes ----------------------------------------------------------------*/
#include "pch_sensors.h"
#include "modbus_data.h"
PCHSens_DallasBusHandle DallasBus;
/* Declarations and definitions --------------------------------------------*/
/* Functions ---------------------------------------------------------------*/
HAL_StatusTypeDef PCHSens_InitNewSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef* sensor, uint64_t ROM)
{
DALLAS_SensorHandleTypeDef tempsens;
HAL_StatusTypeDef result;
if(hdallas == NULL)
return HAL_ERROR;
if(sensor == NULL)
return HAL_ERROR;
// sensor->UserBytes = (PCHSens_LocationTypeDef *)&sensor->sens.scratchpad.tHighRegister;
sensor->sens.Init.InitParam = ROM;
sensor->sens.Init.init_func = &Dallas_SensorInitByROM;
result = Dallas_AddNewSensors(hdallas, &sensor->sens);
if(result != HAL_OK)
{
sensor->not_found = 1;
return result;
}
result = Dallas_WriteUserBytes(&sensor->sens, sensor->Location.all, sensor->Location.all, USED_USER_BYTES);
if(result != HAL_OK)
return result;
sensor->sens.Init.InitParam = sensor->Location.all;
sensor->sens.Init.init_func = &Dallas_SensorInitByUserBytes;
result = Dallas_AddNewSensors(hdallas, &sensor->sens);
if(result == HAL_OK)
{
sensor->not_found = 0;
}
else
{
sensor->not_found = 1;
}
return result;
}
HAL_StatusTypeDef PCHSens_AddSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef* sensor)
{
HAL_StatusTypeDef result;
if(hdallas == NULL)
return HAL_ERROR;
if(sensor == NULL)
return HAL_ERROR;
sensor->sens.Init.InitParam = sensor->Location.all;
sensor->sens.Init.init_func = &Dallas_SensorInitByUserBytes;
result = Dallas_AddNewSensors(hdallas, &sensor->sens);
if(result == HAL_OK)
{
sensor->not_found = 0;
}
else
{
sensor->not_found = 1;
}
return result;
}
HAL_StatusTypeDef PCHSens_InitModule(DALLAS_HandleTypeDef *hdallas, PCHSens_ModuleTypeDef* module, uint16_t param)
{
if(hdallas == NULL)
return HAL_ERROR;
if(module == NULL)
return HAL_ERROR;
PCHSens_LocationTypeDef initlocation;
initlocation.all = param;
module->hdallas = hdallas;
module->refLocation = initlocation;
module->sens1.Location.all = module->refLocation.all;
module->sens1.Location.param.Location = 0;
PCHSens_AddSensor(hdallas, &module->sens1);
module->sens2.Location.all = module->refLocation.all;
module->sens2.Location.param.Location = 1;
PCHSens_AddSensor(hdallas, &module->sens2);
module->sens3.Location.all = module->refLocation.all;
module->sens3.Location.param.Location = 2;
PCHSens_AddSensor(hdallas, &module->sens3);
module->sens4.Location.all = module->refLocation.all;
module->sens4.Location.param.Location = 3;
PCHSens_AddSensor(hdallas, &module->sens4);
return HAL_OK;
}
HAL_StatusTypeDef PCHSens_ModuleReadTemperature(PCHSens_ModuleTypeDef* module)
{
HAL_StatusTypeDef result;
if(module == NULL)
return HAL_ERROR;
result = PCHSens_SensorReadTemperature(module->hdallas, &module->sens1);
result = PCHSens_SensorReadTemperature(module->hdallas, &module->sens2);
result = PCHSens_SensorReadTemperature(module->hdallas, &module->sens3);
result = PCHSens_SensorReadTemperature(module->hdallas, &module->sens4);
return result;
}
HAL_StatusTypeDef PCHSens_SensorReadTemperature(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef *sensor)
{
HAL_StatusTypeDef result;
if(hdallas == NULL)
return HAL_ERROR;
if(sensor == NULL)
return HAL_ERROR;
result = PCHSens_ReadTemperature(sensor);
if(result != HAL_OK)
PCHSens_CheckSensor(hdallas, sensor);
return result;
}
HAL_StatusTypeDef PCHSens_StartCovert(PCHSens_DallasBusHandle *hbus)
{
return Dallas_StartConvertTAll(hbus->hdallas, DALLAS_WAIT_NONE, 0);
}
HAL_StatusTypeDef PCHSens_ReadTemperature(PCHSens_SensorTypeDef* sensor)
{
HAL_StatusTypeDef result;
if(sensor == NULL)
return HAL_ERROR;
if(sensor->sens.isInitialized == 0)
return HAL_ERROR;
result = Dallas_ReadTemperature(&sensor->sens);
return result;
}
HAL_StatusTypeDef PCHSens_CheckSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef* sensor)
{
HAL_StatusTypeDef result;
unsigned unknow_sensors_flag = 0;
if(sensor == NULL)
return HAL_ERROR;
if((sensor->sens.isLost == 1) || (sensor->sens.isInitialized == 0))
{
if(Dallas_ReplaceLostedSensor(&sensor->sens) == HAL_ERROR)
{
sensor->not_found = 1;
}
else
{
sensor->not_found = 0;
}
}
else
{
sensor->not_found = 0;
}
return HAL_OK;
}
HAL_StatusTypeDef PCHSens_FindUnknownSensors(PCHSens_DallasBusHandle *hbus)
{
HAL_StatusTypeDef result;
if(hbus == NULL)
return HAL_ERROR;
hbus->UnknownCnt = 0;
PCHSens_LocationTypeDef *param = (PCHSens_LocationTypeDef *)&hbus->hdallas->scratchpad.tHighRegister;
for(int i = 0; i < hbus->hdallas->onewire->RomCnt; i++)
{
/* Проверка присутствует ли выбранный датчик на линии */
result = DS18B20_ReadScratchpad(hbus->hdallas->onewire, (uint8_t *)&DS.DevAddr[i], (uint8_t *)&hbus->hdallas->scratchpad);
if(result != HAL_OK)
__NOP();
if((IS_REG_SENS_LOCATION(param) == 0) ||
(IS_REG_PCH_LOCATION(param) == 0) ||
(IS_REG_PCH_NUMB(param) == 0) )
{
// unknowns->unknown_sensors[unknowns->UnknownCnt].Init.InitParam = i;
// unknowns->unknown_sensors[unknowns->UnknownCnt].Init.init_func = &Dallas_SensorInitByInd;
// result = Dallas_AddNewSensors(hbus, &unknowns->unknown_sensors[unknowns->UnknownCnt]);
hbus->UnknownCnt++;
if(result != HAL_OK)
__NOP();
}
}
return HAL_OK;
}
HAL_StatusTypeDef PCHSens_UndefineSensor(PCHSens_SensorTypeDef *sensor)
{
HAL_StatusTypeDef result;
if(sensor == NULL)
return HAL_ERROR;
result = Dallas_WriteUserBytes(&sensor->sens, 0, 0, USED_USER_BYTES);
if(result != HAL_OK)
{
return result;
}
result = Dallas_SensorDeInit(&sensor->sens);
return result;
}
HAL_StatusTypeDef PCHSens_GetSensorByLocation(PCHSens_TypeDef *pchsens, PCHSens_LocationTypeDef Location, PCHSens_SensorTypeDef **sensor)
{
PCHSens_ModuleTypeDef *module;
uint8_t pch_numb = (Location.param.PCHdig1 - 1)*3 + (Location.param.PCHdig2 - 1);
switch(pch_numb)
{
case 0:
module = &pchsens->module1; break;
case 1:
module = &pchsens->module2; break;
case 2:
module = &pchsens->module3; break;
case 3:
module = &pchsens->module4; break;
case 4:
module = &pchsens->module5; break;
case 5:
module = &pchsens->module6; break;
default:
return HAL_ERROR;
}
switch(Location.param.Location)
{
case 0:
*sensor = &module->sens1; break;
case 1:
*sensor = &module->sens2; break;
case 2:
*sensor = &module->sens3; break;
case 3:
*sensor = &module->sens4; break;
}
return HAL_OK;
}

View File

@@ -0,0 +1,180 @@
/**
******************************************************************************
* @file pch_sensors.h
* @brief Работа с датчиками температуры DS18B20 в ПЧ
******************************************************************************
*****************************************************************************/
#ifndef PCH_SENSORS_H
#define PCH_SENSORS_H
/* Includes -----------------------------------------------------------------*/
#include "dallas_tools.h"
/* Declarations and definitions ---------------------------------------------*/
#define USED_USER_BYTES DALLAS_USER_BYTE_12
/* Позиции параметров в UserBytes */
#define REG_SENS_LOCATION_Pos (0) /*!< @brief Позиция параметра "Локация внутри модуля" */
#define REG_PCH_LOCATION_Pos (8) /*!< @brief Позиция параметра "Расположение в ПЧ" */
#define REG_PCH_DIOD_PHASE_Pos (10) /*!< @brief Позиция параметра "Диодный или фазный модуль" @ref REG_PCH_LOCATION_Pos */
#define REG_PCH_MODULE_NUMB_Pos (8) /*!< @brief Позиция параметра "Порядковый номер диодного/фазного модуля" @ref REG_PCH_LOCATION_Pos */
#define REG_PCH_NUMB_Pos (11) /*!< @brief Позиция параметра "Преобразователь частоты" */
#define REG_PCH_NUMB_DIGIT_1_Pos (13) /*!< @brief Позиция параметра "Первая цифра номера преобразователя частоты" @ref REG_PCH_NUMB_Pos */
#define REG_PCH_NUMB_DIGIT_2_Pos (11) /*!< @brief Позиция параметра "Вторая цифра номера преобразователя частоты" @ref REG_PCH_NUMB_Pos */
#define REG_ZIP_Pos (15) /*!< @brief Позиция параметра "ЗИП/не ЗИП" */
/* Маски параметров в UserBytes */
#define REG_SENS_LOCATION_Mask ((uint16_t)0x3 << REG_SENS_LOCATION_Pos) /*!< @brief Маска параметра "Локация внутри модуля" */
#define REG_PCH_LOCATION_Mask ((uint16_t)0x7 << REG_PCH_LOCATION_Pos) /*!< @brief Маска параметра "Расположение в ПЧ" */
#define REG_PCH_DIOD_PHASE_Mask ((uint16_t)0x1 << REG_PCH_DIOD_PHASE_Pos) /*!< @brief Маска параметра "Диодный или фазный модуль" */
#define REG_PCH_MODULE_NUMB_Mask ((uint16_t)0x3 << REG_PCH_MODULE_NUMB_Pos) /*!< @brief Маска параметра "Порядковый номер диодного/фазного модуля" */
#define REG_PCH_NUMB_Mask ((uint16_t)0xF << REG_PCH_NUMB_Pos) /*!< @brief Маска параметра "Преобразователь частоты" */
#define REG_PCH_NUMB_DIGIT_1_Mask ((uint16_t)0x3 << REG_PCH_NUMB_DIGIT_1_Pos) /*!< @brief Маска параметра "Первая цифра номера преобразователя частоты" */
#define REG_PCH_NUMB_DIGIT_2_Mask ((uint16_t)0x3 << REG_PCH_NUMB_DIGIT_2_Pos) /*!< @brief Маска параметра "Вторая цифра номера преобразователя частоты" */
#define REG_ZIP_Mask ((uint16_t)0x1 << REG_ZIP_Pos) /*!< @brief Маска параметра "ЗИП/не ЗИП" */
/* Варианты параметров в UserBytes */
#define REG_PCH_NUMB_11 ((1 << REG_PCH_NUMB_DIGIT_1_Pos) | (1 << REG_PCH_NUMB_DIGIT_2_Pos))
#define REG_PCH_NUMB_12 ((1 << REG_PCH_NUMB_DIGIT_1_Pos) | (2 << REG_PCH_NUMB_DIGIT_2_Pos))
#define REG_PCH_NUMB_13 ((1 << REG_PCH_NUMB_DIGIT_1_Pos) | (3 << REG_PCH_NUMB_DIGIT_2_Pos))
#define REG_PCH_NUMB_21 ((2 << REG_PCH_NUMB_DIGIT_1_Pos) | (1 << REG_PCH_NUMB_DIGIT_2_Pos))
#define REG_PCH_NUMB_22 ((2 << REG_PCH_NUMB_DIGIT_1_Pos) | (2 << REG_PCH_NUMB_DIGIT_2_Pos))
#define REG_PCH_NUMB_23 ((2 << REG_PCH_NUMB_DIGIT_1_Pos) | (3 << REG_PCH_NUMB_DIGIT_2_Pos))
#define REG_PCH_DIODE_NUMB_1 ((0 << REG_PCH_DIOD_PHASE_Pos) | (1 << REG_PCH_MODULE_NUMB_Pos))
#define REG_PCH_DIODE_NUMB_2 ((0 << REG_PCH_DIOD_PHASE_Pos) | (2 << REG_PCH_MODULE_NUMB_Pos))
#define REG_PCH_DIODE_NUMB_3 ((0 << REG_PCH_DIOD_PHASE_Pos) | (3 << REG_PCH_MODULE_NUMB_Pos))
#define REG_PCH_PHASE_NUMB_1 ((1 << REG_PCH_DIOD_PHASE_Pos) | (1 << REG_PCH_MODULE_NUMB_Pos))
#define REG_PCH_PHASE_NUMB_2 ((1 << REG_PCH_DIOD_PHASE_Pos) | (2 << REG_PCH_MODULE_NUMB_Pos))
#define REG_PCH_PHASE_NUMB_3 ((1 << REG_PCH_DIOD_PHASE_Pos) | (3 << REG_PCH_MODULE_NUMB_Pos))
/* Получить параметр из UserBytes */
#define GET_REG_SENS_LOCATION(_REG_) ((_REG_) & REG_SENS_LOCATION_Mask) /*!< @brief Получить параметр "Локация внутри модуля" */
#define GET_REG_PCH_LOCATION(_REG_) ((_REG_) & REG_PCH_LOCATION_Mask) /*!< @brief Получить параметр "Расположение в ПЧ" */
#define GET_REG_PCH_DIOD_PHASE(_REG_) ((_REG_) & REG_PCH_DIOD_PHASE_Mask) /*!< @brief Получить параметр "Диодный или фазный модуль" */
#define GET_REG_PCH_MODULE_NUMB(_REG_) ((_REG_) & REG_PCH_MODULE_NUMB_Mask) /*!< @brief Получить параметр "Порядковый номер диодного/фазного модуля" */
#define GET_REG_PCH_NUMB(_REG_) ((_REG_) & REG_PCH_NUMB_Mask) /*!< @brief Получить параметр "Преобразователь частоты" */
#define GET_REG_PCH_NUMB_DIGIT_1(_REG_) ((_REG_) & REG_PCH_NUMB_DIGIT_1_Mask) /*!< @brief Получить параметр "Первая цифра номера преобразователя частоты" */
#define GET_REG_PCH_NUMB_DIGIT_2(_REG_) ((_REG_) & REG_PCH_NUMB_DIGIT_2_Mask) /*!< @brief Получить параметр "Вторая цифра номера преобразователя частоты" */
#define GET_REG_ZIP(_REG_) ((_REG_) & REG_ZIP_Mask) /*!< @brief Получить параметр "ЗИП/не ЗИП" */
/* Диапазоны параметров из UserBytes */
#define REG_SENS_LOCATION_MAX 3
#define REG_SENS_LOCATION_MIN 0
#define REG_PCH_DIOD_PHASE_MAX 1
#define REG_PCH_DIOD_PHASE_MIN 0
#define REG_PCH_MODULE_NUMB_MAX 3
#define REG_PCH_MODULE_NUMB_MIN 0
#define REG_PCH_NUMB_DIGIT_1_MAX 3
#define REG_PCH_NUMB_DIGIT_1_MIN 1
#define REG_PCH_NUMB_DIGIT_2_MAX 2
#define REG_PCH_NUMB_DIGIT_2_MIN 1
/** @brief Получить параметр "Локация внутри модуля" */
#define IS_REG_SENS_LOCATION(_REG_) (((_REG_)->param.Location <= REG_SENS_LOCATION_MAX) && ((_REG_)->param.Location >= REG_SENS_LOCATION_MIN))
/*!< @brief Получить параметр "Расположение в ПЧ" */
#define IS_REG_PCH_LOCATION(_REG_) (IS_REG_PCH_DIOD_PHASE(_REG_) && IS_REG_PCH_MODULE_NUMB(_REG_))
/*!< @brief Получить параметр "Диодный или фазный модуль" */
#define IS_REG_PCH_DIOD_PHASE(_REG_) (((_REG_)->param.DiodeOrPhase <= REG_PCH_DIOD_PHASE_MAX) && ((_REG_)->param.DiodeOrPhase >= REG_PCH_DIOD_PHASE_MIN))
/*!< @brief Получить параметр "Порядковый номер диодного/фазного модуля" */
#define IS_REG_PCH_MODULE_NUMB(_REG_) (((_REG_)->param.ModuleNumb <= REG_PCH_MODULE_NUMB_MAX) && ((_REG_)->param.ModuleNumb >= REG_PCH_MODULE_NUMB_MIN))
/*!< @brief Получить параметр "Преобразователь частоты" */
#define IS_REG_PCH_NUMB(_REG_) (IS_REG_PCH_NUMB_DIGIT_1(_REG_) && IS_REG_PCH_NUMB_DIGIT_2(_REG_))
/*!< @brief Получить параметр "Первая цифра номера преобразователя частоты" */
#define IS_REG_PCH_NUMB_DIGIT_1(_REG_) (((_REG_)->param.PCHdig1 <= REG_PCH_NUMB_DIGIT_1_MAX) && ((_REG_)->param.PCHdig1 >= REG_PCH_NUMB_DIGIT_1_MIN))
/*!< @brief Получить параметр "Вторая цифра номера преобразователя частоты" s*/
#define IS_REG_PCH_NUMB_DIGIT_2(_REG_) (((_REG_)->param.PCHdig2 <= REG_PCH_NUMB_DIGIT_2_MAX) && ((_REG_)->param.PCHdig2 >= REG_PCH_NUMB_DIGIT_2_MIN))
/*!< @brief Получить параметр "ЗИП/не ЗИП" */
#define IS_REG_ZIP(_REG_) (GET_REG_ZIP(_REG_))
typedef union
{
uint16_t all;
struct
{
unsigned Location:2;
unsigned reserved:6;
unsigned ModuleNumb:2;
unsigned DiodeOrPhase:1;
unsigned PCHdig2:2;
unsigned PCHdig1:2;
unsigned ZIP:1;
}param;
}PCHSens_LocationTypeDef;
typedef struct
{
unsigned convertion;
uint64_t connectROM;
unsigned read;
unsigned deinit;
}PCHSens_SensorActionsTypeDef;
extern PCHSens_SensorActionsTypeDef action;
typedef struct
{
DALLAS_SensorHandleTypeDef sens;
PCHSens_LocationTypeDef Location;
unsigned not_found:1;
}PCHSens_SensorTypeDef;
typedef struct
{
DALLAS_HandleTypeDef *hdallas;
PCHSens_SensorTypeDef sens1;
PCHSens_SensorTypeDef sens2;
PCHSens_SensorTypeDef sens3;
PCHSens_SensorTypeDef sens4;
PCHSens_LocationTypeDef refLocation;
}PCHSens_ModuleTypeDef;
typedef struct
{
DALLAS_HandleTypeDef *hdallas;
uint8_t UnknownCnt;
}PCHSens_DallasBusHandle;
extern PCHSens_DallasBusHandle DallasBus;
typedef struct
{
PCHSens_ModuleTypeDef module1;
PCHSens_ModuleTypeDef module2;
PCHSens_ModuleTypeDef module3;
PCHSens_ModuleTypeDef module4;
PCHSens_ModuleTypeDef module5;
PCHSens_ModuleTypeDef module6;
}PCHSens_TypeDef;
/* Functions ---------------------------------------------------------------*/
HAL_StatusTypeDef PCHSens_InitNewSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef* sensor, uint64_t ROM);
HAL_StatusTypeDef PCHSens_AddSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef* sensor);
HAL_StatusTypeDef PCHSens_InitModule(DALLAS_HandleTypeDef *hdallas, PCHSens_ModuleTypeDef* module, uint16_t param);
HAL_StatusTypeDef PCHSens_ModuleReadTemperature(PCHSens_ModuleTypeDef* module);
HAL_StatusTypeDef PCHSens_SensorReadTemperature(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef *sensor);
HAL_StatusTypeDef PCHSens_ReadTemperature(PCHSens_SensorTypeDef* sensor);
HAL_StatusTypeDef PCHSens_StartCovert(PCHSens_DallasBusHandle *hbus);
HAL_StatusTypeDef PCHSens_CheckSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_SensorTypeDef* sensor);
HAL_StatusTypeDef PCHSens_FindUnknownSensors(PCHSens_DallasBusHandle *hbus);
HAL_StatusTypeDef PCHSens_UndefineSensor(PCHSens_SensorTypeDef *sensor);
HAL_StatusTypeDef PCHSens_GetSensorByLocation(PCHSens_TypeDef *pchsens, PCHSens_LocationTypeDef Location, PCHSens_SensorTypeDef **sensor);
#endif // #ifndef PCH_SENSORS_H