* POSOCO Dispatch model with co-optimized ancillary services Scalar Overload overload factor /0.05/ ; Sets g generators t time-steps /1*96/ r regions /W, N, E, S, NE/ ; alias (r,r1); Parameter RegIndex(r) / W 1 N 2 E 3 S 4 NE 5 /; Parameters GenData(g,*), ATC(r,r1,t), Schedule(g,t), ReserveRequirement(t,*); $onecho > in.txt set=g RDim=1 rng=GenData!a2:a10000 par=GenData RDim=1 CDim=1 rng=GenData!a1:R10000 par=ATC RDim=2 CDim=1 rng=ATC!a3:XY10000 par=Schedule RDim=1 CDim=1 rng=Schedule!a4:XY10000 par=ReserveRequirement RDim=1 CDim=1 rng=Reserve!a3:d10000 $offecho $Call GDXXRW I=D:\SCS\My_GAMS\Programs\Learning_Folder\Despatch_96Blocks\InputData.xlsx O=D:\SCS\My_GAMS\Programs\Learning_Folder\Despatch_96Blocks\InputData.gdx @in.txt $GDXIN D:\SCS\My_GAMS\Programs\Learning_Folder\Despatch_96Blocks\InputData.gdx $LOAD g $LOAD GenData $LOAD ATC $LOAD Schedule $LOAD ReserveRequirement display gendata, ATC, Schedule, ReserveRequirement; Parameter Demand(r,t); Demand(r,t) = Sum(g$(gendata(g,"region")=RegIndex(r)), Schedule(g,t)) ; display demand; Variables Gen(g,t) Res(g,t) Corrflow(r,r1,t) Cost ; Positive Variables Gen Res Corrflow ResViol(t) reserve requirement violation UnservedDemand(r,t) ; gen.lo(g,t)=gendata(g, "Technical Min.")*gendata(g, "DC on bar")/100; Corrflow.up(r,r1,t)=ATC(r,r1,t); Equations Energydem(r,t) demand supply balance regional wise Reservedem(t) Reserve demand supply balance Jointlim(g,t) joint limit on generation and reserve Rampuplim(g,t) Ramp up limit Rampdnlim(g,t) Ramp down limit HydroEnergyLim(g) hydro energy limit Objfn objective function ; Energydem(r,t).. sum(g$(gendata(g,"region")=RegIndex(r)), gen(g,t))+sum(r1, Corrflow(r1,r,t)) -sum(r1, Corrflow(r,r1,t)) + UnservedDemand(r,t) =e= Demand(r,t); Reservedem(t).. sum(g,Res(g,t)) + ResViol(t) =e= ReserveRequirement(t,"Reserve"); Jointlim(g,t).. gen(g,t)+Res(g,t) =l= gendata(g, "DC")*(1+Overload); Rampuplim(g,t)$(ord(t) >1).. gen(g,t) - gen(g,t-1) =l= gendata(g,"ramp up"); Rampdnlim(g,t)$(ord(t) >1).. gen(g,t-1) - gen(g,t) =l= gendata(g,"ramp down"); HydroEnergyLim(g)$(GenData(g,"Type")=4).. Sum(t, Gen(g,t))/4 =l= gendata(g,"EnergyLimit"); Objfn.. Cost =e= sum((g,t),gen(g,t)*gendata(g, "Variable Cost per unit"))*10 + sum(t,ResViol(t)*15000) + sum((r,t),UnservedDemand(r,t)*30000); MOdel POSOCO / All / ; Solve POSOCO using lp minimizing cost; Display gen.l, Res.l, Corrflow.l, ResViol.l, Unserveddemand.l, EnergyDem.m, ReserveDem.m, Rampuplim.m, RampDnlim.m; Parameter Summary(t,*), RampSummary(g,t,*), detailedGen(g,t) summary results; Summary(t,"Hourly Cost") = sum((g),gen.l(g,t)*gendata(g, "Variable Cost per unit"))*10 + ResViol.l(t)*15000 + Sum(r,UnservedDemand.l(r,t)*30000); Summary(t,"Energy Spot Price Rs per kWh") = Sum(r,EnergyDem.m(r,t))/(Card(r)*1000); Summary(t,"Unserved demand in MW") = Sum(r,Unserveddemand.l(r,t)); RampSummary(g,t,"Up limit Rs per kWh") = RampUpLim.m(g,t)/1000; RampSummary(g,t,"Down limit Rs per kWh") = RampDnLim.m(g,t)/1000; DetailedGen(g,t) = Gen.l(g,t); EXECUTE_UNLOAD 'OutputData', Summary, RampSummary, DetailedGen; EXECUTE 'GDXXRW OutputData.gdx par=Summary rng=Summary!A5 par=RampSummary rng=RampSummary!A5 par=DetailedGen rng=Dispatch!A5 o=D:\SCS\My_GAMS\Programs\Learning_Folder\Despatch_96Blocks\OutputData.xlsx';