Browse Source

根据地感拍摄号牌,一段时间后出现无法获得号牌情况

yct 6 years ago
parent
commit
0ec440296a

+ 1 - 1
PLCLinker/centralController/App.config

@@ -28,7 +28,7 @@
     <add key="plcRack" value="0" />
     <add key="plcSlot" value="1" />
     <!--PLCdb块,分别对应终端、中控、车位-->
-    <add key="plcDatablockId" value="18,41,20" />
+    <add key="plcDatablockId" value="18,41,20,43" />
     <add key="plcTerminalCount" value="6" />
     <add key="plcParkingSpaceCount" value="200" />
     <add key="plcRefreshInterval" value="200"/>

+ 8 - 0
PLCLinker/centralController/FormPLCConf.cs

@@ -294,6 +294,10 @@ namespace PLCConnector
                     case "车位":
                         type = PLCDataType.parkingSpace;
                         id = 3000 + (index > 0 ? index - 1 : 0);
+                        break;
+                    case "错误":
+                        type = PLCDataType.errorInfo;
+
                         break;
                 }
             }
@@ -312,6 +316,10 @@ namespace PLCConnector
                 {
                     result = Terminal.Terminal.terminalInfo[id - 2000].ToString();
                 }
+                else if(type == PLCDataType.errorInfo)
+                {
+                    result = Monitor.Monitor.PLCErrorInfo.ToString();
+                }
                 else
                 {
                     Console.WriteLine("无法识别输入"); return;

+ 11 - 0
PLCLinker/centralController/Monitor/Monitor.cs

@@ -50,6 +50,7 @@ namespace Monitor
         public static int plcRefreshInterval { get; set; }
         public static MainBlockStru mainBlockInfo { get; set; }
         public static List<ParkingSpaceStru> parkingSpaceInfo { get; set; }
+        public static ErrorInfoStru PLCErrorInfo { get; set; }
         /// <summary>
         /// 远程数据库操作句柄
         /// </summary>
@@ -184,6 +185,16 @@ namespace Monitor
                                 }
                             }
                             catch (Exception ex) { Console.WriteLine("PLC监控中控数据," + ex.Message); }
