Files
cigs4/ym-packing/src/main/java/com/cnbm/dispatch/line2/KukaEvent4ThreadLine2.java
caixiang df116253ff 新增
2023-12-20 14:49:42 +08:00

306 lines
13 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.cnbm.dispatch.line2;
import cn.hutool.core.date.DateUtil;
import com.cnbm.dispatch.enums.kuka.step2.Step2Mes2PlcVar;
import com.cnbm.dispatch.enums.kuka.step2.Step2Plc2MesVar;
import com.cnbm.dispatch.enums.kuka.step3.Step3Mes2PlcVar;
import com.cnbm.dispatch.enums.kuka.step3.Step3Plc2MesVar;
import com.cnbm.dispatch.enums.kuka.step4.Step4Mes2PlcVar;
import com.cnbm.dispatch.enums.kuka.step4.Step4Plc2MesVar;
import com.cnbm.packing.entity.WoPowerLevel;
import com.cnbm.packing.service.*;
import com.cnbm.s7.s7connector.enmuc.S7Client;
import com.cnbm.s7.s7connector.type.PlcVar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.text.DecimalFormat;
import java.text.Format;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @Desc: ""
* @Author: caixiang
* @DATE: 2022/12/23 12:33
*/
@Component
@Order(value = 1)
public class KukaEvent4ThreadLine2 implements ApplicationRunner {
private static final Logger logger = LoggerFactory.getLogger("EVENT4NGLine2");
@Autowired
DynamicDataSourceService service;
@Autowired
WoPowerLevelServiceBiz levelServiceBiz;
@Autowired
WoCompensationPowerServiceBiz compensationPowerServiceBiz;
@Autowired
WoPackagingBoxSubstrateServiceBiz substrateServiceBiz;
@Autowired
WoPackagingBoxServiceBiz boxServiceBiz;
public KukaEvent4ThreadLine2(){
this.kukaStep1 = Executors.newScheduledThreadPool(1);
}
private ScheduledExecutorService kukaStep1;
/**
* return
* 成功: 返回相应的object对象
* 失败: 返回null
* */
private Object read(S7Client s7Client, Step4Plc2MesVar var) {
try {
return s7Client.read(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getLength(), var.getStrSize(), var.getType());
}catch (Throwable e){
logger.info("host:"+s7Client.getHost()+" ; read 操作出现问题: {}",e.getMessage(),e);
return null;
}
}
private void write(S7Client s7Client, Step4Mes2PlcVar var, Object newValue) {
if(var.getType().equals(PlcVar.STRING_Array)){
String[] s = (String[])newValue;
String[] ss = (String[])newValue;
if(s.length > var.getLength() ){
ss = new String[var.getLength()];
for(int i=0;i< var.getLength();i++){
ss[i] = s[i];
}
}
s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),ss);
}else {
s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),newValue);
}
}
private Object read(S7Client s7Client, Step2Plc2MesVar var) {
try {
return s7Client.read(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getLength(), var.getStrSize(), var.getType());
}catch (Throwable e){
logger.info("host:"+s7Client.getHost()+" ; read 操作出现问题: {}",e.getMessage(),e);
return null;
}
}
private void write(S7Client s7Client, Step2Mes2PlcVar var, Object newValue) {
if(var.getType().equals(PlcVar.STRING_Array)){
String[] s = (String[])newValue;
String[] ss = (String[])newValue;
if(s.length > var.getLength() ){
ss = new String[var.getLength()];
for(int i=0;i< var.getLength();i++){
ss[i] = s[i];
}
}
s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),ss);
}else {
s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),newValue);
}
}
private Object read(S7Client s7Client, Step3Plc2MesVar var) {
try {
return s7Client.read(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getLength(), var.getStrSize(), var.getType());
}catch (Throwable e){
logger.info("host:"+s7Client.getHost()+" ; read 操作出现问题: {}",e.getMessage(),e);
return null;
}
}
private void write(S7Client s7Client, Step3Mes2PlcVar var, Object newValue) {
if(var.getType().equals(PlcVar.STRING_Array)){
String[] s = (String[])newValue;
String[] ss = (String[])newValue;
if(s.length > var.getLength() ){
ss = new String[var.getLength()];
for(int i=0;i< var.getLength();i++){
ss[i] = s[i];
}
}
s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),ss);
}else {
s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),newValue);
}
}
public String getBoxId(String sapMaterial){
Integer todayBoxNum = service.getTodayBoxNum()+1;
String nowTime = DateUtil.format(new Date(), "yyMMdd");
todayBoxNum+=500;
logger.info("BOXID生成Event-------现在生成boxId sapMaterial: "+sapMaterial+"nowTime:"+nowTime+"todayBoxNum:"+formateString(todayBoxNum));
String res = "301"+sapMaterial+nowTime+formateString(todayBoxNum);
return res;
}
public String getErrorBoxId(String sapMaterial){
String nowTime = DateUtil.format(new Date(), "yyMMdd");
String mixBoxError = "001";
String res = "444"+sapMaterial+nowTime+mixBoxError;
logger.info("BOXID生成Event-------现在生成errBoxId sapMaterial: "+sapMaterial+"nowTime:"+nowTime);
return res;
}
public String removeKG(String str){
return str.substring(0,17);
}
public static void main(String[] args) {
Integer a = 102;
Format f1 = new DecimalFormat("000");
System.out.println(f1.format(a));
}
public String formateString(Integer a){
Format f1 = new DecimalFormat("000");
return f1.format(a);
}
//return true 出现混档了return false 没有出现混档
private boolean isMixLevel(String[] subIds,Integer size){
String correctLevel = substrateServiceBiz.getBySubId(subIds[0]).getPowerLevel();
String errMsg = "以下基板ID出现混档";
boolean res = false;
for(int i=0;i<size;i++){
String powerLevel = substrateServiceBiz.getBySubId(subIds[i]).getPowerLevel();
if(!powerLevel.equals(correctLevel)){
errMsg += "基板ID:"+subIds[i]+" 档位:"+powerLevel+", ";
res = true;
}
}
if(res){
logger.error(errMsg);
}
return res;
}
@Override
public void run(ApplicationArguments args) throws Exception {
kukaStep1.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
//调度开始
Integer subArrived = waitingForTarget(Step4Plc2MesVar.SubArrivedToMes, true);
logger.info("");
logger.info("================================== 现在开始执行 过程四 任务( 开始 ===================================");
if(subArrived != 1){
logger.info("NG口基板Event--- 失败"+" --- "+" MES监听 Step4Plc2MesVar.SubArrivedToMes 是否 等于 true 失败");
} else if (subArrived == 2) {
throw new Exception("MES 监听值出现异常。");
}
logger.info("NG口基板Event --- 成功 ---- MES监听到 Step4Plc2MesVar.SubArrivedToMes==true");
//一. 从plc 中获取 subId
String subId = (String) read(S7Client.S7_DDJ2,Step4Plc2MesVar.SubIdToMes);
Integer lineNum = 1;
//把基板ID字符串的空格去掉因为plc中设置的20位但实际基板ID就是17位因为带空格去数据库查询 有问题的。
if(subId == null ){
logger.info("NG口基板Event--- 失败"+" --- "+" MES采集到null值subId:"+subId);
}
subId = removeKG(subId);
logger.info("NG口基板Event --- 成功 ---- MES 从plu中 read 到基板id:"+subId);
//二. MES 业务
//=============== MES 业务 开始 =================
logger.info("================= 现在开始执行 过程四 任务 ( MES 业务 ) ( 开始 ) ==================");
//1. 从comline数据库中获取 实际pmpp
float pmppActual = service.getPMPPBySubId(subId);
//2. 匹配和计算补偿功率
float pmppCompensation = compensationPowerServiceBiz.calculCompensationPMPP(pmppActual,lineNum);
//3. 依据补偿功率获取工艺参数并且把这些工艺参数传给kuka
WoPowerLevel argByPMPP = levelServiceBiz.getArgByPMPP(pmppCompensation, lineNum);
write(S7Client.S7_DDJ2,Step4Mes2PlcVar.dLable_Pnom,Integer.valueOf(argByPMPP.getPowerClass()));
write(S7Client.S7_DDJ2,Step4Mes2PlcVar.dLable_Voc,argByPMPP.getLableVoc());
write(S7Client.S7_DDJ2,Step4Mes2PlcVar.dLable_Isc,argByPMPP.getLableIsc());
write(S7Client.S7_DDJ2,Step4Mes2PlcVar.dLable_Vmpp,argByPMPP.getLableVmpp());
write(S7Client.S7_DDJ2,Step4Mes2PlcVar.dLable_Impp,argByPMPP.getLableImpp());
logger.info("NG口基板Event--- 采集到 基板ID: "+subId+", 线边号:"+lineNum+"从camline 获取到实际pmpp"+pmppActual+",计算后 补偿功率:"+pmppCompensation+",dLable_Pnom: "+argByPMPP.getPowerClass() +",dLable_Voc: "+argByPMPP.getLableVoc()+",dLable_Isc: "+argByPMPP.getLableIsc()+",dLable_Vmpp: "+argByPMPP.getLableVmpp()+",dLable_Impp: "+argByPMPP.getLableImpp());
logger.info("================= 现在开始执行 过程四 任务 ( MES 业务 - 数据已经传给PLC ) ( 结束 ) ==================");
//=============== MES 业务 结束 =================
//三. 当MES完成任务后把MesToPlc.SubArrivedFinish变量置为true告诉plc我操作完成了
write(S7Client.S7_DDJ2,Step4Mes2PlcVar.SubArrivedFinish,true);
logger.info("NG口基板Event--- 基板ID: "+subId+", SubArrivedFinish置为true 成功");
//四. mes 监控 到PlcToMes.SubArrived==false就把MesToPlc.SubArrivedFinish置为false
Integer subArrived2 = waitingForTarget(Step4Plc2MesVar.SubArrivedToMes, false);
if(subArrived2 != 1){
logger.info("NG口基板Event--- 失败"+" --- "+"MES监听 Step4Plc2MesVar.SubArrivedToMes 是否 等于 1 失败");
}else if (subArrived2 == 2) {
throw new Exception("MES 监听值出现异常。");
}
write(S7Client.S7_DDJ2,Step4Mes2PlcVar.SubArrivedFinish,false);
logger.info("NG口基板Event--- 基板ID: "+subId+", SubArrivedFinish置为 false 成功");
logger.info("================================== 现在开始执行 过程四 任务( 结束 ===================================");
logger.info("");
}catch (Throwable e){
logger.info("NG口基板Event--- 出现异常 : {}",e.getMessage(),e);
}
}
},1,1, TimeUnit.SECONDS);
}
/**
*
* arg:
* Step4Plc2MesVar 参数类型
* targetValue 目的值
* return:
* 2 s7 访问异常;
* 1 成功;
* */
private Integer waitingForTarget(Step4Plc2MesVar var, Boolean targetValue) {
Integer res = 0;
while (true){
try {
Boolean now = (Boolean) read(S7Client.S7_DDJ2,var);
//注意即使now为null ,这里也不会抛出异常,这里很容易产生 空轮询。
if(now == null){
throw new Exception("");
}
if(targetValue.equals(now)){
res = 1;
break;
}
Thread.sleep(200);
}catch (Throwable e){
logger.info("S7 数据采集 异常. 监听 变量 "+var.getName()+" 为目标值:"+targetValue+"失败");
res = 2;
break;
}
}
return res;
}
}