瀏覽代碼

PLC重连次数限制,加入手动重连机制。控制PLC掉线时的读写操作。回滚微调

yc_t 6 年之前
父節點
當前提交
8c30116852

+ 26 - 7
parkMonitor/controlPanel/ControlPanel.cs

@@ -1,5 +1,6 @@
 using MySql.Data.MySqlClient;
 using parkMonitor.entity;
+using parkMonitor.model;
 using parkMonitor.server.CoreThread;
 using parkMonitor.server.uiLogServer;
 using System;
@@ -51,10 +52,10 @@ namespace parkMonitor.controlPanel
             if (IndexCbMap == null) { IndexCbMap = new Dictionary<int, CheckBox>(); }
             if (ParkingBufferManager.ins != null)
             {
-                if (IndexCbMap.Count != ParkingBufferManager.ins.bufferCount)
+                if (IndexCbMap.Count != ParkingBufferManager.ins.bufferList.Count())
                 {
                     flp_buffer.Controls.Clear();
-                    for (int i = 0; i < ParkingBufferManager.ins.bufferCount; i++)
+                    for (int i = 0; i < ParkingBufferManager.ins.bufferList.Count(); i++)
                     {
                         ParkingBuffer temp = ParkingBufferManager.ins.bufferList[i];
                         CheckBox cb = new CheckBox();
@@ -66,7 +67,7 @@ namespace parkMonitor.controlPanel
                 }
                 else
                 {
-                    for (int i = 0; i < ParkingBufferManager.ins.bufferCount; i++)
+                    for (int i = 0; i < ParkingBufferManager.ins.bufferList.Count(); i++)
                     {
                         IndexCbMap[i].Checked = ParkingBufferManager.ins.bufferList[i].occupied;
                     }
@@ -121,25 +122,43 @@ namespace parkMonitor.controlPanel
 
         private void btn_reInit_Click(object sender, EventArgs e)
         {
+            PLCReconnect();
             InitWin iw = new InitWin();
             iw.ShowDialog();
         }
 
         private void btn_pause_Click(object sender, EventArgs e)
         {
-            EntityForCore.ins.globalStatus = false;
-            UILogServer.ins.warn("处理流程已暂停");
+            if (EntityForCore.ins.globalStatus)
+            {
+                EntityForCore.ins.globalStatus = false;
+                UILogServer.ins.warn("处理流程已暂停");
+            }
         }
 
         private void btn_recover_Click(object sender, EventArgs e)
         {
-            EntityForCore.ins.globalStatus = true;
-            UILogServer.ins.warn("处理流程已恢复");
+            if (!EntityForCore.ins.globalStatus)
+            {
+                EntityForCore.ins.globalStatus = true;
+                UILogServer.ins.warn("处理流程已恢复");
+            }
         }
 
         private void btn_PLC_Click(object sender, EventArgs e)
         {
+            PLCReconnect();
+        }
 
+        private void PLCReconnect()
+        {
+            IEquipments plc = EquipmentSimpleFactory.ins.FindEquipment(EquipmentName.PLC);
+            if (plc != null)
+            {
+                ControlMessage cm = new ControlMessage();
+                cm.status = 10;
+                plc.SetMessage(cm);
+            }
         }
     }
 }

+ 12 - 2
parkMonitor/entity/EntityForCore.cs

@@ -79,7 +79,10 @@ namespace parkMonitor.entity
             Log.WriteLog(LogType.NOT_DATABASE, LogFile.LOG, "初始化缓冲位");
             ParkingBufferManager.ins = new ParkingBufferManager();
             initState = initState && ParkingBufferManager.ins.InitParkingBuffers();
-            UILogServer.ins.info("系统初始化完成");
+            if (initState)
+            {
+                UILogServer.ins.info("系统初始化完成");
+            }
             return initState;
         }
 
@@ -119,7 +122,14 @@ namespace parkMonitor.entity
                 ParkingBufferManager.ins = new ParkingBufferManager();
             }
             initState = initState && ParkingBufferManager.ins.InitParkingBuffers();
-            UILogServer.ins.info("系统初始化完成");
+            if (initState)
+            {
+                UILogServer.ins.info("系统初始化完成");
+            }
+            else
+            {
+                UILogServer.ins.info("系统初始化失败");
+            }
             return initState;
         }
     }

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

