aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Modules/Tango.PPC.Events/app.config
blob: cfbf4bb5c679c521f3869689c448d73eb23459c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Reactive.Core" publicKeyToken="94bc3704cddfc263" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.3000.0" newVersion="3.0.3000.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.2.2.0" newVersion="1.2.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Reflection.Metadata" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.4.2.0" newVersion="1.4.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.19.8.16603" newVersion="3.19.8.16603" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Xml.ReaderWriter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /></startup></configuration>
>#include "Drivers/Heater/Heater.h" #include "Drivers/Heater/TemperatureSensor.h" #include "Drivers/I2C_Communication/Head_Card/PT100/Head_PT100_ADC.h" /******************** STRUCTURES AND ENUMs ********************************************/ /*typedef enum { HeatersInitialState, HeatersInit, HeatersControlledOp, HeatersShutdown, HeatersTest, MaxHeatersStates }HEATERS_STATES_ENUM; typedef enum { HeatersCold, HeatersAtPIDStrip, HeatersOverHeat, HeatersOnTest }HEATERS_EVENTS_ENUM; */ /******************** GLOBAL PARAMETERS ********************************************/ HeaterPIDControlConfig HeaterControl[HEATER_TYPE_MAX_HEATERS] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; bool AcHeaterConfigured[MAX_AC_HEATERS] = {0,0,0}; int NumberOFSlicesInUse = 0; uint32_t MillisecondsPerChange = 0; bool FastHeating = 1; /******************** CODE ********************************************/ /* * HeatersInit * called by: General Hardware Init * initialized all global data */ uint32_t Heaters_Init(void) { int i; //ROM_TimerDisable(Heater_timerBase, TIMER_A); FPGA_SensorInitConfig(); memset(HeaterControl,0,sizeof(HeaterControl)); for (i = 0;i<HEATER_TYPE_MAX_HEATERS; i++) DeActivateHeater(i); initializeArrays(); BlowerCfg.enabled = true; BlowerCfg.voltage = 3000; BlowerCfg.heatingvoltage = 3000; if (WHS_Type == WHS_TYPE_UNKNOWN) BlowerCfg.hardwareblowertype = HARDWARE_BLOWER_TYPE__DefaultBlower; else BlowerCfg.hardwareblowertype = HARDWARE_BLOWER_TYPE__WHSBlower2; return OK; } uint32_t HeaterConfigRequestMessage(HardwarePidControl* request) { //uint32_t status = OK; HardwarePidControlType HeaterId; HeaterId = getHeaterId(request->hardwarepidcontroltype); //int ValidationError = 0; if (HeaterId< HEATER_TYPE_MAX_HEATERS) { HeaterControl[HeaterId].configured = true; HeaterControl[HeaterId].id = HeaterId; HeaterControl[HeaterId].outputproportionalpowerlimit = request->outputproportionalpowerlimit; HeaterControl[HeaterId].outputproportionalband = request->outputproportionalband; HeaterControl[HeaterId].IntegralErrorMultiplier = request->setpointramprateorsoftstartramp; HeaterControl[HeaterId].ProportionalErrorMultiplier = request->outputonoffhysteresisvalue; if (HeaterId == HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature) { HeaterControl[HEATER_TYPE__DryerMainHeater].sensormaxvalue = request->sensormaxvalue*100; HeaterControl[HEATER_TYPE__DryerMainHeater].sensorminvalue = request->sensorminvalue*100; HeaterControl[HEATER_TYPE__DryerSecondaryHeater].sensormaxvalue = request->sensormaxvalue*100; HeaterControl[HEATER_TYPE__DryerSecondaryHeater].sensorminvalue = request->sensorminvalue*100; } HeaterControl[HeaterId].sensormaxvalue = 0; HeaterControl[HeaterId].sensorminvalue = 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; return OK; } return ERROR; } /* * HeaterConfigSetSharedHeatersParams - prepare the time slices for A/C heaters co-ordinated operation * called by the general hardware HWConfigurationFunc * parameters - the cycle time for the coordinated operation, the size (in MCU cycles) of a single step. */ uint32_t HeaterConfigSetSharedHeatersParams(uint32_t outputproportionalcycletime, uint32_t outputproportionalsinglestep) { int Slice_i; int Heater1000Slices,Heater200aSlices /*,Heater200bSlices Currently both 200W heaters will work together*/; //A/C Heaters Cycle time in milliseconds - one for all heaters OutputProportionalCycleTime = outputproportionalcycletime; //A/C Heaters step size from one decision point to another - in cpu clocks. 120000 = 1 millisecod OutputProportionalSingleStep = outputproportionalsinglestep; // calculate how many milliseconds is in each operating cycle (should be an integer number) MillisecondsPerChange = OutputProportionalSingleStep/120000; // calculate how many time slices are used. the total cycle time / the length of one operating cycle. (one added to put a time gap??? TBD) NumberOFSlicesInUse = (OutputProportionalCycleTime/MillisecondsPerChange); if (NumberOFSlicesInUse > MAX_TIMESLICES ) { LOG_ERROR (NumberOFSlicesInUse, "NumberOFSlicesInUse too high"); return ERROR;//NumberOFSlicesInUse = MAX_TIMESLICES; } // all numbers are rounded down. better to have carefully calculated numbers Heater1000Slices = HeaterControl[HEATER_TYPE__DryerMainHeater].outputproportionalpowerlimit * NumberOFSlicesInUse / 100; Heater200aSlices = HeaterControl[HEATER_TYPE__DryerSecondaryHeater].outputproportionalpowerlimit * NumberOFSlicesInUse / 100; if ((Heater1000Slices + Heater200aSlices +2)>NumberOFSlicesInUse) { LOG_ERROR (NumberOFSlicesInUse, "proportional time slices too high too high"); return ERROR;//NumberOFSlicesInUse = MAX_TIMESLICES; } //mark the time slices for heaters operation as empty / Heater1000 / Heater 200 memset (TimeSliceAllocation,0xFF,sizeof(TimeSliceAllocation)); for (Slice_i = 0; Slice_i < Heater1000Slices;Slice_i++ ) TimeSliceAllocation[Slice_i] = HEATER_TYPE__DryerMainHeater; for (Slice_i = Heater1000Slices+1; Slice_i <= Heater1000Slices+Heater200aSlices;Slice_i++ ) TimeSliceAllocation[Slice_i] = HEATER_TYPE__DryerSecondaryHeater; return OK; } /* * HeaterRecalculateSharedHeatersParams - * * parameters - the cycle time for the coordinated operation, the size (in MCU cycles) of a single step. */ uint32_t stub_heating_limit = 100; uint32_t HeaterRecalculateSharedHeatersParams(uint32_t deviceId, uint32_t new_outputproportionalpowerlimit) { int Slice_i; int Heater1000Slices,Heater200aSlices /*,Heater200bSlices Currently both 200W heaters will work together*/; uint32_t stub_outputproportionalpowerlimit = new_outputproportionalpowerlimit; if (NumberOFSlicesInUse > MAX_TIMESLICES ) { LOG_ERROR (NumberOFSlicesInUse, "NumberOFSlicesInUse too high"); return ERROR;//NumberOFSlicesInUse = MAX_TIMESLICES; } if (stub_outputproportionalpowerlimit > stub_heating_limit) stub_outputproportionalpowerlimit = stub_heating_limit; // all numbers are rounded down. better to have carefully calculated numbers HeaterControl[deviceId].outputproportionalpowerlimit = stub_outputproportionalpowerlimit;///100; Heater1000Slices = HeaterControl[HEATER_TYPE__DryerMainHeater].outputproportionalpowerlimit * NumberOFSlicesInUse / 100; Heater200aSlices = HeaterControl[HEATER_TYPE__DryerSecondaryHeater].outputproportionalpowerlimit * NumberOFSlicesInUse / 100; //#warning temporary disable time slice control as we are working with one heater in run time /* if ((Heater1000Slices + Heater200aSlices +2)>NumberOFSlicesInUse) { LOG_ERROR (NumberOFSlicesInUse, "proportional time slices too high too high"); return ERROR;//NumberOFSlicesInUse = MAX_TIMESLICES; } */ //mark the time slices for heaters operation as empty / Heater1000 / Heater 200 memset (TimeSliceAllocation,0xFF,sizeof(TimeSliceAllocation)); for (Slice_i = 0; Slice_i < Heater1000Slices;Slice_i++ ) TimeSliceAllocation[Slice_i] = HEATER_TYPE__DryerMainHeater; for (Slice_i = Heater1000Slices+1; Slice_i <= Heater1000Slices+Heater200aSlices;Slice_i++ ) TimeSliceAllocation[Slice_i] = HEATER_TYPE__DryerSecondaryHeater; return OK; } /* * HeaterRecalculateHeaterParams - prepare the time slices for D/C heaters operation * called by the general hardware HWConfigurationFunc * parameters - the cycle time for the coordinated operation, the size (in MCU cycles) of a single step. */ uint32_t HeaterRecalculateHeaterParams(uint32_t deviceId, uint32_t new_outputproportionalpowerlimit) { // calculate how many milliseconds is in each operating cycle (should be an integer number) //uint32_t MillisecondsPerChange = OutputProportionalSingleStep/120000; // calculate how many time slices are used. the total cycle time / the length of one operating cycle. (one added to put a time gap??? TBD) //NumberOFSlicesInUse = (OutputProportionalCycleTime/MillisecondsPerChange); if (NumberOFSlicesInUse > MAX_TIMESLICES ) { LOG_ERROR (NumberOFSlicesInUse, "NumberOFSlicesInUse too high"); return ERROR;//NumberOFSlicesInUse = MAX_TIMESLICES; } // all numbers are rounded down. better to have carefully calculated numbers if (new_outputproportionalpowerlimit > HeaterControl[deviceId].outputproportionalpowerlimit) new_outputproportionalpowerlimit = HeaterControl[deviceId].outputproportionalpowerlimit; //mark the time slices for heaters operation as empty / Heater1000 / Heater 200 DCTimeSliceAllocation[deviceId] = (new_outputproportionalpowerlimit/*/100*/ * NumberOFSlicesInUse) / 100; return OK; }