当前位置:首页 > 工业控制 > 工业控制
[导读]在工业现场,管理人员需要实时了解产线产量、设备OEE、不良率等关键指标。传统做法是人工抄表或用Excel汇总,效率低且滞后。直接在嵌入式边缘网关(如RK3568、i.MX8M)上运行Java报表系统,可以就近采集PLC和传感器数据,自动生成统计看板,并通过内网Web页面展示。本文展示一个轻量级方案的完整实现。


在工业现场,管理人员需要实时了解产线产量、设备OEE、不良率等关键指标。传统做法是人工抄表或用Excel汇总,效率低且滞后。直接在嵌入式边缘网关(如RK3568、i.MX8M)上运行Java报表系统,可以就近采集PLC和传感器数据,自动生成统计看板,并通过内网Web页面展示。本文展示一个轻量级方案的完整实现。

整体架构

数据流:PLC/传感器 → SQLite数据库 → 定时统计任务 → JSON API → 前端ECharts看板

全部运行在同一台ARM Linux设备上,无需额外服务器。

数据采集与存储

使用H2嵌入式数据库(兼容SQL,体积仅2MB),通过Modbus TCP定时采集产量计数器:

@Component

public class DataCollector {

   @Scheduled(fixedRate = 60000) // 每分钟采集一次

   public void collect() {

       int count = readPlcCounter(); // 通过Modbus读取

       jdbcTemplate.update("INSERT INTO production(ts, count) VALUES(NOW(), ?)", count);

   }

}

统计报表生成

使用Spring Boot的@Scheduled每日凌晨自动生成昨日生产报表,结果存入汇总表:

@Service

public class ReportGenerator {

   @Scheduled(cron = "0 5 0 * * ?") // 每天0点5分执行

   public void generateDailyReport() {

       // 计算昨日总产量、良品率、设备运行时长

       String sql = "SELECT DATE(ts) as day, SUM(count) as total FROM production WHERE ts >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) GROUP BY day";

       Map<String, Object> report = jdbcTemplate.queryForMap(sql);

       // 存入report表

       jdbcTemplate.update("INSERT INTO daily_report(date, total, good_rate) VALUES(?, ?, ?)",

               report.get("day"), report.get("total"), calculateGoodRate());

   }

}

REST API提供数据

通过Spring Boot Controller暴露统计接口:

@RestController

@RequestMapping("/api/report")

public class ReportController {

   @GetMapping("/daily")

   public List<DailyReport> getDailyReports(@RequestParam(defaultValue = "7") int days) {

       return jdbcTemplate.query(

           "SELECT * FROM daily_report ORDER BY date DESC LIMIT ?",

           new BeanPropertyRowMapper<>(DailyReport.class), days);

   }

}

前端看板:ECharts实时展示

在嵌入式设备的/opt/web目录下放置静态HTML文件,使用ECharts绘制柱状图和折线图:

<!DOCTYPE html>

<html>

<head>

   <script src="echarts.min.js"></script>

</head>

<body>

   <div id="chart" style="width: 800px; height: 400px;"></div>

   <script>

       fetch('/api/report/daily?days=7')

           .then(r => r.json())

           .then(data => {

               var chart = echarts.init(document.getElementById('chart'));

               chart.setOption({

                   xAxis: { data: data.map(d => d.date) },

                   yAxis: {},

                   series: [{

                       type: 'bar',

                       data: data.map(d => d.total)

                   }]

               });

           });

   </script>

</body>

</html>

Spring Boot自动托管静态资源,将HTML放在src/main/resources/static/目录即可。

自动化与告警

除了定时报表,还可以设置阈值告警:当不良率超过5%时,自动发送钉钉消息或邮件。使用Spring Mail或钉钉机器人Webhook:

if (badRate > 5.0) {

   restTemplate.postForEntity("https://oapi.dingtalk.com/robot/send?access_token=xxx",

       Map.of("msgtype", "text", "text", Map.of("content", "⚠️ 不良率超标: " + badRate + "%")),

       String.class);

}

部署与运行

编译为Fat JAR,通过systemd管理:

java -jar report-system.jar --server.port=8080

在局域网内访问http://192.168.1.100:8080即可看到看板。整套系统内存占用约80MB,CPU占用在5%以下。

写在最后

用Java在嵌入式设备上构建报表系统,本质上是把边缘网关变成一个微型数据中心。Spring Boot的定时任务、嵌入式数据库和REST API,加上ECharts的前端渲染,构成了一个完整的闭环。对于中小型工厂,这套方案无需购置昂贵的服务器和商业组态软件,一台几百元的ARM开发板就能承载。当产线主管打开手机浏览器就能看到昨日的产量趋势时,嵌入式Java的价值就不再只是“能跑”,而是“好用”。

关键词:嵌入式Java,工业报表,数据看板



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