2016-03-09 41 views
-4

我正在使用Linux機器與PLC進行通信。 PLC和Linux機器在本地網絡內連接,並使用UDP/IP作爲基本協議。此外,端口號碼是固定在兩邊。使用pthreads執行同步和異步通信的C/C++代碼

這種通信需要實現:
要求1:Linux機器能發送命令(每次一個命令)到PLC。收到每個命令後,PLC將在50ms內以成功/失敗消息響應Linux機器。
要求2:反之亦然,PLC可以向Linux機器發送命令。 Linux機器必須在50ms內回覆消息。 PLC發送到Linux機器的是異步。因此,Linux機器需要連續監視(或監聽)端口。

簡單的C/C++代碼已被用於單獨測試有關上述要求的通信。有效。但阻塞機制進行了。

這裏是具有挑戰性的部分。我想用pthreads來進行這樣的通信。我的解決方案是簡單地爲每個需求創建兩個線程。我勾勒使用附加PIC https://www.dropbox.com/s/vriyrprl7j6tntx/multi-thread%20solution.png?dl=0我的思想,以「線程0」表示主線程,「線程1」表示要求1個線程和「線程2」表示要求2線程。 '共享數據'表示可以在所有子線程中共享的數據。 '線程1數據'專用於線程1的使用,其他線程不會訪問。同樣,「線程2數據」僅被線程2使用。

考慮到兩個線程將在同一個端口上進行系統調用,我擔心會升高。因此,我需要對我的解決方案進行評論,並且獲得更多工作解決方案將會非常棒。附:我並不太擔心線程同步和創建。如果您的解決方案中需要線程同步和創建,這對我來說非常酷。

在此先感謝。

+1

Stackoverflow不是問這樣的開放式問題的地方。但有些想法。你並沒有真正給出任何轉向線程體系結構的強有力理由。最近我能看到的是舊的解決方案是一個「阻止機制」,你想避免這種情況。但避免一個特定的機制不應該是最終目標。關於「阻塞機制」(你已經說過的工作)是什麼問題(例如它是否不符合時間要求)?要達成解決方案,首先必須瞭解帶來的問題。只有這樣我們才能決定線程是否有意義。 – kaylum

+0

請注意,實現異步體系結構不需要線程化。 – kaylum

+0

@kaylum感謝您的回覆。我需要制定一些規範。 –

回答

0

在同一套接字上執行系統調用的兩個線程沒有一般問題。您可能會遇到的一些具體問題,但:

  • 如果你調用兩個線程recvfrom()(一個等待PLC發送請求,另一個等待PLC對一個命令,從服務器響應) ,你不知道哪一個會收到迴應。爲了解決這個問題,你可以專門從PLC讀取一個線程,並使用共享隊列或類似的結構將響應消息從PLC傳遞到發送線程。

  • 當你關閉一個可能被另一個線程使用的套接字時,你必須小心 - 由於文件描述符被重用的方式,很容易出現競爭條件,最終導致一個線程作用於錯誤插座。

+0

感謝您的建議。 –