//------------------------------------------------------------ // 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); }
//------------------------------------------------------------ // 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); } } }
//------------------------------------------------------------ // 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); }