/** ****************************************************************************** * @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.Config = 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.Config = 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.Config = 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.Config = 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.Config = 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.Config = 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.Config = 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.Config = 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; }