1. 程式人生 > >(乾貨)Modbus如何自動分配從機地址

(乾貨)Modbus如何自動分配從機地址

根據幾篇的論文思路,有兩種做法:1是從機產生隨機數作為自己的臨時地址並以此作為時間間隔傳送自己的地址,2是利用從機互不相同的ID來實現。本文采用的是第二種方式,以下描述具體細節。 首先要求各臺機器設有唯一的機器識別碼。 Modbus協議是應用層協議,只要不跟本公司外的產品通訊,開發人員可以不拘泥於標準要求,自由決定協議細節。當然最好還是採用標準規範,使用分配給廠家內部的功能碼。 主機發送特殊廣播報文1,要求所有從機收到後回覆自己的識別碼(也可以加上從機地址)。從機收到廣播報文後,經固定延時,按照自己識別碼的後兩位100ms,作為傳送時刻。 波特率是9600時,1ms可傳送9.6個bits,100ms可傳送960bits=60word,只要報文總長度不超過50個字,就不擔心衝突。 主機收到識別碼後,按照先後順序,對應分配新的從機地址,當固定延時(99

100ms=9.9s,所以>10s即可)後,主機將各個識別碼和對應的新地址,逐條廣播發送。從機接收後與自己的識別碼進行比較,如果吻合,就更新自己的從機地址,並向主機回覆接收並更改成功。 主機逐條廣播發送完畢後,作為第一輪地址賦值的結束,如果多臺從機的識別碼後兩位相同,就會同時傳送回覆報文,導致主機接收到錯誤報文,所以還需進行第二輪賦值。 主機發送特殊廣播報文2,仍然要求從機回覆識別碼,從機收到後,先判斷自己的從機地址是否已更新,如已更新,則不理會,如未更新,則按照識別碼的倒數第三位和第二位*100ms,作為傳送時刻,再次傳送自己的識別碼。 如果主機收到正常報文,則對新收到的識別碼,繼續進行地址分配,再進行逐條廣播發送。從機判斷出與自己的識別碼相同,則進行地址更新。 如果主機收到的還有錯誤報文,則重複上述過程,只是要求從機將延時依據的識別碼兩位數前移一位。 總結:如果多臺從機的識別碼後兩位相同,就會同時傳送回覆報文,導致主機接收到錯誤報文,所以在第二輪迴復中,將識別碼的後兩位向前移一位,作為新的延時時間,以期與衝突的另一臺從機錯開,如果主機還是收到錯誤報文,就需要將識別碼再前移一位,直到不相同。