Explorar o código

连接结构调整,使用范例完善

yc_t %!s(int64=6) %!d(string=hai) anos
pai
achega
28383b4308
Modificáronse 2 ficheiros con 93 adicións e 67 borrados
  1. 30 21
      PLCLinker/PLCLinker/PLCLinker.cs
  2. 63 46
      PLCLinker/PLCLinker/Program.cs

+ 30 - 21
PLCLinker/PLCLinker/PLCLinker.cs

@@ -14,7 +14,7 @@ namespace PLCLinker
 {
     interface PLCS7
     {
-        void PLCConnect(CpuType cpu, string ip, short rack, short slot);
+        bool PLCConnect();
         void PLCDisconnect();
         bool WriteToPLC(object abstractPLCMsg, PLCDataType whoami);
         List<object> ReadFromPLC(PLCDataType whichToRead, int index);
@@ -32,11 +32,11 @@ namespace PLCLinker
         /// <summary>
         /// PLC 连接状态flag
         /// </summary>
-        protected bool isConnected = false;
+        public bool isConnected = false;
         /// <summary>
         /// 系统关闭flag
         /// </summary>
-        protected bool isClosing = false;
+        public bool isClosing = false;
         /// <summary>
         /// plc中cpu类型
         /// </summary>
@@ -78,13 +78,20 @@ namespace PLCLinker
         /// </summary>
         protected static Plc plc = null;
 
-        public void PLCConnect(CpuType cpu, string ip, short rack, short slot)
+        public bool PLCConnect()
         {
-            plc = new Plc(CpuType.S71500, "192.168.0.1", 0, 1);
-            //plc = new Plc(CpuType.S71500, "127.0.0.1", 0, 1);
-            ErrorCode err = plc.Open();
-            if (err == ErrorCode.ConnectionError) { Console.WriteLine("connection error"); }
-            else { Console.WriteLine("connected"); }
+            if (plc == null)
+            {
+                plc = new Plc(cpu, ip, rack, slot);
+            }
+            if (plc != null)
+            {
+                ErrorCode err = plc.Open();
+                if (err != ErrorCode.NoError) { Console.WriteLine("connection error"); isConnected = false; }
+                else { Console.WriteLine("connected"); isConnected = true; }
+            }
+            else { isConnected = false; }
+            return isConnected;
         }
 
         public void PLCDisconnect()
@@ -103,18 +110,14 @@ namespace PLCLinker
     public class PLCLinker : AbstractPLCLinker
     {
         ///// <summary>
-        ///// 从plc获得结构化数据
+        ///// PLC刷新频率,来自于配置文件
         ///// </summary>
-        //private PLCMessage plcMsg;
-
-        /// <summary>
-        /// PLC刷新频率,来自于配置文件
-        /// </summary>
-        private int PLC_refresh_interval;
-        /// <summary>
-        /// 无法获取配置文件时使用的PLC刷新频率
-        /// </summary>
-        private const short PLC_TIME_SCALE = 200;
+        //private int PLC_refresh_interval;
+        ///// <summary>
+        ///// 无法获取配置文件时使用的PLC刷新频率
+        ///// </summary>
+        //private const short PLC_TIME_SCALE = 200;
+        
         //************************************** 方法区 *************************************
         public void test()
         {
@@ -176,7 +179,7 @@ namespace PLCLinker
             this.parkingSpaceDB = parkingSpaceDB;
             this.terminalCount = terminalCount;
             this.parkingSpaceCount = parkingSpaceCount;
-            PLCConnect(cpu, ip, rack, slot);
+            isConnected = PLCConnect();
         }
         /// <summary>
         /// 读取指定数据块中多个字节
@@ -289,6 +292,12 @@ namespace PLCLinker
             return BitConverter.ToInt32(temp, 0);
         }
 
+        public bool PLCConnect()
+        {
+            isConnected = base.PLCConnect();
+            return isConnected;
+        }
+
         /// <summary>
         /// 读取PLC数据块
         /// </summary>

+ 63 - 46
PLCLinker/PLCLinker/Program.cs

@@ -13,59 +13,76 @@ namespace PLCLinker
     {
         static void Main(string[] args)
         {
-            PLCLinker pl = new PLCLinker(CpuType.S71500, "192.168.0.1", 0, 1, 18, 22, 20, 6, 200);
+            AbstractPLCLinker pl = new PLCLinker(CpuType.S71500, "192.168.0.1", 0, 1, 18, 22, 20, 6, 200);
             Random rnd = new Random();
             Task t = Task.Factory.StartNew(() =>
             {
                 while (true)
                 {
-                    ////读终端块数据
-                    //List<object> tList = pl.ReadFromPLC(PLCDataType.terminal, 0);
-                    //foreach (var term in tList)
-                    //{
-                    //    Console.WriteLine(((TerminalStru)term).ToString());
-                    //}
-                    ////模拟中控与终端写数据
-                    //TerminalStru tsCentral = new TerminalStru
-                    //{
-                    //    terminalID = 1,
-                    //    paymentStatus = (short)rnd.Next(100,999),
-                    //    licVerification = -1,
-                    //    parkingFee = (short)rnd.Next(100, 999),
-                    //    userType = (short)rnd.Next(100, 999)
-                    //};
-                    //TerminalStru tsTerminal = new TerminalStru
-                    //{
-                    //    terminalID = 1,
-                    //    terminalStatus = (short)rnd.Next(100, 999),
-                    //    btnStatus = 49,
-                    //    licenseCodeA = (short)rnd.Next(100, 999),
-                    //    licenseCodeB = -1,
-                    //    licenseCodeC = (short)rnd.Next(100, 999),
-                    //    receiptNum = (short)rnd.Next(100, 999)
-                    //};
-                    //pl.WriteToPLC(tsCentral, PLCDataType.central);
-
-                    //读车位表信息
-                    List<object> psList = pl.ReadFromPLC(PLCDataType.parkingSpace, 1);
-                    psList.AddRange(pl.ReadFromPLC(PLCDataType.parkingSpace, 2));
-                    foreach (var ps in psList)
-                    {
-                        Console.WriteLine(((ParkingSpaceStru)ps).ToString());
-                    }
-                    //写入车位状态信息
-                    ParkingSpaceStru pss = new ParkingSpaceStru
-                    {
-                        parkingSpace = (short)rnd.Next(1, 3),
-                        receiptNum = 987654321,
-                        spaceStatus = (short)rnd.Next(0, 3)
-                    };
-                    pl.WriteToPLC(pss, PLCDataType.central);
-                    Console.WriteLine("写入状态值");
-                    Thread.Sleep(200);
+                    //parkingSpaceDBTest(pl, rnd);
+                    terminalDBTest(pl, rnd);
+                    Thread.Sleep(500);
                 }
             });
             t.Wait();
         }
-    }
+        public static void parkingSpaceDBTest(AbstractPLCLinker pl, Random rnd)
+        {
+            if (!pl.isConnected) { pl.PLCConnect(); }
+            else
+            {
+                //读车位表信息
+                List<object> psList = pl.ReadFromPLC(PLCDataType.parkingSpace, 1);
+                psList.AddRange(pl.ReadFromPLC(PLCDataType.parkingSpace, 2));
+                foreach (var ps in psList)
+                {
+                    Console.WriteLine(((ParkingSpaceStru)ps).ToString());
+                }
+                //写入车位状态信息
+                ParkingSpaceStru pss = new ParkingSpaceStru
+                {
+                    parkingSpace = (short)rnd.Next(1, 3),
+                    spaceStatus = (short)rnd.Next(0, 3)
+                };
+                pl.WriteToPLC(pss, PLCDataType.central);
+                Console.WriteLine("写入状态值");
+            }
+        }
+
+        public static void terminalDBTest(AbstractPLCLinker pl, Random rnd)
+        {
+            if (!pl.isConnected) { pl.PLCConnect(); }
+            else
+            { 
+                //读终端块数据
+                List<object> tList = pl.ReadFromPLC(PLCDataType.terminal, 1);
+                foreach (var term in tList)
+                {
+                    Console.WriteLine(((TerminalStru)term).ToString());
+                }
+                //模拟中控写数据
+                TerminalStru tsCentral = new TerminalStru
+                {
+                    terminalID = 1,
+                    paymentStatus = (short)rnd.Next(100, 999),
+                    licVerification = -1,
+                    parkingFee = (short)rnd.Next(100, 999),
+                    userType = (short)rnd.Next(100, 999)
+                };
+                //模拟终端写数据
+                TerminalStru tsTerminal = new TerminalStru
+                {
+                    terminalID = 1,
+                    terminalStatus = (short)rnd.Next(100, 999),
+                    btnStatus = (short)rnd.Next(100, 999),
+                    licenseCodeA = (short)rnd.Next(100, 999),
+                    licenseCodeB = -1,
+                    licenseCodeC = (short)rnd.Next(100, 999),
+                    receiptNum = (short)rnd.Next(100, 999)
+                };
+                //pl.WriteToPLC(tsCentral, PLCDataType.central);
+                pl.WriteToPLC(tsTerminal, PLCDataType.terminal);
+            }
+        }
+        }
 }