+                            //接下来获取错误监控信息
+                            try
+                            {
+                                received = PLC.ReadFromPLC(PLCDataType.errorInfo, 0);
+                                if (received.Count > 0 && !mainBlockInfo.Equals(received[0]))
+                                {
+                                    PLCErrorInfo = (ErrorInfoStru)received[0];
+                                }
+                            }
+                            catch (Exception ex) { Console.WriteLine("PLC监控错误信息数据," + ex.Message); }
                             //最后获得所有车位信息
                             if (count < 10 && count % 5 == 0)
                             {

+ 11 - 2
PLCLinker/centralController/Monitor/SystemInitializer.cs

@@ -205,13 +205,22 @@ namespace Monitor
         internal bool PLCInit(int retryCount)
         {
             int temp = retryCount;
+            int terminalDB, centralDB, parkingSpaceDB, errorDB;
+            try
+            {
+                terminalDB = Int32.Parse(Monitor.plcDatablockConfig[0]);
+                centralDB = Int32.Parse(Monitor.plcDatablockConfig[1]);
+                parkingSpaceDB = Int32.Parse(Monitor.plcDatablockConfig[2]);
+                errorDB = Int32.Parse(Monitor.plcDatablockConfig[3]);
+            }
+            catch { Monitor.SetNotification("读取PLC中DB块编号异常", parkMonitor.model.TextColor.Error); return false; }
             //初始化PLC对象
             while (temp-- > 0)
             {
                 if (Monitor.PLC == null)
                 {
-                    Monitor.PLC = new PLCLinker(CpuType.S71500, Monitor.plcIPAddr, (short)Monitor.plcRack, (short)Monitor.plcSlot,
-                        Int32.Parse(Monitor.plcDatablockConfig[0]), Int32.Parse(Monitor.plcDatablockConfig[1]), Int32.Parse(Monitor.plcDatablockConfig[2]),
+                    Monitor.PLC = new PLCLinker(CpuType.S71500, Monitor.plcIPAddr, (short)Monitor.plcRack, (short)Monitor.plcSlot, terminalDB
+                        ,centralDB ,parkingSpaceDB ,errorDB,
                         Monitor.plcTerminalCount, Monitor.plcParkingSpaceCount);
                 }
                 //启动心跳进程

+ 42 - 28
PLCLinker/centralController/NumMachine/NumMachine.cs

@@ -1,5 +1,6 @@
 using centralController;
 using parkMonitor.entity;
+using parkMonitor.LOG;
 using System;
 using System.Collections.Generic;
 using System.Configuration;
@@ -23,7 +24,7 @@ namespace NumMachine
         /// <summary>
         /// 刷新时间间隔与个数
         /// </summary>
-        public const int REFRESHINGTIME = 500, FILTERINGNUMBER = 4;
+        public const int REFRESHINGTIME = 500, FILTERINGNUMBER = 5;
         ///<summary>通过设备句柄访问pic;链接时add,系统关闭时remove</summary>
         private static Dictionary<int, IntPtr> devPicMap = new Dictionary<int, IntPtr>();
         ///<summary>通过名字获取pic对象;创建pic时add,系统关闭remove</summary>
@@ -391,6 +392,7 @@ namespace NumMachine
                     //号牌不为空
                     if (!(plateInformation.plate.Contains("_无_")))
                     {
+                        Log.WriteLog(LogType.process, LogFile.INFO, nmn.id + "收到号牌回调信息: [" + plateInformation.plate + "]");
                         nmn.SetLic(strIP, nmn.id, plateInformation.plate, DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"), GetStatus(strIP));
                         FilterLic(strIP, (NumberMachineNode)nmn.Clone());
                     }
@@ -427,7 +429,7 @@ namespace NumMachine
         private void FilterLic(string ip, NumberMachineNode nmn)
         {
             int id = 0, activeCount = 0;
-            if (ipIdMap.TryGetValue(ip, out id) && idCountMap.TryGetValue(id, out activeCount) && activeCount < FILTERINGNUMBER)
+            if (ipIdMap.TryGetValue(ip, out id) && idCountMap.TryGetValue(id, out activeCount))// && activeCount < FILTERINGNUMBER)
             {
                 Dictionary<NumberMachineNode, int> filter;
                 //该filter不存在则创建
@@ -491,29 +493,34 @@ namespace NumMachine
                         while (enumer.MoveNext())
                         {
                             ////遍历,计数达标且队列中无此号牌
+                            Log.WriteLog(LogType.process, LogFile.INFO, "filter中号牌:" + enumer.Current.Key.LicenseNum + ", 个数:" + enumer.Current.Value);
                             //if (enumer.Current.Value >= (int)(filterCount * filterRatio) && enumer.Current.Key != null && !LicBuffer.Contains(enumer.Current.Key))
                             //找到最大计数及相应号牌信息
-                            if (enumer.Current.Value >= maxCount && enumer.Current.Key != null && !LicBuffer.Contains(enumer.Current.Key))
+                            if (enumer.Current.Value >= maxCount && enumer.Current.Key != null)// && !LicBuffer.Contains(enumer.Current.Key))
                             {
-                                //输出节点为空或与该号牌不同
-                                if (nmMsg.aNode == null || nmMsg.aNode.LicenseNum == null || nmMsg.aNode.LicenseNum != enumer.Current.Key.LicenseNum)
-                                {
-                                    maxCount = enumer.Current.Value;
-                                    node = (NumberMachineNode)enumer.Current.Key.Clone();
-                                    if (node != null && ipIdMap.TryGetValue(node.ip, out node.id))
-                                    {
-                                        LicBuffer.Enqueue((NumberMachineNode)node.Clone());
-                                        if (Monitor.Monitor.allInOneMachine != null)
-                                        {
-                                            Monitor.Monitor.allInOneMachine.DispForAWhile(2, node.LicenseNum, 25, 1, node.LicenseNum + ",入场");
-                                            Monitor.Monitor.allInOneMachine.DispForAWhile(3, "号牌机编号:" + node.id, 25, 1, "");
-                                        }
-                                    }
-                                }
+                                ////输出节点为空或与该号牌不同
+                                //if (nmMsg.aNode == null || nmMsg.aNode.LicenseNum == null || nmMsg.aNode.LicenseNum != enumer.Current.Key.LicenseNum)
+                                //{
+                                maxCount = enumer.Current.Value;
+                                node = (NumberMachineNode)enumer.Current.Key.Clone();
+                                Log.WriteLog(LogType.process, LogFile.INFO, "筛出号牌:" + node);
+                                //}
+                            }
+                        }
+                        if (node != null)
+                        //if (node != null && ipIdMap.TryGetValue(node.ip, out node.id))
+                        {
+                            //LicBuffer.Enqueue((NumberMachineNode)node.Clone());
+                            LicBuffer.Enqueue(node);
+                            Log.WriteLog(LogType.process, LogFile.INFO, "号牌入队:" + node.LicenseNum);
+                            if (Monitor.Monitor.allInOneMachine != null)
+                            {
+                                Monitor.Monitor.allInOneMachine.DispForAWhile(2, node.LicenseNum, 25, 1, node.LicenseNum + ",入场");
+                                Monitor.Monitor.allInOneMachine.DispForAWhile(3, "号牌机编号:" + node.id, 25, 1, "");
                             }
                         }
                     }
-                    filterCount = 0;
+                    //filterCount = 0;
                     filter.Clear();
                 }
             }
@@ -919,7 +926,7 @@ namespace NumMachine
         /// <returns></returns>
         public string GetLicensePlate(int id)
         {
-            string license = "";
+            string license = "";
             NumberMachineNode node = null;
             //Task.Factory.StartNew(() =>
             //{
@@ -953,43 +960,50 @@ namespace NumMachine
                             break;
                         }
                     }
-                    while (idCountMap[id] < FILTERINGNUMBER)
+                    idCountMap[id] = 0;
+                    int count = 0;
+                    while (count <= FILTERINGNUMBER)
                     {
-                        Console.WriteLine(handle);
+                        //Console.WriteLine(handle);
                         ActivateSnap(handle);
-                        Thread.Sleep((int)(REFRESHINGTIME * 0.6));
+                        count++;
+                        Thread.Sleep((int)(REFRESHINGTIME));
                     }
-                    idCountMap[id] = 0;
                 }
             }
 
-            int timeLimit = FILTERINGNUMBER + 2;
+            int timeLimit = FILTERINGNUMBER * 2;
             while (node == null && timeLimit-- > 0)
             {
                 lock (LicBuffer)
                 {
+                    Log.WriteLog(LogType.process, LogFile.INFO, "licBuffer 元素个数:" + LicBuffer.Count);
                     for (int i = 0; i < LicBuffer.Count; i++)
                     {
                         node = LicBuffer.Dequeue();
                         if (node != null)
                         {
-                            if (node.id == id)
+                            if (node.id == id && node.LicenseNum != "")
                             {
                                 license = node.LicenseNum;
+                                Log.WriteLog(LogType.process, LogFile.INFO, "license: " + license + ", id: " + id);
                                 break;
                             }
                             else
                             {
+                                Log.WriteLog(LogType.process, LogFile.INFO, "other license: " + node.LicenseNum + ", id: " + node.id);
                                 LicBuffer.Enqueue(node);
                             }
                         }
                     }
                 }
                 Thread.Sleep(REFRESHINGTIME);
-                if (timeLimit == 0) { Console.WriteLine("本次未找到号牌"); }
             }
+            if (timeLimit <= 0) { Console.WriteLine("本次未找到号牌"); Log.WriteLog(LogType.process, LogFile.INFO, id + "号号牌机未找到号牌"); }
+            else { Log.WriteLog(LogType.process, LogFile.INFO, id + "号号牌机本次号牌: [" + license + "]"); }
             //}).Wait();
-            return license;
+
+            return license == "空" ? "" : license;
         }
 
         /// <summary>