@@ -137,7 +137,7 @@ namespace parkMonitor.server.CoreThread
                         PLCMsg = (PLCMessage)PLC.GetMessage();
                     }
                     bool occupied = true;
-                    if (PLCMsg != null)
+                    if (PLCMsg != null && PLCMsg.originalPlcList.Count!=0)
                     {
                         if (robotID == 1)
                         {
@@ -169,6 +169,7 @@ namespace parkMonitor.server.CoreThread
                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.LOG, "获得机械手资源");
                         break;
                     }
+                    Thread.Sleep(1000);
                     mt.EndTiming();
                     int activationCount = 0;
                     if (mt.IsLonger(60, 1, false, out activationCount))
@@ -185,7 +186,6 @@ namespace parkMonitor.server.CoreThread
                             Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "启动机械手资源超时,已启动回滚");
                             return false;
                         }
-                        Thread.Sleep(100);
                     }
                 }
             }
@@ -204,20 +204,33 @@ namespace parkMonitor.server.CoreThread
             //命令回退
             queueCmd.returnedCount += 1;
             queuingThread.SetMessage(queueCmd);
-            //线程计数调整
+            //机械手释放
             if (robotAllocated)
             {
                 Robot.robot1.occupied = false;
             }
+            //线程计数调整,复位PLC指令
             if (!queueCmd.manual)
             {
                 if (isParking)
                 {
                     Robot.robot1.parkWaitCount -= 1;
+                    ControlMessage cMsg = new ControlMessage
+                    {
+                        status = 6,
+                        RobotID = 1
+                    };
+                    PLC.SetMessage(cMsg);
                 }
                 else
                 {
                     Robot.robot1.fetchWaitCount -= 1;
+                    ControlMessage cMsg = new ControlMessage
+                    {
+                        status = 7,
+                        RobotID = 1
+                    };
+                    PLC.SetMessage(cMsg);
                 }
             }
             //释放激光
@@ -362,7 +375,7 @@ namespace parkMonitor.server.CoreThread
                     Log.WriteLog(LogType.NOT_DATABASE, LogFile.LOG, "停车流程:" + queueCmd.LicenseNum + "已分配车位");
                     break;
                 }
-                Thread.Sleep(200);
+                Thread.Sleep(1000);
                 mt.EndTiming();
                 int activationCount = 0;
                 if (mt.IsLonger(5, 1, false, out activationCount))
@@ -378,7 +391,7 @@ namespace parkMonitor.server.CoreThread
                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, queueCmd.LicenseNum + "超时未获得车位,指令退回");
                         return null;
                     }
-                    Thread.Sleep(100);
+                    //Thread.Sleep(1000);
                 }
             }
             return ppp;
@@ -475,8 +488,7 @@ namespace parkMonitor.server.CoreThread
                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, queueCmd.LicenseNum + "超时未获取激光数据,指令退回");
                         return null;
                     }
-                    Thread.Sleep(100);
-
+                    //Thread.Sleep(1000);
                 }
             }
             return data;
@@ -492,7 +504,6 @@ namespace parkMonitor.server.CoreThread
             mt.StartTiming();
             while (!isClosing)
             {
-                Thread.Sleep(1000);
                 int storeStatus = 0;
                 if (PLC != null)
                 {
@@ -522,6 +533,7 @@ namespace parkMonitor.server.CoreThread
                     }
                     break;
                 }
+                Thread.Sleep(1000);
                 mt.EndTiming();
                 int activationCount = 0;
                 if (mt.IsLonger(120, 1, false, out activationCount))
@@ -537,7 +549,7 @@ namespace parkMonitor.server.CoreThread
                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, queueCmd.LicenseNum + "等待停车完成信号" + status + "超时,流程回滚");
                         return false;
                     }
-                    Thread.Sleep(100);
+                    //Thread.Sleep(1000);
                 }
             }
             return true;
@@ -581,7 +593,7 @@ namespace parkMonitor.server.CoreThread
                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "超时未获取轮距雷达数据,流程回滚");
                         return false;
                     }
-                    Thread.Sleep(100);
+                    //Thread.Sleep(1000);
                 }
             }
             return true;
