Files
DS18B20_Library/Core/PY32Module/PY32module_main.c
Razvalyaev 9f438ccd2f Сделано базовое управление по модбас
- сохранение температур в модбас
- чтение параметров датчика
- инициализация нового датчика
- деинициализация старого датчика

Проект связанный с PY32модулем и температурами ПЧ перенесен в отдельную папку
2025-03-04 13:48:28 +03:00

297 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
******************************************************************************
* @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;
}