+ 18 - 5
PLCLinker/centralController/Terminal/Terminal.cs

@@ -782,7 +782,7 @@ namespace Terminal
                     catch { }
                     Monitor.Monitor.SetNotification(license + " 数据库已更新,停车流程结束", parkMonitor.model.TextColor.Info);
                     Log.WriteLog(LogType.process, LogFile.INFO, license + " 停车流程结束");
-                    Log.WriteLog(LogType.process, "--------------------------------");
+                    Log.WriteLog(LogType.process, LogFile.INFO, "--------------------------------");
                 }
             }
         }
@@ -810,6 +810,10 @@ namespace Terminal
                     Action<int> reserveAction = new Action<int>(ReservedOper);
                     reserveAction(i);
                 }
+                //else if (lockList[i] && terminalInfo[i].terminalID == 1)
+                //{
+                //    Log.WriteLog(LogType.process, LogFile.INFO, "停车终端,根据地感号牌获取中......");
+                //}
             }
         }
         private static void ReservedOper(int index)
@@ -817,7 +821,7 @@ namespace Terminal
             Task.Factory.StartNew(() =>
             {
                 string license = "";
-                int countdown = 2;
+                int countdown = 5;
                 short registered = 4;
                 while (license == "" && countdown-- > 0)
                 {
@@ -881,13 +885,17 @@ namespace Terminal
                     };
                     Monitor.Monitor.PLC.WriteToPLC(ts, PLCDataType.terminal);
                     Monitor.Monitor.SetNotification("指令写入PLC:" + ts.btnStatus, parkMonitor.model.TextColor.Log);
+                    Log.WriteLog(LogType.process, LogFile.INFO, "指令写入PLC:" + ts.btnStatus);
                     Thread.Sleep(1000);
                 }
                 else
                 {
+                    //Monitor.Monitor.SetNotification("收到地感后,尝试5次未拍到号牌。", parkMonitor.model.TextColor.Log);
+                    //Log.WriteLog(LogType.process, LogFile.ERROR, "收到地感后,尝试5次未拍到号牌。");
                     Thread.Sleep(200);
                 }
                 lockList[index] = false;
+                
             });
         }
         /// <summary>
