예제 #1
0
        //------------------------------------------------------------
        // Gửi data sang PLC dạng Array Word
        //------------------------------------------------------------
        public bool SendDataToPLC(int[] wordData, int wordAddress)
        {
            // Gửi dữ liệu sang PLC
            // Tạo stream từ kết nối TCP Client
            NetworkStream stream = PLCSocket.GetStream();

            // Tạo dữ liệu và gửi qua kết nối stream sang PLC
            byte[] sent_Data = PLC3e.Cal_WriteToPLCMessage_Dx_Multi_3E_Frame(wordAddress, wordData);
            stream.Write(sent_Data, 0, sent_Data.Length);
            stream.Flush();

            // Nhận dữ liệu xác nhận từ PLC
            byte[] receive_Data = new byte[0x3e8];
            stream.ReadTimeout = 500;
            try
            {
                stream.Read(receive_Data, 0, 0x3e8);
            }
            catch
            {
                log.Error("PLC Socket receive error! - Timeout");
                return(false);
            }
            // Check xác nhận từ PLC
            byte[] compareArr = { 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00 };
            byte[] receiveArr = new byte[compareArr.Length];
            Array.Copy(receive_Data, receiveArr, receiveArr.Length);
            if (!receiveArr.SequenceEqual(compareArr))
            {
                return(false);
            }

            return(true);
        }
예제 #2
0
 //------------------------------------------------------------
 // Nhận dữ liệu từ Server và gửi Event
 //------------------------------------------------------------
 private void ContinuesReceiveFromTCPSocket()
 {
     while (true)
     {
         try
         {
             if (false)
             {
                 if ((InputFromPLCAddress < 0) || (OutputToPLCAddress < 0))
                 {
                     continue;
                 }
                 //------------------------------------------------------------
                 // Get Data From PLC
                 //------------------------------------------------------------
                 ReceiveDataArr = ReceiveDataFromPLC(InputFromPLCAddress, InputOffset);
                 if (CurrentBitArr == null)
                 {
                     OldBitArr = PLC3e.ConvertWordToBitArray(ReceiveDataArr, 5);
                 }
                 else
                 {
                     OldBitArr = (bool[][])CurrentBitArr.Clone();
                 }
                 CurrentBitArr = PLC3e.ConvertWordToBitArray(ReceiveDataArr, 5);
                 //------------------------------------------------------------
                 // Calculate Raise Pulse and Send Event
                 //------------------------------------------------------------
                 bool[][] pulseBitArr = PLC3e.CompareBitArrarToRaisePulse(OldBitArr, CurrentBitArr);
                 for (int i = 0; i < pulseBitArr.Length; i++)
                 {
                     for (int j = 0; j < 16; j++)
                     {
                         if (pulseBitArr[i][j])
                         {
                             if (CommandNameArr[i][j] != null)
                             {
                                 ReceivedCommandFromServerEvent?.Invoke(CommandNameArr[i][j]);
                             }
                         }
                     }
                 }
             }
             //------------------------------------------------------------
             // Send Data To PLC
             //------------------------------------------------------------
             SendDataToPLC(SendDataArr, OutputToPLCAddress);
         }
         catch
         {
         }
         finally
         {
             Thread.Sleep(10);
         }
     }
 }
예제 #3
0
        //------------------------------------------------------------
        // Nhận dữ liệu từ PLC. Bắt đầu từ wordAddress, số lượng Word: numberData
        //------------------------------------------------------------
        public int[] ReceiveDataFromPLC(int wordAddress, int numberData)
        {
            //------------------------------------------------------------
            // Tạo stream từ kết nối TCP Client
            //------------------------------------------------------------
            NetworkStream stream = PLCSocket.GetStream();

            //------------------------------------------------------------
            // Tạo dữ liệu đúng định dạng
            // Gửi qua kết nối stream sang PLC
            //------------------------------------------------------------
            byte[] sent_Data = PLC3e.Cal_ReadFromPLCMessage_Dx_Multi_3E_Frame(wordAddress, numberData);
            stream.Write(sent_Data, 0, sent_Data.Length);
            stream.Flush();
            //------------------------------------------------------------
            // Nhận dữ liệu xác nhận từ PLC
            //------------------------------------------------------------
            byte[] receive_Data = new byte[0x3e8];
            stream.ReadTimeout = 500;
            try
            {
                stream.Read(receive_Data, 0, 0x3e8);
            }
            catch { return(null); }
            //------------------------------------------------------------
            // Check xác nhận từ PLC
            // So sánh chuỗi để xác nhận không có lỗi gửi nhận
            //------------------------------------------------------------
            byte[] compareArr = { 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00 };
            Array.Copy(BitConverter.GetBytes(numberData * 2 + 2), 0, compareArr, 7, 2);
            byte[] receiveArr = new byte[compareArr.Length];
            Array.Copy(receive_Data, receiveArr, receiveArr.Length);
            if (!receiveArr.SequenceEqual(compareArr))
            {
                return(null);
            }
            //------------------------------------------------------------
            // Tách dữ liệu PLC từ chuỗi nhận về
            //------------------------------------------------------------
            byte[] dataOutArr_byte = new byte[numberData * 2];
            Array.Copy(receive_Data, compareArr.Length, dataOutArr_byte, 0, dataOutArr_byte.Length);
            //------------------------------------------------------------
            // Chuyển dữ liệu về kiểu interger
            //------------------------------------------------------------
            int[] dataOutArr = new int[numberData];
            for (int i = 0; i < numberData; i++)
            {
                dataOutArr[i] = (int)BitConverter.ToInt16(dataOutArr_byte, i * 2);
            }
            //------------------------------------------------------------
            // Gửi chuỗi interger đọc từ PLC
            //------------------------------------------------------------
            return(dataOutArr);
        }