From b2977e51824febd45cfb7d33e8c4c8aa6514666c Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Wed, 2 Sep 2020 10:34:05 +0300 Subject: version 1.4.6.44 p1 IDS pre-run and remove integral on thread loading feeder control --- .../Embedded_SW/Embedded/Common/SW_Info/SW_Info.c | 2 +- Software/Embedded_SW/Embedded/Modules/IDS/IDS.h | 4 + .../Embedded_SW/Embedded/Modules/IDS/IDS_maint.c | 10 +- .../Embedded_SW/Embedded/Modules/IDS/IDS_print.c | 103 +++++++++++---------- .../Embedded/Modules/Thread/ThreadLoad.c | 2 +- .../stubs/embeddedparametersbuild_w_cleaning.cs | 4 +- 6 files changed, 69 insertions(+), 56 deletions(-) (limited to 'Software') diff --git a/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c b/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c index 64002276c..bf2c4e98d 100644 --- a/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c +++ b/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c @@ -20,7 +20,7 @@ typedef struct } TangoVersion_t; -TangoVersion_t _gTangoVersion = {1,4,6,43}; +TangoVersion_t _gTangoVersion = {1,4,6,44}; #define BUILD_DATE __DATE__ char Dat[50] = BUILD_DATE; char _gTangoName [MAX_STRING_LEN] = "Tango01 ";//e diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h index ee308ce62..1c17c4f6b 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h @@ -13,6 +13,10 @@ extern double DispenserPreparePressure ; extern uint32_t DispenserPrepareTimeout ; extern uint32_t DispenserPrepareTimeLag ; extern uint32_t InitialDispenserSpeed; +extern double InitialDispenserPressure; +extern uint32_t InitialDispenserTimeout; + + extern uint32_t DispenserIdToMotorId[MAX_SYSTEM_DISPENSERS]; extern float DispenserPressure[MAX_SYSTEM_DISPENSERS]; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c index 663a6713f..79418a8d8 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c @@ -72,8 +72,8 @@ bool PrimingActive[MAX_SYSTEM_DISPENSERS] = {false,false,false,false,false,false uint32_t DispenserHomingControlId[MAX_SYSTEM_DISPENSERS] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint32_t DispenserBacklashControlId[MAX_SYSTEM_DISPENSERS] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint32_t DispenserHomingTime[MAX_SYSTEM_DISPENSERS] = {0,0,0,0,0,0,0,0}; -#define INITIAL_DISPENSER_PRESSURE 2.10 -#define INITIAL_DISPENSER_TIMEOUT_LIMIT 60000 +#define INITIAL_DISPENSER_PRESSURE 3.85 +#define INITIAL_DISPENSER_TIMEOUT_LIMIT 120000 #define INITIAL_DISPENSER_TIMEOUT 100 #define INITIAL_DISPENSER_SPEED 1000 @@ -105,8 +105,10 @@ void IDS_Dispenser_SetAutoHoming_Config(AutoHoming_Config_enum Config) void IDS_Dispenser_SetBackLashValues(double initialdispenserpressure, uint32_t initialdispensertimeout, uint32_t initialdispensertimelag, uint32_t initialdispenserspeed) { - InitialDispenserPressure = initialdispenserpressure; - InitialDispenserTimeout = initialdispensertimeout; + if (initialdispenserpressure>2) + InitialDispenserPressure = initialdispenserpressure; + if (initialdispensertimeout>70000) + InitialDispenserTimeout = initialdispensertimeout; InitialDispenserTimeLag = initialdispensertimelag; InitialDispenserSpeed = initialdispenserspeed; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c index b15f70267..327d80eb1 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c @@ -514,6 +514,37 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) char IdMessage[100]; int SegmentPrepareWFCFCounter = 0; bool pressureReady = false,endOfPrepareWCF = false; + +bool AdjustDispenserSpeedToPressure(int DispenserId, double RefMaxPressure,double pressure) +{ + TimerMotors_t HW_Motor_Id = DispenserIdToMotorId[DispenserId]; + float updatedSpeed,tempSpeed; + + if (pressure > RefMaxPressure*1.03) + { + tempSpeed = CurrentDispenserSpeed[DispenserId]; + //updatedSpeed = (tempSpeed * 0.992 > 100) ? tempSpeed * 0.992 : 100; + updatedSpeed = tempSpeed*0.98; + MotorSetSpeed(HW_Motor_Id, updatedSpeed); + CurrentDispenserSpeed[DispenserId] = updatedSpeed; + ReportWithPackageFilter(IDSFilter,"IDS decrease speed",__FILE__,DispenserId,(int)updatedSpeed,RpWarning,(int)(pressure*100),0); + //return true; //ready + } + else if (pressure < RefMaxPressure*0.97) + { + tempSpeed = CurrentDispenserSpeed[DispenserId]; + if (tempSpeed<50) tempSpeed = 50; + updatedSpeed = (tempSpeed * 1.02 < InitialDispenserSpeed) ? tempSpeed * 1.02 : InitialDispenserSpeed; + MotorSetSpeed(HW_Motor_Id, updatedSpeed); + CurrentDispenserSpeed[DispenserId] = updatedSpeed; + ReportWithPackageFilter(IDSFilter,"IDS increase speed",__FILE__,DispenserId,(int)updatedSpeed,RpWarning,(int)(pressure*100),0); + //return false; //not ready + } + if ((pressure>RefMaxPressure)&&(pressure<(RefMaxPressure+0.1))) + return true; + return false; +} + //******************************************************************************************************************** uint32_t IDS_Prepare_Callback(uint32_t DispenserId, uint32_t ReadValue) { @@ -525,6 +556,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) //set the speed only before the first segment, speed is constant accros job int Dispenser_i,n_dispensers; double segmentfirst_speed; + double pressure; //REPORT_MSG((int)DispenserPrepareControlId, "Prepare Callback"); @@ -532,75 +564,50 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) if (pressureReady == false) { - if (Special_Dispensers == false) + if (DispenserBuildTimeCounter<(2*eOneSecond)) { - if (DispenserBuildTimeCounter<(2*eOneSecond)) + for (i = 0; i < MAX_DYE_DISPENSERS; i++) { - for (i = 0; i < MAX_DYE_DISPENSERS; i++) - { - DispenserTotalPrepareSteps[i]+=(CurrentDispenserSpeed[i]*PRESSURE_READ_TIME_GAP/eOneSecond); - DispenserLastMovementDown[i] = false; - } - //REPORT_MSG(DispenserBuildTimeCounter,"waiting 2 seconds for pressure changes"); - return OK; + DispenserTotalPrepareSteps[i]+=(CurrentDispenserSpeed[i]*PRESSURE_READ_TIME_GAP/eOneSecond); + DispenserLastMovementDown[i] = false; } + //REPORT_MSG(DispenserBuildTimeCounter,"waiting 2 seconds for pressure changes"); + return OK; } for (i = 0; i < MAX_DYE_DISPENSERS; i++) { + pressure = GetDispenserPressure(i); //IDS_StopHomeDispenser(i); if (DispenserUsedInJob[i] == true) //we actually should check for all dispensers { DispenserTotalPrepareSteps[i]+=(CurrentDispenserSpeed[i]*PRESSURE_READ_TIME_GAP/eOneSecond); - HW_Motor_Id = DispenserIdToMotorId[i]; - if (GetDispenserPressure(i) > DispenserPreparePressure*1.05) +//#ifdef DISPENSER_UP_MOVEMENT + if (DispenserTotalPrepareSteps[i]120000) -#endif - { - NumofReadyDispensers++; - ReportWithPackageFilter(IDSFilter,"Dispenser total prepare steps ready",__FILE__,DispenserTotalPrepareSteps[i],(int)(DispenserPreparePressure*100),RpWarning,IDS_Dispenser_Data[i].consumedinnanolitter,0); - } - if (Special_Dispensers == true) - { - MotorStop(HW_Motor_Id, Hard_Hiz); - CurrentDispenserSpeed[i] = 0; - //ReportWithPackageFilter(IDSFilter,"IDS stopped ready",__FILE__,i,(int)(DispenserPreparePressure*100),RpWarning,(int)NumofReadyDispensers,0); - } - else - { - tempSpeed = CurrentDispenserSpeed[i]; - updatedSpeed = (tempSpeed*0.992>100)?tempSpeed*0.992:100; - MotorSetSpeed(HW_Motor_Id, updatedSpeed); - CurrentDispenserSpeed[i] = updatedSpeed; - //ReportWithPackageFilter(IDSFilter,"IDS reduce speed",__FILE__,i,(int)tempSpeed,RpWarning,(int)updatedSpeed,0); - } + AdjustDispenserSpeedToPressure(i,InitialDispenserPressure,pressure); + } + else if (pressure > DispenserPreparePressure*1.2) + { + MotorStop(HW_Motor_Id, Hard_Hiz); + CurrentDispenserSpeed[i] = 1; } else { - if (Special_Dispensers == true) - { - tempSpeed = (DispenserPreparePressure-GetDispenserPressure(i))*InitialDispenserSpeed; - if (tempSpeed<300) - tempSpeed = 300; - } - else - { - tempSpeed = CurrentDispenserSpeed[i]; - } - updatedSpeed = (tempSpeed*1.03 0.02) + pressure = GetDispenserPressure(CLEANER_DISPENSER); + if (pressure > 0.02) { HW_Motor_Id = DispenserIdToMotorId[CLEANER_DISPENSER]; MotorStop(HW_Motor_Id, Hard_Hiz); if (CurrentDispenserSpeed[CLEANER_DISPENSER]) - ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); + ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(pressure*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); CurrentDispenserSpeed[CLEANER_DISPENSER] = 0; } @@ -724,7 +731,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) HW_Motor_Id = DispenserIdToMotorId[CLEANER_DISPENSER]; MotorStop(HW_Motor_Id, Hard_Hiz); CurrentDispenserSpeed[CLEANER_DISPENSER] = 0; - ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); + ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(pressure*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); } SafeRemoveControlCallback(DispenserPrepareControlId, IDS_Prepare_Callback ); DispenserPrepareControlId = 0xFF; diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c index c478b82de..84cc5cf20 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c @@ -717,7 +717,7 @@ MotorControlConfig[FEEDER_MOTOR].m_params.MIN = MotorsControl[FEEDER_MOTOR].outputproportionalpowerlimit*-1; MotorControlConfig[FEEDER_MOTOR].m_params.Kd = MotorsControl[FEEDER_MOTOR].derivativetime; MotorControlConfig[FEEDER_MOTOR].m_params.Kp = MotorsControl[FEEDER_MOTOR].proportionalgain; - MotorControlConfig[FEEDER_MOTOR].m_params.Ki = MotorsControl[FEEDER_MOTOR].integraltime; + MotorControlConfig[FEEDER_MOTOR].m_params.Ki = 0;//MotorsControl[FEEDER_MOTOR].integraltime; MotorControlConfig[FEEDER_MOTOR].m_params.IntegralErrorMultiplier = MotorsControl[FEEDER_MOTOR].setpointramprateorsoftstartramp; MotorControlConfig[FEEDER_MOTOR].m_params.ProportionalErrorMultiplier = MotorsControl[FEEDER_MOTOR].outputonoffhysteresisvalue; MotorControlConfig[FEEDER_MOTOR].m_params.epsilon = MotorsControl[FEEDER_MOTOR].epsilon; diff --git a/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs b/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs index ee610b445..5b2cfdc0d 100644 --- a/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs +++ b/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs @@ -35,8 +35,8 @@ configurationParameters.CloseValveTimeout = 20; configurationParameters.OpenValveTimeout = 20; //backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters) -configurationParameters.InitialDispenserPressure = 0.25; -configurationParameters.InitialDispenserTimeout = 60000; //20 seconds +configurationParameters.InitialDispenserPressure = 3.85; //used for initial pre-run pressure +configurationParameters.InitialDispenserTimeout = 120000; ////used for initial pre-run number of steps configurationParameters.InitialDispenserTimeLag = 100; //job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed -- cgit v1.3.1