Przeglądaj źródła

铸造参数获取

zhanghe 4 miesięcy temu
rodzic
commit
db656cd239

+ 23 - 23
pom.xml

@@ -2,7 +2,7 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
-	
+
 	<parent>
 		<groupId>com.jeesite</groupId>
 		<artifactId>jeesite-parent</artifactId>
@@ -11,27 +11,27 @@
 	</parent>
 
 
-	<artifactId>jee-mes-x04c</artifactId>
+	<artifactId>mescloud-ljr</artifactId>
 	<packaging>jar</packaging>
-	
+
 	<description>Web 服务,也可为分离端提供接口服务</description>
-	
+
 	<name>JeeSite Web</name>
 	<url>http://jeesite.com</url>
 	<inceptionYear>2013-Now</inceptionYear>
-	
+
 	<properties>
-		
+
 		<finalName>web</finalName><!-- war or jar 包的名称 -->
 		<start-class>com.jeesite.modules.Application</start-class>
-		
+
 		<!-- environment setting -->
 		<eclipse-plugin-download-sources>false</eclipse-plugin-download-sources>
 		<eclipse-plugin-download-javadocs>false</eclipse-plugin-download-javadocs>
-		
+
 		<!-- docker setting -->
         <docker.run.port>8980:8980</docker.run.port>
-		
+
 	</properties>
 
 	<dependencies>
@@ -67,21 +67,21 @@
 <!--			<artifactId>jeesite-module-app</artifactId>-->
 <!--			<version>${project.parent.version}</version>-->
 <!--		</dependency>-->
-		
+
 		<!-- 文件管理共享(标准版)
 		<dependency>
 			<groupId>com.jeesite</groupId>
 			<artifactId>jeesite-module-filemanager</artifactId>
 			<version>${project.parent.version}</version>
 		</dependency> -->
-		
+
 		<!-- 文件在线预览(标准版)
 		<dependency>
 			<groupId>com.jeesite</groupId>
 			<artifactId>jeesite-module-filepreview</artifactId>
 			<version>${project.parent.version}</version>
 		</dependency> -->
-		
+
 		<!-- Spring Boot Tomcat
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
@@ -118,7 +118,7 @@
             <version>4.12</version>
             <scope>test</scope>
         </dependency>
-        
+
         <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-all</artifactId>
@@ -246,12 +246,12 @@
 
 
 	</dependencies>
-	
+
 	<build>
 		<finalName>${finalName}</finalName>
 		<outputDirectory>${project.basedir}/src/main/webapp/WEB-INF/classes/</outputDirectory>
 		<plugins>
-			
+
 			<!-- Spring Boot -->
 			<plugin>
 				<groupId>org.springframework.boot</groupId>
@@ -269,7 +269,7 @@
 					<warName>${finalName}</warName>
 				</configuration>
 			</plugin>
-			
+
 			<!-- Eclipse 插件 -->
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
@@ -282,25 +282,25 @@
 					<jeeversion>6.0</jeeversion>
 				</configuration>
 			</plugin>
-			
+
 		</plugins>
 	</build>
-	
-	<developers>  
+
+	<developers>
 		<developer>
 			<id>thinkgem</id>
 			<name>WangZhen</name>
 			<email>thinkgem at 163.com</email>
 			<roles><role>Project lead</role></roles>
-			<timezone>+8</timezone>  
+			<timezone>+8</timezone>
 		</developer>
 	</developers>
-	
+
 	<organization>
 		<name>JeeSite</name>
 		<url>http://jeesite.com</url>
 	</organization>
-	
+
 	<repositories>
 		<repository>
 			<id>aliyun-repos</id>
@@ -325,5 +325,5 @@
 			<url>http://maven.jeesite.net/repository/maven-public</url>
 		</pluginRepository>
 	</pluginRepositories>
-	
+
 </project>

+ 18 - 8
src/main/java/com/jeesite/modules/mes/entity/MesSmelting.java

