<object id="5egnf"></object>

    <dfn id="5egnf"></dfn>

  1. <sup id="5egnf"></sup>
        加入收藏 在線留言 聯系我們
        關注微信
        手機掃一掃 立刻聯系商家
        全國服務熱線17838383235
        公司新聞
        大神詳解MODBUS標準協議
        發布時間: 2024-04-27 08:58 更新時間: 2024-10-30 14:14

        【導讀】詳解MODBUS標準協議。一、什么是MODBUS?1.基本概念MODBUS 是MODICON公司(現為施耐德電氣公司的一個品牌)先倡導的一種軟的通訊規約,經過大多數公司  的實際應用,逐漸被認可,成為一種標準的通訊規約,只要按照這種規約進行 數據通訊或傳輸,不同的系統就可以通訊。目前,在RS232/RS485通訊過程中, 更是廣泛采用這種規約。常用的MODBUS 通訊規約有兩種,一種是MODBUS ASCII,一種是MODBUS RTU。 一般來說,通訊數據量少而且主要是文本的通訊則采用MODBUS ASCII規約,通訊數據數據量大而且是二進制數值時,多采用MODBUS RTU規約。在實際的應用過程中,為了解決某一個特殊問題,人們喜歡自己修改MODBUS規約來滿足自己的需要(事實上,人們經常使用自己定義的規約來通訊,這樣能解決問題,但不太規范)。更為普通的用法是,少量修改規約,但將規約格式附在軟件說明書一起,或直接放在幫助中,這樣就方便了用戶的通訊。2.MODBUS協議簡述ACRXXXE系列儀表使用的是MODBUS-RTU通訊協議,MODBUS協議詳細定義了校驗碼、數據序列等,這些都是特定數據交換的必要內容。MODBUS協議在一根通訊線上 使用主從應答式連接(半雙工),這意味著在一根單獨的通訊線上信號沿著相反的兩個方向傳輸。首先,主計算機的信號尋址到一臺唯一的終端設備(從機),然后,終端設備發出的應答信號以相反的方向傳輸給主機。 MODBUS協議只允許在主機(PC,PLC等)和終端設備之間通訊,而不允許獨立的終端設備之間的數據交換,這樣各終端設備不會在它們初始化時占據通訊線路,而于響應到達本機的查詢信號。3.查詢—回應周期查詢查詢消息中的功能代碼告之被選中的從設備要執行何種功能。數據段包含了從設備要執行功能的任何附加信息。例如功能代碼03是要求從設備讀保持寄存器并返回它 們的內容。數據段必須包含要告之從設備的信息:從何寄存器開始讀及要讀的寄存器數量。錯誤檢測域為從設備提供了一種驗證消息內容是否正確的方法?;貞绻麖脑O備產生一正常的回應,在回應消息中的功能代碼是在查詢消息中的功能代碼的回應。數據段包括了從設備收集的數據:如寄存器值或狀態。如果有錯誤發生, 功能代碼將被修改以用于指出回應消息是錯誤的,同時數據段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設備確認消息內容是否可用。4.傳輸方式:傳輸方式是指一個數據幀內一系列獨立的數據結構以及用于傳輸數據的有限規則,下面定義了與MODBUS 協議– RTU方式相兼容的傳輸方式。 每個字節的位: ·   1個起始位 ·   8個數據位,小的有效位先發送 ·   無奇偶校驗位 ·   1個停止位 錯誤檢測(Error checking):CRC(循環冗余校驗)5.協議當數據幀到達終端設備時, 它通過一個簡單的“端口”進入被尋址到的設備,該設備去掉數據幀的“信封”(數據頭),讀取數據,如果沒有錯誤,就執行數據所請求的任務,然后,它將自己 生成的數據加入到取得的“信封”中,把數據幀返回給發送者。返回的響應數據中包含了以下內容:終端從機地址(Address)、被執行了的命令(Function)、執行命令生成的被請求數據(Data)和一個校驗碼(Check)。發生任何錯誤都不會有成功的響應,或者返回一個錯誤指示幀。6.數據幀格式AddressFunctionDataCheck8-Bits8-BitsN x 8-Bits16-Bits7.地址(Address)域地址域在幀的開始部分,由 一個字節(8位二進制碼)組成,十進制為0~255,在我們的系統中只使用1~247,其它地址保留。這些位標明了用戶指定的終端設備的地址,該設備將接 收來自與之相連的主機數據。每個終端設備的地址必須是唯一的,僅僅被尋址到的終端會響應包含了該地址的查詢。當終端發送回一個響應,響應中的從機地址數據 便告訴了主機哪臺終端正與之進行通信。8.功能(Function)域功能域代碼告訴了被尋址到的終端執行何種功能。下表列出了該系列儀表用到的功能碼,以及它們的意義和功能。代碼意義行為03讀數據寄存器獲得一個或多個寄存器的當前二進制值16預置多寄存器設定二進制值到一系列多寄存器中(不對ACRXXXE開放)9.數據(Data)域數據域包含了終端執行特定 功能所需要的數據或者終端響應查詢時采集到的數據。這些數據的內容可能是數值、參考地址或者設置值。例如:功能域碼告訴終端讀取一個寄存器,數據域則需要 指明從哪個寄存器開始及讀取多少個數據,內嵌的地址和數據依照類型和從機之間的不同內容而有所不同。10.錯誤校驗(Check)域該域允許主機和終端檢查傳 輸過程中的錯誤。有時,由于電噪聲和其它干擾,一組數據在從一個設備傳輸到另一個設備時在線路上可能會發生一些改變,出錯校驗能夠保證主機或者終端不去響 應那些傳輸過程中發生了改變的數據,這就提高了系統的安全性和效率,錯誤校驗使用了16位循環冗余的方法(CRC16)。11.錯誤檢測的方法錯誤校驗(CRC)域占用兩個字節,包含了一個16位的二進制值。CRC值由傳輸設備計算出來,然后附加到數據幀上,接收設備在接收數據時重新計算CRC值,然后與接收到的CRC域中的值進行比較,如果這兩個值不相等,就發生了錯誤。CRC運算時,首先將一個 16位的寄存器預置為全1,然后連續把數據幀中的每個字節中的8位與該寄存器的當前值進行運算,僅僅每個字節的8個數據位參與生成CRC,起始位和終止位 以及可能使用的奇偶位都不影響CRC。在生成CRC時,每個字節的8位與寄存器中的內容進行異或,然后將結果向低位移位,高位則用“0”補充,低位 (LSB)移出并檢測,如果是1,該寄存器就與一個預設的固定值(0A001H)進行一次異或運算,如果低位為0,不作任何處理。上述處理重復進行,直到執行完了8次移位操作,當后一位(第8位)移完以后,下一個8位字節與寄存器的當前值進行異或運算,同樣進行上述的另一個8次移位異或操作,當數據幀中的所有字節都作了處理,生成的終值就是CRC值。12.生成一個CRC的流程為:?  預置一個16位寄存器為0FFFFH(全1),稱之為CRC寄存器。?  把數據幀中的個字節的8位與CRC寄存器中的低字節進行異或運算,結果存回CRC寄存器。?  將CRC寄存器向右移一位,高位填以0,低位移出并檢測。?  如果低位為0:重復第三步(下一次移位);如果低位為1:將CRC寄存器與一個預設的固定值(0A001H)進行異或運算。?  重復第三步和第四步直到8次移位。這樣處理完了一個完整的八位。?  重復第2步到第5步來處理下一個八位,直到所有的字節處理結束。?  終CRC寄存器的值就是CRC的值。此外還有一種利用預設的表格計算CRC的方法,它的主要特點是計算速度快,但是表格需要較大的存儲空間,該方法此處不再贅述,請參閱相關資料。13.通訊應用格式祥解本節所舉實例將盡可能的使用如圖所示的格式,(數字為16進制)。AddrFunData start  reg hiData start  reg loData #of regs hiData #of regs loCRC16 loCRC16hi01H03H00H00H00H03H05HCBHAddr:從機地址Fun:功能碼Data start reg hi:數據起始地址 寄存器高字節Data start reg lo:數據起始地址 寄存器低字節Data #of reg hi:數據讀取個數 寄存器高字節Data #of reg lo:數據讀取個數 寄存器低字節CRC16 Hi: 循環冗余校驗 高字節CRC16 Lo: 循環冗余校驗 低字節 14.讀數據(功能碼03)查詢數據幀此功能允許用戶獲得設備采集與記錄的數據及系統參數。主機一次請求的數據個數沒有限制,但不能超出定義的地址范圍。下面的例子是從01號從機讀3個采集到的基本數據(數據幀中每個地址占用2個字節)UA、UB、UC,其中UA的地址為0025H, UB的地址為0026H, UC的地址為0027H。Addr FunData startAddr hiDatastartAddr loData#ofregs hiData #ofregs loCRC16 loCRC16 hi01H03H00H25H00H03H14H00H響應數據幀響應包含從機地址、功能碼、數據的數量和CRC錯誤校驗。下面的例子是讀取UA、UB、UC (UA=082CH,UB=082AH,UC=082CH的響應。AddrFunByte countData1 hiData1 loData2 hiData2 loData3 hiData3 loCRC16 loCRC16 hi01H03H06H08H2CH08H2AH08H2CH94H4EH錯誤指示碼如果主機請求的地址不存在則返回錯誤指示碼:FFH。二、特點Modbus具有以下幾個特點1、標準、開放,用戶可以免費、放心地使用Modbus協議,不需要交納許可證費,也不會侵犯知識產權。目前,支持Modbus的廠家超過400家,支持Modbus的產品超過600種。 2、Modbus可以支持多種電氣接口,如RS-232、RS-485等,還可以在各種介質上傳送,如雙絞線、光纖、無線等。 3、Modbus的幀格式簡單、緊湊,通俗易懂。用戶使用容易,廠商開發簡單。三、功能碼定義1.ModBus功能碼01READ COIL STATUS02READ INPUT STATUS03READ HOLDING REGISTER04READ INPUT REGISTER05WRITE SINGLE COIL06WRITE SINGLE REGISTER15WRITE MULTIPLE COIL16WRITE MULTIPLE REGISTER四、傳輸方式在ModBus系統中有2種傳輸模式可選擇。這2種傳輸模式與從機PC通信的能力是同等的。選擇時應視所用ModBus主機而定,每個ModBus系統只能使用一種模式,不允許2種模式混用。一種模式是ASCII(美國信息 交換碼),另一種模式是RTU(遠程 終端設備)。用戶選擇想要的模式,包括 串口通信參數( 波特率、校驗方式等),在配置每個控制器的時候,在一個Modbus網絡上的所有設備都必須選擇相同的傳輸模式和串口參數。所選的ASCII或RTU方式僅適用于標準的Modbus網絡,它定義了在這些網絡上連續傳輸的消息段的每一位,以及決定怎樣將信息打包成消息域和如何解碼。在其它網絡上(像MAP和Modbus Plus)Modbus消息被轉成與串行傳輸無關的幀。1.傳輸模式特性ASCII可打印字符便于故障檢測,而且對于用語言(如Fortran)編程的主計算機及主PC很適宜。RTU則適用于 機器語言編程的計算機和PC主機。用RTU模式傳輸的數據是8位二進制字符。如欲轉換為ASCII模式,則每個RTU字符首先應分為高位和低位兩部分,這兩部分各含4位,然后轉換成十六進制等量值。用以構成 報文的ASCII字符都是十六進制字符。ASCII模式使用的 字符雖是RTU模式的兩倍,但ASCII數據的譯碼和處理更為容易一些,此外,用RTU模式時報文字符必須以連續數據流的形式傳送,用ASCII模式,字符之間可產生長達1s的間隔,以適應速度較慢的機器。控制器能設置為兩種傳輸模式(ASCII或RTU)中的任何一種在標準的Modbus網絡通信。2.ASCII模式當控制器設為在Modbus網絡上以ASCII(美國標準信息交換代碼)模式通信,一個信息中的每8位字節作為2個ASCII字符傳輸,如數值63H用ASCII方式時,需發送兩個字節,即ASCII“6"(0110110)和ASCII”3“(0110011),ASCII字符占用的位數有7位和8位,國際通用7位為多。這種方式的主要優點是字符發送的時間間隔可達到1秒而不產生錯誤。代碼系統  十六進制,ASCII 字符0...9,A...F消息中的每個ASCII字符都是一個十六進制字符組成  每個字節的位1個起始位  7個 數據位,小的有效位先發送  1個 奇偶校驗位,無校驗則無  1個停止位(有校驗時),2個Bit(無校驗時)  錯誤檢測域  LRC(縱向冗長檢測)3.RTU模式當控制器設為在Modbus網絡上以RTU模式通信,在消息中的每個8Bit字節按照原值傳送,不做處理,如63H,RTU將直接發送01100011。這種方式的主要優點是:數據幀傳送之間沒有間隔,相同波特率下傳輸數據的密度要比ASCII高,傳輸速度更快。 代碼系統  8位二進制, 十六進制數0...9,A...F  消息中的每個8 位域都是一或兩個十六進制字符組成  每個字節的位  1個起始位  8個 數據位,小的有效位先發送  1個 奇偶校驗位,無校驗則無  1個停止位(有校驗時),2個Bit(無校驗時)五、數據校驗方式1.CRCCRC域是兩個字節,包含一16位的二進制值。它由傳輸設備計算后加入到消息中。接收設備重新計算收到消息的CRC,并與接收到的CRC域中的值比較,如果兩值不同,則有誤。 CRC是先調入一值是全“1”的16位寄存器,然后調用一過程將消息中連續的8位字節和當前寄存器中的值進行處理。僅每個字符中的8Bit數據對CRC有效,起始位和停止位以及 奇偶校驗位均無效。 CRC產生過程中,每個8位字符都單獨和寄存器內容相異或(XOR),結果向低有效位方向移動,高有效位以0填充。LSB被提取出來檢測,如果LSB為1,寄存器單獨和預置的值或一下,如果LSB為0,則不進行。整個過程要重復8次。在后一位(第8位)完成后,下一個8位字節又單獨和寄存器的當前值相異或(XOR)。終寄存器中的值,是消息中所有的字節都執行之后的CRC值。 CRC添加到消息中時,低字節先加入,然后高字節。 CRC-16錯誤校驗程序如下:報文(此處只涉及 數據位,不指起始位、停止位和任選的 奇偶校驗位)被看作是一個連續的二進制,其高有效位(MSB)發送。報文先與X↑16相乘(左移16位),然后看X↑16+X↑15+X↑2+1除,X↑16+X↑15+X↑2+1可以表示為二進制數11000,0000,0000,0101。整數商位忽略不記,16位余數加入該報文(MSB先發送),成為2個CRC校驗字節。余數中的1全部初始化,以免所有的零成為一條報文被接收。經上述處理而含有CRC字節的報文,若無錯誤,到接收設備后再被同一多項式(X↑16+X↑15+X↑2+1)除,會得到一個零余數(接收設備核驗這個CRC字節,并將其與被傳送的CRC比較)。全部運算以2為模(無進位)。 習慣于成串發送數據的設備會送出字符的右位(LSB-低有效位)。而在生成CRC情況下,發送首位應是被除數的高有效位MSB。由于在運算中不用進位,為便于操作起見,計算CRC時設MSB在右位。生成多項式的位序也必須反過來,以保持一致。多項式的MSB略去不記,因其只對商有影響而不影響余數。 生成CRC-16校驗字節的步驟如下: ①裝如一個16位 寄存器,所有數位均為1。 ②該16位寄存器的高位 字節與開始8位字節進行“異或”運算。運算結果放入這個16位寄存器。 ③把這個16寄存器向右移一位。 ④若向右(標記位)移出的數位是1,則生成多項式10,1000,000,0000,001和這個寄存器進行“異或”運算;若向右移出的數位是0,則返回③。 ⑤重復③和④,直至移出8位。 ⑥另外8位與該十六位寄存器進行“異或”運算。 ⑦重復③~⑥,直至該 報文所有字節均與16位 寄存器進行“異或”運算,并移位8次。 ⑧這個16位寄存器的內容即2字節CRC錯誤校驗,被加到報文的高有效位。 另外,在某些非ModBus通信協議中也經常使用CRC16作為校驗手段,而且產生了一些CRC16的變種,他們是使用CRC16多項式X↑16+X↑15+X↑2+1,單裝入的16位寄存器為0000;使用CRC16的反序X↑16+X↑14+X↑1+1,裝入寄存器值為0000或FFFFH。2.LRCLRC錯誤校驗用于ASCII模式。這個錯誤校驗是一個8位二進制數,可作為2個ASCII十六進制字節傳送。把十六進制字符轉換成二進制,加上無循環進位的二進制字符和二進制補碼結果生成LRC錯誤校驗(參見圖)。這個LRC在接收設備進行核驗,并與被傳送的LRC進行比較,冒號(:)、回車符號(CR)、換行字符(LF)和置入的其他任何非ASCII十六進制字符在運算時忽略不計。Modbus與PROFIBUS-DP協議比較Modbus的協議內容是完全公開的,內容是簡單滴,實現起來是非常容易滴,單片機、PLC、DCS統統都能輕易實現。    Profibus則要復雜一些,關鍵是需要專用芯片進行二次開發,并且需要得到上級組織的認證,開發成本肯定高不少 。   當然從性能上講,基于串口的modbus rtu/ASCII通訊性能肯定比不過profibus dp,但是就一些儀表級的簡單通訊或者控制器級別的小數據量通訊,modbus是足以勝任的。說白了,就是modbus是*絲,profibus是高富帥!Modbus支持的功能碼功能碼名稱作用01讀取線圈狀態取得一組邏輯線圈的當前狀態(ON/OFF)02讀取輸入狀態取得一組開關輸入的當前狀態(ON/OFF)03讀取保持寄存器在一個或多個保持寄存器中取得當前的二進制值04讀取輸入寄存器在一個或多個輸入寄存器中取得當前的二進制值05強置單線圈強置一個邏輯線圈的通斷狀態06預置單寄存器把具體二進值裝入一個保持寄存器07讀取異常狀態取得8個內部線圈的通斷狀態,這8個線圈的地址由控制器決定08回送診斷校驗把診斷校驗報文送從機,以對通信處理進行評鑒09編程(只用于484)使主機模擬編程器作用,修改PC從機邏輯10控詢(只用于484)可使主機與一臺正在執行長程序任務從機通信,探詢該從機是否已完成其操作任務,僅在含有功能碼9的報文發送后,本功能碼才發送11讀取事件計數可使主機發出單詢問,并隨即判定操作是否成功,尤其是該命令或其他應答產生通信錯誤時12讀取通信事件記錄可是主機檢索每臺從機的ModBus事務處理通信事件記錄。如果某項事務處理完成,記錄會給出有關錯誤13編程(184/384 484 584)可使主機模擬編程器功能修改PC從機邏輯14探詢(184/384 484 584)可使主機與正在執行任務的從機通信,定期控詢該從機是否已完成其程序操作,僅在含有功能13的報文發送后,本功能碼才得發送15強置多線圈強置一串連續邏輯線圈的通斷16預置多寄存器把具體的二進制值裝入一串連續的保持寄存器17報告從機標識可使主機判斷編址從機的類型及該從機運行指示燈的狀態18(884和MICRO 84)可使主機模擬編程功能,修改PC狀態邏輯19重置通信鏈路發生非可修改錯誤后,是從機復位于已知狀態,可重置順序字節20讀取通用參數(584L)顯示擴展存儲器文件中的數據信息21寫入通用參數(584L)把通用參數寫入擴展存儲文件,或修改之22~64保留作擴展功能備用65~72保留以備用戶功能所用留作用戶功能的擴展編碼73~119非法功能120~127保留留作內部作用128~255保留用于異常應答功能碼命令詳解在這些功能碼中較長使用的是1、2、3、4、5、6號功能碼,使用它們即可實現對下位機的數字量和模擬量的讀寫操作。1、01號命令,讀可讀寫數字量寄存器(線圈狀態):計算機發送命令:[設備地址] [命令號01] [起始寄存器地址高8位] [低8位] [讀取的寄存器數高8位] [低8位] [CRC校驗的低8位] [CRC校驗的高8位]  例:[11][01][00][13][00][25][CRC低][CRC高]  意義如下: 

        聯系方式

        • 電  話:17838383235
        • 經理:徐嘉泉
        • 手  機:17838383235
        • 微  信:17838383235