Browse Source

加入计时器与中间过程提示,取车读信号方法提取

yc_t 7 years ago
parent
commit
6ad556a346

+ 1 - 0
.gitignore

@@ -166,3 +166,4 @@ $RECYCLE.BIN/
 .mymetadata
 
 .vs
+/modbus_PLC_laser_test/新plc模拟.mbs

BIN
modbus_PLC_laser_test/新plc模拟.mbs


+ 1 - 0
parkMonitor/parkMonitor.csproj

@@ -160,6 +160,7 @@
     <Compile Include="tools\JsonByByteToObjectTools.cs" />
     <Compile Include="sdk\superscene\ui\BaseBehavior.cs" />
     <Compile Include="sdk\superscene\ui\BehaviorBox.cs" />
+    <Compile Include="tools\MyTimer.cs" />
     <Compile Include="viewModel\objectTree\ObjectTreeRootVM.cs" />
     <Compile Include="view\behavior\ListItemSelectBehavior.cs" />
     <Compile Include="view\behavior\ScrollBehavior.cs" />

+ 103 - 26
parkMonitor/server/CoreThread/AbstractCmd.cs

@@ -11,6 +11,7 @@ using System.Configuration;
 using System.Threading;
 using parkMonitor.server.uiLogServer;
 using parkMonitor.DBLocation;
+using parkMonitor.tools;
 
 namespace parkMonitor.server.CoreThread
 {
@@ -81,6 +82,8 @@ namespace parkMonitor.server.CoreThread
         public void WaitForRobotResource(int robotID)
         {
             PLCMessage PLCMsg = null;
+            MyTimer mt = new MyTimer();
+            mt.StartTiming();
             while (!isClosing)
             {
                 lock (robot)
@@ -114,9 +117,15 @@ namespace parkMonitor.server.CoreThread
                     }
                     else
                     {
+                        UILogServer.ins.log("获得机械手资源");
                         break;
                     }
                 }
+                mt.EndTiming();
+                if (mt.IsLonger(4, 1, true))
+                {
+                    UILogServer.ins.info("无空闲机械手资源,继续等待");
+                }
             }
         }
     }
@@ -159,7 +168,6 @@ namespace parkMonitor.server.CoreThread
             numberCheck.Wait();
             return result;
         }
-
         /// <summary>
         /// 号牌复位
         /// </summary>
@@ -183,6 +191,8 @@ namespace parkMonitor.server.CoreThread
             cEntrance.parkingEntY = parkingEntY;
             cEntrance.parkingEntZ = parkingEntZ;
             Parking_Space ppp = new Parking_Space();
+            MyTimer mt = new MyTimer();
+            mt.StartTiming();
             while (!isClosing)
             {
                 if (!queueCmd.manual)
@@ -195,16 +205,24 @@ namespace parkMonitor.server.CoreThread
                 }
                 if (ppp != null)
                 {
+                    UILogServer.ins.log("已分配车位");
                     break;
                 }
-                if (isClosing)
+                Thread.Sleep(200);
+                mt.EndTiming();
+                if (mt.IsLonger(1, 1, true))
                 {
-                    break;
+                    UILogServer.ins.info("未获得车位,继续等待");
                 }
-                Thread.Sleep(200);
             }
             return ppp;
         }
+        /// <summary>
+        /// 等待激光数据
+        /// </summary>
+        /// <param name="queueCmd">传入的命令</param>
+        /// <param name="disappeared">车辆是否已驶离</param>
+        /// <returns></returns>
         private Data WaitForLaserResource(Command queueCmd, bool disappeared)
         {
             //激光数据
@@ -212,6 +230,8 @@ namespace parkMonitor.server.CoreThread
             bool jumpOut = false;
             PLCMessage PLCMsg = null;
             jumpOut = false;
+            MyTimer mt = new MyTimer();
+            mt.StartTiming();
             while (!isClosing)
             {
                 PLCMsg = (PLCMessage)PLC.GetMessage();
@@ -255,19 +275,27 @@ namespace parkMonitor.server.CoreThread
                     }
                     if (jumpOut)
                     {
+                        UILogServer.ins.log("激光数据已获得");
                         break;
                     }
                 }
                 Thread.Sleep(1000);
