Browse Source

回滚到单机械手,异常号牌直接出队不抓车

yc_t 7 years ago
parent
commit
1254be8296

+ 8 - 8
parkMonitor/App.config

@@ -36,27 +36,27 @@
     <add key="PLC_address_length" value="50" />
     <add key="PLC_refresh_interval" value="200"/>
     <add key="equipmentStatus_address" value="28" />
-    <!--PLC停取车地址配置-->
-    <add key="fetch_completed_address" value="9" />
-    <add key="park_command_address" value="0" />
+    <!--PLC停取完成-->
     <add key="park_completed_address" value="8" />
-    <add key="laser_countdown" value="100" />
-    <!--取车写入PLC-->
+    <add key="fetch_completed_address" value="9" />
+    <!--启动机械手-->
+    <add key="parking_startRobot_address" value="11" />
     <add key="fetching_startRobot_address" value="12" />
+    <!--机械手停车所需数据-->
     <add key="parkingSpaceID_address" value="13" />
     <add key="parkingSpaceX_address" value="14" />
     <add key="parkingSpaceY_address" value="15" />
     <add key="parkingSpaceZ_address" value="16" />
     <add key="parkingLaserCenterX_address" value="17" />
-    <!--停车启动机械手-->
-    <add key="parking_startRobot_address" value="11" />
     <!--激光设备配置-->
+    <add key="park_command_address" value="0" />
     <add key="laser1_status_address" value="1" />
     <add key="laser2_status_address" value="" />
     <add key="laser_rescan_count" value="3" />
+    <add key="laser_countdown" value="100" />
     <!--队列线程参数-->
     <add key="fetch_store_ratio" value="3" />
-    <add key="licenseTime" value="2000" />
+    <add key="licenseTime" value="30" />
     <add key="userTime" value="30" />
     <!--上位机(Web线程)IP地址及配置serverScoket的端口-->
     <add key="WebConfig" value="192.168.111.8:9000" />

+ 81 - 20
parkMonitor/server/CoreThread/AbstractCmd.cs

@@ -42,20 +42,74 @@ namespace parkMonitor.server.CoreThread
             PLC = EquipmentSimpleFactory.ins.FindEquipment(EquipmentName.PLC);
             //获取队列句柄
             queuingThread = EquipmentSimpleFactory.ins.FindEquipment(EquipmentName.Queue);
+            //获取号牌机线程句柄
+            NumMachine = EquipmentSimpleFactory.ins.FindEquipment(EquipmentName.NumMachine);
             //数据库
             oper = new DBOperation();
             //车位分配
             c = new CEntrance();
             aps = new AllotParkingSpace();
         }