@@ -17,6 +17,7 @@ import com.jeesite.common.utils.excel.annotation.ExcelFields;
  */
 @Table(name="mes_smelting", alias="a", label="熔炼数据监控信息", columns={
 		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="heat_number", attrName="heatNumber", label="炉号"),
 		@Column(name="molten_aluminum_temperature", attrName="moltenAluminumTemperature", label="铝液温度"),
 		@Column(name="atmosphere_temperature", attrName="atmosphereTemperature", label="气氛温度"),
 		@Column(name="exhaust_gas_temperature", attrName="exhaustGasTemperature", label="排气温度"),
@@ -25,9 +26,10 @@ import com.jeesite.common.utils.excel.annotation.ExcelFields;
 	}, orderBy="a.id DESC"
 )
 public class MesSmelting extends DataEntity<MesSmelting> {
-	
+
 	private static final long serialVersionUID = 1L;
 	private String moltenAluminumTemperature;		// 铝液温度
+	private String heatNumber;		// 炉号
 	private String atmosphereTemperature;		// 气氛温度
 	private String exhaustGasTemperature;		// 排气温度
 	private String meltingTemperature;		// 熔化温度
@@ -42,11 +44,19 @@ public class MesSmelting extends DataEntity<MesSmelting> {
 	public MesSmelting() {
 		this(null);
 	}
-	
+
+	public String getHeatNumber() {
+		return heatNumber;
+	}
+
+	public void setHeatNumber(String heatNumber) {
+		this.heatNumber = heatNumber;
+	}
+
 	public MesSmelting(String id){
 		super(id);
 	}
-	
+
 	@Size(min=0, max=255, message="铝液温度长度不能超过 255 个字符")
 	public String getMoltenAluminumTemperature() {
 		return moltenAluminumTemperature;
@@ -55,7 +65,7 @@ public class MesSmelting extends DataEntity<MesSmelting> {
 	public void setMoltenAluminumTemperature(String moltenAluminumTemperature) {
 		this.moltenAluminumTemperature = moltenAluminumTemperature;
 	}
-	
+
 	@Size(min=0, max=255, message="气氛温度长度不能超过 255 个字符")
 	public String getAtmosphereTemperature() {
 		return atmosphereTemperature;
@@ -64,7 +74,7 @@ public class MesSmelting extends DataEntity<MesSmelting> {
 	public void setAtmosphereTemperature(String atmosphereTemperature) {
 		this.atmosphereTemperature = atmosphereTemperature;
 	}
-	
+
 	@Size(min=0, max=255, message="排气温度长度不能超过 255 个字符")
 	public String getExhaustGasTemperature() {
 		return exhaustGasTemperature;
@@ -73,7 +83,7 @@ public class MesSmelting extends DataEntity<MesSmelting> {
 	public void setExhaustGasTemperature(String exhaustGasTemperature) {
 		this.exhaustGasTemperature = exhaustGasTemperature;
 	}
-	
+
 	@Size(min=0, max=255, message="熔化温度长度不能超过 255 个字符")
 	public String getMeltingTemperature() {
 		return meltingTemperature;
@@ -82,5 +92,5 @@ public class MesSmelting extends DataEntity<MesSmelting> {
 	public void setMeltingTemperature(String meltingTemperature) {
 		this.meltingTemperature = meltingTemperature;
 	}
-	
-}
+
+}

+ 24 - 0
src/main/java/com/jeesite/modules/mes/service/MesDeviceAlarmService.java

@@ -82,5 +82,29 @@ public class MesDeviceAlarmService extends CrudService<MesDeviceAlarmDao, MesDev
 	public void delete(MesDeviceAlarm mesDeviceAlarm) {
 		super.delete(mesDeviceAlarm);
 	}
+
+	/**
+	 * 根据设备编号更新报警状态(用于设备连接状态联动)
+	 * @param deviceSn 设备编号,如 RL_OP030_01
+	 * @param state    状态:0=待处理,1=已处理
+	 */
+	@Transactional
+	public void updateStateByDeviceSn(String deviceSn, String state) {
+		if (deviceSn == null || deviceSn.isEmpty()) {
+			return;
+		}
+		MesDeviceAlarm query = new MesDeviceAlarm();
+		query.setDeviceSn(deviceSn);
+		List<MesDeviceAlarm> list = super.findList(query);
+		for (MesDeviceAlarm alarm : list) {
+			// 状态无变化时跳过,避免无意义的更新
+			if (state != null && state.equals(alarm.getState())) {
+				continue;
+			}
+			alarm.setState(state);
+			// 注意:state 是业务状态字段,需用 update(updateStatus 改的是框架的 status 字段)
+			super.update(alarm);
+		}
+	}
 	
 }

+ 6 - 5
src/main/java/com/jeesite/modules/mes/web/MesProductModelController.java

@@ -39,7 +39,7 @@ public class MesProductModelController extends BaseController {
 
 	@Autowired
 	private MesProductModelService mesProductModelService;
-	
+
 	/**
 	 * 获取数据
 	 */
@@ -47,7 +47,7 @@ public class MesProductModelController extends BaseController {
 	public MesProductModel get(String id, boolean isNewRecord) {
 		return mesProductModelService.get(id, isNewRecord);
 	}
-	
+
 	/**
 	 * 查询列表
 	 */
@@ -57,7 +57,7 @@ public class MesProductModelController extends BaseController {
 		model.addAttribute("mesProductModel", mesProductModel);
 		return "modules/mes/mesProductModelList";
 	}
-	
+
 	/**
 	 * 查询列表数据
 	 */
@@ -91,7 +91,7 @@ public class MesProductModelController extends BaseController {
 		mesProductModelService.save(mesProductModel);
 		return renderResult(Global.TRUE, text("保存产品型号表成功!"));
 	}
-	
+
 	/**
 	 * 删除数据
 	 */
@@ -109,6 +109,7 @@ public class MesProductModelController extends BaseController {
 	public CommonResp getProductModel(HttpServletRequest request) {
 		CommonResp<MesProductModel> resp = new CommonResp<>();
 		String sn = request.getParameter("sn").trim();
+		String linenSn = request.getParameter("linenSn").trim();
 		if(StringUtils.isEmpty(sn)){
 			resp.setMessage("工件码不能为空");
 			resp.setResult(Global.FALSE);
@@ -142,4 +143,4 @@ public class MesProductModelController extends BaseController {
 		resp.setResult(Global.TRUE);
 		return resp;
 	}
-}
+}

+ 4 - 4
src/main/java/com/jeesite/modules/mes/web/MesProductRepairController.java

@@ -69,7 +69,7 @@ public class MesProductRepairController extends BaseController {
 	public MesProductRepair get(String id, boolean isNewRecord) {
 		return mesProductRepairService.get(id, isNewRecord);
 	}
-	
+
 	/**
 	 * 查询列表
 	 */
@@ -79,7 +79,7 @@ public class MesProductRepairController extends BaseController {
 		model.addAttribute("mesProductRepair", mesProductRepair);
 		return "modules/mes/mesProductRepairList";
 	}
-	
+
 	/**
 	 * 查询列表数据
 	 */
@@ -258,7 +258,7 @@ public class MesProductRepairController extends BaseController {
 
 		mesProductRepairService.save(mesProductRepair);
 
-		resp.setMessage("操作成");
+		resp.setMessage("操作成功");
 		resp.setResult(Global.TRUE);
 		return resp;
 	}
@@ -647,4 +647,4 @@ public class MesProductRepairController extends BaseController {
 		return resp;
 	}
 
-}
+}

+ 27 - 0
src/main/java/com/jeesite/modules/mes/web/MesSmeltingController.java

@@ -78,6 +78,33 @@ public class MesSmeltingController extends BaseController {
 	}
 
 	/**
+	 * 实时数据看板页面
+	 */
+	@RequiresPermissions("mes:mesSmelting:view")
+	@RequestMapping(value = "board")
+	public String board(Model model) {
+		return "modules/mes/mesSmeltingBoard";
+	}
+
+	/**
+	 * 实时数据看板 - 获取指定炉号的最新一条采集数据
+	 * 不传 heatNumber 时,返回全表最新一条(兼容老用法)
+	 */
+	@RequiresPermissions("mes:mesSmelting:view")
+	@RequestMapping(value = "latestData")
+	@ResponseBody
+	public MesSmelting latestData(String heatNumber) {
+		MesSmelting query = new MesSmelting();
+		if (heatNumber != null && !heatNumber.isEmpty()) {
+			query.setHeatNumber(heatNumber);
+		}
+		query.setPage(new Page<>(1, 1)); // 只取最新一条(实体 orderBy 为 a.id DESC)
+		Page<MesSmelting> page = mesSmeltingService.findPage(query);
+		List<MesSmelting> list = page.getList();
+		return ListUtils.isEmpty(list) ? new MesSmelting() : list.get(0);
+	}
+
+	/**
 	 * 保存数据
 	 */
 	@RequiresPermissions("mes:mesSmelting:edit")

+ 2 - 2
src/main/java/com/jeesite/modules/scheduling/GpyXmlScheduling.java

@@ -37,10 +37,10 @@ public class GpyXmlScheduling {
     private static final Logger logger = LoggerFactory.getLogger(GpyXmlScheduling.class);
 
     /** 光谱仪 文件存放目录 */
-    private static final String XML_DIR = "F:\\guangpuyi";
+    private static final String XML_DIR = "D:\\MES";
 
 
-    private static final String BACKUP_DIR = "F:\\guangpuyi\\backup";
+    private static final String BACKUP_DIR = "D:\\MES\\backup";
 
     private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
 

+ 74 - 10
src/main/java/com/jeesite/modules/scheduling/SmeltingScheduling.java

@@ -32,20 +32,22 @@ public class SmeltingScheduling {
     private static final Logger logger = LoggerFactory.getLogger(SmeltingScheduling.class);
 
     /** 默认 PLC IP */
-    private static final String DEFAULT_PLC_IP = "192.168.1.7";
+    private static final String DEFAULT_PLC_IP  = "10.0.20.103";
+    private static final String DEFAULT_PLC_IP2 = "10.0.20.100";
 
     /** 该 PLC 对应的设备编号(用于联动设备报警状态) */
-    private static final String DEVICE_SN = "RL_OP030_01";
+    private static final String DEVICE_SN  = "RL_OP030_01";
+    private static final String DEVICE_SN2 = "RL_OP030_02";
 
     /** 设备报警状态:0=待处理,1=已处理 */
     private static final String STATE_PENDING = "0";
     private static final String STATE_HANDLED = "1";
 
     /** 采集点位地址 */
-    private static final String ADDR_MOLTEN_ALUMINUM = "DB1.450.0";  // 铝液温度
-    private static final String ADDR_ATMOSPHERE      = "DB1.452.0";  // 气氛温度
-    private static final String ADDR_EXHAUST_GAS     = "DB1.454.0";  // 排气温度
-    private static final String ADDR_MELTING         = "DB1.456.0";  // 熔化温度
+    private static final String ADDR_MOLTEN_ALUMINUM = "DB17.0";  // 铝液温度
+    private static final String ADDR_ATMOSPHERE      = "DB17.4";  // 气氛温度
+    private static final String ADDR_EXHAUST_GAS     = "DB17.8";  // 排气温度
+    private static final String ADDR_MELTING         = "DB17.12";  // 熔化温度
 
     @Autowired
     private MesSmeltingService mesSmeltingService;
@@ -56,7 +58,7 @@ public class SmeltingScheduling {
     /**
      * 每 30 秒采集一次
      */
-    @Scheduled(fixedRate = 60000)
+    @Scheduled(fixedRate = 3000)
     public void collect() {
         // 采集开关:未配置则默认启用
         String enabled = Global.getConfig("mes.smelting.enabled");
@@ -71,9 +73,7 @@ public class SmeltingScheduling {
 
         S7PLC s7PLC = null;
         try {
-            s7PLC = new S7PLC(EPlcType.SINUMERIK_828D, ip);
-            // 建立连接 / 检查状态
-            s7PLC.readStatus();
+            s7PLC = new S7PLC(EPlcType.S1200, ip);
 
             Short moltenAluminum = s7PLC.readInt16(ADDR_MOLTEN_ALUMINUM);
             Short atmosphere = s7PLC.readInt16(ADDR_ATMOSPHERE);
@@ -85,6 +85,7 @@ public class SmeltingScheduling {
             mesSmelting.setAtmosphereTemperature(toStr(atmosphere));
             mesSmelting.setExhaustGasTemperature(toStr(exhaustGas));
             mesSmelting.setMeltingTemperature(toStr(melting));
+            mesSmelting.setHeatNumber("一号炉");
 
             mesSmeltingService.save(mesSmelting);
 
@@ -108,6 +109,62 @@ public class SmeltingScheduling {
         }
     }
 
+
+
+    /**
+     * 每 30 秒采集一次 一号机
+     */
+    @Scheduled(fixedRate = 3000)
+    public void collect2() {
+        // 采集开关:未配置则默认启用
+        String enabled = Global.getConfig("mes.smelting2.enabled");
+        if (StringUtils.isNotBlank(enabled) && !"true".equalsIgnoreCase(enabled.trim())) {
+            return;
+        }
+
+        String ip = Global.getConfig("mes.smelting2.plc.ip");
+        if (StringUtils.isBlank(ip)) {
+            ip = DEFAULT_PLC_IP2;
+        }
+
+        S7PLC s7PLC = null;
+        try {
+            s7PLC = new S7PLC(EPlcType.S1200, ip);
+
+            Short moltenAluminum = s7PLC.readInt16(ADDR_MOLTEN_ALUMINUM);
+            Short atmosphere = s7PLC.readInt16(ADDR_ATMOSPHERE);
+            Short exhaustGas = s7PLC.readInt16(ADDR_EXHAUST_GAS);
+            Short melting = s7PLC.readInt16(ADDR_MELTING);
+
+            MesSmelting mesSmelting = new MesSmelting();
+            mesSmelting.setMoltenAluminumTemperature(toStr(moltenAluminum));
+            mesSmelting.setAtmosphereTemperature(toStr(atmosphere));
+            mesSmelting.setExhaustGasTemperature(toStr(exhaustGas));
+            mesSmelting.setMeltingTemperature(toStr(melting));
+            mesSmelting.setHeatNumber("二号炉");
+
+            mesSmeltingService.save(mesSmelting);
+
+            // 连接成功:设备状态置为已处理
+            updateDeviceState2(STATE_HANDLED);
+
+            logger.info("熔炼数据采集成功[{}] 铝液温度:{} 气氛温度:{} 排气温度:{} 熔化温度:{}",
+                    ip, moltenAluminum, atmosphere, exhaustGas, melting);
+        } catch (Exception e) {
+            // 连接/读取失败:设备状态置为待处理
+            updateDeviceState2(STATE_PENDING);
+            logger.error("熔炼数据采集失败[{}]:{}", ip, e.getMessage());
+        } finally {
+            if (s7PLC != null) {
+                try {
+                    s7PLC.close();
+                } catch (Exception e) {
+                    logger.warn("关闭 S7PLC 连接异常:{}", e.getMessage());
+                }
+            }
+        }
+    }
+
     /**
      * 更新设备 RL_OP030_01 的报警状态,异常不向上抛出,避免影响采集主流程
      */
@@ -118,6 +175,13 @@ public class SmeltingScheduling {
             logger.warn("更新设备[{}]状态为[{}]失败:{}", DEVICE_SN, state, e.getMessage());
         }
     }
+    private void updateDeviceState2(String state) {
+        try {
+            mesDeviceAlarmService.updateStateByDeviceSn(DEVICE_SN2, state);
+        } catch (Exception e) {
+            logger.warn("更新设备[{}]状态为[{}]失败:{}", DEVICE_SN2, state, e.getMessage());
+        }
+    }
 
     private String toStr(Short val) {
         return val == null ? null : String.valueOf(val);

+ 11 - 5
src/main/resources/views/modules/mes/mesSmeltingList.html

@@ -7,6 +7,7 @@
 			</div>
 			<div class="box-tools pull-right">
 				<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
+				<a href="${ctx}/mes/mesSmelting/board" class="btn btn-info btnTool" data-title="${text('实时数据看板')}" title="${text('实时数据看板')}"><i class="fa fa-dashboard"></i> ${text('实时看板')}</a>
 				<a href="#" class="btn btn-default" id="btnExport"><i class="glyphicon glyphicon-export"></i> 导出</a>
 				<% if(hasPermi('mes:mesSmelting:edit')){ %>
 						<a href="#" class="btn btn-default" id="btnImport"><i class="glyphicon glyphicon-import"></i> 导入</a>
@@ -18,6 +19,12 @@
 		<div class="box-body">
 			<#form:form id="searchForm" model="${mesSmelting}" action="${ctx}/mes/mesSmelting/listData" method="post" class="form-inline hide"
 					data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
+			<div class="form-group">
+				<label class="control-label">${text('炉号')}:</label>
+				<div class="control-inline">
+					<#form:input path="heatNumber" maxlength="255" class="form-control width-120"/>
+				</div>
+			</div>
 				<div class="form-group">
 					<label class="control-label">${text('铝液温度')}:</label>
 					<div class="control-inline">
@@ -58,9 +65,8 @@
 $('#dataGrid').dataGrid({
 	searchForm: $("#searchForm"),
 	columnModel: [
-		{header:'${text("铝液温度")}', name:'moltenAluminumTemperature', index:'a.molten_aluminum_temperature', width:150, align:"left", frozen:true, formatter: function(val, obj, row, act){
-			return '<a href="${ctx}/mes/mesSmelting/form?id='+row.id+'" class="btnList" data-title="${text("编辑熔炼数据监控")}">'+(val||row.id)+'</a>';
-		}},
+		{header:'${text("炉号")}', name:'heatNumber', index:'a.heat_number', width:150, align:"left"},
+		{header:'${text("铝液温度")}', name:'moltenAluminumTemperature', index:'a.molten_aluminum_temperature', width:150, align:"left"},
 		{header:'${text("气氛温度")}', name:'atmosphereTemperature', index:'a.atmosphere_temperature', width:150, align:"left"},
 		{header:'${text("排气温度")}', name:'exhaustGasTemperature', index:'a.exhaust_gas_temperature', width:150, align:"left"},
 		{header:'${text("熔化温度")}', name:'meltingTemperature', index:'a.melting_temperature', width:150, align:"left"},
@@ -75,7 +81,7 @@ $('#dataGrid').dataGrid({
 	],
 	// 加载成功后执行事件
 	ajaxSuccess: function(data){
-		
+
 	}
 });
 </script><script>
@@ -131,4 +137,4 @@ $('#btnImport').click(function(){
 		</div>
 	</div>
 </form>
-//--></script>
+//--></script>