+                mt.EndTiming();
+                if (mt.IsLonger(4, 1, true))
+                {
+                    UILogServer.ins.info("未获取激光数据,继续等待");
+                }
             }
             return data;
         }
         /// <summary>
         /// 停车完成
         /// </summary>
-        private void WaitForStoreSignal(Command queueCmd, ref int parkingSpaceID, ref bool robotError)
+        private void WaitForStoreCompletionSignal(Command queueCmd, ref int parkingSpaceID, ref bool robotError)
         {
             PLCMessage PLCMsg = null;
+            MyTimer mt = new MyTimer();
+            mt.StartTiming();
             while (!isClosing)
             {
                 Thread.Sleep(1000);
@@ -276,9 +304,10 @@ namespace parkMonitor.server.CoreThread
                 //停车完成信号
                 if (storeStatus == 1)
                 {
+                    UILogServer.ins.log("已获得停车完成信号");
                     break;
                 }
-                else if (1 == 2)//机械手异常,则退指令,写数据库归位
+                else if (1 == 2)//机械手异常,则退指令,写数据库归位,判断条件需之后补充
                 {
                     robotError = true;
                     queueCmd.returnedCount += 1;
@@ -293,11 +322,23 @@ namespace parkMonitor.server.CoreThread
                     }
                     break;
                 }
+                mt.EndTiming();
+                if (mt.IsLonger(4, 1, true))
+                {
+                    UILogServer.ins.info("未获得停车完成信号,继续等待");
+                }
             }
         }
+        /// <summary>
+        /// 等待轮距信息
+        /// </summary>
+        /// <param name="frontWheelbase">前轮距</param>
+        /// <param name="rearWheelbase">后轮距</param>
         private void WaitWheelbase(ref int frontWheelbase, ref int rearWheelbase)
         {
             PLCMessage PLCMsg = null;
+            MyTimer mt = new MyTimer();
+            mt.StartTiming();
             while (!isClosing)
             {
                 PLCMsg = (PLCMessage)PLC.GetMessage();
@@ -307,9 +348,15 @@ namespace parkMonitor.server.CoreThread
                 {
                     frontWheelbase = Convert.ToInt32(PLCMsg.originalPlcList[frontWheelbase_address].Value);
                     rearWheelbase = Convert.ToInt32(PLCMsg.originalPlcList[rearWheelbase_address].Value);
+                    UILogServer.ins.log("轮距雷达完成状态已获取");
                     break;
                 }
                 Thread.Sleep(1000);
+                mt.EndTiming();
+                if (mt.IsLonger(4, 1, true))
+                {
+                    UILogServer.ins.info("未获取轮距雷达完成状态,继续等待");
+                }
             }
         }
         /// <summary>
@@ -324,7 +371,6 @@ namespace parkMonitor.server.CoreThread
             cm.status = status;
             cm.laserID = queueCmd.id;//启动对应激光
             PLC.SetMessage(cm);
-            Console.WriteLine("停车,开激光:" + queueCmd.LicenseNum);
             Log.WriteLog("停车,开激光:" + queueCmd.LicenseNum);
             UILogServer.ins.info("停车,开激光:" + queueCmd.LicenseNum);
 
@@ -439,15 +485,15 @@ namespace parkMonitor.server.CoreThread
             int rearWheelbase = 0;
             Task dataFromWheelbase = Task.Factory.StartNew(() =>
             {
-                WaitWheelbase(ref frontWheelbase,ref rearWheelbase);
+                WaitWheelbase(ref frontWheelbase, ref rearWheelbase);
             });
