springboot物联网源码iot数据采集物联网平台源码Java程序 系统设计 2.1 设计目标 显示机组的运行数据,如机组的瞬时发电功率、累计发电量、发电小时数、风轮及电机的转速和风速、风向等,用风玫瑰图、曲线或图表的形式直观地显示出来。 显示风电机组的运行状态。 显示各机组运行过程中发生的故障。 在显示故障时,显示出故障的类型及发生时间,以便运行人员及时处理及消除故障,保证风电机组的安全和持续运行。 2.2 系统设计原则 可扩展性—系统的设计上一方面要全面满足当前环境下的需求及未来一段时间的应用需求,另一方面要能方便地进行功能扩展,可灵活增添删减功能模块。 从技术发展角度和用户需求来看,软件结构本身应能与其它应用系统集成,做到信息共享和资源共享。 互操作性—支持实时数据库的数据接口,并通过标准关系数据库接口(ODBC,OLE DB)实现与ERP及其它MIS系统的数据集成。 平台的开放性保证了今后可从生产管理系统的不同数据模块中裁剪不同的功能,以满足某个特定任务的需要,实现互操作。 三、数据设计 电厂信息 电厂信息包括电厂编号、风机总数、总装机量等 风机配置信息 风机编号、风机品牌、功率、实际功率、所在位置(坐标),所属电厂、启动时间、安装时间、运行状态等。 风机数据统计 分别对风机的风速、转速、发电量、功率、偏航次数、偏航角度等进行年月日统计。 风机故障记录 风机序号、故障类型、负责人、处理状态、处理时间、描述等,其中故障类型主要分为叶片故障、转向故障、发电机故障、其他故障四种。 风速风向区间统计信息 风速、风向由持续时间来统计某时间段内的风速大小和风向角。 功率区间统计 功率大小通过持续时间来统计某时间段内的具体功率,并以图形化折线图显示。 机舱实时信息 实时统计机舱数据。 风机序号、机舱温度、机舱角度、齿轮箱油温度、低速轴温度、高速轴唯独、齿轮油压力、交流电压、发电机输出及频率、功率因素、瞬时功率等。

先看风机实时数据怎么存库。用JPA搞了个带继承的实体结构,基类里塞公共字段:

@MappedSuperclass
@Data
public abstract class BaseDevice {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "device_number", unique = true)
    private String deviceNumber; //风机编号
    
    @Column(name = "record_time")
    private LocalDateTime recordTime = LocalDateTime.now();
}

@Entity
@Table(name = "nacelle_realtime")
public class NacelleRealtime extends BaseDevice {
    @Column(precision = 5, scale = 2)
    private Double cabinTemp; //机舱温度
    
    @Column(name = "gear_oil_pressure")
    private Integer gearOilPressure; //齿轮油压力
    
    @Transient
    private transient InstantPower instantPower; //瞬时功率对象不存DB
}

这里用了@MappedSuperclass把公共字段抽离,不同设备类型建表直接继承。注意@Transient标注的字段不会持久化到数据库,适合临时计算属性。

数据采集最带劲的是异步处理。用@Async注解配合线程池,传感器数据过来直接扔队列:

@Slf4j
@Service
public class DataCollectorService {
    @Autowired
    private BlockingQueue<SensorData> dataQueue;
    
    @Async("sensorPool")
    public void handleRealTimeData(SensorData rawData) {
        // 数据校验黑魔法
        if(rawData.getVoltage() > 800) {
            triggerFaultAlarm(rawData.getDeviceId(), "电压过载");
            return;
        }
        
        dataQueue.offer(rawData);
        log.debug("风机{}数据入队成功,队列深度:{}", 
                 rawData.getDeviceId(), dataQueue.size());
    }
    
    @Scheduled(fixedDelay = 500)
    public void batchInsert() {
        List<SensorData> batchList = new ArrayList<>(100);
        dataQueue.drainTo(batchList, 100);
        if(!batchList.isEmpty()) {
            jdbcTemplate.batchUpdate("INSERT INTO...", batchParams);
        }
    }
}

