|
@@ -0,0 +1,126 @@
|
|
|
|
+package com.gzlh.device.plc.service;
|
|
|
|
+
|
|
|
|
+import cn.hutool.extra.spring.SpringUtil;
|
|
|
|
+import com.gzlh.bus.EventBus;
|
|
|
|
+import com.gzlh.bus.EventConfig;
|
|
|
|
+import com.gzlh.bus.EventDataManager;
|
|
|
|
+import com.gzlh.config.ModuleEnum;
|
|
|
|
+import com.gzlh.config.dto.SerialSetting;
|
|
|
|
+import com.gzlh.device.plc.event.PLCEvent;
|
|
|
|
+import com.gzlh.device.weighbridge.event.WeighbridgeEvent;
|
|
|
|
+import com.gzlh.utils.DeviceCache;
|
|
|
|
+
|
|
|
|
+import java.util.Date;
|
|
|
|
+
|
|
|
|
+public class PLCService {
|
|
|
|
+ public void fRedTrigger(String plcInfo) throws InterruptedException {
|
|
|
|
+ EventBus eventBus = SpringUtil.getBean(EventBus.class);
|
|
|
|
+ //向总线发送抓拍到车牌事件
|
|
|
|
+ SerialSetting.PlcDTO.StatusDTO status = EventConfig.serialSetting.getPlc().getStatus();
|
|
|
|
+// 将plc设备信息的字符串反转
|
|
|
|
+ plcInfo = new StringBuffer(plcInfo).reverse().toString();
|
|
|
|
+ String newStatus = null;
|
|
|
|
+ String oldFRed = String.valueOf(plcInfo.charAt(Integer.parseInt(status.getFRedPoint())));
|
|
|
|
+ String newFRed = null;
|
|
|
|
+ boolean bool = true;
|
|
|
|
+ while (bool) {
|
|
|
|
+ newStatus = new StringBuffer(DeviceCache.getPlcStatus()).reverse().toString();
|
|
|
|
+ newFRed = String.valueOf(newStatus.charAt(Integer.parseInt(status.getFRedPoint())));
|
|
|
|
+// 前红外信息发生变化之后再继续
|
|
|
|
+ if (oldFRed.equals(newFRed)) {
|
|
|
|
+ Thread.sleep(2000);
|
|
|
|
+ } else {
|
|
|
|
+ bool = false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String BRed = String.valueOf(newStatus.charAt(Integer.parseInt(status.getBRedPoint())));
|
|
|
|
+ String radar = String.valueOf(newStatus.charAt(Integer.parseInt(status.getRadarPoint())));
|
|
|
|
+
|
|
|
|
+// 车辆处于前后红外之间(外)
|
|
|
|
+ if (newFRed.equals("0") && BRed.equals("0")) {
|
|
|
|
+ Date fRedTime = DeviceCache.getTime(status.getFRedPoint());
|
|
|
|
+ Date radarTime = DeviceCache.getTime(status.getRadarPoint());
|
|
|
|
+
|
|
|
|
+// 雷达时间小于前红外时间为进,车辆前后红外之间
|
|
|
|
+ if (radarTime.before(fRedTime)) {
|
|
|
|
+ eventBus.startEvent(ModuleEnum.WEIGHBRIDGE_MODULE.getModuleEn() + "." + WeighbridgeEvent.READ);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public void radarTrigger() throws InterruptedException {
|
|
|
|
+ EventBus eventBus = SpringUtil.getBean(EventBus.class);
|
|
|
|
+ //向总线发送抓拍到车牌事件
|
|
|
|
+ SerialSetting.PlcDTO.StatusDTO status = EventConfig.serialSetting.getPlc().getStatus();
|
|
|
|
+// 将plc设备信息的字符串反转
|
|
|
|
+ String newStatus = null;
|
|
|
|
+ String newRadar = null;
|
|
|
|
+ boolean bool = true;
|
|
|
|
+ while (bool) {
|
|
|
|
+// 反转当前设备信息
|
|
|
|
+ newStatus = new StringBuffer(DeviceCache.getPlcStatus()).reverse().toString();
|
|
|
|
+ newRadar = String.valueOf(newStatus.charAt(Integer.parseInt(status.getRadarPoint())));
|
|
|
|
+// 雷达信息发生变化之后再继续
|
|
|
|
+ if ("0".equals(newRadar)) {
|
|
|
|
+ bool = false;
|
|
|
|
+ } else {
|
|
|
|
+ Thread.sleep(2000);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String BRed = String.valueOf(newStatus.charAt(Integer.parseInt(status.getBRedPoint())));
|
|
|
|
+ String radar = String.valueOf(newStatus.charAt(Integer.parseInt(status.getRadarPoint())));
|
|
|
|
+
|
|
|
|
+// 设置str为只有栏杆下到位的状态
|
|
|
|
+ String str = "00000000";
|
|
|
|
+ StringBuilder sb = new StringBuilder(str);
|
|
|
|
+ sb.setCharAt(Integer.parseInt(status.getDownPoint()), '1');
|
|
|
|
+ str = sb.toString();
|
|
|
|
+ System.out.println(str);
|
|
|
|
+// 判断当前PLC状态
|
|
|
|
+ if (str.equals(newStatus)) {
|
|
|
|
+ Date fRedTime = DeviceCache.getTime(status.getFRedPoint());
|
|
|
|
+ Date radarTime = DeviceCache.getTime(status.getRadarPoint());
|
|
|
|
+// 雷达时间大于前红外时间为退,并且只有下到位触发,判断车辆不在通道内,触发通道空闲状态
|
|
|
|
+ if (radarTime.after(fRedTime)) {
|
|
|
|
+ EventDataManager.cleanData();
|
|
|
|
+ eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.IDLE);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void upTrigger() throws InterruptedException {
|
|
|
|
+ EventBus eventBus = SpringUtil.getBean(EventBus.class);
|
|
|
|
+ //向总线发送抓拍到车牌事件
|
|
|
|
+ SerialSetting.PlcDTO.StatusDTO status = EventConfig.serialSetting.getPlc().getStatus();
|
|
|
|
+// 将plc设备信息的字符串反转
|
|
|
|
+ String newStatus = null;
|
|
|
|
+ String downPoint = null;
|
|
|
|
+ boolean bool = true;
|
|
|
|
+ while (bool) {
|
|
|
|
+// 反转当前设备信息
|
|
|
|
+ newStatus = new StringBuffer(DeviceCache.getPlcStatus()).reverse().toString();
|
|
|
|
+ downPoint = String.valueOf(newStatus.charAt(Integer.parseInt(status.getDownPoint())));
|
|
|
|
+// 落杆后结束循环
|
|
|
|
+ if ("1".equals(downPoint)) {
|
|
|
|
+ bool = false;
|
|
|
|
+ } else {
|
|
|
|
+ Thread.sleep(2000);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+// 设置只有栏杆下到位的状态
|
|
|
|
+ String downOnly = "00000000";
|
|
|
|
+ StringBuilder sb = new StringBuilder(downOnly);
|
|
|
|
+ sb.setCharAt(Integer.parseInt(status.getDownPoint()), '1');
|
|
|
|
+ downOnly = sb.toString();
|
|
|
|
+// System.out.println(downOnly);
|
|
|
|
+// 判断当前PLC状态
|
|
|
|
+ if (downOnly.equals(newStatus)) {
|
|
|
|
+ EventDataManager.cleanData();
|
|
|
|
+ eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.IDLE);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|