-            
-            Task storeSignal = Task.Factory.StartNew(() =>
+
+            Task storeCompletionSignal = Task.Factory.StartNew(() =>
             {
-                WaitForStoreSignal(queueCmd, ref parkingSpaceID, ref robotError);
+                WaitForStoreCompletionSignal(queueCmd, ref parkingSpaceID, ref robotError);
             });
             //storeSignal.Wait();
-            Task.WaitAll(dataFromWheelbase, storeSignal);
+            Task.WaitAll(dataFromWheelbase, storeCompletionSignal);
             //第三步:
             status = 3;
             cm.status = status;
@@ -549,6 +595,47 @@ namespace parkMonitor.server.CoreThread
     /// </summary>
     public class FetchCmd : AbstractCmd
     {
+        private void waitForFetchCompletionSignal(Command queueCmd, ref int parkingSpaceID, ref bool robotError)
+        {
+            PLCMessage PLCMsg = null;
+            MyTimer mt = new MyTimer();
+            mt.StartTiming();
+            while (!isClosing)
+            {
+                Thread.Sleep(2000);
+                PLCMsg = (PLCMessage)PLC.GetMessage();
+                int fetchingStatus = Convert.ToInt32(PLCMsg.originalPlcList[fetch_completed_address].Value);
+                //取车完成信号
+                if (fetchingStatus == 1)
+                {
+                    //取车完成后或可归零
+                    UILogServer.ins.log("获得取车完成信号");
+                    break;
+                }
+                else if (1 == 2)//机械手异常,则退指令,写数据库归位,判断条件需之后补充
+                {
+                    robotError = true;
+                    queueCmd.returnedCount += 1;
+                    queuingThread.SetMessage(queueCmd);
+                    if (!queueCmd.manual)
+                    {
+                        oper.UpdateParkingSpaceState(parkingSpaceID, 0);
+                    }
+                    else
+                    {
+                        locationOper.UpdateParkingSpaceState(parkingSpaceID, 0);
+                    }
+                    break;
+                }
+                mt.EndTiming();
+                if (mt.IsLonger(4, 1, true))
+                {
+                    UILogServer.ins.info("未获得取车完成信号,继续等待");
+                }
+            }
+
+        }
+
         public override void executeCmd(Command queueCmd)
         {
             PLCMessage PLCMsg = null;
@@ -565,6 +652,7 @@ namespace parkMonitor.server.CoreThread
             int garageID = vehiclelist.garageID;
             int frontwheelbase = vehiclelist.frontwheelbase;
             int rearwheelbase = vehiclelist.rearwheelbase;
+            bool robotError = false;
             Fetching_Space fslist = null;
             if (queueCmd.manual)
             {
@@ -604,23 +692,12 @@ namespace parkMonitor.server.CoreThread
             Log.WriteLog("取车:" + queueCmd.LicenseNum);
             UILogServer.ins.info("取车:" + queueCmd.LicenseNum);
             //等待PLC取车完成信号
-            Task signalFromPLC = Task.Factory.StartNew(() =>
+            Task FetchCompletionSignal = Task.Factory.StartNew(() =>
             {
-                while (!isClosing)
-                {
-                    Thread.Sleep(2000);
-                    PLCMsg = (PLCMessage)PLC.GetMessage();
-                    int fetchingStatus = Convert.ToInt32(PLCMsg.originalPlcList[fetch_completed_address].Value);
-                    //取车完成信号
-                    if (fetchingStatus == 1)
-                    {
-                        //取车完成后或可归零
-                        break;
-                    }
-                }
+                waitForFetchCompletionSignal(queueCmd,ref parkingSpaceID,ref robotError);
             });
             //Task.WaitAll(signalFromPLC);
-            signalFromPLC.Wait();
+            FetchCompletionSignal.Wait();
             //取车完成
             status = 5;
             ControlMessage cm2 = new ControlMessage();

+ 8 - 6
parkMonitor/server/CoreThread/QueuingThread.cs

@@ -95,7 +95,7 @@ namespace parkMonitor.server.CoreThread
                     else
                     {
                         Console.WriteLine("invalid user command.");
-                        UILogServer.ins.error("无法识别用户指令,并非停取车");
+                        UILogServer.ins.error("从web收到无法识别用户指令,并非停取车");
                     }
                 }
                 Thread.Sleep(500);
@@ -177,8 +177,7 @@ namespace parkMonitor.server.CoreThread
                 //Console.WriteLine("指令已扫描时间:" + userTimeSpan.TotalSeconds);
                 if (userTimeSpan.TotalMinutes >= userTime)
                 {
-                    UILogServer.ins.error("异常:用户指令已存在时间:" + userTimeSpan.TotalSeconds + "秒 ,强制出队");
-                    //Console.WriteLine("异常:用户指令已存在时间:" + userTimeSpan.TotalSeconds + "秒 ,强制出队");
+                    UILogServer.ins.error("异常:用户指令 "+ cmd.LicenseNum+ " 已存在超过" + userTimeSpan.TotalMinutes + "分钟 ,强制出队");
                     //cmd.LicenseNum = "";
                     cmd.commandType = 'e';
                     lock (ValidStoreCmdQueue)
@@ -213,7 +212,7 @@ namespace parkMonitor.server.CoreThread
                     if (licTimeSpan.TotalMinutes >= licenseTime)
                     {
                         //异常号牌不再入队,而是界面提示管理员,并让号牌机线程
-                        UILogServer.ins.error("异常:号牌已扫描时间:" + licTimeSpan.TotalSeconds + "秒 ,强制出队");
+                        UILogServer.ins.error("异常:号牌 " + node.LicenseNum + " 已扫描超过" + licTimeSpan.TotalMinutes + "分钟 ,强制出队");
                         //停车完成,将相应车牌复位
                         NumberMachineMessage numberMachineMessage = new NumberMachineMessage();
                         numberMachineMessage.aNode = new NumberMachineNode();
@@ -293,9 +292,12 @@ namespace parkMonitor.server.CoreThread
                     }
                 }
             }
-            if (!matched)
+            lock (LicenseQueue)
             {
-                LicenseQueue.Enqueue((NumberMachineNode)license.Clone());
+                if (!matched)
+                {
+                    LicenseQueue.Enqueue((NumberMachineNode)license.Clone());
+                }
             }
             license.ip = "used";
         }

+ 25 - 5
parkMonitor/server/PLCLinker/PLCLinker.cs

@@ -12,6 +12,7 @@ using System.Collections;
 using System.Timers;
 using HslCommunication.Controls;
 using parkMonitor.entity;
+using parkMonitor.tools;
 using parkMonitor.model;
 using System.Diagnostics;
 using System.Configuration;
@@ -442,9 +443,12 @@ namespace parkMonitor.server
                 return;
             }
         }