@@ -777,6 +789,7 @@ namespace parkMonitor.server.CoreThread
                 Rollback(queueCmd, ppp.parkingSpaceID, true, true, lmToBeReleased);
                 return;
             }
+            //机械手异常则回滚
             if (!WaitForStoreCompletionSignal(queueCmd, ppp.parkingSpaceID, ref robotError, 1))
             {
                 Rollback(queueCmd, ppp.parkingSpaceID, true, true, lmToBeReleased);
@@ -787,7 +800,6 @@ namespace parkMonitor.server.CoreThread
             status = 3;
             cm.status = status;
             PLC.SetMessage(cm);
-            //机械手异常则回滚
             if (!WaitForStoreCompletionSignal(queueCmd, ppp.parkingSpaceID, ref robotError, 0))
             {
                 Rollback(queueCmd, ppp.parkingSpaceID, true, true, lmToBeReleased);
@@ -970,7 +982,6 @@ namespace parkMonitor.server.CoreThread
             mt.StartTiming();
             while (!isClosing)
             {
-                Thread.Sleep(2000);
                 PLCMsg = (PLCMessage)PLC.GetMessage();
                 int fetchingStatus = Convert.ToInt32(PLCMsg.originalPlcList[fetch_completed_address].Value);
                 //取车完成信号
@@ -996,6 +1007,7 @@ namespace parkMonitor.server.CoreThread
                     }
                     break;
                 }
+                Thread.Sleep(1000);
                 mt.EndTiming();
                 int activationCount = 0;
                 if (mt.IsLonger(120, 1, false, out activationCount))
@@ -1011,7 +1023,6 @@ namespace parkMonitor.server.CoreThread
                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, queueCmd.LicenseNum + "等待取车完成信号" + status + "超时,流程回滚");
                         return false;
                     }
-                    Thread.Sleep(100);
                 }
             }
             return true;
@@ -1053,7 +1064,7 @@ namespace parkMonitor.server.CoreThread
                     count++;
                     if (count == 1)
                     {
-                        UILogServer.ins.error("无法获取车辆信息");
+                        UILogServer.ins.error("无法获取车辆信息,请回滚流程");
                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "无法从数据库获取车辆信息,流程中止");
                     }
                     Thread.Sleep(5000);
@@ -1075,7 +1086,7 @@ namespace parkMonitor.server.CoreThread
                     count++;
                     if (count == 1)
                     {
-                        UILogServer.ins.error("车位分配出现异常!!!");
+                        UILogServer.ins.error("车位分配出现异常!!!请回滚流程并初始化系统");
                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "车位分配出现异常!!!");
                     }
                     Thread.Sleep(5000);

+ 5 - 0
parkMonitor/server/CoreThread/SpaceManager.cs

@@ -367,6 +367,11 @@ namespace parkMonitor.server.CoreThread
                         }
                     }
                 }
+                if(bufferList.Count!= bufferCount)
+                {
+                    UILogServer.ins.error("缓冲位数据异常,请检查plc相关数据");
+                    return false;
+                }
                 //UILogServer.ins.warn("请手动确认缓冲位状态");
                 Log.WriteLog(LogType.NOT_DATABASE, LogFile.LOG, "初始化缓冲位成功");
                 checkedAuto = true;

+ 42 - 7
parkMonitor/server/PLCLinker/PLCLinker.cs

@@ -339,6 +339,7 @@ namespace parkMonitor.server
                 }
                 else
                 {
+                    json = "";
                     if (EntityForCore.ins.globalStatus)
                     {
                         Reconnect();
@@ -373,15 +374,20 @@ namespace parkMonitor.server
                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.LOG, "PLC重连中,请稍候。。。。。。");
                     }
                     LinkStart();
-                    Thread.Sleep(10000);
+                    Thread.Sleep(6000);
                     if (isConnection)
                     {
                         EntityForCore.ins.globalStatus = true;
                         linkCount = 10;
+                        exceptionBreak = false;
                         break;
                     }
                 }
-            }).Wait();
+                if (linkCount <= 0)
+                {
+                    UILogServer.ins.warn("重连PLC超过尝试次数,请检查硬件,之后手动连接PLC");
+                }
+            });
             //linkCount = -1;
             //}
         }
