-- ============================================================ -- 脚本名称: 插入电气数据测试数据 -- 功能: 向 data_electricity_local 表中插入指定时间范围的测试数据 -- 数据精度: 5分钟 -- 参数说明: -- - start_time: 开始时间 (格式: 'YYYY-MM-DD HH:MI:SS' 或 'YYYY-MM-DD') -- - end_time: 结束时间 (格式: 'YYYY-MM-DD HH:MI:SS' 或 'YYYY-MM-DD') -- - station_id: 场站ID (默认: 1) -- - installed_capacity: 装机容量 kW (默认: 50000,即 50MW) -- ============================================================ DO $$ DECLARE -- ========== 可配置参数 ========== v_start_time TIMESTAMPTZ := '2026-08-05 00:00:00'; -- 开始时间 v_end_time TIMESTAMPTZ := '2026-08-06 00:00:00'; -- 结束时间(不包含) v_station_id BIGINT := 1; -- 场站ID v_installed_capacity DOUBLE PRECISION := 50000; -- 装机容量 kW -- ================================ v_current_time TIMESTAMPTZ; v_hour_of_day INTEGER; v_day_of_year INTEGER; v_base_irradiance DOUBLE PRECISION; v_random_factor DOUBLE PRECISION; -- 辐照度参数 v_irradiance_max DOUBLE PRECISION := 1200; -- 最大辐照度 W/m² -- 系统效率参数 v_efficiency DOUBLE PRECISION := 0.85; -- 综合效率(含逆变器、线损等) v_degradation DOUBLE PRECISION := 0.98; -- 衰减系数 v_temp_coeff DOUBLE PRECISION := 0.004; -- 温度系数(每升高1℃损失0.4%) -- 声明变量用于存储计算值 v_actual_power DOUBLE PRECISION; v_theoretical_power DOUBLE PRECISION; v_curtailment_power DOUBLE PRECISION; v_availability DOUBLE PRECISION; v_device_status SMALLINT; v_grid_status SMALLINT; v_temperature DOUBLE PRECISION; v_curtail_flag DOUBLE PRECISION; v_fault_flag DOUBLE PRECISION; v_counter INTEGER := 0; BEGIN -- 参数验证 IF v_start_time >= v_end_time THEN RAISE EXCEPTION '开始时间必须早于结束时间'; END IF; -- 如果结束时间超过当前时间,发出警告 IF v_end_time > NOW() THEN RAISE WARNING '结束时间 (%) 晚于当前时间,将插入未来数据', v_end_time; END IF; -- 初始化当前时间为开始时间 v_current_time := v_start_time; RAISE NOTICE '开始插入数据: 场站ID=%, 时间范围: % 至 %, 装机容量=% kW', v_station_id, v_start_time, v_end_time, v_installed_capacity; -- 循环插入数据,步长5分钟 WHILE v_current_time < v_end_time LOOP -- 计算时间相关因子(分钟数,用于模拟日变化规律) v_hour_of_day := EXTRACT(HOUR FROM v_current_time) * 60 + EXTRACT(MINUTE FROM v_current_time); v_day_of_year := EXTRACT(DOY FROM v_current_time); -- 模拟辐照度的日变化(正弦曲线,夜间为0) -- 峰值在正午12:00 (720分钟),范围 0-1200 W/m² IF v_hour_of_day >= 300 AND v_hour_of_day <= 1140 THEN -- 5:00 到 19:00 v_base_irradiance := SIN((v_hour_of_day - 300) * PI() / 840) * v_irradiance_max; ELSE v_base_irradiance := 0; END IF; -- 添加随机波动 (±15%) v_random_factor := 0.85 + (random() * 0.30); v_base_irradiance := v_base_irradiance * v_random_factor; -- 组件温度:日变化,夜间低白天高,范围 -20~45℃ -- 最低温在凌晨4点,最高温在下午14点 v_temperature := 15 + COS((v_hour_of_day - 240) * PI() / 720) * 15 + (random() - 0.5) * 6; v_temperature := GREATEST(-20, LEAST(45, v_temperature)); -- 理论发电功率:基于辐照度的理想输出 -- P_theoretical = (G / 1000) * P_installed * (1 - temp_coeff * (T - 25)) IF v_base_irradiance > 0 THEN v_theoretical_power := (v_base_irradiance / 1000) * v_installed_capacity * (1 - v_temp_coeff * (v_temperature - 25)); v_theoretical_power := GREATEST(0, v_theoretical_power); ELSE v_theoretical_power := 0; END IF; -- 实际发电功率:理论功率乘以综合效率和衰减 v_actual_power := v_theoretical_power * v_efficiency * v_degradation * (0.97 + random() * 0.06); -- 额外 ±3% 波动 v_actual_power := GREATEST(0, v_actual_power); -- 限电功率:大部分时间为0,偶尔有限电(5% 概率,白天才有) v_curtail_flag := random(); IF v_base_irradiance > 0 AND v_curtail_flag < 0.05 THEN v_curtailment_power := v_actual_power * (0.1 + random() * 0.3); -- 限掉 10%~40% v_actual_power := v_actual_power - v_curtailment_power; ELSE v_curtailment_power := 0; END IF; -- 可用率:正常 95%~100%,故障时下降 v_fault_flag := random(); IF v_fault_flag < 0.005 THEN -- 0.5% 概率设备故障 v_availability := 70 + random() * 20; -- 70%~90% ELSE v_availability := 95 + random() * 5; -- 95%~100% END IF; -- 设备状态(0=正常,1=停机,2=限电,3=检修,4=故障) IF v_fault_flag < 0.005 THEN v_device_status := 4; -- 故障 ELSIF v_curtailment_power > 0 THEN v_device_status := 2; -- 限电 ELSIF v_fault_flag > 0.995 THEN -- 0.5% 概率检修 v_device_status := 3; -- 检修 ELSE v_device_status := 0; -- 正常 END IF; -- 并网状态(1=并网,0=离网) -- 白天发电时并网,夜间或故障时离网 IF v_device_status = 4 OR v_device_status = 1 THEN v_grid_status := 0; ELSIF v_base_irradiance > 0 THEN v_grid_status := 1; ELSE v_grid_status := 0; -- 夜间离网 END IF; -- 插入数据 INSERT INTO data_electricity_local ( tm, config_station_id, actual_power, theoretical_power, curtailment_power, availability, device_status, grid_status ) VALUES ( v_current_time, v_station_id, ROUND(v_actual_power::NUMERIC, 2), ROUND(v_theoretical_power::NUMERIC, 2), ROUND(v_curtailment_power::NUMERIC, 2), ROUND(v_availability::NUMERIC, 2), v_device_status, v_grid_status ); v_counter := v_counter + 1; -- 每1000条输出一次进度 IF v_counter % 1000 = 0 THEN RAISE NOTICE '已插入 % 条数据,当前时间: %', v_counter, v_current_time; END IF; -- 时间增加5分钟 v_current_time := v_current_time + INTERVAL '5 minutes'; END LOOP; RAISE NOTICE '数据插入完成!共插入 % 条数据', v_counter; -- 显示插入数据统计 RAISE NOTICE '数据统计:'; RAISE NOTICE ' - 总记录数: %', v_counter; RAISE NOTICE ' - 开始时间: %', v_start_time; RAISE NOTICE ' - 结束时间: %', v_end_time; RAISE NOTICE ' - 场站ID: %', v_station_id; RAISE NOTICE ' - 装机容量: % kW', v_installed_capacity; END $$;