@@ -921,11 +929,16 @@ namespace Terminal
 
             Task.Factory.StartNew(() =>
             {
-                while (!isClosing)
+                try
                 {
-                    ReservedCarCheck();
-                    Thread.Sleep(Monitor.Monitor.plcRefreshInterval * 5);
+                    while (!isClosing)
+                    {
+                        ReservedCarCheck();
+                        Thread.Sleep(Monitor.Monitor.plcRefreshInterval * 5);
+                    }
                 }
+                catch(Exception e) { Log.WriteLog(LogType.process, LogFile.ERROR, "预约异常,"+e.Message+", "+e.StackTrace); }
+                Log.WriteLog(LogType.process, LogFile.ERROR, "预约线程退出");
             });
         }
 

BIN
PLCLinker/centralController/obj/Release/centralController.Properties.Resources.resources


+ 1 - 1
PLCLinker/centralController/obj/Release/centralController.csproj.FileListAbsolute.txt

@@ -174,7 +174,6 @@ C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\DevCom
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.exe.config
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csproj.CoreCompileInputs.cache
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csproj.CopyComplete
-C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csprojAssemblyReference.cache
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\sdk\VZ_Sdk\VzDrawsLib.dll
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\sdk\VZ_Sdk\VzLPRSDK.dll
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\sdk\VZ_Sdk\VZ_Sdk.dll
@@ -264,3 +263,4 @@ E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonit
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csprojResolveAssemblyReference.cache
 E:\superScene\智能停车项目\智能停车项目v2.0\PLCLinker\centralController\obj\Release\centralController.FormAboutUs.resources
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.FormAboutUs.resources
+C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csprojAssemblyReference.cache

BIN
PLCLinker/centralController/obj/Release/centralController.csproj.GenerateResource.Cache


BIN
PLCLinker/centralController/sdk/PLC/PLCS7.dll


+ 45 - 0
PLCLinker/centralController/sdk/PLC/PLCS7.xml

@@ -44,6 +44,11 @@
             车位DB块ID
             </summary>
         </member>
+        <member name="F:PLCS7.AbstractPLCLinker.errorInfoDB">
+            <summary>
+            错误信息提示DB块ID
+            </summary>
+        </member>
         <member name="F:PLCS7.AbstractPLCLinker.terminalCount">
             <summary>
             终端个数
@@ -118,6 +123,21 @@
             <param name="centralDB"></param>
             <param name="parkingSpaceDB"></param>
         </member>
+        <member name="M:PLCS7.PLCLinker.#ctor(snap7Enc.CpuType,System.String,System.Int16,System.Int16,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            带错误提示块的构造函数
+            </summary>
+            <param name="cpu"></param>
+            <param name="ip"></param>
+            <param name="rack"></param>
+            <param name="slot"></param>
+            <param name="terminalDB"></param>
+            <param name="centralDB"></param>
+            <param name="parkingSpaceDB"></param>
+            <param name="errorInfoDB"></param>
+            <param name="terminalCount"></param>
+            <param name="parkingSpaceCount"></param>
+        </member>
         <member name="M:PLCS7.PLCLinker.ReadMultipleBytes(System.Int32,System.Int32,System.Int32)">
             <summary>
             读取指定数据块中多个字节
@@ -475,5 +495,30 @@
             后轮距
             </summary>
         </member>
