Browse Source

LED电子围栏,plc相应增加围栏状态块

yct 5 years ago
parent
commit
9c008c4c03

+ 10 - 10
PLCLinker/centralController/App.config

@@ -7,20 +7,20 @@
     <add key="retryCount" value="3"/>
     <add key="defaultLic" value="鄂ZZZZZZ"/>
     <!--停车位显示相关配置-->
-    <add key="floors" value="17"/>
-    <add key="rows" value="2"/>
-    <add key="spacesInRow" value="6"/>
+    <add key="floors" value="14"/>
+    <add key="rows" value="1"/>
+    <add key="spacesInRow" value="15"/>
     <!--数据库信息-->
     <!--<add key="remoteDBConnStr" value="Data Source=59.175.148.85;port=3306;uid=root;pooling=true;max pool size=1024;pwd=x5;database=zxpark_cloud_2;CharSet=utf8;Allow Zero Datetime=true;"/>-->
     <add key="remoteDBConnStr" value="Data Source=118.31.225.50;port=3306;uid=zx;pooling=true;max pool size=1024;pwd=ZhiXiang436070;database=zxpark_cloud_2;CharSet=utf8;Allow Zero Datetime=true;"/>
     <!--<add key="remoteDBConnStr" value="Data Source=192.168.0.152;port=3306;uid=root;pooling=true;max pool size=1024;pwd=x5;database=zxpark_cloud_2;CharSet=utf8;Allow Zero Datetime=true;"/>-->
     <!--<add key="remoteDBConnStr" value="Data Source=127.0.0.1;port=20000;uid=root;pooling=true;max pool size=1024;pwd=yct;database=zxpark_cloud_2;CharSet=utf8;Allow Zero Datetime=true;"/>-->
-    <add key="localDBConnStr" value="Data Source=106.14.121.187;port=3306;uid=ubuntu;pooling=true;max pool size=1024;pwd=tommi94;database=zxpark_local;CharSet=utf8;Allow Zero Datetime=true;"/>
-    <!--<add key="localDBConnStr" value="Data Source=127.0.0.1;port=3306;uid=root;pooling=true;max pool size=1024;pwd=;database=zxpark_local;CharSet=utf8;Allow Zero Datetime=true;"/>-->
+    <!--<add key="localDBConnStr" value="Data Source=106.14.121.187;port=3306;uid=ubuntu;pooling=true;max pool size=1024;pwd=tommi94;database=zxpark_local;CharSet=utf8;Allow Zero Datetime=true;"/>-->
+    <add key="localDBConnStr" value="Data Source=127.0.0.1;port=3306;uid=root;pooling=true;max pool size=1024;pwd=;database=zxpark_local;CharSet=utf8;Allow Zero Datetime=true;"/>
     <add key="DBtimeout" value="3"/>
     <!--号牌机信息-->
-    <add key="192.168.0.51" value="2"/>
-    <add key="192.168.0.50" value="1"/>
+    <add key="192.168.0.51" value="3"/>
+    <add key="192.168.0.50" value="4"/>
     <add key="filterRatio" value="0.6"/>
     <!--PLC基本配置-->
     <!--<add key="PLC_ip_address" value="192.168.0.10" />-->
@@ -29,15 +29,15 @@
     <add key="plcRack" value="0" />
     <add key="plcSlot" value="1" />
     <!--PLCdb块,分别对应终端、中控、车位-->
-    <add key="plcDatablockId" value="18,41,20,43" />
+    <add key="plcDatablockId" value="18,41,20,43,47" />
     <add key="plcTerminalCount" value="6" />
     <add key="plcParkingSpaceCount" value="200" />
     <add key="plcRefreshInterval" value="200"/>
     <!--显示屏信息-->
     <!--<add key="allInOneMachineIP" value="192.168.10.90"/>
     <add key="allInOneMachinePort" value="8888"/>-->
-    <add key="allInOneMachineIP" value="192.168.0.19"/>
-    <add key="allInOneMachinePort" value="5005"/>
+    <add key="allInOneMachineIP" value="192.168.0.18,192.168.0.19,192.168.0.21,192.168.0.20,192.168.0.22,192.168.0.23"/>
+    <add key="allInOneMachinePort" value="5005,5005,5005,5005,5005,5005"/>
     <!--中控webServer端口,deprecated-->
     <add key="webPort" value="9000"/>
     <!--车库信息-->

File diff suppressed because it is too large
+ 176 - 241
PLCLinker/centralController/FormCentralController.Designer.cs


+ 9 - 1
PLCLinker/centralController/FormCentralController.cs

@@ -463,6 +463,15 @@ namespace centralController
             string disp = textBox1.Text;
             string audio = textBox2.Text;
             //Monitor.Monitor.allInOneMachine.DispForAWhile(0, disp, 10, 1, audio);
+            //Monitor.Monitor.allInOneMachine.boardList[0].UpdateText(disp, 8);
+            try
+            {
+                Monitor.Monitor.allInOneMachine.boardList[0].UpdateText(disp==""?"智象停车欢迎您!":disp, 30, int.Parse(audio));
+            }
+            catch { }
+            //Monitor.Monitor.allInOneMachine.boardList[0].UpdateText("请将方向盘回正,带好随身携带的物品,关闭车窗与车门,收起后视镜,确认所有人员离开车辆后,操作终端停车", 30, 2);
+            //Thread.Sleep(1000);
+            //Monitor.Monitor.allInOneMachine.boardList[0].UpdateArrow(2, 5, 2);
         }
 
         /// <summary>
@@ -1083,6 +1092,5 @@ namespace centralController
                 }
             }
         }
-
     }
 }

+ 9 - 2
PLCLinker/centralController/FormPLCConf.cs

