From 29b08a41f29655561ab83d8b454ea5fb6227ad7a Mon Sep 17 00:00:00 2001 From: Avi Levkovich Date: Mon, 31 Aug 2020 12:02:40 +0300 Subject: Read WHS Shinko Temperature --- Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 55148e655..7e3118c13 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -65,6 +65,8 @@ #include #include +#include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" + Task_Handle Millisecond_Task_Handle; /******************** Definitions ********************************************/ @@ -717,6 +719,10 @@ uint32_t MillisecLowLoop(uint32_t tick) if (isMotorConfigured(Motor_i)) MotorGetStatusFromFPGA(Motor_i); } + if (WHS_Type == WHS_TYPE_NEW) + { + WHS_Shinko_Communication(); // Reading every fourth cycle (Set HW, Request, Set HW, Response) + } } if ((O500Millisecond_Tick)&&(RapidPressureRead == false)) { -- cgit v1.3.1 From ac87d8609897ff115261fb6995bb6e46d962015c Mon Sep 17 00:00:00 2001 From: Ronen Sberlo Date: Mon, 31 Aug 2020 15:51:06 +0300 Subject: arc head blowers PID --- .../Embedded/Drivers/Heater/TemperatureSensor.c | 4 +- .../Embedded/Modules/Control/MillisecTask.c | 3 + .../Embedded/Modules/General/GeneralHardware.c | 4 + .../Embedded_SW/Embedded/Modules/General/process.c | 5 +- .../Embedded_SW/Embedded/Modules/General/process.h | 1 + .../Embedded/Modules/Heaters/Heaters_ex.h | 1 + .../Embedded/Modules/Heaters/Heaters_print.c | 153 +++++++++++++++++++-- .../Embedded/Modules/Stubs_Handler/Progress.c | 17 +-- 8 files changed, 161 insertions(+), 27 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c index e06962ca5..abbfcb4db 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c +++ b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c @@ -469,12 +469,12 @@ uint32_t CalculateTemperatures(TEMPERATURE_SENSOR_ID_ENUM SensorId, uint32_t Dat //bits to mvolts float temp1 = 3.3;//3.3V ref float temp2 = 8388608.0;//2^23 (24bit) - float temp3 = 100.0;// V_mult_by_100 + float temp3 = 10000.0;// V_mult_by_100 temp = Data & 0x00FFFFFF;//24bit temp *= temp1; - temp /= temp2; temp *= temp3; + temp /= temp2; Current_Measurement_C = (int32_t)(temp);///V_mult_by_100 } diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 7e3118c13..f8868a67b 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -780,6 +780,9 @@ uint32_t MillisecLowLoop(uint32_t tick) } */ } + if (Head_Type == HEAD_TYPE_ARC) { + HeadBlowersControlLoop(); + } //call waste state machine Waste_StateMachine_OneSecond_Call(); diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c index 4938035e6..4ff2e546c 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c +++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c @@ -506,6 +506,10 @@ uint32_t HWConfiguration(UploadHardwareConfigurationRequest* UploadRequest) status += IDS_DispenserPidRequestMessage(request->pidcontrols[PID_i]); else if (request->pidcontrols[PID_i]->hardwarepidcontroltype == HARDWARE_PID_CONTROL_TYPE__WasteControl) WHS_PidRequestMessage(request->pidcontrols[PID_i]); + else if (request->pidcontrols[PID_i]->hardwarepidcontroltype == HARDWARE_PID_CONTROL_TYPE__HeadBlower_1) + HeadBlowerPidRequestMessage(request->pidcontrols[PID_i], HEAD_FAN_RIGHT); + else if (request->pidcontrols[PID_i]->hardwarepidcontroltype == HARDWARE_PID_CONTROL_TYPE__HeadBlower_2) + HeadBlowerPidRequestMessage(request->pidcontrols[PID_i], HEAD_FAN_LEFT); } } else diff --git a/Software/Embedded_SW/Embedded/Modules/General/process.c b/Software/Embedded_SW/Embedded/Modules/General/process.c index d41b3c1a0..7490cef69 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/process.c +++ b/Software/Embedded_SW/Embedded/Modules/General/process.c @@ -41,6 +41,7 @@ double dryerairflow = 5.0; double pressurebuildup = 0; double dryerzone1temp = 0; int32_t tableindex = 0; +double headBlowersFlow[2] = {1.5,1.5}; double dryerbufferMeters = 0; double dryerbufferCentimeters = 0; @@ -303,9 +304,9 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadCoverHeater2, false,ProcessParams->lblowertemp); } + headBlowersFlow[HEAD_FAN_RIGHT] = ProcessParams->rblowerflow; + headBlowersFlow[HEAD_FAN_LEFT] = ProcessParams->lblowerflow; Trigger_HeaterWriting(); - Trigger_Head_Fan_Control(HEAD_FAN_RIGHT,ProcessParams->rblowerflow); - Trigger_Head_Fan_Control(HEAD_FAN_LEFT,ProcessParams->lblowerflow); } if (status) diff --git a/Software/Embedded_SW/Embedded/Modules/General/process.h b/Software/Embedded_SW/Embedded/Modules/General/process.h index 7cd592aad..f7f16d11e 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/process.h +++ b/Software/Embedded_SW/Embedded/Modules/General/process.h @@ -19,6 +19,7 @@ extern double headairflow; extern double dryerairflow; extern double pressurebuildup; extern double dryerzone1temp; +extern double headBlowersFlow[2]; extern int32_t tableindex; diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h index 015c5ea83..00d5a2a65 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h @@ -46,3 +46,4 @@ int HeadBlowersGetRPM(uint8_t fanId); double PressureSensorInit(); void HeadBlowersInit(); void HeadBlowersCfg(); +void HeadBlowersControlLoop (); diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index 54e552684..e59d2e223 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -51,6 +51,8 @@ /******************** Data Structures ********************************************/ #define OVERHEAT_COUNT_LIMIT 3 #define UNDERHEAT_COUNT_LIMIT 3 +#define MIN_ALLOWED_PWM 0 +#define MAX_ALLOWED_PWM 255 int Overheat_Count_Limit = OVERHEAT_COUNT_LIMIT; int Underheat_Count_Limit = UNDERHEAT_COUNT_LIMIT; @@ -84,6 +86,20 @@ typedef struct HeaterControlConfig_t HeaterPIDConfig[HEATER_TYPE_MAX_HEATERS] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //PID_Config_Params temp_params; +typedef struct +{ + bool m_isEnabled; + float m_SetParam; + float m_mesuredParam; + float m_preError; + float m_integral; + float m_calculatedError; + bool m_isReady; + int SamplesFilterSize; + PID_Config_Params m_params; +}HeadBlowerConfig; +HeadBlowerConfig HeadBlowerControl[2] = {0,0}; + /******************** GLOBAL PARAMETERS ********************************************/ HeaterCommand HeaterCmd[HEATER_TYPE_MAX_HEATERS]; uint32_t ControlIdtoHeaterId [HEATER_TYPE_MAX_HEATERS] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; @@ -94,6 +110,7 @@ uint32_t MainDryerHeaterMaxTempControl = 0xFF; uint32_t SecondDryerHeaterMaxTempControl = 0xFF; uint32_t DisasterControlId = 0xFF; double PressureSensorV0[2] = {0.0, 0.0}; +uint8_t HeadBlowersCloseLoopTime[2] = {2, 2}; #define DRYER_AIR_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP1 #define DRYER_MAIN_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP2 @@ -102,6 +119,7 @@ double PressureSensorV0[2] = {0.0, 0.0}; #define MAXIMUM_HEATER_READ 283 #define PRESSURE_SENSOR_CP 0.225 extern uint16_t Head_Fan_Tach[2]; +extern uint8_t Head_Fan_PWM_Command[2]; bool UseSecondaryDrierHeater = true; @@ -285,6 +303,7 @@ uint32_t HeatersDisasterControl(uint32_t x,uint32_t y); uint32_t PrepareHeater(int HeaterId, uint32_t SetTemperatue); void HeatersStartControlTimer (void); +int HeadBlowersGetPWM(uint8_t blowerId); //********************************************************************** //******************** CODE *******************************************/ @@ -1901,6 +1920,115 @@ void HeadBlowersInit() { Trigger_Head_Fan_Control(HEAD_FAN_RIGHT, 0); Trigger_Head_Fan_Control(HEAD_FAN_LEFT, 0); + + //PID parameters init + 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 = 600; + HeadBlowerControl[0].m_params.IntegralErrorMultiplier = 100; + HeadBlowerControl[0].m_params.ProportionalErrorMultiplier = 100; + HeadBlowerControl[0].m_params.epsilon = 0.2; + HeadBlowerControl[0].m_params.dt = 2; + //HeadBlowerControl[0].m_ingnoreValue = PID_Request->sensorcorrectionadjustment; // the minimal change required to change the motor speed in pulses + HeadBlowerControl[0].m_calculatedError = 0; + HeadBlowerControl[0].m_integral = 0; + HeadBlowerControl[0].m_isEnabled = true; + HeadBlowerControl[0].m_isReady = true; + HeadBlowerControl[0].m_mesuredParam = 0; + HeadBlowerControl[0].m_preError = 0; + HeadBlowerControl[0].m_SetParam = 5.0;//need to update SetParams on presegment stage + + 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 = 600; + HeadBlowerControl[1].m_params.IntegralErrorMultiplier = 100; + HeadBlowerControl[1].m_params.ProportionalErrorMultiplier = 100; + HeadBlowerControl[1].m_params.epsilon = 0.2; + HeadBlowerControl[1].m_params.dt = 2; + //HeadBlowerControl[0].m_ingnoreValue = PID_Request->sensorcorrectionadjustment; // the minimal change required to change the motor speed in pulses + HeadBlowerControl[1].m_calculatedError = 0; + HeadBlowerControl[1].m_integral = 0; + HeadBlowerControl[1].m_isEnabled = true; + HeadBlowerControl[1].m_isReady = true; + HeadBlowerControl[1].m_mesuredParam = 0; + HeadBlowerControl[1].m_preError = 0; + HeadBlowerControl[1].m_SetParam = 5.0;//need to update SetParams on presegment stage +} + +uint32_t HeadBlowerPidRequestMessage(void* request, int BlowerId) +{ + HardwarePidControl * PID_Request = request; + + HeadBlowerControl[BlowerId].m_params.MAX = 200; + HeadBlowerControl[BlowerId].m_params.MIN = -200; + HeadBlowerControl[BlowerId].m_params.Kd = PID_Request->derivativetime; + HeadBlowerControl[BlowerId].m_params.Kp = PID_Request->proportionalgain; + HeadBlowerControl[BlowerId].m_params.Ki = PID_Request->integraltime; + HeadBlowerControl[BlowerId].m_params.IntegralErrorMultiplier = PID_Request->setpointramprateorsoftstartramp; + HeadBlowerControl[BlowerId].m_params.ProportionalErrorMultiplier = PID_Request->outputonoffhysteresisvalue; + HeadBlowerControl[BlowerId].m_params.epsilon = PID_Request->epsilon; + HeadBlowerControl[BlowerId].m_params.dt = PID_Request->controloutputtype; + //HeadBlowerControl.m_ingnoreValue = PID_Request->sensorcorrectionadjustment; // the minimal change required to change the motor speed in pulses + HeadBlowerControl[BlowerId].m_calculatedError = 0; + HeadBlowerControl[BlowerId].m_integral = 0; + HeadBlowerControl[BlowerId].m_isEnabled = true; + HeadBlowerControl[BlowerId].m_isReady = true; + HeadBlowerControl[BlowerId].m_mesuredParam = 0; + HeadBlowerControl[BlowerId].m_preError = 0; + HeadBlowerControl[BlowerId].m_SetParam = PID_Request->outputproportionalcycletime;//need to update SetParams on presegment stage + return OK; +} + +uint32_t HeadBlowerPidFunc(double setParam,double measuredParam, int blowerId) +{ + int calculatedPwm; + + HeadBlowerControl[blowerId].m_mesuredParam = measuredParam; + HeadBlowerControl[blowerId].m_SetParam = setParam; + HeadBlowerControl[blowerId].m_calculatedError = PIDAlgorithmCalculation((float)HeadBlowerControl[blowerId].m_SetParam , (float)HeadBlowerControl[blowerId].m_mesuredParam, + &HeadBlowerControl[blowerId].m_params, &HeadBlowerControl[blowerId].m_preError, &HeadBlowerControl[blowerId].m_integral); + calculatedPwm = HeadBlowersGetPWM(blowerId) + HeadBlowerControl[blowerId].m_calculatedError; + + HeadBlowersCloseLoopTime[blowerId] = HeadBlowerControl[blowerId].m_params.dt; + Trigger_Head_Fan_Control(blowerId, calculatedPwm); + if (calculatedPwm < MIN_ALLOWED_PWM) + HeadBlowerControl[blowerId].m_integral = 0; + if (calculatedPwm > MAX_ALLOWED_PWM) + HeadBlowerControl[blowerId].m_integral = 0; + + return OK; +} + +bool HeadBlowerFlowControl(double Q_value, uint8_t blowerId) +{ + double currentFlow = 0.0; + int sensorId; + + sensorId = (blowerId == HEAD_FAN_RIGHT)?(HEAD_PT100_ZONE_5_0X84_0):(HEAD_PT100_ZONE_7_0X86_0); + currentFlow = PressureSensorGetPressure(sensorId); + HeadBlowerPidFunc(Q_value,currentFlow, blowerId); + return OK; +} + +void HeadBlowersControlLoop () +{ + int blowerId; + static int count[2] = {0, 0}; + if (GetMachineState() < MACHINE_STATE_WAIT_FOR_COOLER) + return; //do not start before controller is initialized and running + + for (blowerId = 0; blowerId <= 1; blowerId++) { + if (count[blowerId] == HeadBlowersCloseLoopTime[blowerId]) { + count[blowerId] = 0; + HeadBlowerFlowControl(headBlowersFlow[blowerId], blowerId); + } else { + count[blowerId] += 1; + } + } } void HeadBlowersCfg() @@ -1913,26 +2041,31 @@ void HeadBlowersCfg() } } -double PressureSensorInit(int fanId) +double PressureSensorInit(int blowerId) { int sensorId; - sensorId = (fanId == HEAD_FAN_RIGHT)?(HEAD_PT100_ZONE_5_0X84_0):(HEAD_PT100_ZONE_7_0X86_0); - PressureSensorV0[fanId] = MillisecGetTemperatures(sensorId); - PressureSensorV0[fanId] *= 10; - return PressureSensorV0[fanId]; + sensorId = (blowerId == HEAD_FAN_RIGHT)?(HEAD_PT100_ZONE_5_0X84_0):(HEAD_PT100_ZONE_7_0X86_0); + PressureSensorV0[blowerId] = MillisecGetTemperatures(sensorId); + PressureSensorV0[blowerId] /= 10; + return PressureSensorV0[blowerId]; } -int HeadBlowersGetRPM(uint8_t fanId) +int HeadBlowersGetRPM(uint8_t blowerId) { - Trigger_Head_Read_Tacho(fanId); + Trigger_Head_Read_Tacho(blowerId); - if (Head_Fan_Tach[fanId] == 0x1FFE) { + if (Head_Fan_Tach[blowerId] == 0x1FFE) { return 0; } else { - return 7864320/Head_Fan_Tach[fanId]; + return 7864320/Head_Fan_Tach[blowerId]; } } +int HeadBlowersGetPWM(uint8_t blowerId) +{ + return Head_Fan_PWM_Command[blowerId]; +} + double PressureSensorGetPressure(uint8_t SensorId) { double V0, Vm, Q, Cp; @@ -1940,7 +2073,7 @@ double PressureSensorGetPressure(uint8_t SensorId) Cp = PRESSURE_SENSOR_CP; V0 = (SensorId == HEAD_PT100_ZONE_5_0X84_0)?(PressureSensorV0[0]):(PressureSensorV0[1]); Vm = MillisecGetTemperatures(SensorId); - Vm *= 10; + Vm /= 10; Q = sqrt(Vm - V0 + 22) * Cp; return Q; } diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index d983144f3..853f6913a 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -814,8 +814,7 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) Task_sleep(2000); //response.progress = Fan_Click_Info.Product_ID; - //response.progress = Head_Fan_Tach[0]; - response.progress = HeadBlowersGetRPM(HEAD_FAN_RIGHT); + response.progress = Head_Fan_Tach[0]; response.has_progress = true; } @@ -824,27 +823,19 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) { Trigger_Head_Fan_Control(HEAD_FAN_LEFT, request->delay & 0xFF); Task_sleep(2000); - //response.progress = Head_Fan_Tach[1]; - response.progress = HeadBlowersGetRPM(HEAD_FAN_LEFT); + response.progress = Head_Fan_Tach[1]; response.has_progress = true; } else if ((request->amount & 0x0000FFF0) == 0xFAC0) //WHS Fan control { uint16_t fan_tacho = 0; - WHS_fan_num Fan_Id; - uint8_t Fan_Speed; if (WHS_Type == WHS_TYPE_NEW) { - Fan_Id = (request->amount & 0x0000000F)-2;//0-5 - Fan_Speed = request->delay & 0x000000FF; - Trigger_SetWHSFanSpeed(Fan_Id, Fan_Speed); + Trigger_SetWHSFanSpeed(((request->amount & 0x0000000F)-2) , request->delay & 0x000000FF); Task_sleep(2000); - Trigger_WHSReadAllFanTacho(); - Task_sleep(1000); - //fan_tacho = WHS_Get_fan_tach( (request->amount & 0x0000000F)-2); - fan_tacho = WHS_Fan_Tach_RPM[Fan_Id]; + fan_tacho = WHS_Get_fan_tach( (request->amount & 0x0000000F)-2); } response.progress = fan_tacho; response.has_progress = true; -- cgit v1.3.1 From 8c03f133697306627f8ceb7a73abc922a28f7ab6 Mon Sep 17 00:00:00 2001 From: Avi Levkovich Date: Tue, 1 Sep 2020 14:14:18 +0300 Subject: update shinko logic --- .../WHS_Controller_Comm/WHS_UART/WHS_Uart.c | 100 ++++++++++++++------- .../WHS_Controller_Comm/WHS_UART/WHS_Uart.h | 10 ++- .../Embedded/Modules/Control/MillisecTask.c | 16 +++- .../Embedded/Modules/Diagnostics/Diagnostics.c | 4 +- 4 files changed, 93 insertions(+), 37 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c index 22d3cf836..365275b2d 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c @@ -19,9 +19,10 @@ #include "driverlib/interrupt.h" #include "utils/uartstdio.h" #include "driverlib/uart.h" -#include "Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h" + #include #include "drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h" +#include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" #include //uint8_t Uart3_Tx_Buff[100]; @@ -175,7 +176,7 @@ uint32_t Test_Uart3(uint8_t test_number) delayms(1); break; case 1: //---------------------------------- Shinko reading temperature ----------------------- - + //Read_value RS485_Direction(TX); delayms(1); Reading_Shinko_Request_PV(); @@ -185,7 +186,7 @@ uint32_t Test_Uart3(uint8_t test_number) RetVal|=Reading_Shinko_Response_PV(); break; case 2: //---------------------------------- test Shinko ----------------------- - + //Read_Setup RS485_Direction(TX);//done in MilisecTask delayms(1); Reading_Shinko_Request_SV();//done in MilisecTask @@ -277,40 +278,75 @@ unsigned short Calculate_CRC16 ( int Message_Length, char *Message) // for modbu } */ -uint8_t WHS_Shinko_Communication() //reading every fourth cycle (Set HW, Request, Set HW, Response) +typedef enum +{ + Stage_0 = 10, //to start after few sec from power up + Stage_1, + Stage_2, + Stage_3, + Stage_4 +}SHINKO_RW_STAGES_ENUM; + +uint8_t WHS_Shinko_Communication(SHINKO_RW_OPTIONS_ENUM RWOption) //reading every fourth cycle (Set HW, Request, Set HW, Response) { uint8_t Status = OK; - static uint8_t Shinko_Comm_Stage = 0; - const uint8_t Stage1_Delay_From_PowerUp = 10; //10 * 400mSec + static SHINKO_RW_STAGES_ENUM Shinko_Comm_Stage = Stage_0; + static uint8_t Option = 0; - if(Shinko_Comm_Stage == Stage1_Delay_From_PowerUp) //start after few sec from power up + switch(RWOption) { - RS485_Direction(TX);//Set HW for TX - Shinko_Comm_Stage++; - } - else - if(Shinko_Comm_Stage == Stage1_Delay_From_PowerUp + 1) - { - Reading_Shinko_Request_PV();//Send Command - Shinko_Comm_Stage++; - } - else - if(Shinko_Comm_Stage == Stage1_Delay_From_PowerUp + 2) - { - RS485_Direction(RX);//Set HW for RX - Shinko_Comm_Stage++; - } - else - if(Shinko_Comm_Stage == + 3) - { - Status|=Reading_Shinko_Response_PV();//Get Response - Shinko_Comm_Stage = Stage1_Delay_From_PowerUp; - } - else - { - Shinko_Comm_Stage = Stage1_Delay_From_PowerUp; + case Stage_0: + RS485_Direction(TX);//Set HW for TX + Option = RWOption;//change the read write option only in stage 0 ! + Shinko_Comm_Stage++; + break; + case Stage_1: + if(Option == R_SETUP) + { + Reading_Shinko_Request_SV();//Send Command + } + else + if(Option == R_Value) + { + Reading_Shinko_Request_PV();//Send Command + } + else + if((Option == W_SETUP) && (ShinkoTempDeg.Setup!= 0x00)) + { + Setting_Shinko_Request_SV();//Send Command + } + Shinko_Comm_Stage++; + break; + case Stage_2: + RS485_Direction(RX);//Set HW for RX + Shinko_Comm_Stage++; + break; + case Stage_3: + if(Option == R_SETUP) + { + Status|=Reading_Shinko_Response_SV();//Get Response + } + else + if(Option == R_Value) + { + Status|=Reading_Shinko_Response_PV();//Get Response + } + else + if((Option == W_SETUP) && (ShinkoTempDeg.Setup!= 0x00)) + { + Status|=Setting_Shinko_Response_SV();//Get Response + } + else + { + Status = ERROR; + } + + Shinko_Comm_Stage = Stage_0; + break; + default: + Shinko_Comm_Stage = Stage_0; + break; } return Status; // check header, checksum... } - diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h index a9e9e4d59..0f0b759ac 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h @@ -8,13 +8,19 @@ #ifndef DRIVERS_UART_COMM_WHS_UART_WHS_UART_H_ #define DRIVERS_UART_COMM_WHS_UART_WHS_UART_H_ +typedef enum +{ + R_Value, + R_SETUP, + W_SETUP +}SHINKO_RW_OPTIONS_ENUM; uint8_t Uart3_Transmit(uint8_t * Uart3_Tx_Buff, uint32_t Length); uint8_t Uart3_Receive(uint8_t * Uart3_Rx_Buff, uint32_t RX_Length); -uint8_t Test_Uart3(uint8_t test_number); +uint32_t Test_Uart3(uint8_t test_number); void InitConsole_WHS_UART3(void); -uint8_t WHS_Shinko_Communication(); +uint8_t WHS_Shinko_Communication(SHINKO_RW_OPTIONS_ENUM RWOption); #endif /* DRIVERS_UART_COMM_WHS_UART_WHS_UART_H_ */ diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index f8868a67b..8117c4d81 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -66,6 +66,7 @@ #include #include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" +#include "Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h" Task_Handle Millisecond_Task_Handle; /******************** Definitions ********************************************/ @@ -721,7 +722,20 @@ uint32_t MillisecLowLoop(uint32_t tick) } if (WHS_Type == WHS_TYPE_NEW) { - WHS_Shinko_Communication(); // Reading every fourth cycle (Set HW, Request, Set HW, Response) + if(ShinkoTempDeg.Read_Setup == 0x00)//didn't read it yet + { + WHS_Shinko_Communication(R_SETUP); + } + else + if(0)//TBD - need stop condition to write only once (all the steps) , Read_Setup != setup, Read_Setup != 0, Read_Setup != Prev_Read_Setup + { + // option to wrte + read setup and stop when read = write + WHS_Shinko_Communication(W_SETUP); + } + else + { + WHS_Shinko_Communication(R_Value); // Reading every fourth cycle (Set HW, Request, Set HW, Response) + } } } if ((O500Millisecond_Tick)&&(RapidPressureRead == false)) diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index b09347628..30ff55f36 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -420,7 +420,7 @@ void LoadChillerState(HeaterType HeaterType,HeaterState *HeaterState) HeaterState->has_setpoint = true; HeaterState->setpoint = Shinko_Sv; HeaterState->has_currentvalue = true; - HeaterState->currentvalue = Shinko_Temperature;//MillisecGetTemperatures(HeaterId2PT100Id[HeaterId])/100; + HeaterState->currentvalue = ShinkoTempDeg.Read_value;//Shinko_Temperature;//MillisecGetTemperatures(HeaterId2PT100Id[HeaterId])/100; return; } @@ -919,7 +919,7 @@ void DiagnosticOneSecCollection(void) } else { - DiagnosticsMonitor.chillertemperature = &Shinko_Temperature; + DiagnosticsMonitor.chillertemperature = &ShinkoTempDeg.Read_value;//Shinko_Temperature; } DiagnosticsMonitor.n_chillertemperature = 1; DiagnosticsMonitor.n_wastelevel = 1; -- cgit v1.3.1 From f8588504c5953ff39b36c113c7443c4dedbd4d1e Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Tue, 1 Sep 2020 15:08:58 +0300 Subject: shinko reading and display changes --- .../Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c | 3 +++ Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c | 5 +++-- Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h | 2 +- Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c | 4 ++-- Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c index 365275b2d..1d7d180f7 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c @@ -23,6 +23,7 @@ #include #include "drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h" #include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" +#include "Modules/Control/MillisecTask.h" #include //uint8_t Uart3_Tx_Buff[100]; @@ -342,9 +343,11 @@ uint8_t WHS_Shinko_Communication(SHINKO_RW_OPTIONS_ENUM RWOption) //reading ever } Shinko_Comm_Stage = Stage_0; + Shinko_Read = false; break; default: Shinko_Comm_Stage = Stage_0; + Shinko_Read = false; break; } diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 8117c4d81..c2b4f5298 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -593,7 +593,7 @@ void setRapidPressureRead(bool value) if (GetDiagnosticMode() == Diagnostic_Extreme_Mode) RapidPressureRead = true; } - +bool Shinko_Read = true; uint16_t PumpCounter = 0; uint16_t realtimetest[101]; uint32_t MillisecLowLoop(uint32_t tick) @@ -720,7 +720,7 @@ uint32_t MillisecLowLoop(uint32_t tick) if (isMotorConfigured(Motor_i)) MotorGetStatusFromFPGA(Motor_i); } - if (WHS_Type == WHS_TYPE_NEW) + if ((WHS_Type == WHS_TYPE_NEW)&&(Shinko_Read == true)) { if(ShinkoTempDeg.Read_Setup == 0x00)//didn't read it yet { @@ -838,6 +838,7 @@ uint32_t MillisecLowLoop(uint32_t tick) { waste_seq_step1();// include 1Sec delay <- to open !!!! }*/ + Shinko_Read = true; } if (OneHourTick) { diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h index 226d0d57a..f7351d0b1 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h @@ -50,7 +50,7 @@ void MillisecLogClose(void); #endif - +extern bool Shinko_Read; extern bool watchdogCriticalAlarm; extern Task_Handle Millisecond_Task_Handle; diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 30ff55f36..9977c5305 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -418,7 +418,7 @@ void LoadChillerState(HeaterType HeaterType,HeaterState *HeaterState) HeaterState->has_heatertype = true; HeaterState->heatertype = HeaterType; HeaterState->has_setpoint = true; - HeaterState->setpoint = Shinko_Sv; + HeaterState->setpoint = ShinkoTempDeg.Read_Setup; HeaterState->has_currentvalue = true; HeaterState->currentvalue = ShinkoTempDeg.Read_value;//Shinko_Temperature;//MillisecGetTemperatures(HeaterId2PT100Id[HeaterId])/100; return; @@ -1276,7 +1276,7 @@ void SendDiagnostics(void) LoadHeaterState(HEATER_TYPE__HeaterZone11,&HeaterInfo[i++]); LoadHeaterState(HEATER_TYPE__HeaterZone12,&HeaterInfo[i++]); } - if ((Head_Type == HEAD_TYPE_FLAT)||(Head_Type == HEAD_TYPE_ARC)) + if (Head_Type == HEAD_TYPE_ARC) //if (Head_Type == HEAD_TYPE_STAPLE_SPUN) { LoadHeaterState(HEATER_TYPE__HeadCoverHeater1,&HeaterInfo[i++]); diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c index da2e416b8..e16909c45 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c @@ -963,7 +963,7 @@ void JobRequestFunc(MessageContainer* requestContainer) Report("Job Request ",__FILE__,__LINE__,Ticket->processparameters->dyeingspeed,RpWarning,n_segments, Ticket->intersegmentlength); memcpy(&Configured,&JobConfigured,sizeof(JobConfigured)); if (Ticket->threadparameters) - memcpy(&SavedThreadParameters,&Ticket->threadparameters,sizeof(SavedThreadParameters)); + memcpy(&SavedThreadParameters,Ticket->threadparameters,sizeof(SavedThreadParameters)); else Report("Job Request empty thread parameters ",__FILE__,__LINE__,Ticket->processparameters->dyeingspeed,RpWarning,n_segments, Ticket->intersegmentlength); StartJob(CurrentJob); -- cgit v1.3.1