ProdDataCollector.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package com.mes.prod;
  2. import com.mes.core.StationConfig;
  3. import com.mes.core.StationContext;
  4. import com.mes.device.IDeviceDriver;
  5. import com.mes.util.DateLocalUtils;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import java.util.List;
  9. import java.util.concurrent.CopyOnWriteArrayList;
  10. /**
  11. * 拉铆过程参数采集器
  12. * 在WaitCompleteStep轮询中,检测finishedCount变化时从PLC读取过程参数
  13. * 采集的数据暂存在内存队列中,由ProdDataUploader定时上传
  14. */
  15. public class ProdDataCollector {
  16. private static final Logger log = LoggerFactory.getLogger(ProdDataCollector.class);
  17. // 待上传的过程参数队列
  18. private final List<ProdRecord> pendingRecords = new CopyOnWriteArrayList<>();
  19. // 上一次的已打数量,用于检测变化
  20. private volatile int lastFinishedCount = 0;
  21. private final StationConfig.ProdParamsConfig paramsConfig;
  22. public ProdDataCollector(StationConfig.ProdParamsConfig paramsConfig) {
  23. this.paramsConfig = paramsConfig;
  24. }
  25. /**
  26. * 在轮询中调用,检测finishedCount变化并采集过程参数
  27. * @param context 工位上下文
  28. * @param driver 设备驱动
  29. * @param currentFinishedCount 当前已打数量
  30. */
  31. public void onPoll(StationContext context, IDeviceDriver driver, int currentFinishedCount) {
  32. if (paramsConfig == null || !paramsConfig.isEnabled()) {
  33. return;
  34. }
  35. // 检测已打数量是否增加
  36. if (currentFinishedCount > lastFinishedCount) {
  37. lastFinishedCount = currentFinishedCount;
  38. String productSn = context.getProcessedProductSn();
  39. if (productSn == null || productSn.trim().isEmpty()) {
  40. log.warn("[{}] 工件码为空,跳过过程参数采集", context.getStationCode());
  41. return;
  42. }
  43. try {
  44. // 从PLC读取过程参数(Int32,除以1000得到实际值)
  45. String fout = driver.readInt32(paramsConfig.getFoutAddress()) / 1000 + "";
  46. String sout = (float) driver.readInt32(paramsConfig.getSoutAddress()) / 1000 + "";
  47. String fmin = driver.readInt32(paramsConfig.getFminAddress()) / 1000 + "";
  48. String smin = (float) driver.readInt32(paramsConfig.getSminAddress()) / 1000 + "";
  49. String fmax = driver.readInt32(paramsConfig.getFmaxAddress()) / 1000 + "";
  50. String smax = (float) driver.readInt32(paramsConfig.getSmaxAddress()) / 1000 + "";
  51. String qty = String.valueOf(driver.readRegister(paramsConfig.getQtyAddress()));
  52. // 构建记录
  53. ProdRecord record = new ProdRecord();
  54. record.setGw(context.getStationCode());
  55. record.setLineSn(context.getLineSn());
  56. record.setType("A");
  57. record.setSn(productSn);
  58. record.setFout(fout);
  59. record.setSout(sout);
  60. record.setFmin(fmin);
  61. record.setSmin(smin);
  62. record.setFmax(fmax);
  63. record.setSmax(smax);
  64. record.setQty(qty);
  65. record.setSerialNumber(String.valueOf(currentFinishedCount));
  66. record.setUcode(context.getUser());
  67. record.setRecordTime(DateLocalUtils.getCurrentDateTime());
  68. pendingRecords.add(record);
  69. log.info("[{}] 采集过程参数: 第{}钉, fout={}, sout={}, fmin={}, smin={}, fmax={}, smax={}",
  70. context.getStationCode(), currentFinishedCount, fout, sout, fmin, smin, fmax, smax);
  71. } catch (Exception e) {
  72. log.error("[{}] 采集过程参数失败: {}", context.getStationCode(), e.getMessage());
  73. }
  74. }
  75. }
  76. /**
  77. * 获取并清空待上传的记录
  78. */
  79. public List<ProdRecord> drainRecords() {
  80. List<ProdRecord> records = new java.util.ArrayList<>(pendingRecords);
  81. pendingRecords.removeAll(records);
  82. return records;
  83. }
  84. /**
  85. * 将上传失败的记录放回队列
  86. */
  87. public void requeue(List<ProdRecord> records) {
  88. pendingRecords.addAll(0, records);
  89. }
  90. /**
  91. * 获取待上传记录数量
  92. */
  93. public int getPendingCount() {
  94. return pendingRecords.size();
  95. }
  96. /**
  97. * 重置(新工件开始时调用)
  98. */
  99. public void reset() {
  100. lastFinishedCount = 0;
  101. }
  102. }