@@ -285,7 +285,8 @@ namespace PLCConnector
                 switch (block)
                 {
                     case "中控":
-                        type = PLCDataType.central; id = 1001;
+                        type = PLCDataType.central;
+                        id = 1001;
                         break;
                     case "终端":
                         type = PLCDataType.terminal;
@@ -297,7 +298,9 @@ namespace PLCConnector
                         break;
                     case "错误":
                         type = PLCDataType.errorInfo;
-
+                        break;
+                    case "扫描":
+                        type = PLCDataType.scanInfo;
                         break;
                 }
             }
@@ -320,6 +323,10 @@ namespace PLCConnector
                 {
                     result = Monitor.Monitor.PLCErrorInfo.ToString();
                 }
+                else if(type == PLCDataType.scanInfo)
+                {
+                    result = Monitor.Monitor.PLCScanInfo.ToString();
+                }
                 else
                 {
                     Console.WriteLine("无法识别输入"); return;

+ 12 - 1
PLCLinker/centralController/Monitor/Monitor.cs

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

+ 45 - 44
PLCLinker/centralController/Monitor/SystemInitializer.cs

@@ -81,7 +81,7 @@ namespace Monitor
             catch (Exception e) { Console.WriteLine("初始化," + e.Message); return; }
 
             Monitor.SetNotification("初始化PLC连接...", parkMonitor.model.TextColor.Log);
-            //initStatus = initStatus && PLCInit(retryCount);
+            initStatus = initStatus && PLCInit(retryCount);
             //PLC初始化结束,进入状态2
             if (!initStatus) { Monitor.SetNotification("PLC连接失败,请检查设备", parkMonitor.model.TextColor.Error); return; }
             else { Monitor.initializeState = 2; }
@@ -89,14 +89,14 @@ namespace Monitor
             //初始化数据库对象
             Monitor.remoteDBOper = new DBOperation(remoteDBConnStr, DBtimeout);
             Monitor.localDBOper = new DBOperation(localDBConnStr, DBtimeout);
-            //Monitor.SetNotification("初始化云端数据库...", parkMonitor.model.TextColor.Log);
-            //initStatus = initStatus && Monitor.remoteDBOper.InitConnPooling(5);
-            //if (!initStatus) { Monitor.SetNotification("云端数据库初始化异常", parkMonitor.model.TextColor.Error); return; }
-            //Monitor.SetNotification("初始化本地数据库...", parkMonitor.model.TextColor.Log);
-            //initStatus = initStatus && Monitor.localDBOper.InitConnPooling(5);
-            ////数据库初始化结束,进入状态3
-            //if (!initStatus) { Monitor.SetNotification("本地数据库初始化异常", parkMonitor.model.TextColor.Error); return; }
-            //else { Monitor.initializeState = 3; }
+            Monitor.SetNotification("初始化云端数据库...", parkMonitor.model.TextColor.Log);
+            initStatus = initStatus && Monitor.remoteDBOper.InitConnPooling(5);
+            if (!initStatus) { Monitor.SetNotification("云端数据库初始化异常", parkMonitor.model.TextColor.Error); return; }
+            Monitor.SetNotification("初始化本地数据库...", parkMonitor.model.TextColor.Log);
+            initStatus = initStatus && Monitor.localDBOper.InitConnPooling(5);
+            //数据库初始化结束,进入状态3
+            if (!initStatus) { Monitor.SetNotification("本地数据库初始化异常", parkMonitor.model.TextColor.Error); return; }
+            else { Monitor.initializeState = 3; }
 
             //初始化凭证号
             initStatus = initStatus && Credence.ReadCredence();
@@ -157,42 +157,42 @@ namespace Monitor
             #region 测试屏显
             //Console.WriteLine(Monitor.allInOneMachine.boardList.Count);
             //Console.WriteLine(Monitor.allInOneMachine.boardList[0].boardParams.ip + ", " + Monitor.allInOneMachine.boardList[0].boardParams.port);
-            Monitor.allInOneMachine.boardList[0].UpdateText("请带好随身携带的物品,关闭车窗与车门,收起后视镜,确认所有人员离开车辆后,操作终端停车", 60, 2);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(2);
-            Thread.Sleep(4000);
-            ////Monitor.allInOneMachine.boardList[0].UpdateText("下下下", 3);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(-1);
-            Thread.Sleep(4000);
-            ////Monitor.allInOneMachine.boardList[0].UpdateText("左左左", 3);
-            //Monitor.allInOneMachine.boardList[0].UpdateText("请带好随身携带的物品,关闭车窗与车门,收起后视镜,确认所有人员离开车辆后,操作终端停车", 3);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(1);
-            Thread.Sleep(4000);
-            ////Monitor.allInOneMachine.boardList[0].UpdateText("", 20);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(-1);
-            Thread.Sleep(5000);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(0);
-            Thread.Sleep(5000);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(-1);
-            Thread.Sleep(4000);
-            ////Monitor.allInOneMachine.boardList[0].UpdateText("左左左", 3);
-            //Monitor.allInOneMachine.boardList[0].UpdateText("请带好随身携带的物品,关闭车窗与车门,收起后视镜,确认所有人员离开车辆后,操作终端停车", 3);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(3);
-            Thread.Sleep(4000);
-            ////Monitor.allInOneMachine.boardList[0].UpdateText("", 20);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(-1);
-            Thread.Sleep(5000);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(1);
-            Thread.Sleep(8000);
-            Monitor.allInOneMachine.boardList[0].UpdateArrow(-1);
-            Thread.Sleep(5000);
+            //Monitor.allInOneMachine.boardList[0].UpdateText("智象停车欢迎您!", 30, 0);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(2, 5, 2);
+            //Thread.Sleep(4000);
+            //////Monitor.allInOneMachine.boardList[0].UpdateText("下下下", 3);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1);
+            //Thread.Sleep(4000);
+            //////Monitor.allInOneMachine.boardList[0].UpdateText("左左左", 3);
+            ////Monitor.allInOneMachine.boardList[0].UpdateText("请带好随身携带的物品,关闭车窗与车门,收起后视镜,确认所有人员离开车辆后,操作终端停车", 3);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(1);
+            //Thread.Sleep(4000);
+            //////Monitor.allInOneMachine.boardList[0].UpdateText("", 20);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1);
+            //Thread.Sleep(5000);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(0);
+            //Thread.Sleep(5000);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1, 5, 0);
+            //Thread.Sleep(4000);
+            //////Monitor.allInOneMachine.boardList[0].UpdateText("左左左", 3);
+            ////Monitor.allInOneMachine.boardList[0].UpdateText("请带好随身携带的物品,关闭车窗与车门,收起后视镜,确认所有人员离开车辆后,操作终端停车", 3);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(3);
+            //Thread.Sleep(4000);
+            //////Monitor.allInOneMachine.boardList[0].UpdateText("", 20);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1);
+            //Thread.Sleep(5000);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(1);
+            //Thread.Sleep(8000);
+            //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1);
+            //Thread.Sleep(5000);
             #endregion 
             //BroadcastLinker.Start();
             //Monitor.allInOneMachine = BroadcastLinker.ins;//new BroadcastBoard(Monitor.allInOneMachineIP, Monitor.allInOneMachinePort);
 
             //初始化广告实例
-            Monitor.SetNotification("初始化广告...", parkMonitor.model.TextColor.Log);
-            Monitor.advertMgr = new AdvertManager();
-            initStatus = initStatus && AdvertMgrInit(3);
+            //Monitor.SetNotification("初始化广告...", parkMonitor.model.TextColor.Log);
+            //Monitor.advertMgr = new AdvertManager();
+            //initStatus = initStatus && AdvertMgrInit(3);
             //Monitor.AddNotification("test");
 
             Monitor.SetNotification("初始化终端...", parkMonitor.model.TextColor.Log);
@@ -255,13 +255,14 @@ namespace Monitor
         internal bool PLCInit(int retryCount)
         {
             int temp = retryCount;
-            int terminalDB, centralDB, parkingSpaceDB, errorDB;
+            int terminalDB, centralDB, parkingSpaceDB, errorDB, scanInfoDB;
             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]);
