aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Modules
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2018-11-05 10:03:00 +0200
committerShlomo Hecht <shlomo@twine-s.com>2018-11-05 10:03:00 +0200
commit8bce53c5bea437d09946e1d29f153bfaa7a45133 (patch)
tree81e97e3ec148e689c69e6c820703435ee01ef8b9 /Software/Embedded_SW/Embedded/Modules
parent05538cca177a09a2d97c35700c6dd19a1bf5f7f0 (diff)
parent648a3fdc373fc1555a8d1e1908e8b4dfa2203820 (diff)
downloadTango-8bce53c5bea437d09946e1d29f153bfaa7a45133.tar.gz
Tango-8bce53c5bea437d09946e1d29f153bfaa7a45133.zip
merge
Diffstat (limited to 'Software/Embedded_SW/Embedded/Modules')
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c8
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c30
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h22
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c46
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c74
5 files changed, 98 insertions, 82 deletions
diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
index 9eb9d9822..5785bafe4 100644
--- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
+++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
@@ -486,6 +486,10 @@ uint32_t MillisecLoop(uint32_t tick)
{
MillisecReadFromTempSensor(Sensor_i, NULL);
}
+ if (watchdogCriticalAlarm == false)
+ {
+ Control_WD(ENABLE,5); //activate heaters/dispenser watchdog, 0.5 seconds
+ }
}
if (O900Millisecond_Tick)
@@ -499,10 +503,6 @@ uint32_t MillisecLoop(uint32_t tick)
CalculateDispenserPressure(Disp_i);
}
FPGA_GetAllDispensersValveBusyOCD();
- if (watchdogCriticalAlarm == false)
- {
- Control_WD(ENABLE,50); //activate heaters/dispenser watchdog, 5 seconds
- }
DrawerFansStatus = Read_Fans_Tacho();
KeepAliveOneSecondCall();
}
diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c
index a5f3f48cf..ed1f23cb1 100644
--- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c
+++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c
@@ -26,14 +26,10 @@
HardwareBlower BlowerCfg;
-uint32_t HWConfigurationFunc(MessageContainer* requestContainer)
+uint32_t HWConfiguration(UploadHardwareConfigurationRequest* UploadRequest)
{
uint32_t status = 0;
int Motor_i, Dancer_i, Dispenser_i,PID_i;
- MessageContainer responseContainer;
- UploadHardwareConfigurationResponse response = UPLOAD_HARDWARE_CONFIGURATION_RESPONSE__INIT;
-
- UploadHardwareConfigurationRequest* UploadRequest = upload_hardware_configuration_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
if (UploadRequest == NULL)
{
@@ -42,6 +38,10 @@ uint32_t HWConfigurationFunc(MessageContainer* requestContainer)
}
HardwareConfiguration *request = UploadRequest->hardwareconfiguration;
+ if (JobIsActive())
+ {
+ return ERROR;
+ }
PrintingHWConfiguration(request);
if (request->n_winders == 1)
status += InternalWinderConfigMessage(request->winders);
@@ -122,8 +122,28 @@ uint32_t HWConfigurationFunc(MessageContainer* requestContainer)
AlarmHandlingStart();
//ThreadInitialTestStub(request);
+ return OK;
+
+
+
+}
+uint32_t HWConfigurationFunc(MessageContainer* requestContainer)
+{
+ uint32_t status = 0;
+ int Motor_i, Dancer_i, Dispenser_i,PID_i;
+ MessageContainer responseContainer;
+ UploadHardwareConfigurationResponse response = UPLOAD_HARDWARE_CONFIGURATION_RESPONSE__INIT;
+
+ UploadHardwareConfigurationRequest* UploadRequest = upload_hardware_configuration_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
+
+ status = HWConfiguration(UploadRequest);
responseContainer = createContainer(MESSAGE_TYPE__UploadHardwareConfigurationResponse, requestContainer->token, true, &response, &upload_hardware_configuration_response__pack, &upload_hardware_configuration_response__get_packed_size);
+ if (status!= OK)
+ {
+ responseContainer.error = ERROR_CODE__INVALID_PARAMETER;
+ responseContainer.errormessage = "JOb Active or incorrect parameters";
+ }
uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer));
size_t container_size = message_container__pack(&responseContainer, container_buffer);
free(responseContainer.data.data);
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h
index 6a682969f..975635342 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h
@@ -22,25 +22,23 @@ typedef struct HeaterPIDControlConfigstruc
{
bool configured;
int id; //HardwarePidControlType
- char name[20];
int32_t outputproportionalpowerlimit;
float outputproportionalband;
- int32_t integraltime;
- int32_t derivativetime;
- int32_t sensorcorrectionadjustment;
- int32_t sensortypeandsetpointlimits;
- int32_t setpointramprateorsoftstartramp;
- int32_t setpointcontroloutputrate;
- float controloutputtype;
- int32_t ssrcontroloutputtype;
- int32_t outputonoffhysteresisvalues;
- int32_t processvariablesamplingrate;
- int32_t pvinputfilterfactormode;
+ //int32_t sensorcorrectionadjustment;
+ //int32_t sensortypeandsetpointlimits;
+ //int32_t setpointramprateorsoftstartramp;
+ //int32_t setpointcontroloutputrate;
+ //int32_t outputonoffhysteresisvalues;
+ //int32_t processvariablesamplingrate;
+ //int32_t pvinputfilterfactormode;
int32_t sensormaxvalue;
int32_t sensorminvalue;
double kp;
double ki;
double kd;
+ double epsilon;
+ double dt;
+ bool pidactive;
}HeaterPIDControlConfig;
typedef struct HeaterCommandstruc
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c
index bf1f1128d..6f6cf702d 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c
@@ -140,58 +140,44 @@ uint32_t HeaterConfigRequestMessage(HardwarePidControl* request)
{
HeaterControl[HeaterId].configured = true;
HeaterControl[HeaterId].id = HeaterId;
- //strncpy (HeaterControl[HeaterId].name, request->name, 20);
HeaterControl[HeaterId].outputproportionalpowerlimit = request->outputproportionalpowerlimit;
HeaterControl[HeaterId].outputproportionalband = request->outputproportionalband;
- HeaterControl[HeaterId].integraltime = request->integraltime;
- HeaterControl[HeaterId].derivativetime = request->derivativetime;
- HeaterControl[HeaterId].sensorcorrectionadjustment = request->sensorcorrectionadjustment;
- //sensorminvalue,sensormaxvalue are used for the dryer heater as internal heater control
if (HeaterId == HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature)
- //if ((HeaterId == HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain)||(HeaterId != HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary))
{
HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain].sensormaxvalue = request->sensormaxvalue;
HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain].sensorminvalue = request->sensorminvalue;
HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary].sensormaxvalue = request->sensormaxvalue;
HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary].sensorminvalue = request->sensorminvalue;
}
- //HeaterControl[HeaterId].sensortypeandsetpointlimits = request->sensortypeandsetpointlimits;
- HeaterControl[HeaterId].setpointramprateorsoftstartramp = request->setpointramprateorsoftstartramp;
- HeaterControl[HeaterId].setpointcontroloutputrate = request->setpointcontroloutputrate;
- HeaterControl[HeaterId].controloutputtype = request->controloutputtype;
- HeaterControl[HeaterId].ssrcontroloutputtype = request->ssrcontroloutputtype;
- HeaterControl[HeaterId].outputonoffhysteresisvalues = request->outputonoffhysteresisvalue;
- HeaterControl[HeaterId].processvariablesamplingrate = request->processvariablesamplingrate;
- HeaterControl[HeaterId].pvinputfilterfactormode = request->pvinputfilterfactormode;
- //HeaterControl[HeaterId].kp = 0.5;
- //HeaterControl[HeaterId].ki = 0.1;
- //HeaterControl[HeaterId].kd = 0.0;
HeaterControl[HeaterId].kp = request->proportionalgain;
HeaterControl[HeaterId].ki = request->integraltime;
HeaterControl[HeaterId].kd = request->derivativetime;
+ HeaterControl[HeaterId].dt = request->controloutputtype;
+ HeaterControl[HeaterId].epsilon = request->epsilon;
+ HeaterControl[HeaterId].pidactive = request->pidactive;
+ //HeaterControl[HeaterId].sensorcorrectionadjustment = request->sensorcorrectionadjustment;
+ //sensorminvalue,sensormaxvalue are used for the dryer heater as internal heater control
+ //HeaterControl[HeaterId].sensortypeandsetpointlimits = request->sensortypeandsetpointlimits;
+ //HeaterControl[HeaterId].setpointramprateorsoftstartramp = request->setpointramprateorsoftstartramp;
+ //HeaterControl[HeaterId].setpointcontroloutputrate = request->setpointcontroloutputrate;
+ //HeaterControl[HeaterId].ssrcontroloutputtype = request->ssrcontroloutputtype;
+ //HeaterControl[HeaterId].outputonoffhysteresisvalues = request->outputonoffhysteresisvalue;
+ //HeaterControl[HeaterId].processvariablesamplingrate = request->processvariablesamplingrate;
+ //HeaterControl[HeaterId].pvinputfilterfactormode = request->pvinputfilterfactormode;
if (HeaterId < MAX_AC_HEATERS)
AcHeaterConfigured[HeaterId] = true;
//check if all A/C heaters are defined. if they are - validate the configuration
- if (((HeaterId == HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain)||(HeaterId == HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary))
+ /*if (((HeaterId == HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain)||(HeaterId == HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary))
&&HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain].configured
- &&HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary].configured
- /*&&HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeater200w2].id*/)
+ &&HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary].configured)
{
if (HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain].outputproportionalpowerlimit
- + HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary].outputproportionalpowerlimit
- /*+ HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeater200w2].outputproportionalpowerlimit*/> 100)
- ValidationError += 2;
- if (ValidationError)
- {
+ + HeaterControl[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary].outputproportionalpowerlimit > 100)
LOG_ERROR (ValidationError, "Validation Error in Heaters Control");
return ERROR;
- }
- else
- {
- }
- }
+ }*/
return OK;
}
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
index 1a4086a34..8ae7a117b 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
@@ -329,8 +329,8 @@ uint32_t PrepareHeater(int HeaterId, uint32_t SetTemperatue)
HeaterPIDConfig[HeaterId].m_params.Kd = HeaterControl[HeaterId].kd;
HeaterPIDConfig[HeaterId].m_params.Kp = HeaterControl[HeaterId].kp;
HeaterPIDConfig[HeaterId].m_params.Ki = HeaterControl[HeaterId].ki;
- HeaterPIDConfig[HeaterId].m_params.dt = 0.01;
- HeaterPIDConfig[HeaterId].m_params.epsilon = 10;
+ HeaterPIDConfig[HeaterId].m_params.dt = HeaterControl[HeaterId].dt;
+ HeaterPIDConfig[HeaterId].m_params.epsilon = HeaterControl[HeaterId].epsilon; //0.1 degree
HeaterPIDConfig[HeaterId].m_calculatedError = 0;
HeaterPIDConfig[HeaterId].m_integral = 0;
HeaterPIDConfig[HeaterId].m_isEnabled = true;
@@ -532,20 +532,26 @@ uint32_t HeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue)
if(HeaterPIDConfig[index].m_isEnabled && (HeaterPIDConfig[index].m_SetParam != 0))
{
HeaterPIDConfig[index].m_mesuredParam = readValue;
- if (readValue < ((HeaterCmd[index].targettemperatue * (100-HeaterControl[index].outputproportionalband))/100)) //below proportional band
+ if (HeaterControl[index].pidactive == false)
{
- HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain, 100);
- //REPORT_MSG (readValue,"AC HEATER Over temperature");
+ if (readValue < ((HeaterCmd[index].targettemperatue * (100-HeaterControl[index].outputproportionalband))/100)) //below proportional band
+ {
+ HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain, 100);
+ //REPORT_MSG (readValue,"AC HEATER Over temperature");
+ }
+ else if (readValue > ((HeaterCmd[index].targettemperatue * (100+HeaterControl[index].outputproportionalband))/100))
+ {
+ HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain, 0);
+ //REPORT_MSG (readValue,"AC HEATER Under temperature");
+ }
}
- else if (readValue > ((HeaterCmd[index].targettemperatue * (100+HeaterControl[index].outputproportionalband))/100))
+ else //PID active
{
- HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain, 0);
- //REPORT_MSG (readValue,"AC HEATER Under temperature");
+ //check only for the proportional band limits
+ HeaterPIDConfig[index].m_calculatedError = PIDAlgorithmCalculation(HeaterPIDConfig[index].m_SetParam , HeaterPIDConfig[index].m_mesuredParam,
+ &HeaterPIDConfig[index].m_params, &HeaterPIDConfig[index].m_preError, &HeaterPIDConfig[index].m_integral);
+ HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain, (int)(HeaterPIDConfig[index].m_calculatedError/100));
}
-//check only for the proportional band limits
- HeaterPIDConfig[index].m_calculatedError = PIDAlgorithmCalculation(HeaterPIDConfig[index].m_SetParam , HeaterPIDConfig[index].m_mesuredParam,
- &HeaterPIDConfig[index].m_params, &HeaterPIDConfig[index].m_preError, &HeaterPIDConfig[index].m_integral);
- //HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain, (int)(HeaterPIDConfig[index].m_calculatedError/100));
}
@@ -618,30 +624,36 @@ uint32_t DCHeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue)
}
if(HeaterPIDConfig[index].m_isEnabled && (HeaterPIDConfig[index].m_SetParam != 0))
{
- if (readValue < ((HeaterCmd[index].targettemperatue * (100-HeaterControl[index].outputproportionalband))/100)) //below proportional band
+ if (HeaterControl[index].pidactive == false)
{
- HeaterRecalculateHeaterParams(index, 100);
+ if (readValue < ((HeaterCmd[index].targettemperatue * (100-HeaterControl[index].outputproportionalband))/100)) //below proportional band
+ {
+ HeaterRecalculateHeaterParams(index, 100);
+ }
+ else if (readValue > ((HeaterCmd[index].targettemperatue * (100+HeaterControl[index].outputproportionalband))/100))
+ {
+ HeaterRecalculateHeaterParams(index, 0);
+ }
+
}
- else if (readValue > ((HeaterCmd[index].targettemperatue * (100+HeaterControl[index].outputproportionalband))/100))
+ else ///pid active
{
- HeaterRecalculateHeaterParams(index, 0);
- }
+ //check only for the proportional band limits
+ HeaterPIDConfig[index].m_mesuredParam = readValue;
+ HeaterPIDConfig[index].m_calculatedError = PIDAlgorithmCalculation(HeaterPIDConfig[index].m_SetParam , HeaterPIDConfig[index].m_mesuredParam,
+ &HeaterPIDConfig[index].m_params, &HeaterPIDConfig[index].m_preError, &HeaterPIDConfig[index].m_integral);
+ // error[index][Counter[index]] = HeaterPIDConfig[index].m_preError;
+ // integral[index][Counter[index]] = HeaterPIDConfig[index].m_integral;
+ // output[index][Counter[index]] = HeaterPIDConfig[index].m_calculatedError;
+ // if (Counter[index]++ >=100)
+ // Counter[index] = 0;
+ // len = usnprintf(logmsg[index], 254, "PID%d: Temp %d Integral %d Output %d ",index,(int)HeaterPIDConfig[index].m_mesuredParam ,(int)HeaterPIDConfig[index].m_integral,(int)HeaterPIDConfig[index].m_calculatedError);
+ // Report(logmsg[index],__FILE__,__LINE__,index,RpWarning,index, Counter[index]);
+ // #warning PID is now only proportional (above)
+ HeaterRecalculateHeaterParams(index, (int)(HeaterPIDConfig[index].m_calculatedError/100));
-//check only for the proportional band limits
- HeaterPIDConfig[index].m_mesuredParam = readValue;
- HeaterPIDConfig[index].m_calculatedError = PIDAlgorithmCalculation(HeaterPIDConfig[index].m_SetParam , HeaterPIDConfig[index].m_mesuredParam,
- &HeaterPIDConfig[index].m_params, &HeaterPIDConfig[index].m_preError, &HeaterPIDConfig[index].m_integral);
-
-// error[index][Counter[index]] = HeaterPIDConfig[index].m_preError;
-// integral[index][Counter[index]] = HeaterPIDConfig[index].m_integral;
-// output[index][Counter[index]] = HeaterPIDConfig[index].m_calculatedError;
-// if (Counter[index]++ >=100)
-// Counter[index] = 0;
-// len = usnprintf(logmsg[index], 254, "PID%d: Temp %d Integral %d Output %d ",index,(int)HeaterPIDConfig[index].m_mesuredParam ,(int)HeaterPIDConfig[index].m_integral,(int)HeaterPIDConfig[index].m_calculatedError);
-// Report(logmsg[index],__FILE__,__LINE__,index,RpWarning,index, Counter[index]);
+ }
- #warning PID is now only proportional (above)
- //HeaterRecalculateHeaterParams(index, (int)(HeaterPIDConfig[index].m_calculatedError/100));
}