+
         private void WaitForLaserReady(LaserProcessUnit lpuTemp)
         {
             bool jumpOut = false;
+            MyTimer mt = new MyTimer();
+            mt.StartTiming();
             while (!jumpOut)
             {
                 Thread.Sleep(1000);
@@ -456,10 +460,16 @@ namespace parkMonitor.server
                         if (node.Address.Equals(lpuTemp.laser_status_address.ToString()) && (node.Value.Equals("254") || node.Value.Equals("255")))
                         {
                             jumpOut = true;
+                            UILogServer.ins.log("获取摆扫激光空闲状态,准备启动激光");
                             break;
                         }
                     }
                 }
+                mt.EndTiming();
+                if (mt.IsLonger(4, 1, true))
+                {
+                    UILogServer.ins.info("启动前暂未获取摆扫激光心跳/空闲状态,继续等待");
+                }
             }
         }
         //***************公有方法****************
@@ -529,7 +539,6 @@ namespace parkMonitor.server
                                 }
                                 if (laser_start_addr == "")
                                     return;
-
                                 WaitForLaserReady(lpuTemp);
                                 SendtoPLC(laser_start_addr, "0");
                                 foreach (LaserMessage lm in plcMsg.laserMsgList)
@@ -702,6 +711,7 @@ namespace parkMonitor.server
         private bool laser_record, laser_heartbeat_test, enable_status_check = true,disconnected = false;
         private HashSet<int> laser_heartbeat = new HashSet<int>();
         private IEquipments plc = null;
+        private MyTimer mt = new MyTimer();
         public LaserMessage laserMsg = new LaserMessage();
 
         public LaserProcessUnit(int id, int park_command_address, int laser_status_address, int laser_rescan_count, int laser_heartbeat_period)
@@ -757,6 +767,9 @@ namespace parkMonitor.server
                             //停车指令置0
                             PLCNode pn = new PLCNode(laser_start_address.ToString(), "0");
                             plc.SetMessage(pn);
+
+                            mt.StartTiming();
+
                             Thread.Sleep(2000);
                             laser_record = true;
                             laser_rescan_countdown = LASER_RESCAN_COUNT;
