diff --git a/web/src/main/java/com/zhehekeji/web/controller/PLCController.java b/web/src/main/java/com/zhehekeji/web/controller/PLCController.java index 54a5c40..826a6d5 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/PLCController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/PLCController.java @@ -5,6 +5,7 @@ import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.mapper.StreetMapper; import com.zhehekeji.web.service.NettyClient; +import com.zhehekeji.web.service.PlcService; import com.zhehekeji.web.service.StreetConn; import com.zhehekeji.web.service.StreetService; import io.swagger.annotations.Api; @@ -12,6 +13,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.List; @Api(value = "PLCController",tags = "PLC管理") @RestController(value = "PLCController") @@ -41,11 +43,13 @@ public class PLCController { } return Result.success(); } + @Resource + private PlcService plcService; @GetMapping("/disPlc") @ApiOperation(value = "未连接的PLC") - public Result disConn(){ - return Result.success(); + public Result> disConn(){ + return Result.success(plcService.disStreets()); } diff --git a/web/src/main/java/com/zhehekeji/web/entity/Order.java b/web/src/main/java/com/zhehekeji/web/entity/Order.java index 3b07f1b..b1a3175 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Order.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Order.java @@ -17,6 +17,8 @@ public class Order { @TableId(type = IdType.AUTO) private Long id; + private Integer streetId; + @ApiModelProperty("订单号") private String orderNum; diff --git a/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java b/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java index f7b3d1b..9069316 100644 --- a/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java +++ b/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java @@ -50,11 +50,13 @@ public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter { @Override public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { if (obj instanceof IdleStateEvent) { + log.debug("streetId:{}heart",streetId); + ctx.channel().writeAndFlush(heart); IdleStateEvent event = (IdleStateEvent) obj; - if (IdleState.WRITER_IDLE.equals(event.state())) { // 如果写通道处于空闲状态就发送心跳命令 - log.debug("streetId:{}heart",streetId); - ctx.channel().writeAndFlush(heart); - } + +// if (IdleState.WRITER_IDLE.equals(event.state())) { // 如果写通道处于空闲状态就发送心跳命令 +// +// } } } diff --git a/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java b/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java index d54d846..2b34bf8 100644 --- a/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java @@ -3,15 +3,11 @@ package com.zhehekeji.web.service; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.FixedLengthFrameDecoder; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; import java.nio.charset.Charset; import java.util.concurrent.ThreadPoolExecutor; -import static java.nio.ByteOrder.LITTLE_ENDIAN; - @Slf4j public class MyProtocolDecoder extends FixedLengthFrameDecoder { @@ -43,14 +39,10 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { } CharSequence plc = in.readCharSequence(6, Charset.defaultCharset()); String plcId = plc.toString(); - log.info("plcId:{}", plcId); // OA=心跳 OB=工单 OC=任务 OD=告警 CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset()); String type = typeChar.toString(); int taskId = in.readInt(); - - log.debug("type:{}", type); - short short1 = in.readShort(); short short2 = in.readShort(); short short3 = in.readShort(); @@ -59,7 +51,7 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { short short6 = in.readShort(); short short7 = in.readShort(); short short8 = in.readShort(); - PlcOrderInfo plcOrderInfo = new PlcOrderInfo(taskId,(int)short1,(int)short2,(int)short3,(int)short4,(int)short5,(int)short6,(int)short7,(int)short8); + PlcOrderInfo plcOrderInfo = new PlcOrderInfo(plcId,taskId,(int)short1,(int)short2,(int)short3,(int)short4,(int)short5,(int)short6,(int)short7,(int)short8); byte maohao = in.readByte(); byte leixing = in.readByte(); @@ -74,9 +66,10 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { byte b6 = in.readByte(); byte b7 = in.readByte(); byte b8 = in.readByte(); + byte[]bytes=new byte[]{b1,b2,b3,b4,b5,b6,b7,b8}; if (type.equals("0A")) { //心跳 - log.debug("receive plc heart"); + log.debug("receive heart plcId:{}",plcId); } else if (type.equals("0B")) { if ("B1".equals(code)) { @@ -93,24 +86,58 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { //执行动作 plcService.action(plcOrderInfo,plcId,times,code); + } else if(type.equals("0D")){ log.info(" warn code:{}",code); if("D0".equals(code)){ log.info("warn start ,plcId:{}",plcId); plcService.warnStart(plcId); //动作 - + //解析具体的告警 具体规则见文档 + int n = 1; + int warn = 0; + for(byte b: bytes){ + warn = warn(b,8*n); + if(warn > 0){ + break; + } + n++; + } + if(warn > 0){ + //执行动作 + //times = 1 只执行动作 + //code 写作"D{warn}" + plcService.action(plcOrderInfo,plcId,1,"D"+warn); + } }else if("D100".equals(code)){ log.info("warn end ,plcId:{}",plcId); plcService.warnStop(plcId); } } + log.debug("1:{},b1:{},b2:{},b3:{},b4:{},b5:{},b6:{},b7:{},b8:{}",w, b1, b2, b3, b4, b5, b6, b7, b8); - log.info("b1:{},b2:{},b3:{},b4:{},b5:{},b6:{},b7:{},b8:{}", b1, b2, b3, b4, b5, b6, b7, b8); in.release(); return null; } + private Integer warn(byte b,Integer num){ + String tString = Integer.toBinaryString((b & 0xFF) + 0x100).substring(1); + Integer warn = 0; + for (int i = 0; i < 8; i++) { + char item = tString.charAt(i); + if(String.valueOf(item).equals("1")){ + warn = num-i; + } + } + return warn; + } + + public static void main(String[] args) { + byte tByte = 4; + String tString = Integer.toBinaryString((tByte & 0xFF) + 0x100).substring(1); + System.out.println(tString); + } + } diff --git a/web/src/main/java/com/zhehekeji/web/service/OrderAction.java b/web/src/main/java/com/zhehekeji/web/service/OrderAction.java index da3af23..daabd71 100644 --- a/web/src/main/java/com/zhehekeji/web/service/OrderAction.java +++ b/web/src/main/java/com/zhehekeji/web/service/OrderAction.java @@ -2,6 +2,7 @@ package com.zhehekeji.web.service; import lombok.Data; +import java.util.HashMap; import java.util.Map; /** @@ -12,7 +13,7 @@ import java.util.Map; @Data public class OrderAction { - private static Map orderActions; + private static Map orderActions = new HashMap<>(); /** * 订单任务,返回该订单已发送的任务数 diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java b/web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java index 8330648..b35da1c 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java @@ -54,7 +54,7 @@ public class PlcOrderInfo { private String orderNum; - public PlcOrderInfo(Integer taskId, Integer inOut1, Integer leftRight1, Integer column1, Integer row1, Integer inOut2, Integer leftRight2, Integer column2, Integer row2) { + public PlcOrderInfo(String plcId,Integer taskId, Integer inOut1, Integer leftRight1, Integer column1, Integer row1, Integer inOut2, Integer leftRight2, Integer column2, Integer row2) { this.taskId = taskId; this.inOut1 = inOut1; this.leftRight1 = leftRight1; @@ -64,6 +64,6 @@ public class PlcOrderInfo { this.leftRight2 = leftRight2; this.column2 = column2; this.row2 = row2; - this.orderNum = ""+taskId+inOut1+leftRight1+column1+row1+inOut2+leftRight2+column2+row2; + this.orderNum = plcId+"_"+taskId; } } diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index 3b77590..ba41318 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -15,7 +15,9 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.stream.Collectors; /** * @Description plc信号指令处理类 @@ -49,6 +51,12 @@ public class PlcService { @Resource private CameraIOMapper ioMapper; + public List disStreets(){ + List streets = streetMapper.selectByMap(new HashMap<>(0)); + List connIds = StreetConn.connList(); + return streets.stream().filter(s->!connIds.contains(s.getId())).collect(Collectors.toList()); + } + /** * 开始工单 * @param orderNum @@ -62,6 +70,7 @@ public class PlcService { Street street = streetService.getStreetByPlcId(plcId); if(street != null){ OrderRealtime.startOrder(street.getId(), orderNum); + order.setStreetId(street.getId()); orderMapper.insert(order); //orderMapper.update(order, new UpdateWrapper().eq("order_num", orderNum)); } diff --git a/web/src/main/java/com/zhehekeji/web/service/SendHeart.java b/web/src/main/java/com/zhehekeji/web/service/SendHeart.java index e91fefa..26302f1 100644 --- a/web/src/main/java/com/zhehekeji/web/service/SendHeart.java +++ b/web/src/main/java/com/zhehekeji/web/service/SendHeart.java @@ -5,9 +5,9 @@ import lombok.Data; @Data public class SendHeart { - private byte l = 'L'; + private char l = 'L'; - private byte p = 'P'; + private char p = 'P'; private byte length01 = (byte) 4; private byte length02 = (byte) 3; @@ -18,11 +18,11 @@ public class SendHeart { private int id ; - private short[]ids =new short[8]; + private short[]ids = new short[8]; - private byte maohao = ':'; + private char maohao = ':'; - private byte h = 'H'; + private char h = 'H'; private byte q = 1; @@ -36,7 +36,7 @@ public class SendHeart { } id = 1; for (int j = 0; j < 8; j++) { - emp[j] = (byte) j; + emp[j] = (byte) (j+2); } } } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 758ee76..6a4d74b 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -36,6 +36,5 @@ picPort: 8544 cameraPassword: admin123 cameraUser: admin cameraPort: 37777 -mediaPath: d:\\media\ -mp4Path: d:\\mp4\ -tcpPort: 2021 +mediaPath: d:\\data\media\ +mp4Path: d:\\data\mp4\