+                scanInfoDB = Int32.Parse(Monitor.plcDatablockConfig[4]);
             }
             catch { Monitor.SetNotification("读取PLC中DB块编号异常", parkMonitor.model.TextColor.Error); return false; }
             //初始化PLC对象
@@ -270,7 +271,7 @@ namespace Monitor
                 if (Monitor.PLC == null)
                 {
                     Monitor.PLC = new PLCLinker(CpuType.S71500, Monitor.plcIPAddr, (short)Monitor.plcRack, (short)Monitor.plcSlot, terminalDB
-                        , centralDB, parkingSpaceDB, errorDB,
+                        , centralDB, parkingSpaceDB, errorDB, scanInfoDB,
                         Monitor.plcTerminalCount, Monitor.plcParkingSpaceCount);
                 }
                 //启动心跳进程
@@ -338,10 +339,10 @@ namespace Monitor
             {
                 for (int i = 0; i < Monitor.allInOneMachine.boardList.Count; i++)
                 {
-                    Monitor.allInOneMachine.boardList[i].UpdateText(" ",2,0);
+                    Monitor.allInOneMachine.boardList[i].UpdateText(" ", 2, 0);
                     Monitor.allInOneMachine.boardList[i].UpdateArrow(-1);
                 }
-                Monitor.allInOneMachine.DestroyAll();
+                //Monitor.allInOneMachine.DestroyAll();
             }
             Terminal.Terminal.Stop();
         }

+ 5 - 0
PLCLinker/centralController/NumMachine/NumMachine.cs

@@ -515,6 +515,11 @@ namespace NumMachine
                             Log.WriteLog(LogType.process, LogFile.INFO, "号牌入队:" + node.LicenseNum);
                             if (Monitor.Monitor.allInOneMachine != null)
                             {
+                                if (Monitor.Monitor.allInOneMachine.boardList.Count >= id && node.LicenseNum != "")
+                                {
+                                    Monitor.Monitor.allInOneMachine.boardList[id - 1].UpdateText("车辆"+ node.LicenseNum+"入场", 30, 2);
+                                    //Monitor.Monitor.allInOneMachine.boardList[id - 1].UpdateArrow(-1, 2, 0);
+                                }
                                 //Monitor.Monitor.allInOneMachine.DispForAWhile(2, node.LicenseNum, 25, 1, node.LicenseNum + ",入场");
                                 //Monitor.Monitor.allInOneMachine.DispForAWhile(3, "号牌机编号:" + node.id, 25, 1, "");
                             }

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

@@ -749,6 +749,13 @@ namespace Terminal
                     //停车流程确保已清除中控块完成信号
                     ResetCompleteSignal();
 
+                    // LED屏显示,停车完成可能不提示
+                    //if (Monitor.Monitor.allInOneMachine.boardList.Count >= currentTerm)
+                    //{
+                    //    Monitor.Monitor.allInOneMachine.boardList[currentTerm - 1].UpdateText("停车完成", 60, 2);
+                    //    Monitor.Monitor.allInOneMachine.boardList[currentTerm - 1].UpdateArrow(-1, 2, 0);
+                    //}
+
                     UpdateVehicle(license, 0, 0, true, false, 0);
                     UpdateVehicle(license, 0, 0, true, true, 0);
                     //插入停车记录
@@ -931,12 +938,92 @@ namespace Terminal
                 {
                     Monitor.Monitor.SetNotification("收到地感后,尝试5次未拍到号牌。", parkMonitor.model.TextColor.Log);
                     Log.WriteLog(LogType.process, LogFile.ERROR, "收到地感后,尝试5次未拍到号牌。");
-                    Thread.Sleep(200);
+                    Thread.Sleep(10000);
+                    lockList[index] = false;
                 }
 
 
             });
         }
