aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2020-11-16 16:16:33 +0200
committerShlomo Hecht <shlomo@twine-s.com>2020-11-16 16:16:33 +0200
commitcbd5e135024f32e282866b07951bbf1645019a01 (patch)
tree1538bfbcc698340ab0f2556bc6f7ad9270034097 /Software
parent3f8b5c336b2eddda520ee46cd53b29e33ff591c6 (diff)
downloadTango-cbd5e135024f32e282866b07951bbf1645019a01.tar.gz
Tango-cbd5e135024f32e282866b07951bbf1645019a01.zip
fix alarm handling (resolves bugs #4085, #4097). dancer setup - per dancer
Diffstat (limited to 'Software')
-rw-r--r--Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c33
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c4
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_Blowers.c17
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c3
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h2
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c37
-rw-r--r--Software/Stubs Collection/stubs/ChangePidDuringRun.cs16
7 files changed, 67 insertions, 45 deletions
diff --git a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c
index e754b0df2..5c24b2338 100644
--- a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c
+++ b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c
@@ -631,8 +631,16 @@ JobEndReasonEnum getEndReason(uint32_t AlarmId)
switch (AlarmItem[AlarmId].AlarmSource)
{
case ALARM_SOURCE_TYPE__TemperatureAlarm:
- usnprintf(AlarmReasonStr, 100, "Temperature problem in heater %d",AlarmItem[AlarmId].DeviceId);
- return JOB_TEMPERATURE_ALARM;
+ if (AlarmItem[AlarmId].Severity == DEBUG_LOG_CATEGORY__Critical)
+ {
+ usnprintf(AlarmReasonStr, 100, "Safety Critical Alarm %d",AlarmItem[AlarmId].EventType);
+ return JOB_SAFETY_CRITICAL_ALARM;
+ }
+ else
+ {
+ usnprintf(AlarmReasonStr, 100, "Temperature problem in heater %d",AlarmItem[AlarmId].DeviceId);
+ return JOB_TEMPERATURE_ALARM;
+ }
case ALARM_SOURCE_TYPE__LimitSwitchAlarm:
usnprintf(AlarmReasonStr, 100, "Dispenser %d empty",AlarmItem[AlarmId].DeviceId);
return JOB_OUT_OF_DYE;
@@ -987,13 +995,20 @@ JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob)
}
if ((IFS_Availability[1] == IFS_RECOGNIZED_INIT_PASSED)&&(IFS_Availability[2] == IFS_RECOGNIZED_INIT_PASSED)) //ifs installed -check cartridges
{
-
- tempFoundReason = Waste_CheckState(&AlarmId);
- if (tempFoundReason!=JOB_OK)
- {
- FoundReason = tempFoundReason;
- ReportWithPackageFilter(AlarmFilter,"waste handling alarm preventing job", __FILE__,__LINE__,AlarmItem[Alarm_i].EventType, AlarmItem[Alarm_i].Severity, AlarmItem[Alarm_i].DeviceId, 0);
- }
+ tempFoundReason = Waste_CheckState(&AlarmId);
+ if (tempFoundReason!=JOB_OK)
+ {
+ for (Alarm_i = 0;Alarm_i<NumOfSystemAlarms;Alarm_i++)
+ {
+ if (AlarmId == (AlarmItem[Alarm_i].EventType))
+ {
+ FoundReason = tempFoundReason;
+ AlarmId = Alarm_i;
+ ReportWithPackageFilter(AlarmFilter,"waste handling alarm preventing job", __FILE__,AlarmId,AlarmItem[Alarm_i].EventType, AlarmItem[Alarm_i].Severity, AlarmItem[Alarm_i].DeviceId, 0);
+ break;
+ }
+ }
+ }
}
if ((AlarmState[Alarm_i].Status == true)&&(FoundReason == JOB_OK))
{
diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c
index 193a35e12..cc2c508c0 100644
--- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c
+++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c
@@ -885,7 +885,9 @@ void FlashInitAndLoad(void)
}
Report("Hardware Initialized", __FILE__,__LINE__,Bytes, RpMessage, GENHWCFG_MAP_IN_FLASH, 0);
- StoreDancerConfigMessage();
+ StoreDancerConfigMessage(0);
+ StoreDancerConfigMessage(1);
+ StoreDancerConfigMessage(2);
Report("Dancer Initialized", __FILE__,DancersCfg[0].zeropoint,DancersCfg[1].zeropoint, RpMessage, DancersCfg[2].zeropoint, 0);
/*Bytes = AlarmHandlingLoadFile();
if (Bytes>0)
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_Blowers.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_Blowers.c
index 021dd243f..5be5f1232 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_Blowers.c
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_Blowers.c
@@ -53,7 +53,7 @@
#define PRESSURE_SENSOR_CP 0.269
#define PRESSURE_SENSOR_B 0.45
#define V0_DEFAULT_VALUE 1050
-#define FAN_MIN_RPM_THRESHOLD 4000
+#define FAN_MIN_RPM_THRESHOLD 3200
extern uint16_t Head_Fan_Tach[2];
extern uint8_t Head_Fan_PWM_Command[2];
@@ -92,8 +92,8 @@ void HeadBlowersInit()
HeadBlowerControl[0].m_params.MAX = 200;
HeadBlowerControl[0].m_params.MIN = -200;
HeadBlowerControl[0].m_params.Kd = 0;
- HeadBlowerControl[0].m_params.Kp = 350;
- HeadBlowerControl[0].m_params.Ki = 25;
+ HeadBlowerControl[0].m_params.Kp = 800;
+ HeadBlowerControl[0].m_params.Ki = 80;
HeadBlowerControl[0].m_params.IntegralErrorMultiplier = 10;
HeadBlowerControl[0].m_params.ProportionalErrorMultiplier = 10;
HeadBlowerControl[0].m_params.epsilon = 0;
@@ -110,8 +110,8 @@ void HeadBlowersInit()
HeadBlowerControl[1].m_params.MAX = 200;
HeadBlowerControl[1].m_params.MIN = -200;
HeadBlowerControl[1].m_params.Kd = 0;
- HeadBlowerControl[1].m_params.Kp = 350;
- HeadBlowerControl[1].m_params.Ki = 25;
+ HeadBlowerControl[1].m_params.Kp = 800;
+ HeadBlowerControl[1].m_params.Ki = 80;
HeadBlowerControl[1].m_params.IntegralErrorMultiplier = 10;
HeadBlowerControl[1].m_params.ProportionalErrorMultiplier = 10;
HeadBlowerControl[1].m_params.epsilon = 0;
@@ -354,12 +354,13 @@ void HeadBlowersCfg()
uint32_t PressureSensorInit(int blowerId)
{
- uint32_t rpm, V0 = 0;
+ uint32_t V0;
- rpm = HeadBlowersGetRPM(blowerId);
- if (rpm < FAN_MIN_RPM_THRESHOLD) {
+ if (HeadBlowersGetRPM(blowerId) < FAN_MIN_RPM_THRESHOLD) {
V0 = MillisecGetTemperatures(BlowerIdToSensorId[blowerId]);
V0 /= 10;
+ } else {
+ V0 = V0_DEFAULT_VALUE;
}
return V0;
}
diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c
index 3d2db071e..27a7dfb31 100644
--- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c
+++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c
@@ -70,6 +70,7 @@ void Stub_DancerPositionRequest(MessageContainer* requestContainer)
response.has_general_status = true;
response.detailed_status = DANCER_ENC[request->dancer_id].Det_status;
response.has_general_status = true;
+ StoreDancerConfigMessage(Dancer_Id);
}
else if(Dancer_Id < NUM_OF_ROTENC*2)
{
@@ -86,8 +87,6 @@ void Stub_DancerPositionRequest(MessageContainer* requestContainer)
response.detailed_status = ERROR; // use the Reserved bits to send our errors
response.has_general_status = true;
}
- if (Dancer_Id == 2)
- StoreDancerConfigMessage();
responseContainer = createContainer(MESSAGE_TYPE__StubDancerPositionResponse, requestContainer->token, true, &response, &stub_dancer_position_response__pack, &stub_dancer_position_response__get_packed_size);
//free(request);
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h
index 07ecf5d0b..11a92ab63 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h
@@ -46,7 +46,7 @@ uint32_t ThreadEndState();
bool Set_Thread_Rockers_Bypass (int value);
-uint32_t StoreDancerConfigMessage(void);
+uint32_t StoreDancerConfigMessage(int DancerId);
uint32_t LoadDancerConfigMessage(void);
//uint32_t MotorPidRequestMessage(HardwarePidControl* request);
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c
index 1920db03a..626bcde7c 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c
@@ -188,34 +188,35 @@ uint32_t MotorPidRequestMessage(HardwarePidControl* request)
}
char DancerConfigPath[50] = "0://SysInfo//DancCfg.cfg";
-uint32_t StoreDancerConfigMessage()
+uint32_t StoreDancerConfigMessage(int DancerId)
{
uint32_t status = OK;
// FRESULT Fresult = FR_OK;
//HardwareConfiguration DancerConfig;
HardwareDancer Dancers[MAX_SYSTEM_DANCERS];
- // uint8_t* response_buffer;
+#ifdef FOUR_WINDERS
+ uint8_t DancerAddress[MAX_SYSTEM_DANCERS] = {EEPROM_STORAGE_DANCER_0,EEPROM_STORAGE_DANCER_1,EEPROM_STORAGE_DANCER_2,EEPROM_STORAGE_DANCER_3,EEPROM_STORAGE_DANCER_4};
+#else
+ uint8_t DancerAddress[MAX_SYSTEM_DANCERS] = {EEPROM_STORAGE_DANCER_0,EEPROM_STORAGE_DANCER_1,EEPROM_STORAGE_DANCER_2};
+#endif
// size_t response_size = 0;
- int Dancer_i;
+ int Dancer_i = DancerId;
//hardware_configuration__init(&DancerConfig);
//DancerConfig.dancers = (HardwareDancer**)my_malloc(sizeof(HardwareDancer*)*MAX_SYSTEM_DANCERS);
- for (Dancer_i = 0; Dancer_i < MAX_SYSTEM_DANCERS; Dancer_i++)
- {
- hardware_dancer__init(&Dancers[Dancer_i]);
- //DancerConfig.dancers[Dancer_i] = &Dancers[Dancer_i];
- Dancers[Dancer_i].has_zeropoint = true;
- Dancers[Dancer_i].hardwaredancertype = Dancer_i;
- Dancers[Dancer_i].has_hardwaredancertype = true;
- Dancers[Dancer_i].zeropoint=Control_Read_Dancer_Position(Dancer_i,0);
- //DancerConfig.n_dancers++;
- DancersCfg[Dancer_i].zeropoint = Dancers[Dancer_i].zeropoint;
- DancersCfg[Dancer_i].zeropoint = Control_Read_Dancer_Position(Dancer_i,0);
- }
+ hardware_dancer__init(&Dancers[Dancer_i]);
+ //DancerConfig.dancers[Dancer_i] = &Dancers[Dancer_i];
+ Dancers[Dancer_i].has_zeropoint = true;
+ Dancers[Dancer_i].hardwaredancertype = Dancer_i;
+ Dancers[Dancer_i].has_hardwaredancertype = true;
+ Dancers[Dancer_i].zeropoint=Control_Read_Dancer_Position(Dancer_i,0);
+ //DancerConfig.n_dancers++;
+ DancersCfg[Dancer_i].zeropoint = Dancers[Dancer_i].zeropoint;
+ DancersCfg[Dancer_i].zeropoint = Control_Read_Dancer_Position(Dancer_i,0);
+
+
- status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_0,DancersCfg[0].zeropoint);
- status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_1,DancersCfg[1].zeropoint);
- status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_2,DancersCfg[2].zeropoint);
+ status |= MCU_E2PromProgram(DancerAddress[Dancer_i],DancersCfg[Dancer_i].zeropoint);
Report("~~~~~~Store eeprom 0",__FILE__,DancersCfg[0].zeropoint,(int)DancersCfg[1].zeropoint,RpWarning,(int)DancersCfg[2].zeropoint,0);
#ifdef FOUR_WINDERS
status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_3,DancersCfg[HARDWARE_DANCER_3].zeropoint);
diff --git a/Software/Stubs Collection/stubs/ChangePidDuringRun.cs b/Software/Stubs Collection/stubs/ChangePidDuringRun.cs
index 4d07cac71..9422e2cdc 100644
--- a/Software/Stubs Collection/stubs/ChangePidDuringRun.cs
+++ b/Software/Stubs Collection/stubs/ChangePidDuringRun.cs
@@ -8,19 +8,19 @@ using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using Tango.PMR.Stubs;
+using Tango.PMR.Hardware;
using Tango.Stubs;
public void OnExecute(StubManager stubManager)
{
+StubHeatingTestRequest stubHeatingTestRequest = new StubHeatingTestRequest();
stubHeatingTestRequest.DryerZone1Temp = 0;
stubHeatingTestRequest.DryerZone2Temp = 0;
HardwarePidControl hardwarePidControl = new HardwarePidControl();
-hardwarePidControl.HardwarePidControlType = Tango.PMR.Hardware.HardwarePidControlType.FeederMotor;
hardwarePidControl.OutputProportionalPowerLimit = 0.5; //Maximal additional power
hardwarePidControl.OutputProportionalBand = 5;
-hardwarePidControl.IntegralTime = 7000; //Ki
hardwarePidControl.DerivativeTime = 0; //Kd
hardwarePidControl.SensorCorrectionAdjustment = 0;
hardwarePidControl.SensorMinValue = 0;
@@ -30,15 +30,19 @@ hardwarePidControl.SetPointControlOutputRate = 0;
hardwarePidControl.ControlOutputType = 0.001; ////Dt
hardwarePidControl.SsrControlOutputType = 0;
hardwarePidControl.OutputOnOffHysteresisValue = 100; //Kp divider
-hardwarePidControl.ProcessVariableSamplingRate = 0;
-hardwarePidControl.PvInputFilterFactorMode = 6; //averaging the readouts / number of samples
+hardwarePidControl.ProcessVariableSamplingRate = 10;
+hardwarePidControl.PvInputFilterFactorMode = 4; //averaging the readouts / number of samples
hardwarePidControl.OutputProportionalCycleTime = 0;
hardwarePidControl.AcHeatersHalfCycleTime = 0;
-hardwarePidControl.ProportionalGain = 5000; //Kp
hardwarePidControl.PidActive = false;
hardwarePidControl.Epsilon = 0;
+hardwarePidControl.OutputOnOffHysteresisValue = 100;
-stubHeatingTestRequest.HardwarePidControl1 = hardwarePidControl1;
+hardwarePidControl.HardwarePidControlType = Tango.PMR.Hardware.HardwarePidControlType.MotorWinder;
+hardwarePidControl.IntegralTime = 8000; //Ki
+hardwarePidControl.ProportionalGain = 7000; //Kp
+
+stubHeatingTestRequest.HardwarePidControl1 = hardwarePidControl;
StubHeatingTestPollRequest stubHeatingTestPollRequest = new StubHeatingTestPollRequest();