@@ -793,11 +806,19 @@ namespace parkMonitor.server
                                             //重测检测心跳
                                             Task rescan_wait_heartbeat = Task.Factory.StartNew(() =>
                                             {
+                                                MyTimer mt = new MyTimer();
+                                                mt.StartTiming();
                                                 while (laserMsg.status != 254 && laserMsg.status != 255)
                                                 {
                                                     Thread.Sleep(1000);
+                                                    mt.EndTiming();
+                                                    if (mt.IsLonger(4, 1, true))
+                                                    {
+                                                        UILogServer.ins.info("重测前未获得心跳,继续等待");
+                                                    }
                                                 }
                                             });
+                                            UILogServer.ins.log("获得心跳,准备发起重测");
                                             rescan_wait_heartbeat.Wait();
                                             pn = new PLCNode(laser_start_address.ToString(), "1");
                                             plc.SetMessage(pn);
@@ -828,9 +849,7 @@ namespace parkMonitor.server
                         lock (laserMsg)
                         {
                             laser_heartbeat_test = false;
-                            //AsyncCmdServer.ins.send(AsyncCmdType.LaserSystemException);
-                            Console.WriteLine("激光" + laserMsg.id + "系统状态异常");
-                            //UILogServer.ins.error("激光系统异常");
+                            UILogServer.ins.error("激光系统异常");
                         }
                     }
 
@@ -893,7 +912,8 @@ namespace parkMonitor.server
                                 laserMsg.data.height = value;
                         }
                         laserMsg.recorded = true;
-                        //Console.WriteLine("激光测量数据已记录");
+                        mt.EndTiming();
+                        UILogServer.ins.info(mt.GetInterval().TotalSeconds+"秒,摆扫激光测量数据已记录");
                     }
                 }
                 else

+ 96 - 0
parkMonitor/tools/MyTimer.cs

@@ -0,0 +1,96 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace parkMonitor.tools
+{
+    /// <summary>
+    /// 计时器类,提供计算时间间隔与判断时长方法
+    /// </summary>
+    class MyTimer
+    {
+        private DateTime startTime;
+        private DateTime endTime;
+        private bool recorded;
+        private bool displayed;
+        private TimeSpan timeSpan;
+        /// <summary>
+        /// 开始计时
+        /// </summary>
+        public void StartTiming()
+        {
+            recorded = false;
+            startTime = DateTime.Now;
+        }
+        /// <summary>
+        /// 结束计时
+        /// </summary>
+        public void EndTiming()
+        {
+            endTime = DateTime.Now;
+            timeSpan = endTime - startTime;
+            recorded = true;
+        }
+        /// <summary>
+        /// 获取时间间隔
+        /// </summary>
+        /// <returns>返回TimeSpan对象</returns>
+        public TimeSpan GetInterval()
+        {
+            if (recorded)
+                return timeSpan;
+            else
+                return new TimeSpan();
+        }
+        /// <summary>
+        /// 判断时长是否在范围内
+        /// </summary>
+        /// <param name="minCount">最小单位个数</param>
+        /// <param name="maxCount">最大单位个数</param>
+        /// <param name="secondsInUnit">一单位对应秒数</param>
+        /// /// <param name="displayOnlyOnce">是否只在外界输出一次</param>
+        /// <returns>判断结果</returns>
+        public bool IsInBetween(int minCount, int maxCount, double secondsInUnit, bool displayOnlyOnce)
+        {
+            TimeSpan ts = GetInterval();
+            if (ts.TotalSeconds >= minCount * secondsInUnit && ts.TotalSeconds <= maxCount * secondsInUnit)
+            {
+                if (displayOnlyOnce && displayed)
+                    return false;
+                else
+                {
+                    displayed = true;
+                    return true;
+                }
+            }
+            else
+                return false;
+        }
+        /// <summary>
+        /// 判断时长是否在范围内
+        /// </summary>
+        /// <param name="minCount">最小单位个数</param>
+        /// <param name="secondsInUnit">一单位对应秒数</param>
+        /// /// <param name="displayOnlyOnce">是否只在外界输出一次</param>
+        /// <returns>判断结果</returns>
+        public bool IsLonger(int minCount, double secondsInUnit, bool displayOnlyOnce)
+        {
+            TimeSpan ts = GetInterval();
+            if (ts.TotalSeconds >= minCount * secondsInUnit)
+            {
+                if (displayOnlyOnce && displayed)
+                    return false;
+                else
+                {
+                    displayed = true;
+                    return true;
+                }
+            }
+            else
+                return false;
+        }
+
+    }
+}