+
+        private static void UpdateLedForBarrier()
+        {
+            for (int i = 0; i < terminalInfo.Count; i++)
+            {
+                // 停车终端,收到地感,尚无停车指令,提示扫描结果
+                bool condition = terminalInfo[i].terminalStatus == (short)1 && terminalInfo[i].groundStatus == (short)1 && terminalInfo[i].cmd != 1;
+                int scanState = -1;
+                switch (terminalInfo[i].terminalID)
+                {
+                    case 1:
+                        scanState = Monitor.Monitor.PLCScanInfo.scanStateTerm1; break;
+                    case 2:
+                        scanState = Monitor.Monitor.PLCScanInfo.scanStateTerm2; break;
+                    case 3:
+                        scanState = Monitor.Monitor.PLCScanInfo.scanStateTerm3; break;
+                    case 4:
+                        scanState = Monitor.Monitor.PLCScanInfo.scanStateTerm4; break;
+                    case 5:
+                        scanState = Monitor.Monitor.PLCScanInfo.scanStateTerm5; break;
+                    case 6:
+                        scanState = Monitor.Monitor.PLCScanInfo.scanStateTerm6; break;
+                }
+                if (scanState != -1)
+                {
+                    LedDisplay(terminalInfo[i].terminalID, scanState, condition);
+                }
+            }
+        }
+        private static void LedDisplay(int termID, int state, bool condition)
+        {
+            if (Monitor.Monitor.allInOneMachine.boardList.Count >= termID)
+            {
+                if (state != Monitor.Monitor.allInOneMachine.boardList[termID - 1].ledScanState)
+                {
+                    if (state == 0)
+                    {
+                        Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateText("欢迎光临智象停车", 60, 0, 5);
+                        Monitor.Monitor.allInOneMachine.boardList[termID - 1].ledScanState = state;
+                    }
+                    else if (condition)
+                    {
+                        Monitor.Monitor.allInOneMachine.boardList[termID - 1].ledScanState = state;
+                        switch (state)
+                        {
+                            //case 0:
+                            //    Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateText("欢迎光临", 60, 2);
+                            //    //Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateArrow(-1, 2, 0);
+                            //    break;
+                            case 1:
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateText("车辆位置正常", 60, 2, 5);
+                                //Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateArrow(-1, 2, 0);
+                                break;
+                            case 2:
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateText("前超界,请向后移动", 30, 2, 5);
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateArrow(1, 30, 2);
+                                break;
+                            case 3:
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateText("后超界,请向前移动", 30, 2, 5);
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateArrow(0, 30, 2);
+                                break;
+                            case 4:
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateText("左超界,请向右移动", 30, 2, 5);
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateArrow(3, 30, 2);
+                                break;
+                            case 5:
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateText("右超界,请向左移动", 30, 2, 5);
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateArrow(2, 30, 2);
+                                break;
+                            case 6:
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateText("检测中,请稍候", 30, 2, 5);
+                                Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateArrow(-1, 2, 0);
+                                break;
+                        }
+                    }
+                }
+            }
+        }
+
         /// <summary>
         /// 停车相关操作
         /// 0.观测到地感信号,且按钮状态不为3,则启动号牌机获取号牌,并判断是否预约车
@@ -979,6 +1066,15 @@ namespace Terminal
                 catch (Exception e) { Log.WriteLog(LogType.process, LogFile.ERROR, "预约异常," + e.Message + ", " + e.StackTrace); }
                 Log.WriteLog(LogType.process, LogFile.ERROR, "预约线程退出");
             });
+
+            Task.Factory.StartNew(() =>
+            {
+                while (!isClosing)
+                {
+                    UpdateLedForBarrier();
+                    Thread.Sleep(Monitor.Monitor.plcRefreshInterval * 5);
+                }
+            });
         }
 
         /// <summary>
@@ -1397,6 +1493,11 @@ namespace Terminal
                                 }
                                 if (Monitor.Monitor.mainBlockInfo.processCompleted == 1)
                                 {
+                                    if (Monitor.Monitor.allInOneMachine.boardList.Count >= termID)
+                                    {
+                                        Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateText("取车完成,请将车辆驶离车库,智象停车祝您一路顺风。", 60, 2);
+                                        Monitor.Monitor.allInOneMachine.boardList[termID - 1].UpdateArrow(-1, 2, 0);
+                                    }
                                     UpdateSpecificParkingSpace();
                                     //while (terminalInfo[termIndex].receiptNum != 0)
                                     //{

+ 91 - 24
PLCLinker/centralController/allInOneMachine/broadcastModule.cs

@@ -56,7 +56,11 @@ namespace BroadcastModule
                     Thread.Sleep(5000);
                     foreach (BroadcastBoard bb in boardList)
                     {
-                        bb.CheckConnection();
+                        try
+                        {
+                            bb.CheckConnection(5);
+                        }
+                        catch(Exception e) { Console.WriteLine("LED"+bb.boardParams.id+"连接:\n"+e.StackTrace); }
                     }
                 }
             });
@@ -142,6 +146,9 @@ namespace BroadcastModule
         private Dictionary<uint, List<Led5kSDK.bx_5k_area_header>> handleDynamicAreasMap;
         private int volume = 10;
         public Led5kSDK.bx_5k_area_header header_model;
+        public int ledScanState;// 0空闲 1正常 2前超界 3后超界 4左超界 5右超界 6测量失败
+        private int[] dispStatus;
+        private bool isDisplaying;
         private object area1Lock;
         private object area2Lock;
         private string[] arrows = { "\\T001arrU64|\\n", "\\T001arrD64|\\n", "\\T001arrL64|\\n", "\\T001arrR64|\\n" };
