現有項目是利用C#的socket與PLC進行實時通訊,PLC有兩種通訊模式——常規採集&高頻採集。 其中常規採集大概在10ms左右發送一次數據,高頻採集大概在2ms左右發送一次數據。 現有代碼框架:在與PLC進行連接時,通過建立委托並創建線程的方式,來迴圈讀取數據 只要連接PLC成功後,會一直在後臺 ...
現有項目是利用C#的socket與PLC進行實時通訊,PLC有兩種通訊模式——常規採集&高頻採集。
其中常規採集大概在10ms左右發送一次數據,高頻採集大概在2ms左右發送一次數據。
現有代碼框架:在與PLC進行連接時,通過建立委托並創建線程的方式,來迴圈讀取數據
//創建委托 public delegate void PLC_HD_Receive(byte[] recv_data); public PLC_HD_Receive PLC_Recv_Delegate_HD; //給委托綁定方法 PLC_Recv_Delegate_HD = new PLC_HD_Receive(PLC_Receive_Callback_HD);
//創建線程 PLC_Thread_HD = new Thread(new ThreadStart(PLC_ReadThread_HD));
PLC_Thread_HD.IsBackground = true; PLC_Thread_HD.Start();
//線上程內調用委托 this.BeginInvoke(this.PLC_Recv_Delegate_HD, new Object[] { recv_buffer_hd });
只要連接PLC成功後,會一直在後臺讀取PLC發送來的數據,並解析數據
現有問題:實時性和數據完整性不夠,有些操作會導致socket斷掉連接。
計劃:改寫現有代碼框架,加深對通訊的理解,和對實時數據流的處理。 2019-5-22
***********************************************************************************************************************************************************************
思路:原有框架讀取數據使用的是同步通信,出錯時反饋TimeOut錯誤,先準備改成非同步通信
1 SocketError socket_error; 2 3 while (total_length < recv_buffer_len_hd) 4 { 5 //同步接收數據 6 ret_length = m_socket_hd.Receive(recv_buffer_hd, total_length, data_left, SocketFlags.None, out socket_error); 7 if (socket_error == SocketError.TimedOut || socket_error == SocketError.Shutdown || socket_error == SocketError.ConnectionAborted || ret_length == 0) 8 { 9 // 網路不正常,委托退出接收線程 10 thread_id = 1; 11 this.Invoke(this.PLC_ExitThread_Delegate_HD, new Object[] { thread_id }); 12 return; 13 } 14 total_length += ret_length; 15 data_left -= ret_length; 16 }