@@ -12,8 +12,13 @@
/* Declarations and definitions --------------------------------------------*/
PCHSens_TypeDef pchsens;
PCHSens_DallasBusHandle DallasBus;
static uint8_t scan_cnt;
/* Functions ---------------------------------------------------------------*/
void PYModule_FillResponse(PCHSens_SensorTypeDef* sensor, Sensor_ResponseStatusTypeDef status);
void PYModule_CheckModuleLosted(PCHSens_ModuleTypeDef *module, uint8_t *losted_flag);
void PYModule_StoreModuleToModbus(PCHSens_ModuleTypeDef *module);
void PYModule_main(void)
{
@@ -27,10 +32,13 @@ void PYModule_main(void)
}
}
if(MB_DATA.Coils.Read Sensor)
if(MB_DATA.Coils.Scan Sensors )
{
PYModule_Read Sensor(&hd allas1, &pchsen s);
MB_DATA.Coils.ReadSensor = 0;
PYModule_Scan Sensor(&D allasBu s);
}
else
{
scan_cnt = 0;
}
if(MB_DATA.Coils.InitSensor)
@@ -46,7 +54,6 @@ void PYModule_main(void)
}
PYModule_CheckLosted(&pchsens);
if(MB_DATA.Coils.RunConvertions)
{
@@ -70,7 +77,6 @@ void PYModule_FirstInit(void)
{
OW.DataPin = DS_Pin;
OW.DataPort = DS_GPIO_Port;
DS.Resolution = DS18B20_RESOLUTION_9BITS;
/* Инициализация onewire и поиск датчиков*/
OneWire_Init(&OW);
@@ -84,6 +90,7 @@ void PYModule_FirstInit(void)
/* Инициализация структур датчиков ПЧ */
DallasBus.hdallas = &hdallas1;
DallasBus.hdallas->onewire = &OW;
DallasBus.hdallas->ds_devices = &DS;
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);
@@ -98,7 +105,33 @@ void PYModule_FirstInit(void)
}
void PYModule_ScanSensor(PCHSens_DallasBusHandle *hbus)
{
PCHSens_SensorTypeDef sensor;
sensor.sens.hdallas = hbus->hdallas;
sensor.sens.sensROM = *(uint64_t *)(hbus->hdallas->ds_devices->DevAddr[scan_cnt]);
if (scan_cnt >= hbus->hdallas->onewire->RomCnt)
{
scan_cnt = hbus->hdallas->onewire->RomCnt;
PYModule_FillResponse(&sensor, 0);
return;
}
if(Dallas_ReadScratchpad(&sensor.sens) == HAL_OK)
{
PYModule_FillResponse(&sensor, STATUS_OK);
}
else
{
PYModule_FillResponse(&sensor, STATUS_ERR_SCAN);
}
}
void PYModule_IncrementScanSensor(void)
{
if(MB_DATA.Coils.ScanSensors)
{
scan_cnt++;
}
}
void PYModule_ReadSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_TypeDef *pchsens)
{
// чтение по локации
@@ -111,48 +144,28 @@ void PYModule_ReadSensor(DALLAS_HandleTypeDef *hdallas, PCHSens_TypeDef *pchsens
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;
PYModule_FillResponse(sensor, STATUS_OK) ;
}
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;
PYModule_FillResponse(sensor, STATUS_ERR_READ_LOCATION) ;
}
}
// чтение по 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)
PCHSens_SensorTypeDef sensor;
sensor.sens.hdallas = hdallas;
sensor.sens.sensROM = *(uint64_t *)MB_DATA.HoldRegs.InitStruct.ROM;
if(Dallas_ReadScratchpad(&sensor.sens) == 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;
PYModule_FillResponse(&sensor, STATUS_OK) ;
}
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;
PYModule_FillResponse(&sensor, STATUS_ERR_READ_ROM) ;
}
}
@@ -176,23 +189,11 @@ void PYModule_InitSensor(PCHSens_TypeDef *pchsens)
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;
PYModule_FillResponse(sensor, STATUS_OK) ;
}
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;
PYModule_FillResponse(sensor, STATUS_ERR_INIT) ;
}
}
}
@@ -208,38 +209,15 @@ void PYModule_DeInitSensor(PCHSens_TypeDef *pchsens)
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;
PYModule_FillResponse(sensor, STATUS_OK) ;
}
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;
PYModule_FillResponse(sensor, STATUS_ERR_DEINIT) ;
}
}
}
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;
@@ -258,6 +236,119 @@ void PYModule_CheckLosted(PCHSens_TypeDef *pchsens)
MB_DATA.Coils.LostedSensors = 0;
}
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;
}
void PYModule_FillResponse(PCHSens_SensorTypeDef* sensor, Sensor_ResponseStatusTypeDef status)
{
switch(status)
{
// successfull response
case STATUS_OK:
// fil with sensor data
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 = status;
break;
// error read by location
case STATUS_ERR_READ_LOCATION:
// fill only location from holdreg
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 = status;
break;
// error read by ROM
case STATUS_ERR_READ_ROM:
// fill only ROM from holdreg
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 = status;
break;
// error init
case STATUS_ERR_INIT:
// fill ROM and location from holdreg
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 = status;
break;
// error deinit
case STATUS_ERR_DEINIT:
// fill with sensor data
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 = status;
break;
// error deinit
case STATUS_ERR_SCAN:
// fill with sensor data
MB_DATA.InRegs.Response.Location = 0;
MB_DATA.InRegs.Response.Config = 0;
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 = status;
break;
default:
MB_DATA.InRegs.Response.Location = 0;
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 = 0;
break;
}
}
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_StoreModuleToModbus(PCHSens_ModuleTypeDef *module)
{
uint8_t mb_location;
@@ -281,17 +372,3 @@ void PYModule_StoreModuleToModbus(PCHSens_ModuleTypeDef *module)
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;
}