mock-data-electricity-local.sql 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. -- ============================================================
  2. -- 脚本名称: 插入电气数据测试数据
  3. -- 功能: 向 data_electricity_local 表中插入指定时间范围的测试数据
  4. -- 数据精度: 5分钟
  5. -- 参数说明:
  6. -- - start_time: 开始时间 (格式: 'YYYY-MM-DD HH:MI:SS' 或 'YYYY-MM-DD')
  7. -- - end_time: 结束时间 (格式: 'YYYY-MM-DD HH:MI:SS' 或 'YYYY-MM-DD')
  8. -- - station_id: 场站ID (默认: 1)
  9. -- - installed_capacity: 装机容量 kW (默认: 50000,即 50MW)
  10. -- ============================================================
  11. DO $$
  12. DECLARE
  13. -- ========== 可配置参数 ==========
  14. v_start_time TIMESTAMPTZ := '2026-08-05 00:00:00'; -- 开始时间
  15. v_end_time TIMESTAMPTZ := '2026-08-06 00:00:00'; -- 结束时间(不包含)
  16. v_station_id BIGINT := 1; -- 场站ID
  17. v_installed_capacity DOUBLE PRECISION := 50000; -- 装机容量 kW
  18. -- ================================
  19. v_current_time TIMESTAMPTZ;
  20. v_hour_of_day INTEGER;
  21. v_day_of_year INTEGER;
  22. v_base_irradiance DOUBLE PRECISION;
  23. v_random_factor DOUBLE PRECISION;
  24. -- 辐照度参数
  25. v_irradiance_max DOUBLE PRECISION := 1200; -- 最大辐照度 W/m²
  26. -- 系统效率参数
  27. v_efficiency DOUBLE PRECISION := 0.85; -- 综合效率(含逆变器、线损等)
  28. v_degradation DOUBLE PRECISION := 0.98; -- 衰减系数
  29. v_temp_coeff DOUBLE PRECISION := 0.004; -- 温度系数(每升高1℃损失0.4%)
  30. -- 声明变量用于存储计算值
  31. v_actual_power DOUBLE PRECISION;
  32. v_theoretical_power DOUBLE PRECISION;
  33. v_curtailment_power DOUBLE PRECISION;
  34. v_availability DOUBLE PRECISION;
  35. v_device_status SMALLINT;
  36. v_grid_status SMALLINT;
  37. v_temperature DOUBLE PRECISION;
  38. v_curtail_flag DOUBLE PRECISION;
  39. v_fault_flag DOUBLE PRECISION;
  40. v_counter INTEGER := 0;
  41. BEGIN
  42. -- 参数验证
  43. IF v_start_time >= v_end_time THEN
  44. RAISE EXCEPTION '开始时间必须早于结束时间';
  45. END IF;
  46. -- 如果结束时间超过当前时间,发出警告
  47. IF v_end_time > NOW() THEN
  48. RAISE WARNING '结束时间 (%) 晚于当前时间,将插入未来数据', v_end_time;
  49. END IF;
  50. -- 初始化当前时间为开始时间
  51. v_current_time := v_start_time;
  52. RAISE NOTICE '开始插入数据: 场站ID=%, 时间范围: % 至 %, 装机容量=% kW',
  53. v_station_id, v_start_time, v_end_time, v_installed_capacity;
  54. -- 循环插入数据,步长5分钟
  55. WHILE v_current_time < v_end_time LOOP
  56. -- 计算时间相关因子(分钟数,用于模拟日变化规律)
  57. v_hour_of_day := EXTRACT(HOUR FROM v_current_time) * 60 + EXTRACT(MINUTE FROM v_current_time);
  58. v_day_of_year := EXTRACT(DOY FROM v_current_time);
  59. -- 模拟辐照度的日变化(正弦曲线,夜间为0)
  60. -- 峰值在正午12:00 (720分钟),范围 0-1200 W/m²
  61. IF v_hour_of_day >= 300 AND v_hour_of_day <= 1140 THEN -- 5:00 到 19:00
  62. v_base_irradiance := SIN((v_hour_of_day - 300) * PI() / 840) * v_irradiance_max;
  63. ELSE
  64. v_base_irradiance := 0;
  65. END IF;
  66. -- 添加随机波动 (±15%)
  67. v_random_factor := 0.85 + (random() * 0.30);
  68. v_base_irradiance := v_base_irradiance * v_random_factor;
  69. -- 组件温度:日变化,夜间低白天高,范围 -20~45℃
  70. -- 最低温在凌晨4点,最高温在下午14点
  71. v_temperature := 15 + COS((v_hour_of_day - 240) * PI() / 720) * 15 + (random() - 0.5) * 6;
  72. v_temperature := GREATEST(-20, LEAST(45, v_temperature));
  73. -- 理论发电功率:基于辐照度的理想输出
  74. -- P_theoretical = (G / 1000) * P_installed * (1 - temp_coeff * (T - 25))
  75. IF v_base_irradiance > 0 THEN
  76. v_theoretical_power := (v_base_irradiance / 1000) * v_installed_capacity
  77. * (1 - v_temp_coeff * (v_temperature - 25));
  78. v_theoretical_power := GREATEST(0, v_theoretical_power);
  79. ELSE
  80. v_theoretical_power := 0;
  81. END IF;
  82. -- 实际发电功率:理论功率乘以综合效率和衰减
  83. v_actual_power := v_theoretical_power * v_efficiency * v_degradation
  84. * (0.97 + random() * 0.06); -- 额外 ±3% 波动
  85. v_actual_power := GREATEST(0, v_actual_power);
  86. -- 限电功率:大部分时间为0,偶尔有限电(5% 概率,白天才有)
  87. v_curtail_flag := random();
  88. IF v_base_irradiance > 0 AND v_curtail_flag < 0.05 THEN
  89. v_curtailment_power := v_actual_power * (0.1 + random() * 0.3); -- 限掉 10%~40%
  90. v_actual_power := v_actual_power - v_curtailment_power;
  91. ELSE
  92. v_curtailment_power := 0;
  93. END IF;
  94. -- 可用率:正常 95%~100%,故障时下降
  95. v_fault_flag := random();
  96. IF v_fault_flag < 0.005 THEN -- 0.5% 概率设备故障
  97. v_availability := 70 + random() * 20; -- 70%~90%
  98. ELSE
  99. v_availability := 95 + random() * 5; -- 95%~100%
  100. END IF;
  101. -- 设备状态(0=正常,1=停机,2=限电,3=检修,4=故障)
  102. IF v_fault_flag < 0.005 THEN
  103. v_device_status := 4; -- 故障
  104. ELSIF v_curtailment_power > 0 THEN
  105. v_device_status := 2; -- 限电
  106. ELSIF v_fault_flag > 0.995 THEN -- 0.5% 概率检修
  107. v_device_status := 3; -- 检修
  108. ELSE
  109. v_device_status := 0; -- 正常
  110. END IF;
  111. -- 并网状态(1=并网,0=离网)
  112. -- 白天发电时并网,夜间或故障时离网
  113. IF v_device_status = 4 OR v_device_status = 1 THEN
  114. v_grid_status := 0;
  115. ELSIF v_base_irradiance > 0 THEN
  116. v_grid_status := 1;
  117. ELSE
  118. v_grid_status := 0; -- 夜间离网
  119. END IF;
  120. -- 插入数据
  121. INSERT INTO data_electricity_local (
  122. tm,
  123. config_station_id,
  124. actual_power,
  125. theoretical_power,
  126. curtailment_power,
  127. availability,
  128. device_status,
  129. grid_status
  130. ) VALUES (
  131. v_current_time,
  132. v_station_id,
  133. ROUND(v_actual_power::NUMERIC, 2),
  134. ROUND(v_theoretical_power::NUMERIC, 2),
  135. ROUND(v_curtailment_power::NUMERIC, 2),
  136. ROUND(v_availability::NUMERIC, 2),
  137. v_device_status,
  138. v_grid_status
  139. );
  140. v_counter := v_counter + 1;
  141. -- 每1000条输出一次进度
  142. IF v_counter % 1000 = 0 THEN
  143. RAISE NOTICE '已插入 % 条数据,当前时间: %', v_counter, v_current_time;
  144. END IF;
  145. -- 时间增加5分钟
  146. v_current_time := v_current_time + INTERVAL '5 minutes';
  147. END LOOP;
  148. RAISE NOTICE '数据插入完成!共插入 % 条数据', v_counter;
  149. -- 显示插入数据统计
  150. RAISE NOTICE '数据统计:';
  151. RAISE NOTICE ' - 总记录数: %', v_counter;
  152. RAISE NOTICE ' - 开始时间: %', v_start_time;
  153. RAISE NOTICE ' - 结束时间: %', v_end_time;
  154. RAISE NOTICE ' - 场站ID: %', v_station_id;
  155. RAISE NOTICE ' - 装机容量: % kW', v_installed_capacity;
  156. END $$;