package com.zy.core.model.protocol;
|
|
import com.zy.asrs.entity.BasRgv;
|
import com.zy.asrs.entity.BasRgvErrorLog;
|
import com.zy.core.enums.RgvModeType;
|
import com.zy.core.enums.RgvStatusType;
|
import lombok.Data;
|
|
import javax.swing.*;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
/**
|
* Created by vincent on 2020/8/7
|
*/
|
@Data
|
public class RgvProtocol implements Cloneable{
|
|
private short RgvNo;
|
|
/**
|
* 1 = 手动模式
|
* 2 = 自动模式
|
* 3 = 电脑模式
|
*/
|
public Short mode;
|
|
public RgvModeType modeType;
|
|
private transient Long loadingStartTime;
|
|
/**
|
* 执行优先级
|
* 0:不判断
|
* 1:工位1先执行
|
* 2:工位2先执行
|
*/
|
public Short wrkTaskPri;
|
|
public Short wrkTaskMove1;
|
|
public Short wrkTaskMove2;
|
|
|
/**
|
* RGV当前状态工位1
|
* 0:空闲,无任务
|
* 1:作业中
|
* 2:报警
|
*/
|
public Short status;
|
|
|
/**
|
* 状态枚举
|
*/
|
public RgvStatusType statusType;
|
|
/**
|
* 工位1任务号
|
*/
|
public Integer taskNo1 = 0;
|
/**
|
* 工位1目标站
|
*/
|
public Integer staNo1 = 0;
|
|
/**
|
* RGV工位1当前状态
|
* 0:空闲,无任务
|
* 11:取货中
|
* 12:放货中
|
* 10:任务完成等待WCS确认
|
*/
|
public Short status1;
|
|
/**
|
* 状态枚举
|
*/
|
public RgvStatusType statusType1;
|
|
/**
|
* 工位1有物
|
*/
|
public Boolean loaded1;
|
|
/**
|
* RGV当前位置
|
*/
|
public Integer RgvPos;
|
|
/**
|
* RGV当前目的位置
|
*/
|
public Integer RgvPosDestination;
|
|
|
/**
|
* 走行在定位
|
* 0 = 在定位
|
* 1 = 不在定位
|
*/
|
public Short walkPos;
|
|
/**
|
* 急停触发
|
*/
|
public Boolean err1;
|
|
/**
|
*
|
*/
|
public Boolean err2;
|
|
/**
|
* 有资料无物
|
*/
|
public Boolean err3;
|
|
/**
|
* 命令错误走行联调冲突
|
*/
|
public Boolean err4;
|
|
/**
|
* 目标为超过行走极限
|
*/
|
public Boolean err5;
|
|
/**
|
* 变频器异常
|
*/
|
public Boolean err6;
|
|
/**
|
* 光电异常
|
*/
|
public Boolean err7;
|
|
public Boolean err8;
|
public Boolean err9;
|
public Boolean err10;
|
public Boolean err11;
|
public Boolean err12;
|
|
////////////////////// 工位2定义 //////////////////////////////////////////////////
|
/**
|
* 工位2任务号
|
*/
|
public Integer taskNo2 = 0;
|
/**
|
* 工位1目标站
|
*/
|
public Integer staNo2 = 0;
|
|
/**
|
* RGV工位2当前状态
|
* 0:空闲,无任务
|
* 11:取货中
|
* 12:放货中
|
* 10:任务完成等待WCS确认
|
*/
|
public Short status2;
|
|
/**
|
* 状态枚举
|
*/
|
public RgvStatusType statusType2;
|
|
/**
|
* 工位2有物
|
*/
|
public Boolean loaded2;
|
|
// /**
|
// * 急停
|
// */
|
// public Boolean err21;
|
//
|
// /**
|
// * 有物无资料
|
// */
|
// public Boolean err22;
|
//
|
// /**
|
// * 有资料无物
|
// */
|
// public Boolean err23;
|
//
|
// /**
|
// * 命令错误走行联调冲突
|
// */
|
// public Boolean err24;
|
//
|
// /**
|
// * 目标为超过行走极限
|
// */
|
// public Boolean err25;
|
//
|
// /**
|
// * 变频器异常
|
// */
|
// public Boolean err26;
|
//
|
// /**
|
// * 光电异常
|
// */
|
// public Boolean err27;
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
//配置信号-----------------------------------------------------------------------------
|
// 故障读取锁定标记
|
private boolean errorMk = false;
|
//写入标记
|
private boolean writeMk = true;
|
private Boolean chainForward1 = false; // 链条前进 1
|
private Boolean chainReverse1 = false; // 链条后退 1
|
private Boolean inverterAlarm = false; // 变频器报警
|
private Boolean leftOverlimit2 = false; // 左超限 2
|
private Boolean rightOverlimit2 = false; // 右超限 2
|
private Boolean leftAtPosition2 = false; // 左到位 2
|
private Boolean rightAtPosition2 = false; // 右到位 2
|
private Boolean cargoSpeedReduction = false; // 货物减速
|
private Boolean conveyorInverterAlarm2 = false; // 输送变频器报警 2
|
|
private Boolean emergencyStop = false; // 急停触发
|
private Boolean slot1EmptyNoData = false; // 1号位有物无资料
|
private Boolean slot2EmptyNoData = false; // 2号位有物无资料
|
private Boolean commandErrorChainConflict = false; // 命令错误走链条冲突
|
private Boolean targetPositionIssue = false; // 目标位下发错误
|
private Boolean travelInverterError = false; // 走行变频器异常
|
private Boolean photoelectric1Error = false; // 1号光电异常
|
private Boolean photoelectric2Error = false; // 2号光电异常
|
private Boolean timeoutConnectionWithLine = false; // 与输线时接超时
|
private Boolean leftRollerTimeout = false; // 左侧滚筒运行超时
|
private Boolean rightRollerTimeout = false; // 右侧滚筒运行超时
|
private Boolean rgvRunTimeout = false; // rgv运行超时
|
private Boolean position1ChainInverterError = false; // 1号工位链条变频器异常
|
private Boolean position2ChainInverterError = false; // 2号工位链条变频器异常
|
private Boolean frontRearLimit = false; // 前后极限位
|
private Boolean emergencyButton = false; // 急停按钮
|
private Boolean forwardButton = false; // 前进按钮
|
private Boolean reverseButton = false; // 后退按钮
|
private Boolean localRemote = false; // 本地/远程
|
private Boolean reset = false; // 复位
|
private Boolean travelBrakeSwitch = false; // 走行抱闸开关钮
|
private Boolean travelSpeedLimitPhotoelectric = false; // 走行强制减速光电
|
private Boolean leftOverlimit1 = false; // 左超限 1
|
private Boolean rightOverlimit1 = false; // 右超限 1
|
private Boolean leftAtPosition1 = false; // 左到位 1
|
private Boolean rightAtPosition1 = false; // 右到位 1
|
|
private Boolean rightConveyor2 = false; // 右输送 2
|
private Boolean leftConveyor2 = false; // 左输送 2
|
//---------------------------------------------------------------------
|
/**
|
* 异常码
|
*/
|
public Short alarm;
|
|
/**
|
* 心跳指令 1-2每秒切换一次
|
*/
|
public Short heart;
|
|
private Short temp1;
|
|
private Short temp2;
|
|
private Short temp3;
|
|
private Short temp4;
|
|
private Short temp5;
|
|
/**
|
* X行走行速度m/min
|
*/
|
private Float xSpeed;
|
|
/**
|
* 堆垛机累计走行距离km
|
*/
|
public Float xDistance;
|
|
/**
|
* 堆垛机累计走行时长h
|
*/
|
public Float xDuration;
|
|
|
public BasRgvErrorLog toSqlModelError(){
|
BasRgvErrorLog basRgvErrorLog = new BasRgvErrorLog();
|
basRgvErrorLog.setRgvNo((int) RgvNo);// 设备号(假设有定义 siteId)
|
basRgvErrorLog.setChainForward1(chainForward1 ? "Y" : "N"); // 链条前进 1
|
basRgvErrorLog.setChainReverse1(chainReverse1 ? "Y" : "N"); // 链条后退 1
|
basRgvErrorLog.setInverterAlarm(inverterAlarm ? "Y" : "N"); // 变频器报警
|
basRgvErrorLog.setLeftOverlimit2(leftOverlimit2 ? "Y" : "N"); // 左超限 2
|
basRgvErrorLog.setRightOverlimit2(rightOverlimit2 ? "Y" : "N"); // 右超限 2
|
basRgvErrorLog.setLeftAtPosition2(leftAtPosition2 ? "Y" : "N"); // 左到位 2
|
basRgvErrorLog.setRightAtPosition2(rightAtPosition2 ? "Y" : "N"); // 右到位 2
|
basRgvErrorLog.setCargoSpeedReduction(cargoSpeedReduction ? "Y" : "N"); // 货物减速
|
basRgvErrorLog.setConveyorInverterAlarm2(conveyorInverterAlarm2 ? "Y" : "N"); // 输送变频器报警 2
|
basRgvErrorLog.setEmergencyStop(emergencyStop ? "Y" : "N"); // 急停触发
|
basRgvErrorLog.setSlot1EmptyNoData(slot1EmptyNoData ? "Y" : "N"); // 1号位有物无资料
|
basRgvErrorLog.setSlot2EmptyNoData(slot2EmptyNoData ? "Y" : "N"); // 2号位有物无资料
|
basRgvErrorLog.setCommandErrorChainConflict(commandErrorChainConflict ? "Y" : "N"); // 命令错误走链条冲突
|
basRgvErrorLog.setTargetPositionIssue(targetPositionIssue ? "Y" : "N"); // 目标位下发错误
|
basRgvErrorLog.setTravelInverterError(travelInverterError ? "Y" : "N"); // 走行变频器异常
|
basRgvErrorLog.setPhotoelectric1Error(photoelectric1Error ? "Y" : "N"); // 1号光电异常
|
basRgvErrorLog.setPhotoelectric2Error(photoelectric2Error ? "Y" : "N"); // 2号光电异常
|
basRgvErrorLog.setTimeoutConnectionWithLine(timeoutConnectionWithLine ? "Y" : "N"); // 与输线时接超时
|
basRgvErrorLog.setLeftRollerTimeout(leftRollerTimeout ? "Y" : "N"); // 左侧滚筒运行超时
|
basRgvErrorLog.setRightRollerTimeout(rightRollerTimeout ? "Y" : "N"); // 右侧滚筒运行超时
|
basRgvErrorLog.setRgvRunTimeout(rgvRunTimeout ? "Y" : "N"); // rgv运行超时
|
basRgvErrorLog.setPosition1ChainInverterError(position1ChainInverterError ? "Y" : "N"); // 1号工位链条变频器异常
|
basRgvErrorLog.setPosition2ChainInverterError(position2ChainInverterError ? "Y" : "N"); // 2号工位链条变频器异常
|
basRgvErrorLog.setFrontRearLimit(frontRearLimit ? "Y" : "N"); // 前后极限位
|
basRgvErrorLog.setEmergencyButton(emergencyButton ? "Y" : "N"); // 急停按钮
|
basRgvErrorLog.setForwardButton(forwardButton ? "Y" : "N"); // 前进按钮
|
basRgvErrorLog.setReverseButton(reverseButton ? "Y" : "N"); // 后退按钮
|
basRgvErrorLog.setLocalRemote(localRemote ? "Y" : "N"); // 本地/远程
|
basRgvErrorLog.setReset(reset ? "Y" : "N"); // 复位
|
basRgvErrorLog.setTravelBrakeSwitch(travelBrakeSwitch ? "Y" : "N"); // 走行抱闸开关钮
|
basRgvErrorLog.setTravelSpeedLimitPhotoelectric(travelSpeedLimitPhotoelectric ? "Y" : "N"); // 走行强制减速光电
|
basRgvErrorLog.setLeftOverlimit1(leftOverlimit1 ? "Y" : "N"); // 左超限 1
|
basRgvErrorLog.setRightOverlimit1(rightOverlimit1 ? "Y" : "N"); // 右超限 1
|
basRgvErrorLog.setLeftAtPosition1(leftAtPosition1 ? "Y" : "N"); // 左到位 1
|
basRgvErrorLog.setRightAtPosition1(rightAtPosition1 ? "Y" : "N"); // 右到位 1
|
basRgvErrorLog.setRightConveyor2(rightConveyor2 ? "Y" : "N"); // 右输送 2
|
basRgvErrorLog.setLeftConveyor2(leftConveyor2 ? "Y" : "N"); // 左输送 2
|
|
return basRgvErrorLog;
|
}
|
|
public void setMode(Short mode) {
|
this.mode = mode;
|
this.modeType = RgvModeType.get(mode);
|
}
|
|
public void setMode(RgvModeType type) {
|
this.modeType = type;
|
this.mode = RgvModeType.get(type).id.shortValue();
|
}
|
|
public void setStatus(Short status){
|
this.status = status;
|
this.statusType = RgvStatusType.get(status);
|
}
|
|
public void setStatus(RgvStatusType type){
|
this.statusType = type;
|
this.status = RgvStatusType.get(type).id.shortValue();
|
}
|
|
public void setStatus1(Short status1){
|
this.status1 = status1;
|
this.statusType1 = RgvStatusType.get(status1);
|
}
|
|
public void setStatus1(RgvStatusType type1){
|
this.statusType1 = type1;
|
this.status1 = RgvStatusType.get(type1).id.shortValue();
|
}
|
|
public void setStatus2(Short status2){
|
this.status2 = status2;
|
this.statusType2 = RgvStatusType.get(status2);
|
}
|
|
public void setStatus2(RgvStatusType type2){
|
this.statusType2 = type2;
|
this.status2 = RgvStatusType.get(type2).id.shortValue();
|
}
|
|
public boolean isLoaded1ing() {
|
return Boolean.TRUE.equals(this.loaded1);
|
}
|
|
public boolean isLoaded2ing() {
|
return Boolean.TRUE.equals(this.loaded2);
|
}
|
|
|
/**
|
* 最近一次入出库类型
|
* I:入库
|
* O:出库
|
*/
|
private String lastIo = "I";
|
|
|
public BasRgv toSqlModel(BasRgv basRgv){
|
if (alarm!=null) {
|
basRgv.setRgvErr(alarm.longValue());
|
}
|
basRgv.setWrkNo1(taskNo1.intValue());
|
basRgv.setWrkNo2(taskNo2.intValue());
|
return basRgv;
|
}
|
|
public void setxSpeed(Short xSpeed) {
|
this.xSpeed = Float.valueOf(xSpeed);
|
}
|
|
public void setxDistance(Short xDistance) {
|
this.xDistance = Float.valueOf(xDistance);
|
}
|
|
public void setxDuration(Short xDuration) {
|
this.xDuration = Float.valueOf(xDuration);
|
}
|
|
public Integer getRgvPosI(){
|
//需要根据现场改造 根据读到的值获取对应站点位置
|
Map<Short,Integer> map = new HashMap<>();
|
map.put((short) 1,1004);map.put((short) 2,1007);
|
map.put((short) 3,1010);map.put((short) 4,1014);
|
map.put((short) 5,1018);map.put((short) 6,1021);
|
map.put((short) 7,1024); map.put((short) 8,1028);
|
map.put((short) 9,1031);map.put((short) 10,1035);
|
map.put((short) 11,2003);map.put((short) 12,2006);
|
map.put((short) 13,2009);map.put((short) 14,2012);
|
map.put((short) 15,2015);map.put((short) 16,2018);
|
map.put((short) 17,2021);map.put((short) 18,2024);
|
map.put((short) 19,2027);map.put((short) 20,2030);
|
if (RgvPos==null) return 0;
|
|
return map.get(RgvPos);
|
}
|
|
public Integer getRgvPosI2() {
|
// key: 站点号 value: 基准物理位置
|
Map<Integer, Integer> posMap = new HashMap<>();
|
posMap.put(1004, 6534);
|
posMap.put(1007, 33634);
|
posMap.put(1010, 75174);
|
posMap.put(1014, 102124);
|
posMap.put(1018, 138224);
|
posMap.put(1021, 178034);
|
posMap.put(1024, 219684);
|
posMap.put(1028, 246724);
|
posMap.put(1031, 288194);
|
posMap.put(2003, 314954);
|
posMap.put(2006, 288094);
|
posMap.put(2009, 246574);
|
posMap.put(2012, 219584);
|
posMap.put(2015, 177934);
|
posMap.put(2018, 138126);
|
posMap.put(2021, 102124);
|
posMap.put(2024, 75174);
|
posMap.put(2027, 33748);
|
posMap.put(2030, 6449);
|
|
|
int tolerance = 200; // 允许误差范围
|
|
for (Map.Entry<Integer, Integer> entry : posMap.entrySet()) {
|
int site = entry.getKey();
|
int basePos = entry.getValue();
|
if (Math.abs(RgvPos - basePos) <= tolerance) {
|
return site;
|
}
|
}
|
|
return 0; // 没匹配到站点
|
}
|
|
|
@Override
|
public RgvProtocol clone() {
|
try {
|
return (RgvProtocol) super.clone();
|
} catch (CloneNotSupportedException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
}
|