@@ -149,6 +156,9 @@ namespace BroadcastModule
         // *************** 公有方法 ***************
         public BroadcastBoard(int id, byte[] ip, uint port, Led5kSDK.bx_5k_card_type card_type, uint handle)
         {
+            ledScanState = -1;
+            isDisplaying = false;
+            dispStatus = new int[2];
             handleDynamicAreasMap = new Dictionary<uint, List<Led5kSDK.bx_5k_area_header>>();
             header_model = new Led5kSDK.bx_5k_area_header();
             area1Lock = new object();
@@ -160,7 +170,7 @@ namespace BroadcastModule
         /// 检查连接状态
         /// </summary>
         /// <returns></returns>
-        public bool CheckConnection()
+        public bool CheckConnection(int sleptSec)
         {
             int count = 3;
             int result = -1;
@@ -168,6 +178,34 @@ namespace BroadcastModule
             {
                 if (boardParams.handle != 0)
                 {
+                    // 检查是否有内容在显示
+                    int displaying = 0;
+                    lock (area1Lock)
+                    {
+                        displaying = dispStatus[0];
+                    }
+                    lock (area2Lock)
+                    {
+                        displaying += dispStatus[1];
+                    }
+                    if (displaying <= 0 && isDisplaying)
+                    {
+                        UpdateText("欢迎光临智象停车", 2, 0);
+                        UpdateArrow(-1, 2, 0);
+                        Console.WriteLine("LED清屏");
+                        isDisplaying = false;
+                    }
+                    else
+                    {
+                        lock (area1Lock)
+                        {
+                            dispStatus[0] = dispStatus[0] >= 0 ? (dispStatus[0] - sleptSec) : 0;
+                        }
+                        lock (area2Lock)
+                        {
+                            dispStatus[1] = dispStatus[1] >= 0 ? (dispStatus[1] - sleptSec) : 0;
+                        }
+                    }
                     result = Led5kSDK.CON_PING(boardParams.handle);
                     Console.WriteLine("屏幕ping结果: " + result);
                     if (result == 0)
@@ -207,7 +245,7 @@ namespace BroadcastModule
             area1.header.SingleLine = 0x01;
             area1.header.NewLine = 0x02;
             area1.header.DisplayMode = 0x03;
-            area1.header.StayTime = 1;
+            area1.header.StayTime = 10;
             area1.header.RunMode = 2;
             area1.header.Speed = 2;
             area1.header.Timeout = 20;
@@ -279,7 +317,7 @@ namespace BroadcastModule
         /// </summary>
         /// <param name="sentence"></param>
         /// <param name="slice"></param>
-        public bool UpdateText(string sentence, int waitSec, int runMode=-1, bool horizontal = true, int slice = 6)
+        public bool UpdateText(string sentence, int waitSec, int runMode = -1,int dispMode = -1, bool horizontal = true, int slice = 6)
         {
             List<string> sentenceContent = new List<string>();
             int i = 0;
@@ -290,7 +328,7 @@ namespace BroadcastModule
             {
                 while (i < sentence.Length)
                 {
-                    if ((i + slice) % slice == 0) 
+                    if ((i + slice) % slice == 0)
                     {
                         if (i < sentence.Length - slice + 1)
                         {
@@ -325,16 +363,27 @@ namespace BroadcastModule
             // 横屏
             else
             {
-                lock (area1Lock)
+
+                Task.Factory.StartNew(() =>
                 {
-                    Task.Factory.StartNew(() =>
+                    lock (area1Lock)
                     {
+                        dispStatus[0] = waitSec;
                         UpdateArea(boardParams.handle, boardParams.areas[2].index, Encoding.Default.GetBytes(""), true, Encoding.Default.GetBytes(sentence), 10, runMode, waitSec);
-                        UpdateArea(boardParams.handle, boardParams.areas[0].index, Encoding.Default.GetBytes(sentence), runMode, waitSec);
-                        Console.WriteLine("index: " + boardParams.areas[0].index);
-                        Console.WriteLine("sentence: " + sentence);
-                    });
-                }
+                        UpdateArea(boardParams.handle, boardParams.areas[0].index, Encoding.Default.GetBytes(sentence + "\\n"), runMode, waitSec, dispMode);
+                    }
+                    if (sentence != "欢迎光临智象停车")
+                    {
+                        isDisplaying = true;
+                    }
+                    Console.WriteLine("index: " + boardParams.areas[0].index);
+                    Console.WriteLine("sentence: " + sentence);
+                    //if (runMode != 0)
+                    //{
+                    //    Thread.Sleep(waitSec*1000);
+                    //    dispStatus[0] = false;
+                    //}
+                });
             }
             return true;
         }
@@ -343,23 +392,33 @@ namespace BroadcastModule
         /// </summary>
         /// <param name="index"></param>
         /// <returns></returns>
-        public bool UpdateArrow(int index, int waitSec=5, int runMode = -1)
+        public bool UpdateArrow(int index, int waitSec = 5, int runMode = -1)
         {
             if (index > 3)
                 return false;
             if (boardParams.handle == 0 || boardParams.areas.Count < 2)
                 return false;
-            lock (area2Lock)
+            Task.Factory.StartNew(() =>
             {
-                if (index < 0)
-                {
-                    UpdateArea(boardParams.handle, boardParams.areas[1].index, Encoding.Default.GetBytes(" "), runMode, waitSec);
-                }
-                else
+                lock (area2Lock)
                 {
-                    UpdateArea(boardParams.handle, boardParams.areas[1].index, Encoding.Default.GetBytes(arrows[index]), runMode, waitSec);
+                    dispStatus[1] = waitSec;
+                    if (index < 0)
+                    {
+                        UpdateArea(boardParams.handle, boardParams.areas[1].index, Encoding.Default.GetBytes(" "), runMode, waitSec);
+                    }
+                    else
+                    {
+                        UpdateArea(boardParams.handle, boardParams.areas[1].index, Encoding.Default.GetBytes(arrows[index]), runMode, waitSec);
+                        isDisplaying = true;
+                    }
                 }
-            }
+                //if (runMode != 0)
+                //{
+                //    Thread.Sleep(waitSec*1000);
+                //    dispStatus[1] = false;
+                //}
+            });
             return true;
         }
         /// <summary>
@@ -454,7 +513,7 @@ namespace BroadcastModule
         /// 动态区域更新函数
         /// </summary>
         /// <param name="i"></param>
-        private bool UpdateArea(uint handle, int index, byte[] areaText, int runMode=-1, int waitSec=-1)
+        private bool UpdateArea(uint handle, int index, byte[] areaText, int runMode = -1, int waitSec = -1, int dispMode = -1)
         {
             int err = -1;
             List<Led5kSDK.bx_5k_area_header> list;
@@ -472,10 +531,14 @@ namespace BroadcastModule
                         if (index == list[i].DynamicAreaLoc)
                         {
                             Led5kSDK.bx_5k_area_header temp = list[i];
-                            if(runMode>=0 && runMode < 3)
+                            if (runMode >= 0 && runMode < 3)
                             {
                                 temp.RunMode = (byte)runMode;
                             }
+                            if(dispMode >= 0 && dispMode < 7)
+                            {
+                                temp.DisplayMode = (byte)dispMode;
+                            }
                             if (waitSec >= 0)
                             {
                                 temp.Timeout = (short)waitSec;
@@ -499,7 +562,7 @@ namespace BroadcastModule
         /// 动态区域更新函数
         /// </summary>
         /// <param name="i"></param>
-        private bool UpdateArea(uint handle, int index, byte[] areaText, bool soundOnly, byte[] soundText, int sound, int runMode = -1, int waitSec = -1)
+        private bool UpdateArea(uint handle, int index, byte[] areaText, bool soundOnly, byte[] soundText, int sound, int runMode = -1, int waitSec = -1, int dispMode = -1)
         {
             int err = -1;
             sound = sound > 10 ? 10 : sound;
@@ -523,6 +586,10 @@ namespace BroadcastModule
                             {
                                 temp.RunMode = (byte)runMode;
                             }
+                            if (dispMode >= 0 && dispMode < 7)
+                            {
+                                temp.DisplayMode = (byte)dispMode;
+                            }
                             if (waitSec >= 0)
                             {
                                 temp.Timeout = (short)waitSec;

+ 1 - 1
PLCLinker/centralController/obj/Release/centralController.csproj.CoreCompileInputs.cache

@@ -1 +1 @@
-3398d78de3fcc3fdbcb3ec2b3ec2c74f125bb553
+67ee0d7b26f743e16c5a11d7d5b0f31390b7f07a

+ 3 - 2
PLCLinker/centralController/obj/Release/centralController.csproj.FileListAbsolute.txt

@@ -18,7 +18,6 @@ C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centra
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\serversettings.json
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\centralController.exe
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\centralController.pdb
-C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\broadcastDLL.dll
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\db.dll
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\DotNetty.Buffers.dll
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\DotNetty.Codecs.dll
@@ -261,8 +260,10 @@ E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonit
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.pdb
 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
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.FormAboutUs.resources
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\sdk\broadcast\Led5kSDK.dll
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\sdk\VZ_Sdk\iDecoders.dll
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csprojResolveAssemblyReference.cache
+C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\sdk\broadcast\Led5kSDK.dll
+C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csprojAssemblyReference.cache
+C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\PLCS7.pdb

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


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


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

@@ -49,6 +49,11 @@
             错误信息提示DB块ID
             </summary>
         </member>
+        <member name="F:PLCS7.AbstractPLCLinker.scanInfoDB">
+            <summary>
+            终端扫描状态信息块
+            </summary>
+        </member>
         <member name="F:PLCS7.AbstractPLCLinker.terminalCount">
             <summary>
             终端个数
@@ -138,6 +143,22 @@
             <param name="terminalCount"></param>
             <param name="parkingSpaceCount"></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,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="scanInfoDB"></param>
+            <param name="terminalCount"></param>
+            <param name="parkingSpaceCount"></param>
+        </member>
         <member name="M:PLCS7.PLCLinker.ReadMultipleBytes(System.Int32,System.Int32,System.Int32)">
             <summary>
             读取指定数据块中多个字节
@@ -520,5 +541,40 @@
             错误信息编号
             </summary>
         </member>
+        <member name="T:PLCS7.ScanInfoStru">
+            <summary>
+            超限信息
+            </summary>
+        </member>
+        <member name="F:PLCS7.ScanInfoStru.scanStateTerm1">
+            <summary>
+            终端1扫描状态。0空闲,1正确,2上超界,3下超界,4左超界,5右超界,6测量失败
+            </summary>
+        </member>
+        <member name="F:PLCS7.ScanInfoStru.scanStateTerm2">
+            <summary>
+            终端2扫描状态
+            </summary>
+        </member>
+        <member name="F:PLCS7.ScanInfoStru.scanStateTerm3">
+            <summary>
+            终端3扫描状态
+            </summary>
+        </member>
+        <member name="F:PLCS7.ScanInfoStru.scanStateTerm4">
+            <summary>
+            终端4扫描状态
+            </summary>
+        </member>
+        <member name="F:PLCS7.ScanInfoStru.scanStateTerm5">
+            <summary>
+            终端5扫描状态
+            </summary>
+        </member>
+        <member name="F:PLCS7.ScanInfoStru.scanStateTerm6">
+            <summary>
+            终端6扫描状态
+            </summary>
+        </member>
     </members>
 </doc>

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


+ 4 - 3
PLCLinker/newPLCConnector/App.config

@@ -4,11 +4,12 @@
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
     </startup>
   <appSettings>
-    <add key="plcIpAddress" value="192.168.2.178" />
+    <add key="plcIpAddress" value="192.168.0.1" />
     <add key="plcRack" value="0" />
     <add key="plcSlot" value="1" />
-    <add key="plcDatablockId" value="18,41,20" />
+    <add key="plcDatablockId" value="18,41,20,43" />
+    <!--<add key="plcDatablockId" value="1,2,3,3" />-->
     <!--日志写入地址配置文件-->
-    <add key="LogAddress" value="E:\superScene\智能停车项目\测试包\snap7\LoggerTest" />
+    <add key="LogAddress" value="c:\\c#workspace\\LogDemo\\LoggerTest" />
   </appSettings>
 </configuration>

+ 1 - 1
PLCLinker/newPLCConnector/Form1.cs

@@ -36,7 +36,7 @@ namespace PLCConnector
                 rack = Int16.Parse(ConfigurationManager.AppSettings.Get("plcRack"));
                 slot = Int16.Parse(ConfigurationManager.AppSettings.Get("plcSlot"));
                 blockIds = (ConfigurationManager.AppSettings.Get("plcDatablockId")).Split(',');
-                pl = new PLCLinker(CpuType.S71500, ip, rack, slot, int.Parse(blockIds[0]), int.Parse(blockIds[1]), int.Parse(blockIds[2]), 6, 200);
+                pl = new PLCLinker(CpuType.S71500, ip, rack, slot, int.Parse(blockIds[0]), int.Parse(blockIds[1]), int.Parse(blockIds[2]), int.Parse(blockIds[3]), 6, 200);
             }
             catch (Exception e) { MessageBox.Show("配置文件异常"); }
 

BIN
PLCLinker/newPLCConnector/PLC/PLCS7.dll


+ 45 - 0
PLCLinker/newPLCConnector/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>

BIN
PLCLinker/newPLCConnector/PLC/snap7Enc.dll


+ 30 - 1
PLCLinker/newPLCS7/PLCS7.cs

@@ -27,6 +27,7 @@ namespace PLCS7
         central,
         parkingSpace,
         errorInfo,
+        scanInfo,
     }
     public abstract class AbstractPLCLinker : IPLCS7
     {
@@ -70,6 +71,11 @@ namespace PLCS7
         /// 错误信息提示DB块ID
         /// </summary>
         protected int errorInfoDB;
+        /// <summary>
+        /// 终端扫描状态信息块
+        /// </summary>
+        protected int scanInfoDB;
+
         /// <summary>
         /// 终端个数
         /// </summary>
@@ -214,7 +220,26 @@ namespace PLCS7
         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();
+            //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="scanInfoDB"></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 scanInfoDB, int terminalCount, int parkingSpaceCount) : this(cpu, ip, rack, slot, terminalDB, centralDB, parkingSpaceDB,errorInfoDB, terminalCount, parkingSpaceCount)
+        {
+            this.scanInfoDB = scanInfoDB;
+            //isConnected = PLCConnect();
         }
         /// <summary>
         /// 读取指定数据块中多个字节
@@ -468,6 +493,10 @@ namespace PLCS7
                             object errorInfo = ReadStruFromPLC(new ErrorInfoStru(), errorInfoDB);
                             if (errorInfo != null) { result.Add(errorInfo); }
                             break;
+                        case PLCDataType.scanInfo:
+                            object scanInfo = ReadStruFromPLC(new ScanInfoStru(), scanInfoDB);
+                            if (scanInfo != null) { result.Add(scanInfo); }
+                            break;
                         default:
                             Console.WriteLine("wrong type");
                             break;

+ 52 - 0
PLCLinker/newPLCS7/entity.cs

@@ -384,4 +384,56 @@ namespace PLCS7
             else return false;
         }
     }
+
+    /// <summary>
+    /// 超限信息
+    /// </summary>
+    public struct ScanInfoStru
+    {
+        /// <summary>
+        /// 终端1扫描状态。0空闲,1正确,2上超界,3下超界,4左超界,5右超界,6测量失败
+        /// </summary>
+        public short scanStateTerm1;
+        /// <summary>
+        /// 终端2扫描状态
+        /// </summary>
+        public short scanStateTerm2;
+        /// <summary>
+        /// 终端3扫描状态
+        /// </summary>
+        public short scanStateTerm3;
+        /// <summary>
+        /// 终端4扫描状态
+        /// </summary>
+        public short scanStateTerm4;
+        /// <summary>
+        /// 终端5扫描状态
+        /// </summary>
+        public short scanStateTerm5;
+        /// <summary>
+        /// 终端6扫描状态
+        /// </summary>
+        public short scanStateTerm6;
+
+        public override string ToString()
+        {
+            return "[终端1(0): " + scanStateTerm1 + ",终端2(2): " + scanStateTerm2 + ", 终端3(4): " + scanStateTerm3 + ", 终端4(6): " + scanStateTerm4 + ", 终端5(8): " + scanStateTerm5 + ", 终端6(10): " + scanStateTerm6 + "]";
+        }
+        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;
+        }
+    }
 }

BIN
PLCLinker/newPLCS7/snap7Enc.dll


+ 4 - 139
PLCLinker/snap7Enc/Sharp7.cs

@@ -1,5 +1,5 @@
 /*=============================================================================|
-|  PROJECT Sharp7                                                        1.0.3 |
+|  PROJECT Sharp7                                                        1.0.0 |
 |==============================================================================|
 |  Copyright (C) 2016 Davide Nardella                                          |
 |  All rights reserved.                                                        |
@@ -22,22 +22,11 @@
 |  You should have received a copy of the GNU General Public License and a     |
 |  copy of Lesser GNU General Public License along with Sharp7.                |
 |  If not, see  http://www.gnu.org/licenses/                                   |
-|==============================================================================|
-History:
- * 1.0.0 2016/10/09 First Release
- * 1.0.1 2016/10/22 Added CoreCLR compatibility (CORE_CLR symbol must be 
-                    defined in Build options).
-                    Thanks to Dirk-Jan Wassink.
- * 1.0.2 2016/11/13 Fixed a bug in CLR compatibility
- * 1.0.3 2017/01/25 Fixed a bug in S7.GetIntAt(). Thanks to lupal1
-                    Added S7Timer Read/Write. Thanks to Lukas Palkovic 
-
-*/
+|=============================================================================*/
 using System;
 using System.Runtime.InteropServices;
 using System.Text;
 using System.Threading;
-using System.Collections.Generic;
 //------------------------------------------------------------------------------
 // If you are compiling for UWP verify that WINDOWS_UWP or NETFX_CORE are 
 // defined into Project Properties->Build->Conditional compilation symbols
@@ -358,15 +347,8 @@ namespace Sharp7
             Socket PingSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             try
             {
-
-#if CORE_CLR
-                var task = PingSocket.ConnectAsync(Host, Port);
-                task.Wait(_ConnectTimeout);
-                bool success = task.IsCompleted;
-#else
                 IAsyncResult result = PingSocket.BeginConnect(Host, Port, null, null);
                 bool success = result.AsyncWaitHandle.WaitOne(_ConnectTimeout, true);
-#endif
                 if (!success)
                 {
                     LastError = S7Consts.errTCPConnectionFailed;
@@ -376,11 +358,7 @@ namespace Sharp7
             {
                 LastError = S7Consts.errTCPConnectionFailed;
             };
-#if CORE_CLR
-            PingSocket.Dispose();
-#else
             PingSocket.Close();
-#endif
         }
 
         public int Connect(string Host, int Port)
@@ -635,88 +613,6 @@ namespace Sharp7
         #endregion
     }
 
-    public class S7Timer
-    {
-        #region S7Timer
-        TimeSpan pt;
-        TimeSpan et;
-        bool input = false;
-        bool q = false;
-        public S7Timer(byte[] buff, int position)
-        {
-            if (position + 12 < buff.Length)
-            {
-                return;
-            }
-            else
-            {
-                SetTimer(new List<byte>(buff).GetRange(position, 16).ToArray());
-            }
-        }
-
-        public S7Timer(byte[] buff)
-        {
-            SetTimer(buff);
-        }
-
-        private void SetTimer(byte[] buff)
-        {
-            if (buff.Length != 12)
-            {
-                this.pt = new TimeSpan(0);
-                this.et = new TimeSpan(0);
-            }
-            else
-            {
-                Int32 resPT;
-                resPT = buff[0]; resPT <<= 8;
-                resPT += buff[1]; resPT <<= 8;
-                resPT += buff[2]; resPT <<= 8;
-                resPT += buff[3];
-                this.pt = new TimeSpan(0, 0, 0, 0, resPT);
-
-                Int32 resET;
-                resET = buff[4]; resET <<= 8;
-                resET += buff[5]; resET <<= 8;
-                resET += buff[6]; resET <<= 8;
-                resET += buff[7];
-                this.et = new TimeSpan(0, 0, 0, 0, resET);
-
-                this.input = (buff[8] & 0x01) == 0x01;
-                this.q = (buff[8] & 0x02) == 0x02;
-            }
-        }
-        public TimeSpan PT
-        {
-            get
-            {
-                return pt;
-            }
-        }
-        public TimeSpan ET
-        {
-            get
-            {
-                return et;
-            }
-        }
-        public bool IN
-        {
-            get
-            {
-                return input;
-            }
-        }
-        public bool Q
-        {
-            get
-            {
-                return q;
-            }
-        }
-        #endregion
-    }
-
     public static class S7
     {
         #region [Help Functions]
@@ -799,7 +695,7 @@ namespace Sharp7
         #region Get/Set 16 bit signed value (S7 int) -32768..32767
         public static int GetIntAt(byte[] Buffer, int Pos)
         {
-            return (short)((Buffer[Pos] << 8) | Buffer[Pos + 1]);
+            return (int)((Buffer[Pos] << 8) | Buffer[Pos + 1]);
         }
         public static void SetIntAt(byte[] Buffer, int Pos, Int16 Value)
         {
@@ -1236,37 +1132,6 @@ namespace Sharp7
         }
         #endregion
 
-        #region Get/Set Timer
-        
-        public static S7Timer GetS7TimerAt(byte[] Buffer, int Pos)
-        {
-            return new S7Timer(new List<byte>(Buffer).GetRange(Pos, 12).ToArray());
-        }
-
-        public static void SetS7TimespanAt(byte[] Buffer, int Pos, TimeSpan Value)
-        {
-            SetDIntAt(Buffer, Pos, (Int32)Value.TotalMilliseconds);
-        }
-
-        public static TimeSpan GetS7TimespanAt(byte[] Buffer, int pos)
-        {
-            if (Buffer.Length < pos + 4)
-            {
-                return new TimeSpan();
-            }
-
-            Int32 a;
-            a = Buffer[pos + 0]; a <<= 8;
-            a += Buffer[pos + 1]; a <<= 8;
-            a += Buffer[pos + 2]; a <<= 8;
-            a += Buffer[pos + 3];
-            TimeSpan sp = new TimeSpan(0, 0, 0, 0, a);
-
-            return sp;
-        }        
-        
-        #endregion
-
         #endregion [Help Functions]
     }
 
@@ -2822,7 +2687,7 @@ namespace Sharp7
         private string SiemensTimestamp(long EncodedDate)
         {
             DateTime DT = new DateTime(1984, 1, 1).AddSeconds(EncodedDate*86400);
-#if WINDOWS_UWP || NETFX_CORE || CORE_CLR
+#if WINDOWS_UWP || NETFX_CORE
             return DT.ToString(System.Globalization.DateTimeFormatInfo.CurrentInfo.ShortDatePattern);
 #else
             return DT.ToShortDateString();