【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】
? ? ? ? 作為上位機,它很重要的一個部分就是需要和外面的設備進行數據溝通的。很多時候,也就是在這個溝通的過程當中,上位機軟件才有了自己的價值。如果上位機可以通過收集數據,進一步構建自己的算法,那么上位機自身的價值就更大了。之前說的usb、can、232這些都是溝通的媒介,本質上最重要的還是通訊的協議。
? ? ? ? 所謂通訊的協議,其實就是溝通的方式和報文的格式。溝通的方式,一般代表誰先主動發起溝通,誰被動應答溝通;報文的格式,則代表每次溝通的數據有多少個,每個數據代表著什么樣的含義。這就是通訊的全部內容。
1、通訊溝通的方式
? ? ? ? 大部分上位機在溝通的時候都是作為主動的一方存在的,被溝通的設備一般都是被動響應報文的。比如說一個卷簾門設備、一個充電設備、一個機器人設備等等,基本上都是上位機要求它做什么,它就會去做什么。在作業的過程中,上位機會不停輪詢當前的工作狀態。
2、哪里可以看到數據協議
? ? ? ? 這種協議還是很多的。如果是網站服務器類的協議,這種一般都是私有協議,只需要和對應網站的開發人員搞好對接就可以了;如果是設備類的協議,那么我們通過線上或者線下的方式拿到設備之后,就可以通過它們的售后人員拿到對應設備的開發協議。當然,現在很多設備供應商也會提前在自己的官網或者是github上發布對應的通訊協議,這都是可能的。
3、常見的協議有哪幾種
? ? ? ? 對于工控領域來說,最常見的協議就是modbus協議,它的通訊格式非常簡單,就是簡單的應答模式。上位機發送一個請求,設備回復一個請求。主要的請求也只有讀寫兩種模式,讀寫的報文也很短,一般就十幾個字節,這也是因為本身modbus設備功能比較單一,十幾個字節加上對應的bit位,其實很容易把大部分功能就說清楚了。
4、某設備232通信協議分析
4.1 讀設備協議
? ? ? ? 這就是一個讀設備協議,整個數據是16進制形式,數據內容是0x0101006400087c13。整個數據有8個字節。第一個01代表設備地址,第二個01代表功能,這里是讀。第三、四個字節是0064,轉成10進制就是100,代表寄存器地址是100。第五、六個字節是0008,代表需要讀8個寄存器。第七、八兩個字節7c13,這個是校驗碼,一般通過crc算法計算得到。
4.2 讀設備返回協議
? ? ? ? 如果我們按照4.1的形式發送數據之后,那么沒什么問題的話,上位機就會從設備讀到返回的數據。假設這個數據是0x0101010f118c。這個時候和4.1一樣,我們只需要按照官方給出的example去一個一個字節解析就可以了。從長度上看,返回的數據只有6個字節。第一個字節01代表設備地址。第二個字節01代表功能碼01,即讀。第三個字節代表數據長度01,即1個字節。第四個字節0F代表返回的數據0F。第五、六個字節0x118c代表檢驗碼,用戶可以根據校驗碼判斷一下下發的數據是否有錯誤。
? ? ? ? 這里可以思考下,假設返回的數據是4個,那么格式應該是什么樣的?比如說還是這里,那么返回的數據可能是這樣的,01+01+04+0000000f+校驗碼2個字節,這樣所有的數據長度加起來就是9個字節。
4.3 寫設備協議
? ? ? ? 和讀設備協議相比較,讀設備協議稍微復雜了一點。這里寫設備的命令是0x010f00640008010fcf59。其中有兩個個地方需要注意一下,第一,功能嗎從01變成了0f。第二,和讀設備相比較,這里多了一個010f,其中01代表要寫的數據長度,0f代表要寫的數據內容。其他部分和讀設備協議差別不大。
4.4 寫設備返回協議
? ? ? ? 和寫設備協議相比較,寫設備返回則簡單很多。基本上,把寫的數據長度、寫數據內容拿走,剩下來就是寫設備返回的內容。當然,對應的校驗碼肯定也發生了改變。
5、數據內容代表什么
? ? ? ? 前面我們討論了設備協議,但是大家有沒有注意,我們沒有討論讀寫數據里面的內容。這主要是因為,具體數據的含義其實和設備本身是相關的,它可能是一個門、一個燈、一個開關、一個電機、一個顯示屏幕,凡此種種,我們使用的時候再分別分析具體的bit位、具體的數據含義就可以了。這次要學習的主要就是怎么分析這個通信協議的邏輯。
6、其他要注意的地方
? ? ? ? 編寫協議的時候,還是需要非常小心的,通常來說有這么幾點要注意;
? ? ? ? 1)注意字節序;
? ? ? ? 2)注意每個bit的含義;
? ? ? ? 3)一收一發,不斷檢驗執行的返回結果;
? ? ? ? 4)嚴格根據設備的要求,保證輸入參數的合法性;
? ? ? ? 5)大膽懷疑,小心假設;
? ? ? ? 6)出問題的時候,大部分是參數沒設置好、環境發生了變化,設備出問題概率不大。