+
     }
 
     public class StopCmd : AbstractCmd
     {
+        /// <summary>
+        /// 命令中号牌与对应号牌机中当前号牌比对,确认车辆
+        /// </summary>
+        public bool NumValidation(Command queueCmd)
+        {
+            List<NumberMachineNode> numList = ((NumberMachineMessage)NumMachine.GetMessage()).data;
+            bool result = false;
+            Task numberCheck = Task.Factory.StartNew(() =>
+            {
+                int countdown = 8, count = 0;
+                while (countdown-- > 0)
+                {
+                    foreach (NumberMachineNode node in numList)
+                    {
+                        if (queueCmd.ip.Equals(node.ip) && queueCmd.LicenseNum.Equals(node.LicenseNum))
+                        {
+                            count += 1;
+                        }
+                    }
+                    Thread.Sleep(500);
+                }
+                if (count >= (int)(countdown * 0.8))
+                {
+                    result = true;
+                }
+                else
+                {
+                    result = false;
+                }
+            });
+            numberCheck.Wait();
+            return result;
+        }
+
         public override void executeCmd(Command queueCmd)
         {
+            int centerX = 0;
+            int centerY = 0;
+            int angleA = 0;
+            int length = 0;
+            int width = 0;
+            int height = 0;
             PLCMessage PLCMsg = null;
             int status = 1;//停车
+
+            //号牌验证,异常则退回队列
+            Func<Command, bool> numValidationResult = new Func<Command, bool>(NumValidation);
+            IAsyncResult result = numValidationResult.BeginInvoke(queueCmd, null, null);
+            bool checkResult = numValidationResult.EndInvoke(result);
+            if (!checkResult)
+            {
+                queuingThread.SetMessage(queueCmd);
+                return;
+            }
+
             ParkingMessage pm = new ParkingMessage();
             pm.status = status;
             PLC.SetMessage(pm);
@@ -102,12 +156,6 @@ namespace parkMonitor.server.CoreThread
                     PLCMsg = (PLCMessage)PLC.GetMessage();
                     if (PLCMsg != null)
                     {
-                        int centerX = 0;
-                        int centerY = 0;
-                        int angleA = 0;
-                        int length = 0;
-                        int width = 0;
-                        int height = 0;
                         foreach (LaserMessage lm in PLCMsg.laserMsgList)
                         {
                             if(lm.id == 1 && lm.data!=null && lm.status == 3)
@@ -118,19 +166,6 @@ namespace parkMonitor.server.CoreThread
                                 length = lm.data.length;
                                 width = lm.data.width;
                                 height = lm.data.height;
-                                status = 2;
-                                pm.status = status;
-                                pm.centerX = Convert.ToString(centerX);
-                                pm.centerY = Convert.ToString(centerY);
-                                pm.angleA = Convert.ToString(angleA);
-                                pm.length = Convert.ToString(length);
-                                pm.width = Convert.ToString(width);
-                                pm.height = Convert.ToString(height);
-                                pm.parkingSpaceID = Convert.ToString(parkingSpaceID);
-                                pm.parkingSpaceX = Convert.ToString(parkingSpaceX);
-                                pm.parkingSpaceY = Convert.ToString(parkingSpaceY);
-                                pm.parkingSpaceZ = Convert.ToString(parkingSpaceZ);
-                                PLC.SetMessage(pm);
                                 jumpOut = true;
                                 break;
                             }else if (lm.status == -1)
@@ -150,6 +185,30 @@ namespace parkMonitor.server.CoreThread
             //Task.WaitAll(dataFromLaser,parkingSpace);
             dataFromLaser.Wait();
 
+            //号牌验证,异常则退回队列
+            numValidationResult = new Func<Command, bool>(NumValidation);
+            result = numValidationResult.BeginInvoke(queueCmd, null, null);
+            checkResult = numValidationResult.EndInvoke(result);
+            if (!checkResult)
+            {
+                queuingThread.SetMessage(queueCmd);
+                return;
+            }
+
+            status = 2;
+            pm.status = status;
+            pm.centerX = Convert.ToString(centerX);
+            pm.centerY = Convert.ToString(centerY);
+            pm.angleA = Convert.ToString(angleA);
+            pm.length = Convert.ToString(length);
+            pm.width = Convert.ToString(width);
+            pm.height = Convert.ToString(height);
+            pm.parkingSpaceID = Convert.ToString(parkingSpaceID);
+            pm.parkingSpaceX = Convert.ToString(parkingSpaceX);
+            pm.parkingSpaceY = Convert.ToString(parkingSpaceY);
+            pm.parkingSpaceZ = Convert.ToString(parkingSpaceZ);
+            PLC.SetMessage(pm);
+
             Console.WriteLine("停车,抓车:" + queueCmd.LicenseNum);
             Log.WriteLog("停车,抓车:" + queueCmd.LicenseNum);
             UILogServer.ins.info("停车,抓车:" + queueCmd.LicenseNum);
@@ -171,17 +230,19 @@ namespace parkMonitor.server.CoreThread
             status = 3;
             pm.status = status;
             PLC.SetMessage(pm);
+
             //停车完成,将相应车牌复位
             NumberMachineMessage numberMachineMessage = new NumberMachineMessage();
             numberMachineMessage.aNode = new NumberMachineNode();
             numberMachineMessage.aNode.ip = "";
             numberMachineMessage.aNode.LicenseNum = queueCmd.LicenseNum;
             queuingThread.SetMessage(numberMachineMessage);
+
             Console.WriteLine("停车完成,状态复位");
             Log.WriteLog("停车完成,状态复位");
             UILogServer.ins.info("停车完成,状态复位");
             //根据号牌查找车型
-            int vehicleTypeID = oper.getVehicleTypeID(numberPlate);
+            //int vehicleTypeID = oper.getVehicleTypeID(numberPlate);
             //判断测量数据是否准确
             //bool isDataRight = oper.IsDataRight(vehicleTypeLength, vehicleTypeWidth, vehicleTypeHeight, vehicleTypeWheelbase, vehicleTypeID);
 

+ 27 - 18
parkMonitor/server/CoreThread/QueuingThread.cs

@@ -192,32 +192,41 @@ namespace parkMonitor.server.CoreThread
         /// </summary>
         private void LicTimeOut()
         {
-            foreach (NumberMachineNode n in LicenseQueue)
+            for (int i = 0; i < LicenseQueue.Count; i++)
             {
-                if (NumMachineNodeValidation(n))
+                NumberMachineNode node = LicenseQueue.Dequeue();
+                if (NumMachineNodeValidation(node))
                 {
                     //计算时间差,超过5分钟自动出队(?处理方式待讨论),并将该Node标记为已使用,等待统一处理
-                    TimeSpan licTimeSpan = DateTime.Now - DateTime.Parse(n.TimeRecord);
+                    TimeSpan licTimeSpan = DateTime.Now - DateTime.Parse(node.TimeRecord);
                     if (licTimeSpan.TotalMinutes >= licenseTime)
                     {
+                        //异常号牌不再入队,而是界面提示管理员,并让号牌机线程
                         UILogServer.ins.error("异常:号牌已扫描时间:" + licTimeSpan.TotalSeconds + "秒 ,强制出队");
-                        //Console.WriteLine("异常:号牌已扫描时间:" + licTimeSpan.TotalSeconds + "秒 ,强制出队");
-                        Command cmd = new Command();
-                        cmd.ip = n.ip;
-                        cmd.commandType = 's';
-                        cmd.LicenseNum = n.LicenseNum;
-                        cmd.userID = "";
-                        cmd.garageID = 0;
-                        cmd.parkingRecordsID = 0;
-                        cmd.TimeRecord = n.TimeRecord;
-                        lock (ValidStoreCmdQueue)
-                        {
-                            ValidStoreCmdQueue.Enqueue((Command)cmd.Clone());
-                        }
-                        //numMachineHandle.SetMessage((AbstractMessage)cmd.Clone());
-                        n.ip = "used";
+                        //停车完成,将相应车牌复位
+                        NumberMachineMessage numberMachineMessage = new NumberMachineMessage();
+                        numberMachineMessage.aNode = new NumberMachineNode();
+                        numberMachineMessage.aNode.ip = "";
+                        numberMachineMessage.aNode.LicenseNum = node.LicenseNum;
+                        numMachineHandle.SetMessage(numberMachineMessage);
+                        node.ip = "used";
+
+                        //Command cmd = new Command();
+                        //cmd.ip = node.ip;
+                        //cmd.commandType = 's';
+                        //cmd.LicenseNum = node.LicenseNum;
+                        //cmd.userID = "";
+                        //cmd.garageID = 0;
+                        //cmd.parkingRecordsID = 0;
+                        //cmd.TimeRecord = node.TimeRecord;
+                        //lock (ValidStoreCmdQueue)
+                        //{
+                        //    ValidStoreCmdQueue.Enqueue((Command)cmd.Clone());
+                        //}
+                        ////numMachineHandle.SetMessage((AbstractMessage)cmd.Clone());
                     }
                 }
+                LicenseQueue.Enqueue(node);
             }
         }