閱界資訊

.NET上位機踩坑:爲什麼有時讀取數據需要Sleep?

閱閱界編輯部1閱讀6分鐘

《.NET上位機踩坑:爲什麼有時讀取數據需要Sleep?》這篇在博客園熱度很高,講的正是大家天天碰到的事。下面幫你把要點捋出來,結尾有能直接抄的結論。

前言 大家好,我是 wacky。 今天這篇文章,也是源自於一個真實的探討。曾經有朋友說,做上位機開發對接PLC的時候,有時會出現玄學,讀取不到完整的數據。這時就需要加一個Thread.Sleep(30),或者一個類似的時間間隔,就完全好了,至於爲什麼,完全搞不清楚。 我相信應該不少人都遇到過類似的情況,包括我自己,曾經做數據採集的時候,也加過類似的代碼,但是當時沒想明白爲什麼,只是以爲下位機返回數據存在延遲的現象。

前言 大家好,我是 wacky。 今天這篇文章,也是源自於一個真實的探討。曾經有朋友說,做上位機開發對接PLC的時候,有時會出現玄學,讀取不到完整的數據。這時就需要加一個Thread.Sleep(30),或者一個類似的時間間隔,就完全好了,至於爲什麼,完全搞不清楚。 我相信應該不少人都遇到過類似的情況,包括我自己,曾經做數據採集的時候,也加過類似的代碼,但是當時沒想明白爲什麼,只是以爲下位機返回數據存在延遲的現象。但是隨着時間的推移和經驗的積累,我認爲任何問題都有跡可循,恰好近期在梳理工控系列文章的時候,想明白了這個問題,我認爲有以下兩種可能性: PLC掃描週期未到 參考我們之前寫的內容: .NET工控概念科普——PLC掃描週期:理解了它纔算入了工控的門 PLC是存在掃描週期的概念的,如果一個掃描週期過了,但是未到下一個掃描週期,這時你剛好發送了一個讀取數據的指令,那麼PLC即使收到了報文,也只會返回舊數據,因爲沒有把最新的值給到通信緩衝區。

前言 大家好,我是 wacky。 今天這篇文章,也是源自於一個真實的探討。曾經有朋友說,做上位機開發對接PLC的時候,有時會出現玄學,讀取不到完整的數據。這時就需要加一個Thread.Sleep(30),或者一個類似的時間間隔,就完全好了,至於爲什麼,完全搞不清楚。 我相信應該不少人都遇到過類似的情況,包括我自己,曾經做數據採集的時候,也加過類似的代碼,但是當時沒想明白爲什麼,只是以爲下位機返回數據存在延遲的現象。但是隨着時間的推移和經驗的積累,我認爲任何問題都有跡可循,恰好近期在梳理工控系列文章的時候,想明白了這個問題,我認爲有以下兩種可能性: PLC掃描週期未到 參考我們之前寫的內容: .NET工控概念科普——PLC掃描週期:理解了它纔算入了工控的門 PLC是存在掃描週期的概念的,如果一個掃描週期過了,但是未到下一個掃描週期,這時你剛好發送了一個讀取數據的指令,那麼PLC即使收到了報文,也只會返回舊數據,因爲沒有把最新的值給到通信緩衝區。 但是這種情況的可能性其實很低,因爲我們的問題是"讀不到完整的數據",而不是"一直讀取的是舊數據",那麼就要引入第二種可能性。

前言 大家好,我是 wacky。 今天這篇文章,也是源自於一個真實的探討。曾經有朋友說,做上位機開發對接PLC的時候,有時會出現玄學,讀取不到完整的數據。這時就需要加一個Thread.Sleep(30),或者一個類似的時間間隔,就完全好了,至於爲什麼,完全搞不清楚。 我相信應該不少人都遇到過類似的情況,包括我自己,曾經做數據採集的時候,也加過類似的代碼,但是當時沒想明白爲什麼,只是以爲下位機返回數據存在延遲的現象。但是隨着時間的推移和經驗的積累,我認爲任何問題都有跡可循,恰好近期在梳理工控系列文章的時候,想明白了這個問題,我認爲有以下兩種可能性: PLC掃描週期未到 參考我們之前寫的內容: .NET工控概念科普——PLC掃描週期:理解了它纔算入了工控的門 PLC是存在掃描週期的概念的,如果一個掃描週期過了,但是未到下一個掃描週期,這時你剛好發送了一個讀取數據的指令,那麼PLC即使收到了報文,也只會返回舊數據,因爲沒有把最新的值給到通信緩衝區。 但是這種情況的可能性其實很低,因爲我們的問題是"讀不到完整的數據",而不是"一直讀取的是舊數據",那麼就要引入第二種可能性。 TCP存在粘包/半包 這個就是我們今天要探討的重點了,因爲TCP協議屬於流式協議,它是沒有報文邊界的。

前言 大家好,我是 wacky。 今天這篇文章,也是源自於一個真實的探討。曾經有朋友說,做上位機開發對接PLC的時候,有時會出現玄學,讀取不到完整的數據。這時就需要加一個Thread.Sleep(30),或者一個類似的時間間隔,就完全好了,至於爲什麼,完全搞不清楚。 我相信應該不少人都遇到過類似的情況,包括我自己,曾經做數據採集的時候,也加過類似的代碼,但是當時沒想明白爲什麼,只是以爲下位機返回數據存在延遲的現象。但是隨着時間的推移和經驗的積累,我認爲任何問題都有跡可循,恰好近期在梳理工控系列文章的時候,想明白了這個問題,我認爲有以下兩種可能性: PLC掃描週期未到 參考我們之前寫的內容: .NET工控概念科普——PLC掃描週期:理解了它纔算入了工控的門 PLC是存在掃描週期的概念的,如果一個掃描週期過了,但是未到下一個掃描週期,這時你剛好發送了一個讀取數據的指令,那麼PLC即使收到了報文,也只會返回舊數據,因爲沒有把最新的值給到通信緩衝區。 但是這種情況的可能性其實很低,因爲我們的問題是"讀不到完整的數據",而不是"一直讀取的是舊數據",那麼就要引入第二種可能性。 TCP存在粘包/半包 這個就是我們今天要探討的重點了,因爲TCP協議屬於流式協議,它是沒有報文邊界的。所以這就會出現PLC發送了一包100字節,我們上位機可能會收到: 全部完整數據; 拆成兩段(半包); 兩包數據合併到一起(粘包)。

最後提醒:每個人的環境不一樣,照抄之前先小步驗證。有了自己的驗證結果,這篇的價值才真正歸你。你怎麼看? 來源|博客園《.NET上位機踩坑:爲什麼有時讀取數據需要Sleep?》,https://www.cnblogs.com/wackysoft/p/22947367.html

程式員技術場技术后端

評論(0)

暫無評論,來搶第一條。