@@ -523,7 +529,7 @@ namespace parkMonitor.server
         {
             List<string> temp = new List<string>();
             List<PLCNode> decomPlcList = new List<PLCNode>();
-            if (plcList != null && addrLength > 100)
+            if (plcList != null && plcList.Count != 0 && addrLength > 100)
             {
                 try
                 {
@@ -636,7 +642,6 @@ namespace parkMonitor.server
             {
                 while (!jumpOut)
                 {
-                    Thread.Sleep(1000);
                     if (plcMsg != null && plcMsg.originalPlcList.Count > lpuTemp.laser_status_address)
                     {
                         foreach (PLCNode node in plcMsg.originalPlcList)
@@ -655,6 +660,7 @@ namespace parkMonitor.server
                             }
                         }
                     }
+                    Thread.Sleep(1000);
                     mt.EndTiming();
                     int activationCount = 0;
                     if (mt.IsLonger(15, 1, false, out activationCount))
@@ -669,7 +675,6 @@ namespace parkMonitor.server
                             UILogServer.ins.error("启动前超时未能获取摆扫空闲状态,请检查设备");
                             Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "启动前超时未能获取摆扫空闲状态,请检查设备");
                         }
-                        Thread.Sleep(100);
                     }
                 }
             }
@@ -688,6 +693,11 @@ namespace parkMonitor.server
                 {
                     plcMsg.originalPlcList = JsonHelper.DeserializeJsonToList<PLCNode>(json);
                 }
+                else
+                {
+                    plcMsg.originalPlcList = new List<PLCNode>();
+                }
+
                 if (decompressIndex != null && decompressIndex.Count != 0)
                 {
                     plcMsg.extendedPlcList = ListDecompression(plcMsg.originalPlcList, decompressIndex);
@@ -708,6 +718,7 @@ namespace parkMonitor.server
         /// <param name="message">plc消息则传入plc,控制消息则根据指令编号分别处理</param>
         public void SetMessage(AbstractMessage message)
         {
+            //if (!isConnection) { UILogServer.ins.error("PLC未连接"); return; }
             if (message.GetType().Equals(typeof(PLCMessage)))
             {
                 PLCMessage ps = (PLCMessage)message;
@@ -816,6 +827,32 @@ namespace parkMonitor.server
                                 SendtoPLC(rpu1.fetch_to_address.ToString(), "0");
                             }
                             break;
+                        case 6:
+                            if (cm.RobotID == 1)
+                            {
+                                //停车回滚
+                                SendtoPLC(rpu1.parking_startRobot_address.ToString(), "0");
+                                SendtoPLC("1", "0");//停车指令置0
+                            }
+                            break;
+                        case 7:
+                            if (cm.RobotID == 1)
+                            {
+                                //取车回滚
+                                SendtoPLC(rpu1.fetching_startRobot_address.ToString(), "0");
+                                SendtoPLC(rpu1.fetch_to_address.ToString(), "0");
+                            }
+                            break;
+                        case 10:
+                            if (!EntityForCore.ins.globalStatus && linkCount <= 0)
+                            {
+                                Reconnect();
+                            }
+                            else
+                            {
+                                UILogServer.ins.warn("无需手动重连PLC");
+                            }
+                            break;
                         default: Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "输入PLC数据异常"); break;
                     }
                 }
@@ -1165,7 +1202,6 @@ namespace parkMonitor.server
                                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "记录数据前超时未获得心跳");
                                         return;
                                     }
-                                    Thread.Sleep(100);
                                 }
                             }
                             laser_record = true;
@@ -1222,7 +1258,6 @@ namespace parkMonitor.server
                                                         Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "发起重测前超时未能获取摆扫激光心跳");
                                                         return;
                                                     }
-                                                    Thread.Sleep(100);
                                                 }
                                             }
                                         });

+ 1 - 1
parkMonitor/view/menuBox/MenuBox.xaml.cs

@@ -110,10 +110,10 @@ namespace parkMonitor.view.util
         /// <summary>菜单-重启上次流程</summary>
         private void muRunRestartProcess_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
         {
-            MyTimer.restart = !MyTimer.restart;
             if (sender is ImageMenuItem)
             {
                 ImageMenuItem temp = ((ImageMenuItem)this.FindName("muRunRestartProcess"));
+                MyTimer.restart = !MyTimer.restart;
                 if (MyTimer.restart)
                 {
                     temp.Content = "回滚已启动";