|
@@ -0,0 +1,117 @@
|
|
|
+package com.jiayue.pfr.service.alg;
|
|
|
+
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import com.jiayue.pfr.constant.CacheConstants;
|
|
|
+import com.jiayue.pfr.dto.FmDataBeanDto;
|
|
|
+import com.jiayue.pfr.dto.SagFormulaDto;
|
|
|
+import com.jiayue.pfr.service.cmf.SysParameterService;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.ApplicationListener;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 核心计算监听
|
|
|
+ *
|
|
|
+ * @author xsl
|
|
|
+ * @since 2023/11/09
|
|
|
+ */
|
|
|
+@Component
|
|
|
+public class CoreAlgListener implements ApplicationListener<GetFmEvent> {
|
|
|
+ private static final Logger fLogger = LoggerFactory.getLogger("FLogger");
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ SysParameterService sysParameterService;
|
|
|
+
|
|
|
+ @Async
|
|
|
+ @Override
|
|
|
+ public void onApplicationEvent(GetFmEvent getFmEvent) {
|
|
|
+ // 判断一次调频是否投入/退出
|
|
|
+ String ieSignal = sysParameterService.queryByKey("ieSignal","ON");
|
|
|
+ if ("ON".equals(ieSignal)){
|
|
|
+ // 投入,获取最新频率
|
|
|
+ FmDataBeanDto fmDataBeanDto = getFmEvent.getFmDataBeanDto();
|
|
|
+ if (fmDataBeanDto.getF().compareTo(new BigDecimal("-99"))!=0){
|
|
|
+ SagFormulaDto sagFormulaDto = genSagFormulaAttr(fmDataBeanDto);
|
|
|
+ // 判断频率是否超死区
|
|
|
+ if (!"".equals(sagFormulaDto.getFmDisturb())){
|
|
|
+ if ("OFF".equals(CacheConstants.fmAct)){
|
|
|
+ CacheConstants.fmAct = "ON";
|
|
|
+ // 计算有功-频率下垂公式=>∆P
|
|
|
+ BigDecimal dtp = sagFormulaCal(sagFormulaDto,fmDataBeanDto);
|
|
|
+ // 给AGC闭锁调用104
|
|
|
+
|
|
|
+ // 上传PMU、EMS数据
|
|
|
+ fLogger.info("超出死区频率:"+sagFormulaDto.getDb()+ " 当前频率:"+fmDataBeanDto.getF()+" 时间:"+fmDataBeanDto.getTime());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ // 判断是否有过动作信号
|
|
|
+ if ("ON".equals(CacheConstants.fmAct)){
|
|
|
+ fLogger.info("频率恢复,当前频率:"+fmDataBeanDto.getF()+" 时间:"+fmDataBeanDto.getTime());
|
|
|
+ // 做复归通知,AGC和PMU
|
|
|
+ CacheConstants.fmAct = "OFF";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取下垂公式属性
|
|
|
+ * @param fmDataBeanDto
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private SagFormulaDto genSagFormulaAttr(FmDataBeanDto fmDataBeanDto){
|
|
|
+ SagFormulaDto sagFormulaDto = new SagFormulaDto();
|
|
|
+ // 单位: Hz 调频死区下限值
|
|
|
+ String dbMin = sysParameterService.queryByKey("dbMin","49.95");
|
|
|
+ String dbMax = sysParameterService.queryByKey("dbMax","50.05");
|
|
|
+ // 获取场站额定功率
|
|
|
+ String capacity = sysParameterService.queryByKey("capacity","100");
|
|
|
+ sagFormulaDto.setCapacity(new BigDecimal(capacity));
|
|
|
+ // 判断频率是否超死区
|
|
|
+ if (fmDataBeanDto.getF().compareTo(new BigDecimal(dbMax))==1){
|
|
|
+ // 频率上扰
|
|
|
+ sagFormulaDto.setFmDisturb("UP");
|
|
|
+ String epMin = sysParameterService.queryByKey("epMin","0.02");
|
|
|
+ sagFormulaDto.setEp(new BigDecimal(epMin));
|
|
|
+ sagFormulaDto.setDb(new BigDecimal(dbMax));
|
|
|
+ String limitMin = sysParameterService.queryByKey("limitMin","0.2");
|
|
|
+ sagFormulaDto.setLimit(new BigDecimal(limitMin));
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ if (fmDataBeanDto.getF().compareTo(new BigDecimal(dbMin))==-1){
|
|
|
+ // 频率下扰
|
|
|
+ sagFormulaDto.setFmDisturb("DOWN");
|
|
|
+ String epMax = sysParameterService.queryByKey("epMax","0.05");
|
|
|
+ sagFormulaDto.setEp(new BigDecimal(epMax));
|
|
|
+ sagFormulaDto.setDb(new BigDecimal(dbMin));
|
|
|
+ String limitMax = sysParameterService.queryByKey("limitMax","0.1");
|
|
|
+ sagFormulaDto.setLimit(new BigDecimal(limitMax));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return sagFormulaDto;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算下垂公式∆P
|
|
|
+ * @param sagFormulaDto
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private BigDecimal sagFormulaCal(SagFormulaDto sagFormulaDto,FmDataBeanDto fmDataBeanDto){
|
|
|
+ BigDecimal difference = fmDataBeanDto.getF().subtract(sagFormulaDto.getLimit());
|
|
|
+ BigDecimal differencetemp = difference.divide(new BigDecimal("50"),4,BigDecimal.ROUND_HALF_UP);
|
|
|
+ BigDecimal eptemp = new BigDecimal("-1").divide(sagFormulaDto.getEp(),4,BigDecimal.ROUND_HALF_UP);
|
|
|
+ // ∆P结果
|
|
|
+ BigDecimal dtp = differencetemp.multiply(eptemp).multiply(sagFormulaDto.getCapacity());
|
|
|
+ return dtp;
|
|
|
+ }
|
|
|
+}
|