src/main/java/com/zy/asrs/controller/BasRgvController.java
New file @@ -0,0 +1,123 @@ package com.zy.asrs.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; import com.core.common.DateUtils; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.service.BasRgvService; import com.core.annotations.ManagerAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.R; import com.zy.common.web.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.*; @RestController public class BasRgvController extends BaseController { @Autowired private BasRgvService basRgvService; @RequestMapping(value = "/basRgv/{id}/auth") @ManagerAuth public R get(@PathVariable("id") String id) { return R.ok(basRgvService.selectById(String.valueOf(id))); } @RequestMapping(value = "/basRgv/list/auth") @ManagerAuth public R list(@RequestParam(defaultValue = "1")Integer curr, @RequestParam(defaultValue = "10")Integer limit, @RequestParam(required = false)String orderByField, @RequestParam(required = false)String orderByType, @RequestParam Map<String, Object> param){ EntityWrapper<BasRgv> wrapper = new EntityWrapper<>(); excludeTrash(param); convert(param, wrapper); if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} return R.ok(basRgvService.selectPage(new Page<>(curr, limit), wrapper)); } private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){ for (Map.Entry<String, Object> entry : map.entrySet()){ String val = String.valueOf(entry.getValue()); if (val.contains(RANGE_TIME_LINK)){ String[] dates = val.split(RANGE_TIME_LINK); wrapper.ge(entry.getKey(), DateUtils.convert(dates[0])); wrapper.le(entry.getKey(), DateUtils.convert(dates[1])); } else { wrapper.like(entry.getKey(), val); } } } @RequestMapping(value = "/basRgv/add/auth") @ManagerAuth public R add(BasRgv basRgv) { basRgvService.insert(basRgv); return R.ok(); } @RequestMapping(value = "/basRgv/update/auth") @ManagerAuth public R update(BasRgv basRgv){ if (Cools.isEmpty(basRgv) || null==basRgv.getRgvNo()){ return R.error(); } basRgvService.updateById(basRgv); return R.ok(); } @RequestMapping(value = "/basRgv/delete/auth") @ManagerAuth public R delete(@RequestParam(value="ids[]") Long[] ids){ for (Long id : ids){ basRgvService.deleteById(id); } return R.ok(); } @RequestMapping(value = "/basRgv/export/auth") @ManagerAuth public R export(@RequestBody JSONObject param){ EntityWrapper<BasRgv> wrapper = new EntityWrapper<>(); List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class); Map<String, Object> map = excludeTrash(param.getJSONObject("basRgv")); convert(map, wrapper); List<BasRgv> list = basRgvService.selectList(wrapper); return R.ok(exportSupport(list, fields)); } @RequestMapping(value = "/basRgvQuery/auth") @ManagerAuth public R query(String condition) { EntityWrapper<BasRgv> wrapper = new EntityWrapper<>(); wrapper.like("rgv_no", condition); Page<BasRgv> page = basRgvService.selectPage(new Page<>(0, 10), wrapper); List<Map<String, Object>> result = new ArrayList<>(); for (BasRgv basRgv : page.getRecords()){ Map<String, Object> map = new HashMap<>(); map.put("id", basRgv.getRgvNo()); map.put("value", basRgv.getRgvNo()); result.add(map); } return R.ok(result); } @RequestMapping(value = "/basRgv/check/column/auth") @ManagerAuth public R query(@RequestBody JSONObject param) { Wrapper<BasRgv> wrapper = new EntityWrapper<BasRgv>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val")); if (null != basRgvService.selectOne(wrapper)){ return R.parse(BaseRes.REPEAT).add(getComment(BasRgv.class, String.valueOf(param.get("key")))); } return R.ok(); } } src/main/java/com/zy/asrs/controller/BasRgvErrController.java
New file @@ -0,0 +1,123 @@ package com.zy.asrs.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; import com.core.common.DateUtils; import com.zy.asrs.entity.BasRgvErr; import com.zy.asrs.service.BasRgvErrService; import com.core.annotations.ManagerAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.R; import com.zy.common.web.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.*; @RestController public class BasRgvErrController extends BaseController { @Autowired private BasRgvErrService basRgvErrService; @RequestMapping(value = "/basRgvErr/{id}/auth") @ManagerAuth public R get(@PathVariable("id") String id) { return R.ok(basRgvErrService.selectById(String.valueOf(id))); } @RequestMapping(value = "/basRgvErr/list/auth") @ManagerAuth public R list(@RequestParam(defaultValue = "1")Integer curr, @RequestParam(defaultValue = "10")Integer limit, @RequestParam(required = false)String orderByField, @RequestParam(required = false)String orderByType, @RequestParam Map<String, Object> param){ EntityWrapper<BasRgvErr> wrapper = new EntityWrapper<>(); excludeTrash(param); convert(param, wrapper); if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} return R.ok(basRgvErrService.selectPage(new Page<>(curr, limit), wrapper)); } private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){ for (Map.Entry<String, Object> entry : map.entrySet()){ String val = String.valueOf(entry.getValue()); if (val.contains(RANGE_TIME_LINK)){ String[] dates = val.split(RANGE_TIME_LINK); wrapper.ge(entry.getKey(), DateUtils.convert(dates[0])); wrapper.le(entry.getKey(), DateUtils.convert(dates[1])); } else { wrapper.like(entry.getKey(), val); } } } @RequestMapping(value = "/basRgvErr/add/auth") @ManagerAuth public R add(BasRgvErr basRgvErr) { basRgvErrService.insert(basRgvErr); return R.ok(); } @RequestMapping(value = "/basRgvErr/update/auth") @ManagerAuth public R update(BasRgvErr basRgvErr){ if (Cools.isEmpty(basRgvErr) || null==basRgvErr.getErrorCode()){ return R.error(); } basRgvErrService.updateById(basRgvErr); return R.ok(); } @RequestMapping(value = "/basRgvErr/delete/auth") @ManagerAuth public R delete(@RequestParam(value="ids[]") Long[] ids){ for (Long id : ids){ basRgvErrService.deleteById(id); } return R.ok(); } @RequestMapping(value = "/basRgvErr/export/auth") @ManagerAuth public R export(@RequestBody JSONObject param){ EntityWrapper<BasRgvErr> wrapper = new EntityWrapper<>(); List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class); Map<String, Object> map = excludeTrash(param.getJSONObject("basRgvErr")); convert(map, wrapper); List<BasRgvErr> list = basRgvErrService.selectList(wrapper); return R.ok(exportSupport(list, fields)); } @RequestMapping(value = "/basRgvErrQuery/auth") @ManagerAuth public R query(String condition) { EntityWrapper<BasRgvErr> wrapper = new EntityWrapper<>(); wrapper.like("id", condition); Page<BasRgvErr> page = basRgvErrService.selectPage(new Page<>(0, 10), wrapper); List<Map<String, Object>> result = new ArrayList<>(); for (BasRgvErr basRgvErr : page.getRecords()){ Map<String, Object> map = new HashMap<>(); map.put("id", basRgvErr.getErrorCode()); map.put("value", basRgvErr.getErrorCode()); result.add(map); } return R.ok(result); } @RequestMapping(value = "/basRgvErr/check/column/auth") @ManagerAuth public R query(@RequestBody JSONObject param) { Wrapper<BasRgvErr> wrapper = new EntityWrapper<BasRgvErr>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val")); if (null != basRgvErrService.selectOne(wrapper)){ return R.parse(BaseRes.REPEAT).add(getComment(BasRgvErr.class, String.valueOf(param.get("key")))); } return R.ok(); } } src/main/java/com/zy/asrs/entity/BasRgv.java
New file @@ -0,0 +1,209 @@ package com.zy.asrs.entity; import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.annotations.TableField; import com.core.common.SpringUtils; import com.zy.system.service.UserService; import com.zy.system.entity.User; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.format.annotation.DateTimeFormat; import com.core.common.SpringUtils; import com.zy.system.service.UserService; import com.zy.system.entity.User; import java.text.SimpleDateFormat; import java.util.Date; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.baomidou.mybatisplus.annotations.TableName; import java.io.Serializable; @Data @TableName("asr_bas_rgv") public class BasRgv implements Serializable { private static final long serialVersionUID = 1L; /** * RGV编号 */ @ApiModelProperty(value= "RGV编号") @TableId(value = "rgv_no", type = IdType.INPUT) @TableField("rgv_no") private Integer rgvNo; /** * 可入 */ @ApiModelProperty(value= "可入") @TableField("in_enable") private Integer inEnable; /** * 可出 */ @ApiModelProperty(value= "可出") @TableField("out_enable") private Integer outEnable; /** * 作业态 */ @ApiModelProperty(value= "作业态") @TableField("rgv_sts") private Integer rgvSts; /** * 任务号 */ @ApiModelProperty(value= "任务号") @TableField("wrk_no1") private Integer wrkNo1; /** * 堆垛机号 */ @ApiModelProperty(value= "堆垛机号") @TableField("wrk_no2") private Integer wrkNo2; /** * 错误码 */ @ApiModelProperty(value= "错误码") @TableField("rgv_err") private Long rgvErr; /** * 标记 */ @ApiModelProperty(value= "标记") @TableField("pak_mk") private String pakMk; /** * 状态 1: 正常 0: 禁用 */ @ApiModelProperty(value= "状态 1: 正常 0: 禁用 ") private Integer status; /** * 添加人员 */ @ApiModelProperty(value= "添加人员") @TableField("create_by") private Long createBy; /** * 添加时间 */ @ApiModelProperty(value= "添加时间") @TableField("create_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date createTime; /** * 修改人员 */ @ApiModelProperty(value= "修改人员") @TableField("update_by") private Long updateBy; /** * 修改时间 */ @ApiModelProperty(value= "修改时间") @TableField("update_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateTime; /** * 备注 */ @ApiModelProperty(value= "备注") private String memo; public BasRgv() {} public BasRgv(Integer rgvNo,Integer inEnable,Integer outEnable,Integer rgvSts,Integer wrkNo1,Integer wrkNo2,Long rgvErr,String pakMk,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { this.rgvNo = rgvNo; this.inEnable = inEnable; this.outEnable = outEnable; this.rgvSts = rgvSts; this.wrkNo1 = wrkNo1; this.wrkNo2 = wrkNo2; this.rgvErr = rgvErr; this.pakMk = pakMk; this.status = status; this.createBy = createBy; this.createTime = createTime; this.updateBy = updateBy; this.updateTime = updateTime; this.memo = memo; } // BasRgv basRgv = new BasRgv( // null, // RGV编号[非空] // null, // 可入 // null, // 可出 // null, // 作业态 // null, // 任务号 // null, // 堆垛机号 // null, // 错误码 // null, // 标记 // null, // 状态 // null, // 添加人员 // null, // 添加时间 // null, // 修改人员 // null, // 修改时间 // null // 备注 // ); public String getStatus$(){ if (null == this.status){ return null; } switch (this.status){ case 1: return "正常"; case 0: return "禁用"; default: return String.valueOf(this.status); } } public String getCreateBy$(){ UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.createBy); if (!Cools.isEmpty(user)){ return String.valueOf(user.getId()); } return null; } public String getCreateTime$(){ if (Cools.isEmpty(this.createTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); } public String getUpdateBy$(){ UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.updateBy); if (!Cools.isEmpty(user)){ return String.valueOf(user.getId()); } return null; } public String getUpdateTime$(){ if (Cools.isEmpty(this.updateTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); } } src/main/java/com/zy/asrs/entity/BasRgvErr.java
New file @@ -0,0 +1,127 @@ package com.zy.asrs.entity; import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.annotations.TableField; import com.core.common.SpringUtils; import com.zy.system.service.UserService; import com.zy.system.entity.User; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.format.annotation.DateTimeFormat; import com.core.common.SpringUtils; import com.zy.system.service.UserService; import com.zy.system.entity.User; import java.text.SimpleDateFormat; import java.util.Date; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.baomidou.mybatisplus.annotations.TableName; import java.io.Serializable; @Data @TableName("asr_bas_rgv_err") public class BasRgvErr implements Serializable { private static final long serialVersionUID = 1L; /** * 异常码 */ @ApiModelProperty(value= "异常码") @TableId(value = "error_code", type = IdType.INPUT) @TableField("error_code") private Long errorCode; /** * 异常 */ @ApiModelProperty(value= "异常") @TableField("err_name") private String errName; /** * 修改人员 */ @ApiModelProperty(value= "修改人员") @TableField("modi_user") private Long modiUser; /** * 修改时间 */ @ApiModelProperty(value= "修改时间") @TableField("modi_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date modiTime; /** * 添加人员 */ @ApiModelProperty(value= "添加人员") @TableField("appe_user") private Long appeUser; /** * 添加时间 */ @ApiModelProperty(value= "添加时间") @TableField("appe_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date appeTime; public BasRgvErr() {} public BasRgvErr(Long errorCode,String errName,Long modiUser,Date modiTime,Long appeUser,Date appeTime) { this.errorCode = errorCode; this.errName = errName; this.modiUser = modiUser; this.modiTime = modiTime; this.appeUser = appeUser; this.appeTime = appeTime; } // BasRgvErr basRgvErr = new BasRgvErr( // null, // 异常码[非空] // null, // 异常 // null, // 修改人员 // null, // 修改时间 // null, // 添加人员 // null // 添加时间 // ); public String getModiUser$(){ UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.modiUser); if (!Cools.isEmpty(user)){ return String.valueOf(user.getNickname()); } return null; } public String getModiTime$(){ if (Cools.isEmpty(this.modiTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime); } public String getAppeUser$(){ UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.appeUser); if (!Cools.isEmpty(user)){ return String.valueOf(user.getNickname()); } return null; } public String getAppeTime$(){ if (Cools.isEmpty(this.appeTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime); } } src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.mapper; import com.zy.asrs.entity.BasRgvErr; import com.baomidou.mybatisplus.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface BasRgvErrMapper extends BaseMapper<BasRgvErr> { } src/main/java/com/zy/asrs/mapper/BasRgvMapper.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.mapper; import com.zy.asrs.entity.BasRgv; import com.baomidou.mybatisplus.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface BasRgvMapper extends BaseMapper<BasRgv> { } src/main/java/com/zy/asrs/service/BasRgvErrService.java
New file @@ -0,0 +1,8 @@ package com.zy.asrs.service; import com.zy.asrs.entity.BasRgvErr; import com.baomidou.mybatisplus.service.IService; public interface BasRgvErrService extends IService<BasRgvErr> { } src/main/java/com/zy/asrs/service/BasRgvService.java
New file @@ -0,0 +1,8 @@ package com.zy.asrs.service; import com.zy.asrs.entity.BasRgv; import com.baomidou.mybatisplus.service.IService; public interface BasRgvService extends IService<BasRgv> { } src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.service.impl; import com.zy.asrs.mapper.BasRgvErrMapper; import com.zy.asrs.entity.BasRgvErr; import com.zy.asrs.service.BasRgvErrService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @Service("basRgvErrService") public class BasRgvErrServiceImpl extends ServiceImpl<BasRgvErrMapper, BasRgvErr> implements BasRgvErrService { } src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.service.impl; import com.zy.asrs.mapper.BasRgvMapper; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.service.BasRgvService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @Service("basRgvService") public class BasRgvServiceImpl extends ServiceImpl<BasRgvMapper, BasRgv> implements BasRgvService { } src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@ generator.url="127.0.0.1:1433;databasename=ghtzasrs"; generator.username="sa"; generator.password="sa@123"; generator.table="sys_saas_log"; generator.table="asr_bas_rgv_err"; generator.packagePath="com.zy.asrs"; generator.js = false; generator.html = false; src/main/java/com/zy/core/RgvThread.java
New file @@ -0,0 +1,4 @@ package com.zy.core; public interface RgvThread extends ThreadHandler{ } src/main/java/com/zy/core/ServerBootstrap.java
@@ -59,6 +59,10 @@ for (Slave barcode : slaveProperties.getBarcode()) { MessageQueue.init(SlaveType.Barcode, barcode); } // 初始化Rgv小车mq for (Slave rgv : slaveProperties.getRgv()) { MessageQueue.init(SlaveType.Rgv, rgv); } // // 初始化Led灯mq // for (Slave led : slaveProperties.getLed()) { // MessageQueue.init(SlaveType.Led, led); src/main/java/com/zy/core/cache/MessageQueue.java
@@ -29,6 +29,7 @@ // 台车mq交换机 private static final Map<Integer, ConcurrentLinkedQueue<Task>> CAR_EXCHANGE = new ConcurrentHashMap<>(); private static final Map<Integer, LinkedBlockingQueue<Task>> RGV_EXCHANGE = new ConcurrentHashMap<>(); /** * mq 交换机初始化 */ @@ -36,6 +37,9 @@ switch (type) { case Crn: CRN_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1)); break; case Rgv: RGV_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1)); break; case Devp: DEVP_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>()); @@ -65,6 +69,8 @@ switch (type) { case Crn: return CRN_EXCHANGE.get(id).offer(task); case Rgv: return RGV_EXCHANGE.get(id).offer(task); case Devp: return DEVP_EXCHANGE.get(id).offer(task); case Barcode: @@ -88,6 +94,8 @@ switch (type) { case Crn: return CRN_EXCHANGE.get(id).poll(); case Rgv: return RGV_EXCHANGE.get(id).poll(); case Devp: return DEVP_EXCHANGE.get(id).poll(); case Barcode: @@ -110,6 +118,8 @@ switch (type) { case Crn: return CRN_EXCHANGE.get(id).peek(); case Rgv: return RGV_EXCHANGE.get(id).peek(); case Devp: return DEVP_EXCHANGE.get(id).peek(); case Barcode: @@ -128,9 +138,11 @@ public static void clear(SlaveType type, Integer id){ switch (type) { case Crn: CRN_EXCHANGE.get(id).clear(); break; case Rgv: RGV_EXCHANGE.get(id).clear(); break; case Devp: DEVP_EXCHANGE.get(id).clear(); break; src/main/java/com/zy/core/cache/OutputQueue.java
@@ -17,4 +17,8 @@ public static ArrayBlockingQueue<JSONObject> BARCODE = new ArrayBlockingQueue<>(32); // 磅秤输出日志 public static ArrayBlockingQueue<JSONObject> SCALE = new ArrayBlockingQueue<>(32); // 堆垛机输出日志 public static ArrayBlockingQueue<String> RGV = new ArrayBlockingQueue<>(32); } src/main/java/com/zy/core/enums/RgvModeType.java
New file @@ -0,0 +1,43 @@ package com.zy.core.enums; public enum RgvModeType { NONE(-1, "离线"), STOP(0, "关机"), HAND(1, "手动"), HALF_AUTO(2, "半自动"), AUTO(3, "自动"), AUTO2(100, "其它"), ; public Integer id; public String desc; RgvModeType(Integer id, String desc) { this.id = id; this.desc = desc; } public static RgvModeType get(Short id) { if (null == id) { return null; } for (RgvModeType type : RgvModeType.values()) { if (type.id.equals(id.intValue())) { return type; } } return null; } public static RgvModeType get(RgvModeType type) { if (null == type) { return null; } for (RgvModeType rgvModeType : RgvModeType.values()) { if (rgvModeType == type) { return rgvModeType; } } return null; } } src/main/java/com/zy/core/enums/RgvStatusType.java
New file @@ -0,0 +1,46 @@ package com.zy.core.enums; public enum RgvStatusType { NONE(-1, "离线"), IDLE(0, "空闲"), WORKING(1, "作业中"), SOS(2, "报警"), WORKING1(3, "作业中"), FETCHING(11, "取货中"), PUTTING(12, "放货中"), WAITING(90, "任务完成等待WCS确认"), FETCHWAITING(91, "取货任务完成等待WCS确认"), ; public Integer id; public String desc; RgvStatusType(Integer id, String desc) { this.id = id; this.desc = desc; } public static RgvStatusType get(Short id) { if (null == id) { return null; } for (RgvStatusType type : RgvStatusType.values()) { if (type.id.equals(id.intValue())) { return type; } } return NONE; } public static RgvStatusType get(RgvStatusType type) { if (null == type) { return null; } for (RgvStatusType rgvStatusType : RgvStatusType.values()) { if (rgvStatusType == type) { return rgvStatusType; } } return null; } } src/main/java/com/zy/core/enums/RgvTaskModeType.java
New file @@ -0,0 +1,47 @@ package com.zy.core.enums; public enum RgvTaskModeType { NONE(0), // 无 FETCH(1), // 取货 PUT(2), // 放货 FETCH_PUT(3), // 取放货 X_MOVE(4), // 站位移转 // Y_MOVE(5), // 站位移转 // XY_MOVE(6), // 站位移转 GO_ORIGIN(7), // 回原点 // BACK_ORIGIN(8), // 回反原点 // CLEAR(9), // 清错 ; public Integer id; RgvTaskModeType(Integer id) { this.id = id; } public static RgvTaskModeType get(Short id) { if (null == id) { return null; } for (RgvTaskModeType type : RgvTaskModeType.values()) { if (type.id.equals(id.intValue())) { return type; } } return null; } public static RgvTaskModeType get(RgvTaskModeType type) { if (null == type) { return null; } for (RgvTaskModeType rgvTaskModeType : RgvTaskModeType.values()) { if (rgvTaskModeType == type) { return rgvTaskModeType; } } return null; } } src/main/java/com/zy/core/enums/SlaveType.java
@@ -8,6 +8,7 @@ Led, Scale, Car, Rgv ; public static SlaveType findInstance(String s){ src/main/java/com/zy/core/model/RgvSlave.java
New file @@ -0,0 +1,57 @@ package com.zy.core.model; import com.zy.core.Slave; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.ArrayList; import java.util.List; @EqualsAndHashCode(callSuper = true) @Data public class RgvSlave extends Slave { private Integer rack; private Integer slot; private Integer offset; private Boolean demo; // RGV入库源站点 private List<RgvStn> rgvInSStn = new ArrayList<>(); // RGV出库源站点 private List<RgvStn> rgvOutSStn = new ArrayList<>(); // RGV叠盘 private List<RgvStn> rgvEmptyInSStn = new ArrayList<>(); // RGV空板入库 private List<RgvStn> rgvEmptyOutSStn = new ArrayList<>(); // RGV出库目标站点 private List<RgvStn> rgvDestStn = new ArrayList<>(); @Data public static class RgvStn { // 输送线plc编号 private Integer devpPlcId; // RGV站点编号 private Integer staNo; // // 排 // private Integer row; // // // 列 // private Integer bay; // // // 层 // private Integer lev; } } src/main/java/com/zy/core/model/command/RgvCommand.java
New file @@ -0,0 +1,129 @@ package com.zy.core.model.command; import com.alibaba.fastjson.annotation.JSONField; import com.zy.core.enums.RgvTaskModeType; import lombok.Data; import java.util.Calendar; import java.util.Date; /** * 堆垛机命令报文 * Created by vincent on 2020/8/11 */ @Data public class RgvCommand { // Rgv编号 private Integer rgvNo = 0; // 工位1任务完成确认位 private Short ackFinish1 = 0; // 工位1任务号 private Short taskNo1 = 0; /** * 任务模式: * 0 = 无 * 1 = 取货 * 2 = 放货 * 3 = 取放货 */ private Short taskMode1 = 0; @JSONField(serialize = false) private RgvTaskModeType taskModeType1; /* 工位1源站 */ private Short sourceStaNo1 = 0; /* 工位1目标站 */ private Short destinationStaNo1 = 0; ////////////////////// 工位2定义 ////////////////////////////////////////////////// // 工位1任务完成确认位 private Short ackFinish2 = 0; // 工位2任务号 private Short taskNo2 = 0; /** * 任务模式: * 0 = 无 * 1 = 取货 * 2 = 放货 * 3 = 取放货 */ private Short taskMode2 = 0; @JSONField(serialize = false) private RgvTaskModeType taskModeType2; /* 工位1源站 */ private Short sourceStaNo2 = 0; /* 工位1目标站 */ private Short destinationStaNo2 = 0; /////////////////////////////////////////////////////////////////////////////////////// /** * 任务模式: * 0 = 未确认 * 1 = 工位1任务确认 * 2 = 工位2任务确认 * 3 = 工位1、2任务同时确认 */ private Short command = 0; public void setTaskMode1(Short taskMode1){ this.taskMode1 = taskMode1; this.taskModeType1 = RgvTaskModeType.get(taskModeType1); } public void setTaskMode1(RgvTaskModeType type1) { this.taskModeType1 = type1; this.taskMode1 = RgvTaskModeType.get(type1).id.shortValue(); } public void setTaskMode2(Short taskMode2){ this.taskMode2 = taskMode2; this.taskModeType2 = RgvTaskModeType.get(taskModeType2); } public void setTaskMode2(RgvTaskModeType type2) { this.taskModeType2 = type2; this.taskMode2 = RgvTaskModeType.get(type2).id.shortValue(); } public static void main(String[] args) { Date date = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(date); System.out.println(cal.get(Calendar.YEAR)); //默认从0-11 System.out.println(cal.get(Calendar.MONTH)+1); System.out.println(cal.get(Calendar.DATE)); int hour = cal.get(Calendar.HOUR_OF_DAY); System.out.println("时"); System.out.println(hour); int minute = cal.get(Calendar.MINUTE); System.out.println("分"); System.out.println(minute); int second = cal.get(Calendar.SECOND); System.out.println("秒"); System.out.println(second); int mm = cal.get(Calendar.DAY_OF_WEEK) - 1; // 星期:0(日)~6(六) System.out.println("礼拜"); System.out.println(mm); } } src/main/java/com/zy/core/model/protocol/RgvProtocol.java
New file @@ -0,0 +1,231 @@ package com.zy.core.model.protocol; import com.zy.asrs.entity.BasRgv; import com.zy.core.enums.RgvModeType; import com.zy.core.enums.RgvStatusType; import lombok.Data; import java.util.HashMap; import java.util.Map; /** * Created by vincent on 2020/8/7 */ @Data public class RgvProtocol implements Cloneable{ private Integer RgvNo; /** * 1 = 手动模式 * 2 = 自动模式 * 3 = 电脑模式 */ public Short mode; public RgvModeType modeType; /** * RGV当前状态 * 0:空闲,无任务 * 1:作业中 * 2:报警 */ public Short status; /** * 状态枚举 */ public RgvStatusType statusType; /** * 工位1任务号 */ public Short taskNo1 = 0; /** * RGV工位1当前状态 * 0:空闲,无任务 * 11:取货中 * 12:放货中 * 10:任务完成等待WCS确认 */ public Short status1; /** * 状态枚举 */ public RgvStatusType statusType1; /** * 工位1有物 */ public Short loaded1; /** * RGV当前位置 */ public Short RgvPos; /** * 走行在定位 * 0 = 在定位 * 1 = 不在定位 */ public Short walkPos; ////////////////////// 工位2定义 ////////////////////////////////////////////////// // /** // * 工位2任务号 // */ // public Short taskNo2 = 0; // // /** // * RGV工位2当前状态 // * 0:空闲,无任务 // * 11:取货中 // * 12:放货中 // * 10:任务完成等待WCS确认 // */ // public Short status2; // // /** // * 状态枚举 // */ // public RgvStatusType statusType2; // // /** // * 工位2有物 // */ // public Short loaded2; /////////////////////////////////////////////////////////////////////////////////////// /** * 异常码 */ 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 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(); // } /** * 最近一次入出库类型 * 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,100);map.put((short) 2,101); map.put((short) 3,106);map.put((short) 4,107); map.put((short) 5,112);map.put((short) 6,113); map.put((short) 7,119);map.put((short) 8,124); map.put((short) 9,149);map.put((short) 10,153); map.put((short) 11,157);map.put((short) 12,161); if (RgvPos==null) return 0; return map.get(RgvPos); } @Override public RgvProtocol clone() { try { return (RgvProtocol) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } } src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -4,6 +4,7 @@ import com.zy.core.model.CrnSlave; import com.zy.core.model.DevpSlave; import com.zy.core.model.LedSlave; import com.zy.core.model.RgvSlave; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -42,4 +43,5 @@ private List<Slave> car = new ArrayList<>(); private List<RgvSlave> rgv = new ArrayList<>(); } src/main/java/com/zy/core/thread/SiemensRgvThread.java
New file @@ -0,0 +1,489 @@ package com.zy.core.thread; import HslCommunication.Core.Types.OperateResult; import HslCommunication.Core.Types.OperateResultExOne; import HslCommunication.Profinet.Siemens.SiemensPLCS; import HslCommunication.Profinet.Siemens.SiemensS7Net; import com.alibaba.fastjson.JSON; import com.core.common.DateUtils; import com.core.common.SpringUtils; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.service.BasRgvService; import com.zy.core.RgvThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.RgvStatusType; import com.zy.core.enums.RgvTaskModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.RgvProtocol; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.text.MessageFormat; import java.util.Date; @Data @Slf4j public class SiemensRgvThread implements Runnable, RgvThread { private SiemensS7Net siemensNet; private RgvSlave slave; private RgvProtocol rgvProtocol; /** * 工位1复位信号 */ private boolean resetFlag1 = false; /** * 工位2复位信号 */ private boolean resetFlag2 = false; //锁定标记 private boolean PakMk = true; public SiemensRgvThread(RgvSlave slave) { this.slave = slave; } @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { this.connect(); while (true) { try { int step = 1; Task task = MessageQueue.poll(SlaveType.Rgv, slave.getId()); if (task != null) { step = task.getStep(); } switch (step) { // 读数据 case 1: readStatus(); break; // // 工位1、2写入数据 // case 2: // write((RgvCommand) task.getData()); // break; //工位1写入数据 case 4: write1((RgvCommand) task.getData()); break; // //工位2写入数据 // case 5: // write2((RgvCommand) task.getData()); // break; // 复位 case 3: RgvCommand command = (RgvCommand) task.getData(); if (null == command) { command = new RgvCommand(); } command.setRgvNo(slave.getId()); // RGV编号 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1((short) 1); // 任务完成确认位 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short)0); // 源站 command.setDestinationStaNo1((short)0); // 目标站 command.setCommand((short)0); write1(command); break; // 回原点 避让 case 9: RgvCommand commandAvoidanceXY = (RgvCommand) task.getData(); if (null == commandAvoidanceXY) { commandAvoidanceXY = new RgvCommand(); } commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号 commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号 commandAvoidanceXY.setAckFinish1((short) 1); // 任务完成确认位 commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式 commandAvoidanceXY.setSourceStaNo1((short)0); // 源站 commandAvoidanceXY.setDestinationStaNo1((short)0); // 目标站 // commandAvoidanceXY.setTaskNo2((short) 0); // 工作号 // commandAvoidanceXY.setAckFinish2((short) 1); // 任务完成确认位 // commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式 // commandAvoidanceXY.setSourceStaNo2((short)0); // 源站 // commandAvoidanceXY.setDestinationStaNo2((short)0); // 目标站 commandAvoidanceXY.setCommand((short)0); write(commandAvoidanceXY); break; default: break; } Thread.sleep(500); } catch (Exception e) { // e.printStackTrace(); } } } /** * 初始化RGV状态 */ private void initRgv() { if (null == rgvProtocol) { rgvProtocol = new RgvProtocol(); } rgvProtocol.setMode((short) -1); rgvProtocol.setStatus((short)-1); rgvProtocol.setTaskNo1((short)0); rgvProtocol.setStatus1((short)-1); rgvProtocol.setLoaded1((short)0); rgvProtocol.setWalkPos((short)0); rgvProtocol.setRgvPos((short)0); // rgvProtocol.setTaskNo2((short)0); // rgvProtocol.setStatus2((short)-1); // rgvProtocol.setLoaded2((short)0); rgvProtocol.setAlarm((short)0); rgvProtocol.setxSpeed((short) 0); rgvProtocol.setxDistance((short) 0); rgvProtocol.setxDuration((short) 0); } @Override public boolean connect() { boolean result = false; siemensNet = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp()); siemensNet.setRack(slave.getRack().byteValue()); siemensNet.setSlot(slave.getSlot().byteValue()); OperateResult connect = siemensNet.ConnectServer(); if(connect.IsSuccess){ result = true; OutputQueue.RGV.offer(MessageFormat.format( "【{0}】RGV plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); log.info("RGV plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } else { OutputQueue.RGV.offer(MessageFormat.format("【{0}】RGV plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); log.error("RGV plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); initRgv(); } // siemensNet.ConnectClose(); return result; } /** * 读取状态 */ private void readStatus(){ try { OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30); if (result.IsSuccess) { if (null == rgvProtocol || rgvProtocol.getRgvNo() == null) { rgvProtocol = new RgvProtocol(); rgvProtocol.setRgvNo(slave.getId()); } rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0)); rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2)); rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4)); rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6)); rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 8)); rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 10)); rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14)); // rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16)); rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18)); // rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20)); rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22)); // rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24)); rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26)); // rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28)); // rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30)); // rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32)); // rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28)); // rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40)); // rgvProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId())); // 工位1复位信号 if (rgvProtocol.getStatusType1().equals(RgvStatusType.WAITING) || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) { if (resetFlag1) { RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setAckFinish1((short)1); if (write(rgvCommand)) { resetFlag1 = false; } } } // 工位2复位信号 // if (rgvProtocol.getStatusType2().equals(RgvStatusType.WAITING) // || rgvProtocol.getStatusType2().equals(RgvStatusType.FETCHWAITING)) { // if (resetFlag2) { // RgvCommand rgvCommand = new RgvCommand(); // rgvCommand.setAckFinish2((short)1); // if (write(rgvCommand)) { // resetFlag2 = false; // } // } // } try { // 根据实时信息更新数据库 BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class); BasRgv basRgv = new BasRgv(); basRgv.setRgvNo(slave.getId()); basRgv.setRgvSts((int)rgvProtocol.getMode()); if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))){ log.error("RGV plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } catch (Exception ignore){ System.out.println(ignore); } } else { initRgv(); OutputQueue.RGV.offer(MessageFormat.format("【{0}】读取RGV plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); // log.error("读取RGV plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } catch (Exception e) { e.printStackTrace(); OutputQueue.RGV.offer(MessageFormat.format("【{0}】读取RGV plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); // log.error("读取RGV plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); initRgv(); } } /** * 工位1、2同时写入数据 */ private boolean write(RgvCommand command) throws InterruptedException { if (null == command) { log.error("RGV写入命令为空"); return false; } // convertRow(command); command.setRgvNo(slave.getId()); short[] array = new short[11]; array[0] = command.getAckFinish1(); array[1] = command.getTaskNo1(); array[2] = command.getTaskMode1(); array[3] = command.getSourceStaNo1(); array[4] = command.getDestinationStaNo1(); // array[0] = command.getAckFinish1(); // array[1] = command.getTaskNo1(); // array[2] = command.getTaskMode1(); // array[3] = command.getSourceStaNo1(); // array[4] = command.getDestinationStaNo1(); // array[5] = command.getAckFinish2(); // array[6] = command.getTaskNo2(); // array[7] = command.getTaskMode2(); // array[8] = command.getSourceStaNo2(); // array[9] = command.getDestinationStaNo2(); // array[10] = command.getCommand(); OperateResult result = siemensNet.Write("DB100.0", array); // if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) { // short commandFinish = 3; //工位1、2任务同时写入 // Thread.sleep(100L); // result = siemensNet.Write("DB100.20", commandFinish); // } if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; } else { OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入RGV plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } /** * 工位1写入数据 */ private boolean write1(RgvCommand command) throws InterruptedException { if (null == command) { log.error("RGV写入命令为空"); return false; } // siemensNet.Write("DB100.20", command.getCommand()); command.setRgvNo(slave.getId()); short[] array = new short[5]; array[0] = command.getAckFinish1(); array[1] = command.getTaskNo1(); array[2] = command.getTaskMode1(); array[3] = command.getSourceStaNo1(); array[4] = command.getDestinationStaNo1(); siemensNet.Write("DB100.10", command.getCommand()); OperateResult result = siemensNet.Write("DB100.0", array); if (!result.IsSuccess){ log.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command)); MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(4,command)); Thread.sleep(100); readStatus(); return false; } //RGV任务写入后,回读一次,看是否成功 Thread.sleep(400); try { OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 12); if (resultRead.IsSuccess){ RgvCommand one = new RgvCommand(); // one.setAckFinish1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0)); one.setTaskNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); one.setTaskMode1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); if ( !command.getTaskNo1().equals(one.getTaskNo1()) || !command.getTaskMode1().equals(one.getTaskMode1()) || !command.getSourceStaNo1().equals(one.getSourceStaNo1()) || !command.getDestinationStaNo1().equals(one.getDestinationStaNo1()) ){ try{ log.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); }catch (Exception e){ try{ log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead)); }catch (Exception e1){ log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); } } log.error("Rgv命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(4, command)); Thread.sleep(100); readStatus(); return false; }else { log.info("RGV命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); } } }catch (Exception e){ log.error("RGV命令地址写入后回读出错"); } if (command.getAckFinish1() == 0) { if (result.IsSuccess) { Thread.sleep(300); //任务下发次数 int writeCount2 = 0; do { writeCount2++; short commandFinish = (short) 1; result = siemensNet.Write("DB100.10", commandFinish); if(result.IsSuccess){ //RGV任务写入后,回读一次,看是否成功 Thread.sleep(200); OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.10", (short) 2); if (resultRead.IsSuccess) { commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0); if (commandFinish != 1){ log.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次"); }else{ //任务命令写入成功 log.info("RGV任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次"); break; } }else { log.error("RGV任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次"); } } else { log.error("RGV任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次"); } }while (writeCount2<5); } } // if (command.getAckFinish1() == 0) { // short commandFinish = 1; //工位1任务写入 // Thread.sleep(200); // result = siemensNet.Write("DB100.10", commandFinish); // } if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("RGV 工位1命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位1命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; } else { OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位1数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入RGV plc工位1数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } /** * 工位2写入数据 */ private boolean write2(RgvCommand command) throws InterruptedException { if (null == command) { log.error("RGV写入命令为空"); return false; } command.setRgvNo(slave.getId()); short[] array = new short[6]; array[0] = command.getAckFinish2(); array[1] = command.getTaskNo2(); array[2] = command.getTaskMode2(); array[3] = command.getSourceStaNo2(); array[4] = command.getDestinationStaNo2(); array[5] = command.getCommand(); OperateResult result = siemensNet.Write("DB100.10", array); if (command.getAckFinish2() == 0) { short commandFinish = 2; //工位2任务写入 Thread.sleep(100L); result = siemensNet.Write("DB100.20", commandFinish); } if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("RGV 工位2命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位2命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; } else { OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位2数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入RGV plc工位2数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } @Override public void close() { siemensNet.ConnectClose(); } /******************************************************************************************/ /**************************************** 测试专用 *****************************************/ /*****************************************************************************************/ public static void main(String[] args) throws InterruptedException { RgvSlave slave = new RgvSlave(); slave.setId(1); slave.setIp("192.168.6.9"); slave.setRack(0); slave.setSlot(0); SiemensRgvThread rgvThread = new SiemensRgvThread(slave); rgvThread.connect(); rgvThread.readStatus(); System.out.println(JSON.toJSONString(rgvThread.rgvProtocol)); Thread.sleep(3000L); } } src/main/resources/mapper/BasRgvErrMapper.xml
New file @@ -0,0 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.asrs.mapper.BasRgvErrMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgvErr"> <result column="error_code" property="errorCode" /> <result column="err_name" property="errName" /> <result column="modi_user" property="modiUser" /> <result column="modi_time" property="modiTime" /> <result column="appe_user" property="appeUser" /> <result column="appe_time" property="appeTime" /> </resultMap> </mapper> src/main/resources/mapper/BasRgvMapper.xml
New file @@ -0,0 +1,24 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.asrs.mapper.BasRgvMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgv"> <result column="rgv_no" property="rgvNo" /> <result column="in_enable" property="inEnable" /> <result column="out_enable" property="outEnable" /> <result column="rgv_sts" property="rgvSts" /> <result column="wrk_no1" property="wrkNo1" /> <result column="wrk_no2" property="wrkNo2" /> <result column="rgv_err" property="rgvErr" /> <result column="pak_mk" property="pakMk" /> <result column="status" property="status" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> <result column="memo" property="memo" /> </resultMap> </mapper>