ソースを参照

取消车位整体更新,进行增量更新。流程结束清空中控块流程完成

yc_t 6 年 前
コミット
969e368f4c

+ 64 - 50
PLCLinker/centralController/Monitor/Monitor.cs

@@ -93,6 +93,10 @@ namespace Monitor
         /// </summary>
         public static int garageID;
         /// <summary>
+        /// PLC读取锁
+        /// </summary>
+        public static object PLCReadLock = new object();
+        /// <summary>
         /// 将显示在界面的提示字符串
         /// </summary>
         private static Queue<string> notificationQueue = new Queue<string>();
@@ -101,83 +105,93 @@ namespace Monitor
         private void PLCUpdate()
         {
             int linkCount = 0;
+            int count = 0;
             bool disconnected = false;
             while (!isClosing)
             {
+                if (count > 10000)
+                    count = 11;
+                count++;
                 if (PLC != null)
                 {
                     if (PLC.isConnected)
                     {
                         if (disconnected) {disconnected = false; SetNotification("PLC已重新连接",TextColor.Info); }
                         linkCount = 0;
-                        List<object> received = PLC.ReadFromPLC(PLCDataType.terminal, 0);
-                        //首先获取所有终端信息
-                        try
+                        lock (PLCReadLock)
                         {
-                            //终端总数相同
-                            if (Terminal.Terminal.terminalInfo.Count == plcTerminalCount)
+                            List<object> received = PLC.ReadFromPLC(PLCDataType.terminal, 0);
+                            //首先获取所有终端信息
+                            try
                             {
-                                for (int i = 0; i < plcTerminalCount; i++)
+                                //终端总数相同
+                                if (Terminal.Terminal.terminalInfo.Count == plcTerminalCount)
                                 {
-                                    //一旦发现差异立刻更新
-                                    if (!Terminal.Terminal.terminalInfo[i].Equals(received[i]))
+                                    for (int i = 0; i < plcTerminalCount; i++)
                                     {
-                                        Terminal.Terminal.terminalInfo[i] = (TerminalStru)received[i];
+                                        //一旦发现差异立刻更新
+                                        if (!Terminal.Terminal.terminalInfo[i].Equals(received[i]))
+                                        {
+                                            Terminal.Terminal.terminalInfo[i] = (TerminalStru)received[i];
+                                        }
                                     }
                                 }
-                            }
-                            else
-                            {
-                                //初始化终端信息列表
-                                Terminal.Terminal.terminalInfo.Clear();
-                                for (int i = 0; i < plcTerminalCount; i++)
+                                else
                                 {
-                                    Terminal.Terminal.terminalInfo.Add((TerminalStru)received[i]);
-                                    if (!Terminal.Terminal.termCalcMap.ContainsKey(((TerminalStru)received[i]).terminalID))
-                                        Terminal.Terminal.termCalcMap.Add(((TerminalStru)received[i]).terminalID, false);
-                                    else
-                                        Terminal.Terminal.termCalcMap[((TerminalStru)received[i]).terminalID] = false;
+                                    //初始化终端信息列表
+                                    Terminal.Terminal.terminalInfo.Clear();
+                                    for (int i = 0; i < plcTerminalCount; i++)
+                                    {
+                                        Terminal.Terminal.terminalInfo.Add((TerminalStru)received[i]);
+                                        if (!Terminal.Terminal.termCalcMap.ContainsKey(((TerminalStru)received[i]).terminalID))
+                                            Terminal.Terminal.termCalcMap.Add(((TerminalStru)received[i]).terminalID, false);
+                                        else
+                                            Terminal.Terminal.termCalcMap[((TerminalStru)received[i]).terminalID] = false;
+                                    }
                                 }
                             }
-                        }
-                        catch (Exception ex) { Console.WriteLine("PLC监控终端数据," + ex.Message); }
-                        //接下来获取中控监控信息
-                        try
-                        {
-                            received = PLC.ReadFromPLC(PLCDataType.central, 0);
-                            if (received.Count > 0 && !mainBlockInfo.Equals(received[0]))
-                            {
-                                mainBlockInfo = (MainBlockStru)received[0];
-                            }
-                        }
-                        catch (Exception ex) { Console.WriteLine("PLC监控中控数据," + ex.Message); }
-                        //最后获得所有车位信息
-                        try
-                        {
-                            received = PLC.ReadFromPLC(PLCDataType.parkingSpace, 0);
-                            //Console.WriteLine(parkingSpaceInfo.Count+","+ plcParkingSpaceCount);
-                            //车位总数相同
-                            if (parkingSpaceInfo.Count == plcParkingSpaceCount)
+                            catch (Exception ex) { Console.WriteLine("PLC监控终端数据," + ex.Message); }
+                            //接下来获取中控监控信息
+                            try
                             {
-                                for (int i = 0; i < plcParkingSpaceCount; i++)
+                                received = PLC.ReadFromPLC(PLCDataType.central, 0);
+                                if (received.Count > 0 && !mainBlockInfo.Equals(received[0]))
                                 {
-                                    //一旦发现差异立刻更新
-                                    if (!parkingSpaceInfo[i].Equals(received[i]))
-                                    {
-                                        parkingSpaceInfo[i] = (ParkingSpaceStru)received[i];
-                                    }
+                                    mainBlockInfo = (MainBlockStru)received[0];
                                 }
                             }
-                            else
+                            catch (Exception ex) { Console.WriteLine("PLC监控中控数据," + ex.Message); }
+                            //最后获得所有车位信息
+                            if (count < 10)
                             {
-                                parkingSpaceInfo.Clear();
-                                for (int i = 0; i < plcParkingSpaceCount; i++)
+                                try
                                 {
-                                    parkingSpaceInfo.Add((ParkingSpaceStru)received[i]);
+                                    received = PLC.ReadFromPLC(PLCDataType.parkingSpace, 0);
+                                    //Console.WriteLine(parkingSpaceInfo.Count+","+ plcParkingSpaceCount);
+                                    //车位总数相同
+                                    if (parkingSpaceInfo.Count == plcParkingSpaceCount)
+                                    {
+                                        for (int i = 0; i < plcParkingSpaceCount; i++)
+                                        {
+                                            //一旦发现差异立刻更新
+                                            if (!parkingSpaceInfo[i].Equals(received[i]))
+                                            {
+                                                parkingSpaceInfo[i] = (ParkingSpaceStru)received[i];
+                                            }
+                                        }
+                                    }
+                                    else
+                                    {
+                                        parkingSpaceInfo.Clear();
+                                        for (int i = 0; i < plcParkingSpaceCount; i++)
+                                        {
+                                            parkingSpaceInfo.Add((ParkingSpaceStru)received[i]);
+                                        }
+                                    }
                                 }
+                                catch (Exception ex) { Console.WriteLine("PLC监控车位数据," + ex.Message); }
                             }
                         }
-                        catch (Exception ex) { Console.WriteLine("PLC监控车位数据," + ex.Message); }
                     }
                     else
                     {

+ 45 - 1
PLCLinker/centralController/Terminal/Terminal.cs

@@ -320,6 +320,35 @@ namespace Terminal
             Monitor.Monitor.PLC.WriteToPLC(tsFromTerminal, PLCDataType.terminal);
         }
         /// <summary>
+        /// 更新PLC提供的特定车位状态
+        /// </summary>
+        /// <param name="state"></param>
+        private static void UpdateSpecificParkingSpace()
+        {
+            try
+            {
+                lock (Monitor.Monitor.PLCReadLock)
+                {
+                    //获取当前车位ID
+                    int parkingSpaceID = Monitor.Monitor.mainBlockInfo.currentParkingSpaceID;
+                    //获取车位状态
+                    List<object> received = Monitor.Monitor.PLC.ReadFromPLC(PLCDataType.parkingSpace, parkingSpaceID);
+                    //本地车位更新
+                    for (int i = 0; i < Monitor.Monitor.parkingSpaceInfo.Count; i++)
+                    {
+                        if (Monitor.Monitor.parkingSpaceInfo[i].parkingSpace == parkingSpaceID)
+                        {
+                            ParkingSpaceStru ps = Monitor.Monitor.parkingSpaceInfo[i];
+                            ps.spaceStatus = (short)((ParkingSpaceStru)received[0]).spaceStatus;
+                            Monitor.Monitor.parkingSpaceInfo[i] = ps;
+                            break;
+                        }
+                    }
+                }
+            }
+            catch { Console.WriteLine("更新此车位异常"); }
+        }
+        /// <summary>
         /// 验证会员信息
         /// </summary>
         /// <param name="ts"></param>
@@ -588,6 +617,7 @@ namespace Terminal
                 //拿到号牌
                 if (/*terminalInfo[i].terminalID == currentTerm && */idLicMap.TryGetValue(currentTerm, out license) && license != "")
                 {
+                    UpdateSpecificParkingSpace();
                     for (int i = 0; i < terminalInfo.Count; i++)
                     {
                         if (terminalInfo[i].terminalID == currentTerm)
@@ -608,7 +638,19 @@ namespace Terminal
                     //无车位信息则跳出当前循环
                     if (parkingSpaceID == 0 || term.receiptNum == 0)
                     {
-                        try { idLicMap.Remove(currentTerm); }
+                        try {
+                            idLicMap.Remove(currentTerm);
+                            ClearTerminal(term.terminalID);
+                            MainBlockStru mbs = new MainBlockStru
+                            {
+                                centralHearbeat = (short)-1,
+                                bookParkCmd = -1,
+                                bookFetchCmd = -1,
+                                processCompleted = (short)0,
+                                licenseReceived = (short)-1
+                            };
+                            Monitor.Monitor.PLC.WriteToPLC(mbs, PLCDataType.central);
+                        }
                         catch { }
                         Monitor.Monitor.SetNotification("无车位或凭证号", parkMonitor.model.TextColor.Warning);
                         return;
@@ -1218,6 +1260,7 @@ namespace Terminal
                                 }
                                 if (Monitor.Monitor.mainBlockInfo.processCompleted == 1)
                                 {
+                                    UpdateSpecificParkingSpace();
                                     while (terminalInfo[termIndex].receiptNum != 0)
                                     {
                                         count++;
@@ -1249,6 +1292,7 @@ namespace Terminal
                                         licenseReceived = (short)-1
                                     };
                                     Monitor.Monitor.PLC.WriteToPLC(mb, PLCDataType.central);
+
                                     if (fetchInfoMap.ContainsKey(terminalInfo[termIndex].terminalID))
                                     {
                                         fi = fetchInfoMap[terminalInfo[termIndex].terminalID];

+ 22 - 0
PLCLinker/centralController/WebServer/WebServer.cs

@@ -397,6 +397,17 @@ namespace centralController.WebServer
                                 //如果是预约停车,通知PLC减少一个可预约车位数
                                 if (msg.cmd == "RESERVE")
                                 {
+                                    //本地车位更新,2->3
+                                    for (int j = 0; j < Monitor.Monitor.parkingSpaceInfo.Count; j++)
+                                    {
+                                        if(Monitor.Monitor.parkingSpaceInfo[j].spaceStatus == 2)
+                                        {
+                                            ParkingSpaceStru ps = Monitor.Monitor.parkingSpaceInfo[j];
+                                            ps.spaceStatus = 3;
+                                            Monitor.Monitor.parkingSpaceInfo[j] = ps;
+                                            break;
+                                        }
+                                    }
                                     SendBookCmd(true, 1);
                                     Monitor.Monitor.SetNotification("通知PLC减少可预约车位", parkMonitor.model.TextColor.Log);
                                 }
@@ -425,6 +436,17 @@ namespace centralController.WebServer
                             {
                                 Monitor.Monitor.SetNotification(msg.context + " 预约已超时", parkMonitor.model.TextColor.Warning);
                                 Log.WriteLog(LogType.process, LogFile.INFO, msg.context + " 预约已超时");
+                                //本地车位更新,3->2
+                                for (int j = 0; j < Monitor.Monitor.parkingSpaceInfo.Count; j++)
+                                {
+                                    if (Monitor.Monitor.parkingSpaceInfo[j].spaceStatus == 3)
+                                    {
+                                        ParkingSpaceStru ps = Monitor.Monitor.parkingSpaceInfo[j];
+                                        ps.spaceStatus = 2;
+                                        Monitor.Monitor.parkingSpaceInfo[j] = ps;
+                                        break;
+                                    }
+                                }
                                 //通知PLC将可预约车位数恢复一个
                                 SendBookCmd(true, 2);
                                 //恢复车辆状态

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


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

@@ -385,6 +385,11 @@
             预约车位总数
             </summary>
         </member>
+        <member name="F:PLCS7.MainBlockStru.currentParkingSpaceID">
+            <summary>
+            当前需更新车位ID
+            </summary>
+        </member>
         <member name="T:PLCS7.ParkingSpaceStru">
             <summary>
             车位单元结构体