这里用阻塞队列做缓冲,batchInsert定时任务每500ms批量入库。注意@Async要配置自定义线程池,别直接用默认的,否则并发上来直接OOM给你看。

springboot物联网源码iot数据采集物联网平台源码Java程序 系统设计 2.1 设计目标 显示机组的运行数据,如机组的瞬时发电功率、累计发电量、发电小时数、风轮及电机的转速和风速、风向等,用风玫瑰图、曲线或图表的形式直观地显示出来。 显示风电机组的运行状态。 显示各机组运行过程中发生的故障。 在显示故障时,显示出故障的类型及发生时间,以便运行人员及时处理及消除故障,保证风电机组的安全和持续运行。 2.2 系统设计原则 可扩展性—系统的设计上一方面要全面满足当前环境下的需求及未来一段时间的应用需求,另一方面要能方便地进行功能扩展,可灵活增添删减功能模块。 从技术发展角度和用户需求来看,软件结构本身应能与其它应用系统集成,做到信息共享和资源共享。 互操作性—支持实时数据库的数据接口,并通过标准关系数据库接口(ODBC,OLE DB)实现与ERP及其它MIS系统的数据集成。 平台的开放性保证了今后可从生产管理系统的不同数据模块中裁剪不同的功能,以满足某个特定任务的需要,实现互操作。 三、数据设计 电厂信息 电厂信息包括电厂编号、风机总数、总装机量等 风机配置信息 风机编号、风机品牌、功率、实际功率、所在位置(坐标),所属电厂、启动时间、安装时间、运行状态等。 风机数据统计 分别对风机的风速、转速、发电量、功率、偏航次数、偏航角度等进行年月日统计。 风机故障记录 风机序号、故障类型、负责人、处理状态、处理时间、描述等,其中故障类型主要分为叶片故障、转向故障、发电机故障、其他故障四种。 风速风向区间统计信息 风速、风向由持续时间来统计某时间段内的风速大小和风向角。 功率区间统计 功率大小通过持续时间来统计某时间段内的具体功率,并以图形化折线图显示。 机舱实时信息 实时统计机舱数据。 风机序号、机舱温度、机舱角度、齿轮箱油温度、低速轴温度、高速轴唯独、齿轮油压力、交流电压、发电机输出及频率、功率因素、瞬时功率等。

故障检测这块得玩点状态模式。当温度连续3次超标才触发告警:

public class FaultDetector {
    private Map<String, FaultContext> deviceContexts = new ConcurrentHashMap<>();
    
    public void checkTemperature(String deviceId, Double temp) {
        deviceContexts.computeIfAbsent(deviceId, k -> new FaultContext())
            .check(temp, 80.0, "温度异常");
    }
    
    private class FaultContext {
        private int abnormalCount = 0;
        
        void check(Double value, Double threshold, String faultType) {
            if(value > threshold) {
                if(++abnormalCount >= 3) {
                    eventPublisher.publishEvent(new FaultEvent(deviceId, faultType));
                    abnormalCount = 0; //重置计数器
                }
            } else {
                abnormalCount = 0;
            }
        }
    }
}

这个上下文对象记录了每个设备的异常次数,避免偶发波动误报。用ConcurrentHashMap存设备上下文,线程安全还不用加锁。

最后看风玫瑰图的数据聚合。用JPA的@Query玩原生SQL分组统计:

public interface WindStatsRepo extends JpaRepository<WindStats, Long> {
    
    @Query(nativeQuery = true, value = """
        SELECT direction_angle as direction, 
               AVG(speed) as avgSpeed,
               COUNT(*) as duration 
        FROM wind_data 
        WHERE record_time BETWEEN ?1 AND ?2 
        GROUP BY direction_angle 
        ORDER BY duration DESC
        """)
    List<WindRoseProjection> getWindRoseData(LocalDateTime start, LocalDateTime end);
}

public interface WindRoseProjection {
    Integer getDirection();
    Double getAvgSpeed();
    Long getDuration();
}

这里用原生SQL做风向角的分组统计,返回的投影接口直接映射成DTO。前端拿到数据用ECharts的风玫瑰图组件一渲,哪个方向刮风多久一目了然。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