+        <member name="T:PLCS7.ErrorInfoStru">
+            <summary>
+            错误信息结构体
+            </summary>
+        </member>
+        <member name="F:PLCS7.ErrorInfoStru.errorOne">
+            <summary>
+            错误信息编号
+            </summary>
+        </member>
+        <member name="F:PLCS7.ErrorInfoStru.errorTwo">
+            <summary>
+            错误信息编号
+            </summary>
+        </member>
+        <member name="F:PLCS7.ErrorInfoStru.errorThree">
+            <summary>
+            错误信息编号
+            </summary>
+        </member>
+        <member name="F:PLCS7.ErrorInfoStru.errorFour">
+            <summary>
+            错误信息编号
+            </summary>
+        </member>
     </members>
 </doc>

+ 28 - 1
PLCLinker/newPLCS7/PLCS7.cs

@@ -25,7 +25,8 @@ namespace PLCS7
     {
         terminal,
         central,
-        parkingSpace
+        parkingSpace,
+        errorInfo,
     }
     public abstract class AbstractPLCLinker : IPLCS7
     {
@@ -66,6 +67,10 @@ namespace PLCS7
         /// </summary>
         protected int parkingSpaceDB;
         /// <summary>
+        /// 错误信息提示DB块ID
+        /// </summary>
+        protected int errorInfoDB;
+        /// <summary>
         /// 终端个数
         /// </summary>
         protected int terminalCount;
@@ -194,6 +199,24 @@ namespace PLCS7
             isConnected = PLCConnect();
         }
         /// <summary>
+        /// 带错误提示块的构造函数
+        /// </summary>
+        /// <param name="cpu"></param>
+        /// <param name="ip"></param>
+        /// <param name="rack"></param>
+        /// <param name="slot"></param>
+        /// <param name="terminalDB"></param>
+        /// <param name="centralDB"></param>
+        /// <param name="parkingSpaceDB"></param>
+        /// <param name="errorInfoDB"></param>
+        /// <param name="terminalCount"></param>
+        /// <param name="parkingSpaceCount"></param>
+        public PLCLinker(CpuType cpu, string ip, short rack, short slot, int terminalDB, int centralDB, int parkingSpaceDB, int errorInfoDB, int terminalCount, int parkingSpaceCount):this(cpu,ip,rack,slot,terminalDB,centralDB,parkingSpaceDB,terminalCount,parkingSpaceCount)
+        {
+            this.errorInfoDB = errorInfoDB;
+            isConnected = PLCConnect();
+        }
+        /// <summary>
         /// 读取指定数据块中多个字节
         /// </summary>
         /// <param name="db"></param>
@@ -441,6 +464,10 @@ namespace PLCS7
                                 }
                             }
                             break;
+                        case PLCDataType.errorInfo:
+                            object errorInfo = ReadStruFromPLC(new ErrorInfoStru(), errorInfoDB);
+                            if (errorInfo != null) { result.Add(errorInfo); }
+                            break;
                         default:
                             Console.WriteLine("wrong type");
                             break;

+ 43 - 0
PLCLinker/newPLCS7/entity.cs

@@ -341,4 +341,47 @@ namespace PLCS7
             else return false;
         }
     }
+    /// <summary>
+    /// 错误信息结构体
+    /// </summary>
+    public struct ErrorInfoStru
+    {
+        /// <summary>
+        /// 错误信息编号
+        /// </summary>
+        public short errorOne;
+        /// <summary>
+        /// 错误信息编号
+        /// </summary>
+        public short errorTwo;
+        /// <summary>
+        /// 错误信息编号
+        /// </summary>
+        public short errorThree;
+        /// <summary>
+        /// 错误信息编号
+        /// </summary>
+        public short errorFour;
+
+        public override string ToString()
+        {
+            return "[错误1(0): "+errorOne+",错误2(2): "+errorTwo+", 错误3(4): "+errorThree+", 错误4(6): "+errorFour+"]";
+        }
+        public override int GetHashCode()
+        {
+            return (ToString()).GetHashCode();
+        }
+        public override bool Equals(object obj)
+        {
+            if (obj == null) return false;
+            else if ((object)this == obj) return true;
+            else if (obj.GetType().Equals(typeof(ErrorInfoStru)))
+            {
+                ErrorInfoStru eis = (ErrorInfoStru)obj;
+                if (eis.ToString().Equals(ToString())) return true;
+                else return false;
+            }
+            else return false;
+        }
+    }
 }