版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、MODBUS-RTU通訊協(xié)議簡介2008-01-15 23:15:09|分類: 技術(shù)人生 |標簽: |字號大中小訂閱 什么是MODBUS?MODBUS是MODICON公司最先倡導(dǎo)的一種軟的通訊規(guī)約,經(jīng)過大多數(shù)公司的實際應(yīng)用,逐漸被認可,成為一種標準的通訊規(guī)約,只要按照這種規(guī)約進行數(shù)據(jù)通訊或傳輸,不同的系統(tǒng)就可以通訊。目前,在RS232/RS485通訊過程中,更是廣泛采用這種規(guī)約。 常用的MODBUS通訊規(guī)約有兩種,一種是MODBUSASCII,一種是MODBUSRTU。一般來說,通訊數(shù)據(jù)量少而且主要是文本的通訊則采用MODBUSASCII規(guī)約,通訊數(shù)據(jù)數(shù)據(jù)量大而且是二進制數(shù)值時,多采用MODB
2、USRTU規(guī)約。在實際的應(yīng)用過程中,為了解決某一個特殊問題,人們喜歡自己修改MODBUS規(guī)約來滿足自己的需要(事實上,人們經(jīng)常使用自己定義的規(guī)約來通訊,這樣能解決問題,但不太規(guī)范)。更為普通的用法是,少量修改規(guī)約,但將規(guī)約格式附在軟件說明書一起,或直接放在幫助中,這樣就方便了用戶的通訊。MODBUS-RTU通訊協(xié)議簡介 在本章主要講述如何利用軟件通過通訊口來操控該系列儀表。本章內(nèi)容的掌握需要您具有MODBUS協(xié)議的知識儲備并且通讀了本冊其它章節(jié)所有內(nèi)容,對本產(chǎn)品功能和應(yīng)用概念有較全面了解。本章內(nèi)容包括:MODBUS協(xié)議簡述,通訊應(yīng)用格式詳解,本機的應(yīng)用細節(jié)及參量地址表。1.1 MODBUS協(xié)議
3、簡述ACRXXXE系列儀表使用的是MODBUS-RTU通訊協(xié)議,MODBUS協(xié)議詳細定義了校驗碼、數(shù)據(jù)序列等,這些都是特定數(shù)據(jù)交換的必要內(nèi)容。MODBUS協(xié)議在一根通訊線上使用主從應(yīng)答式連接(半雙工),這意味著在一根單獨的通訊線上信號沿著相反的兩個方向傳輸。首先,主計算機的信號尋址到一臺唯一的終端設(shè)備(從機),然后,終端設(shè)備發(fā)出的應(yīng)答信號以相反的方向傳輸給主機。MODBUS協(xié)議只允許在主機(PC,PLC等)和終端設(shè)備之間通訊,而不允許獨立的終端設(shè)備之間的數(shù)據(jù)交換,這樣各終端設(shè)備不會在它們初始化時占據(jù)通訊線路,而僅限于響應(yīng)到達本機的查詢信號。1.2 查詢回應(yīng)周期1.2.1 查詢查詢消息中的功能代
4、碼告之被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí)行功能的任何附加信息。例如功能代碼03是要求從設(shè)備讀保持寄存器并返回它們的內(nèi)容。數(shù)據(jù)段必須包含要告之從設(shè)備的信息:從何寄存器開始讀及要讀的寄存器數(shù)量。錯誤檢測域為從設(shè)備提供了一種驗證消息內(nèi)容是否正確的方法。1.2.2 回應(yīng)如果從設(shè)備產(chǎn)生一正常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢消息中的功能代碼的回應(yīng)。數(shù)據(jù)段包括了從設(shè)備收集的數(shù)據(jù):如寄存器值或狀態(tài)。如果有錯誤發(fā)生,功能代碼將被修改以用于指出回應(yīng)消息是錯誤的,同時數(shù)據(jù)段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設(shè)備確認消息內(nèi)容是否可用。1.3 傳輸方式傳輸方式是指一個數(shù)據(jù)幀內(nèi)一系列獨立
5、的數(shù)據(jù)結(jié)構(gòu)以及用于傳輸數(shù)據(jù)的有限規(guī)則,下面定義了與MODBUS 協(xié)議 RTU方式相兼容的傳輸方式。每個字節(jié)的位: 1個起始位 8個數(shù)據(jù)位,最小的有效位先發(fā)送 無奇偶校驗位 1個停止位錯誤檢測(Error checking):CRC(循環(huán)冗余校驗)1.4 協(xié)議當數(shù)據(jù)幀到達終端設(shè)備時,它通過一個簡單的“端口”進入被尋址到的設(shè)備,該設(shè)備去掉數(shù)據(jù)幀的“信封”(數(shù)據(jù)頭),讀取數(shù)據(jù),如果沒有錯誤,就執(zhí)行數(shù)據(jù)所請求的任務(wù),然后,它將自己生成的數(shù)據(jù)加入到取得的“信封”中,把數(shù)據(jù)幀返回給發(fā)送者。返回的響應(yīng)數(shù)據(jù)中包含了以下內(nèi)容:終端從機地址(Address)、被執(zhí)行了的命令(Function)、執(zhí)行命令生成的被請
6、求數(shù)據(jù)(Data)和一個校驗碼(Check)。發(fā)生任何錯誤都不會有成功的響應(yīng),或者返回一個錯誤指示幀。1.4.1 數(shù)據(jù)幀格式AddressFunctionDataCheck8-Bits8-BitsN x 8-Bits16-Bits1.4.2 地址(Address)域地址域在幀的開始部分,由一個字節(jié)(8位二進制碼)組成,十進制為0255,在我們的系統(tǒng)中只使用1247,其它地址保留。這些位標明了用戶指定的終端設(shè)備的地址,該設(shè)備將接收來自與之相連的主機數(shù)據(jù)。每個終端設(shè)備的地址必須是唯一的,僅僅被尋址到的終端會響應(yīng)包含了該地址的查詢。當終端發(fā)送回一個響應(yīng),響應(yīng)中的從機地址數(shù)據(jù)便告訴了主機哪臺終端正與之
7、進行通信。1.4.3 功能(Function)域功能域代碼告訴了被尋址到的終端執(zhí)行何種功能。下表列出了該系列儀表用到的功能碼,以及它們的意義和功能。代碼意義行為03讀數(shù)據(jù)寄存器獲得一個或多個寄存器的當前二進制值16預(yù)置多寄存器設(shè)定二進制值到一系列多寄存器中(不對ACRXXXE開放)1.4.4 數(shù)據(jù)(Data)域數(shù)據(jù)域包含了終端執(zhí)行特定功能所需要的數(shù)據(jù)或者終端響應(yīng)查詢時采集到的數(shù)據(jù)。這些數(shù)據(jù)的內(nèi)容可能是數(shù)值、參考地址或者設(shè)置值。例如:功能域碼告訴終端讀取一個寄存器,數(shù)據(jù)域則需要指明從哪個寄存器開始及讀取多少個數(shù)據(jù),內(nèi)嵌的地址和數(shù)據(jù)依照類型和從機之間的不同內(nèi)容而有所不同。1.4.5 錯誤校驗(Ch
8、eck)域該域允許主機和終端檢查傳輸過程中的錯誤。有時,由于電噪聲和其它干擾,一組數(shù)據(jù)在從一個設(shè)備傳輸?shù)搅硪粋€設(shè)備時在線路上可能會發(fā)生一些改變,出錯校驗?zāi)軌虮WC主機或者終端不去響應(yīng)那些傳輸過程中發(fā)生了改變的數(shù)據(jù),這就提高了系統(tǒng)的安全性和效率,錯誤校驗使用了16位循環(huán)冗余的方法(CRC16)。1.5 錯誤檢測的方法錯誤校驗(CRC)域占用兩個字節(jié),包含了一個16位的二進制值。CRC值由傳輸設(shè)備計算出來,然后附加到數(shù)據(jù)幀上,接收設(shè)備在接收數(shù)據(jù)時重新計算CRC值,然后與接收到的CRC域中的值進行比較,如果這兩個值不相等,就發(fā)生了錯誤。CRC運算時,首先將一個16位的寄存器預(yù)置為全1,然后連續(xù)把數(shù)據(jù)幀
9、中的每個字節(jié)中的8位與該寄存器的當前值進行運算,僅僅每個字節(jié)的8個數(shù)據(jù)位參與生成CRC,起始位和終止位以及可能使用的奇偶位都不影響CRC。在生成CRC時,每個字節(jié)的8位與寄存器中的內(nèi)容進行異或,然后將結(jié)果向低位移位,高位則用“0”補充,最低位(LSB)移出并檢測,如果是1,該寄存器就與一個預(yù)設(shè)的固定值(0A001H)進行一次異或運算,如果最低位為0,不作任何處理。上述處理重復(fù)進行,直到執(zhí)行完了8次移位操作,當最后一位(第8位)移完以后,下一個8位字節(jié)與寄存器的當前值進行異或運算,同樣進行上述的另一個8次移位異或操作,當數(shù)據(jù)幀中的所有字節(jié)都作了處理,生成的最終值就是CRC值。生成一個CRC的流程
10、為:1 預(yù)置一個16位寄存器為0FFFFH(全1),稱之為CRC寄存器。2 把數(shù)據(jù)幀中的第一個字節(jié)的8位與CRC寄存器中的低字節(jié)進行異或運算,結(jié)果存回CRC寄存器。3 將CRC寄存器向右移一位,最高位填以0,最低位移出并檢測。4 如果最低位為0:重復(fù)第三步(下一次移位);如果最低位為1:將CRC寄存器與一個預(yù)設(shè)的固定值(0A001H)進行異或運算。5 重復(fù)第三步和第四步直到8次移位。這樣處理完了一個完整的八位。6 重復(fù)第2步到第5步來處理下一個八位,直到所有的字節(jié)處理結(jié)束。7 最終CRC寄存器的值就是CRC的值。此外還有一種利用預(yù)設(shè)的表格計算CRC的方法,它的主要特點是計算速度快,但是表格需要
11、較大的存儲空間,該方法此處不再贅述,請參閱相關(guān)資料。1.6 通訊應(yīng)用格式祥解本節(jié)所舉實例將盡可能的使用如圖所示的格式,(數(shù)字為16進制)。AddrFunData start reg hiData start reg loData #of regs hiData #of regs loCRC16 loCRC16hi01H03H00H00H00H03H05HCBHAddr:從機地址Fun:功能碼Data start reg hi:數(shù)據(jù)起始地址 寄存器高字節(jié)Data start reg lo:數(shù)據(jù)起始地址 寄存器低字節(jié)Data #of reg hi:數(shù)據(jù)讀取個數(shù) 寄存器高字節(jié)Data #of reg
12、 lo:數(shù)據(jù)讀取個數(shù) 寄存器低字節(jié)CRC16 Hi: 循環(huán)冗余校驗 高字節(jié)CRC16 Lo: 循環(huán)冗余校驗 低字節(jié)1.6.1 讀數(shù)據(jù)(功能碼03)l 查詢數(shù)據(jù)幀此功能允許用戶獲得設(shè)備采集與記錄的數(shù)據(jù)及系統(tǒng)參數(shù)。主機一次請求的數(shù)據(jù)個數(shù)沒有限制,但不能超出定義的地址范圍。下面的例子是從01號從機讀3個采集到的基本數(shù)據(jù)(數(shù)據(jù)幀中每個地址占用2個字節(jié))UA、UB、UC,其中UA的地址為0025H, UB的地址為0026H, UC的地址為0027H。AddrFunData start Addr hiDatastartAddr loData#of regs hiData #ofregs loCRC16 l
13、oCRC16 hi01H03H00H25H00H03H14H00Hl 響應(yīng)數(shù)據(jù)幀響應(yīng)包含從機地址、功能碼、數(shù)據(jù)的數(shù)量和CRC錯誤校驗。下面的例子是讀取UA、UB、UC (UA=082CH,UB=082AH,UC=082CH的響應(yīng)。 AddrFunByte countData1 hiData1 lo Data2 hiData2 loData3 hiData3 loCRC16 loCRC16 hi01H03H06H08H2CH08H2AH08H2CH94H4EHl 錯誤指示碼如果主機請求的地址不存在則返回錯誤指示碼:FFH。1.6.2 預(yù)置多寄存器(功能碼16,不對ACRXXXE開放)l 查詢數(shù)據(jù)
14、幀 功能碼16允許用戶改變多個寄存器的內(nèi)容,該儀表中系統(tǒng)參數(shù)、開關(guān)量輸出狀態(tài)等可用此功能號寫入。主機一次最多可以寫入16個(32字節(jié))數(shù)據(jù)。下面的例子是預(yù)置ACR220EK、ACR320EFK及ACR420EK地址都為1時同時輸出開關(guān)量Do1和Do2。ACR220EK:AddrFunData Start reg hiData start reg loData #of regs hiData #of regs loBytecountValue hiValue loCRC loCRC hi01H10H00H22H00H01H02 H30H00HB4HD2HACR420EK:AddrFunData
15、Start reg hiData start reg loData #of regs hiData #of regs loBytecountValue hiValue loCRC loCRC hi01H10H00H22H00H01H02 HC0H00HF0HD2HACR320EFK:AddrFunData Start reg hiData start reg loData #of regs hiData #of regs loValue hiValue loCRC loCRC hi01H10H00H05H00H01H00HC0H0DH96Hl 響應(yīng)數(shù)據(jù)幀對于預(yù)置單寄存器請求的正常響應(yīng)是在寄存器
16、值改變以后回應(yīng)機器地址、功能號、數(shù)據(jù)起始地址、數(shù)據(jù)個數(shù)(ACR320EFK為數(shù)據(jù)字節(jié)數(shù))、CRC校驗碼。如圖。ACR220EK和ACR420EK:AddrFunData start reg hiData start reg loData #of regs hiData #of regs loCRC16 loCRC16 hi01H10H00H22H00H01HA1HC3HACR320EFK:AddrFunData start reg hiData start reg loBytecountCRC16 loCRC16 hi01H10H00H05H02H9FH91Hl 錯誤指示碼如果主機請求的地址不
17、存在或數(shù)據(jù)個數(shù)不正確則返回錯誤指示碼:FFH。1.7 ACRXXXE的應(yīng)用細節(jié)及參量地址表該系列測量值用Modbus-RTU 通訊規(guī)約的03號命令讀出。通訊值與實際值之間的對應(yīng)關(guān)系如下表:(約定Val_t為通訊讀出值,Val_s為實際值)適用參量對應(yīng)關(guān)系單位電壓值UA、UB、UCVal_s(Val_t /10000)*(10DPT)伏(V)電流值IA、IB、ICsignVal_s(Val_t /10000)*(10DCT)安培(A)功率值PA、 PB、 PC、P、 QA、 QB、QC、QVal_s(-1) (Val_t /10000)*(10DPQ)瓦(W)、乏(Var)電度量一次側(cè)值EpI、
18、 EpE、EqL、EqCVal_sVal_t*PT*CT瓦時(wh)乏時(varh)功率因數(shù)值PFA、PFB、PFC、PFSVal_sVal_t / 1000無單位頻率FRVal_sVal_t / 100赫茲(Hz)范例:UA的通訊讀出值為08C6H(2246),DPT為5,則UA的實際值Va =(2246/10000)*(105) = 22.46KV。 IA的通訊讀出值為0FA0H(4000),DCT為3,則IA的實際值Ia =(4000/10000)*(103) = 400.0A。幾點說明:1 數(shù)據(jù)類型:“BYTE”指1個字節(jié);“word” 指16位無符號整數(shù);“Integer”指16位有
19、符號整數(shù);“Dword” 指32位無符號整數(shù),“Fword”指32位浮點數(shù)。2 讀寫屬性:“R”只讀,讀參量用03H號命令;“R/W”可讀可寫,寫系統(tǒng)參量用10H號命令。禁止向未列出的或不具可寫屬性的地址寫入。3 波特率的設(shè)定范圍4800 bps,9600 bps,19200 bps,38400 bps.在此范圍外的設(shè)定是不允許的。如果寫入超范圍的設(shè)定值,儀表會啟用默認波特率:38400 bps。4 ACR320EFK所測電能值均為二次側(cè)電能。高字節(jié)在前,低字節(jié)在后,單位WH 或VARH, 統(tǒng)計一次側(cè)電能數(shù)據(jù)的時候,請乘以相應(yīng)的變比。例如10KV/100V,75A/5A 的儀表,請在計量抄表的
20、數(shù)據(jù)乘以PT=100和CT=15 的乘積1500。5 ACR320EFK提供4 路開關(guān)量輸入功能和2路繼電器開關(guān)量輸出功能。4 路開關(guān)輸入是采用濕接點電阻開關(guān)信號輸入方式,儀表內(nèi)部配備+5V 的工作電源,無須外部供電。當外部接通的時候,經(jīng)過儀表開關(guān)輸入模塊DI 采集其為接通信息、顯示為1;當外部斷開的時候,經(jīng)過儀表開關(guān)輸入模塊DI 采集其為斷開信息、顯示為0。開關(guān)量輸入模塊不僅能夠采集和顯示本地的開關(guān)信息,同時可以通過儀表的數(shù)字接口RS485 實現(xiàn)遠程傳輸功能,即“遙信”功能;2路繼電器輸出功能可用于各種場所下的報警指示、保護控制等輸出功能。在開關(guān)輸出有效的時候,繼電器輸出導(dǎo)通,顯示為1;開關(guān)
21、輸出關(guān)閉的時候,顯示為0,繼電器輸出關(guān)斷。6 ACRXXXE(K)電度一次側(cè)時的值采用浮點變量數(shù)據(jù)類型。它用符號位表示數(shù)的符號,用階碼和尾數(shù)表示數(shù)的大小。儀表采用的數(shù)據(jù)格式為IEEE754數(shù)據(jù)格式具有24位精度,尾數(shù)的高位始終為“1”,因而不保存,位的分布如下 1位符號位; 8位指數(shù)位; 23位尾數(shù)。符號位是最高位,尾數(shù)為最低的23位,按字節(jié)描述如下:地址+0+1+2+3內(nèi)容SEEE EEEEEMMM MMMMMMMM MMMMMMMM MMMM其中, S:符號位,1表示負,0表示正;E:階碼(在兩個字節(jié)中)偏移為127;M:23位尾數(shù),最高位為“1”。具體舉例如下:讀出01000111010
22、0 1011 1010 1100 0000 0000B0 代表符號位,“1”為負,“0”為正;10001110為計算指數(shù),設(shè)為a, a為10進制,a為142;100 1011 1010 1100 0000 0000為計算尾數(shù),設(shè)為b,b為10進制,b為4959232。計算公式: 一次側(cè)電量=上例計算結(jié)果為:=52140Modbus通訊協(xié)議Modbus協(xié)議 Modbus協(xié)議最初由Modicon公司開發(fā)出來,在1979年末該公司成為施耐德自動化(Schneider Automation)部門的一部分,現(xiàn)在Modbus已經(jīng)是工業(yè)領(lǐng)域全球最流行的協(xié)議。此協(xié)議支持傳統(tǒng)的RS-232、RS-422、RS-
23、485和以太網(wǎng)設(shè)備。許多工業(yè)設(shè)備,包括PLC,DCS,智能儀表等都在使用Modbus協(xié)議作為他們之間的通訊標準。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進行集中監(jiān)控。 當在網(wǎng)絡(luò)上通信時,Modbus協(xié)議決定了每個控制器須要知道它們的設(shè)備地址,識別按地址發(fā)來的消息,決定要產(chǎn)生何種行動。如果需要回應(yīng),控制器將生成應(yīng)答并使用Modbus協(xié)議發(fā)送給詢問方。 Modbus協(xié)議包括ASCII、RTU、TCP等,并沒有規(guī)定物理層。此協(xié)議定義了控制器能夠認識和使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進行通信的。標準的Modicon控制器使用RS232C實現(xiàn)串行的Modbus。Modbus的ASCII、
24、RTU協(xié)議規(guī)定了消息、數(shù)據(jù)的結(jié)構(gòu)、命令和就答的方式,數(shù)據(jù)通訊采用Maser/Slave方式,Master端發(fā)出數(shù)據(jù)請求消息,Slave端接收到正確消息后就可以發(fā)送數(shù)據(jù)到Master端以響應(yīng)請求;Master端也可以直接發(fā)消息修改Slave端的數(shù)據(jù),實現(xiàn)雙向讀寫。 Modbus協(xié)議需要對數(shù)據(jù)進行校驗,串行協(xié)議中除有奇偶校驗外,ASCII模式采用LRC校驗,RTU模式采用16位CRC校驗,但TCP模式?jīng)]有額外規(guī)定校驗,因為TCP協(xié)議是一個面向連接的可靠協(xié)議。另外,Modbus采用主從方式定時收發(fā)數(shù)據(jù),在實際使用中如果某Slave站點斷開后(如故障或關(guān)機),Master端可以診斷出來,而當故障修復(fù)后
25、,網(wǎng)絡(luò)又可自動接通。因此,Modbus協(xié)議的可靠性較好。 下面我來簡單的給大家介紹一下,對于Modbus的ASCII、RTU和TCP協(xié)議來說,其中TCP和RTU協(xié)議非常類似,我們只要把RTU協(xié)議的兩個字節(jié)的校驗碼去掉,然后在RTU協(xié)議的開始加上5個0和一個6并通過TCP/IP網(wǎng)絡(luò)協(xié)議發(fā)送出去即可。所以在這里我僅介紹一下Modbus的ASCII和RTU協(xié)議。 下表是ASCII協(xié)議和RTU協(xié)議進行的比較: 協(xié)議開始標記結(jié)束標記校驗傳輸效率程序處理ASCII:(冒號)CR,LFLRC低直觀,簡單,易調(diào)試RTU無無CRC高不直觀,稍復(fù)雜通過比較可以看到,ASCII協(xié)議和RTU協(xié)議相比擁有開始和結(jié)束標記
26、,因此在進行程序處理時能更加方便,而且由于傳輸?shù)亩际强梢姷腁SCII字符,所以進行調(diào)試時就更加的直觀,另外它的LRC校驗也比較容易。但是因為它傳輸?shù)亩际强梢姷腁SCII字符,RTU傳輸?shù)臄?shù)據(jù)每一個字節(jié)ASCII都要用兩個字節(jié)來傳輸,比如RTU傳輸一個十六進制數(shù)0xF9,ASCII就需要傳輸F9的ASCII碼0x39和0x46兩個字節(jié),這樣它的傳輸?shù)男示捅容^低。所以一般來說,如果所需要傳輸?shù)臄?shù)據(jù)量較小可以考慮使用ASCII協(xié)議,如果所需傳輸?shù)臄?shù)據(jù)量比較大,最好能使用RTU協(xié)議。下面對兩種協(xié)議的校驗進行一下介紹。1、LRC校驗LRC域是一個包含一個8位二進制值的字節(jié)。LRC值由傳輸設(shè)備來計算并放
27、到消息幀中,接收設(shè)備在接收消息的過程中計算LRC,并將它和接收到消息中LRC域中的值比較,如果兩值不等,說明有錯誤。LRC校驗比較簡單,它在ASCII協(xié)議中使用,檢測了消息域中除開始的冒號及結(jié)束的回車換行號外的內(nèi)容。它僅僅是把每一個需要傳輸?shù)臄?shù)據(jù)按字節(jié)疊加后取反加1即可。下面是它的VC代碼: BYTE GetCheckCode(const char * pSendBuf, int nEnd)/獲得校驗碼 BYTE byLrc = 0; char pBuf4; int nData = 0; for(i=1; iend; i+=2)/i初始為1,避開“開始標記”冒號 /每兩個需要發(fā)送的ASCII碼
28、轉(zhuǎn)化為一個十六進制數(shù) pBuf 0 = pSendBuf i; pBuf 1 = pSendBuf i+1; pBuf 2 = 0; sscanf(pBuf,%x,& nData); byLrc += nData; byLrc = byLrc; byLrc +; return byLrc; 2、CRC校驗 CRC域是兩個字節(jié),包含一16位的二進制值。它由傳輸設(shè)備計算后加入到消息中。接收設(shè)備重新計算收到消息的CRC,并與接收到的CRC域中的值比較,如果兩值不同,則有誤。CRC是先調(diào)入一值是全“1”的16位寄存器,然后調(diào)用一過程將消息中連續(xù)的8位字節(jié)各當前寄存器中的值進行處理。僅每個字符中的8Bi
29、t數(shù)據(jù)對CRC有效,起始位和停止位以及奇偶校驗位均無效。CRC產(chǎn)生過程中,每個8位字符都單獨和寄存器內(nèi)容相或(OR),結(jié)果向最低有效位方向移動,最高有效位以0填充。LSB被提取出來檢測,如果LSB為1,寄存器單獨和預(yù)置的值或一下,如果LSB為0,則不進行。整個過程要重復(fù)8次。在最后一位(第8位)完成后,下一個8位字節(jié)又單獨和寄存器的當前值相或。最終寄存器中的值,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。CRC添加到消息中時,低字節(jié)先加入,然后高字節(jié)。下面是它的VC代碼: WORD GetCheckCode(const char * pSendBuf, int nEnd)/獲得校驗碼 WORD w
30、Crc = WORD(0xFFFF);for(int i=0; inEnd; i+)wCrc = WORD(BYTE(pSendBufi);for(int j=0; j= 1; wCrc = 0xA001; elsewCrc = 1; return wCrc;對于一條RTU協(xié)議的命令可以簡單的通過以下的步驟轉(zhuǎn)化為ASCII協(xié)議的命令:1、 把命令的CRC校驗去掉,并且計算出LRC校驗取代。2、 把生成的命令串的每一個字節(jié)轉(zhuǎn)化成對應(yīng)的兩個字節(jié)的ASCII碼,比如0x03轉(zhuǎn)化成0x30,0x33(0的ASCII碼和3的ASCII碼)。3、 在命令的開頭加上起始標記“:”,它的ASCII碼為0x3A
31、。4、 在命令的尾部加上結(jié)束標記CR,LF(0xD,0xA),此處的CR,LF表示回車和換行的ASCII碼。所以以下我們僅介紹RTU協(xié)議即可,對應(yīng)的ASCII協(xié)議可以使用以上的步驟來生成。下表是Modbus支持的功能碼:功能碼 名稱 作用 01 讀取線圈狀態(tài) 取得一組邏輯線圈的當前狀態(tài)(ON/OFF) 02 讀取輸入狀態(tài) 取得一組開關(guān)輸入的當前狀態(tài)(ON/OFF) 03 讀取保持寄存器 在一個或多個保持寄存器中取得當前的二進制值 04 讀取輸入寄存器 在一個或多個輸入寄存器中取得當前的二進制值 05 強置單線圈 強置一個邏輯線圈的通斷狀態(tài) 06 預(yù)置單寄存器 把具體二進值裝入一個保持寄存器 0
32、7 讀取異常狀態(tài) 取得8個內(nèi)部線圈的通斷狀態(tài),這8個線圈的地址由控制器決定 08 回送診斷校驗 把診斷校驗報文送從機,以對通信處理進行評鑒 09 編程(只用于484) 使主機模擬編程器作用,修改PC從機邏輯 10 控詢(只用于484) 可使主機與一臺正在執(zhí)行長程序任務(wù)從機通信,探詢該從機是否已完成其操作任務(wù),僅在含有功能碼9的報文發(fā)送后,本功能碼才發(fā)送 11 讀取事件計數(shù) 可使主機發(fā)出單詢問,并隨即判定操作是否成功,尤其是該命令或其他應(yīng)答產(chǎn)生通信錯誤時 12 讀取通信事件記錄 可是主機檢索每臺從機的ModBus事務(wù)處理通信事件記錄。如果某項事務(wù)處理完成,記錄會給出有關(guān)錯誤 13 編程(184/
33、384 484 584) 可使主機模擬編程器功能修改PC從機邏輯 14 探詢(184/384 484 584) 可使主機與正在執(zhí)行任務(wù)的從機通信,定期控詢該從機是否已完成其程序操作,僅在含有功能13的報文發(fā)送后,本功能碼才得發(fā)送 15 強置多線圈 強置一串連續(xù)邏輯線圈的通斷 16 預(yù)置多寄存器 把具體的二進制值裝入一串連續(xù)的保持寄存器 17 報告從機標識 可使主機判斷編址從機的類型及該從機運行指示燈的狀態(tài) 18 (884和MICRO 84) 可使主機模擬編程功能,修改PC狀態(tài)邏輯 19 重置通信鏈路 發(fā)生非可修改錯誤后,是從機復(fù)位于已知狀態(tài),可重置順序字節(jié) 20 讀取通用參數(shù)(584L) 顯示
34、擴展存儲器文件中的數(shù)據(jù)信息 21 寫入通用參數(shù)(584L) 把通用參數(shù)寫入擴展存儲文件,或修改之 2264 保留作擴展功能備用 6572 保留以備用戶功能所用 留作用戶功能的擴展編碼 73119 非法功能 120127 保留 留作內(nèi)部作用 128255 保留 用于異常應(yīng)答 在這些功能碼中較長使用的是1、2、3、4、5、6號功能碼,使用它們即可實現(xiàn)對下位機的數(shù)字量和模擬量的讀寫操作。 1、讀可讀寫數(shù)字量寄存器(線圈狀態(tài)):計算機發(fā)送命令:設(shè)備地址 命令號01 起始寄存器地址高8位 低8位 讀取的寄存器數(shù)高8位 低8位 CRC校驗的低8位 CRC校驗的高8位 例:110100130025CRC低C
35、RC高 意義如下:設(shè)備地址:在一個485總線上可以掛接多個設(shè)備,此處的設(shè)備地址表示想和哪一個設(shè)備通訊。例子中為想和17號(十進制的17是十六進制的11)通訊。 命令號01:讀取數(shù)字量的命令號固定為01。起始地址高8位、低8位:表示想讀取的開關(guān)量的起始地址(起始地址為0)。比如例子中的起始地址為19。寄存器數(shù)高8位、低8位:表示從起始地址開始讀多少個開關(guān)量。例子中為37個開關(guān)量。CRC校驗:是從開頭一直校驗到此之前。在此協(xié)議的最后再作介紹。此處需要注意,CRC校驗在命令中的高低字節(jié)的順序和其他的相反。 設(shè)備響應(yīng):設(shè)備地址 命令號01 返回的字節(jié)個數(shù)數(shù)據(jù)1數(shù)據(jù)2.數(shù)據(jù)nCRC校驗的低8位 CRC校驗的高8位 例:110105CD6BB20E1BCRC低CRC高 意義如下:設(shè)備地址和命令號和上面的相同。返回的字節(jié)個數(shù):表示數(shù)據(jù)的字節(jié)個數(shù),也就是數(shù)據(jù)1,2.n中的n的值。數(shù)據(jù)1.n:由于每一個數(shù)據(jù)是一個8位的數(shù),所以每一個數(shù)據(jù)表示8個開關(guān)量的值,每一位為0表示對應(yīng)的開關(guān)斷開,為1表示閉合。比如例子中,表示20號(索引號為19)開關(guān)閉合,21號斷開,22閉合,23閉合,24斷開,25斷開,26閉合,27閉合.如果詢問的開關(guān)量不是8的整倍數(shù),那么最后一個字節(jié)的高位部分無意義,置為0。CRC校驗
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江理工大學(xué)《語文教學(xué)理論與實踐(1)》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州輕工業(yè)大學(xué)《軟件開發(fā)管理程》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)學(xué)校章程
- 浙江電力職業(yè)技術(shù)學(xué)院《電視原理B》2023-2024學(xué)年第一學(xué)期期末試卷
- 漳州職業(yè)技術(shù)學(xué)院《信號與系統(tǒng)》2023-2024學(xué)年第一學(xué)期期末試卷
- 生產(chǎn)調(diào)度與庫存管理協(xié)同效應(yīng)
- 財務(wù)年終總結(jié)報告模板
- 雙十一新媒體營銷報告模板
- 生物醫(yī)療研究總結(jié)模板
- 房地產(chǎn)交易制度政策-《房地產(chǎn)基本制度與政策》模擬試卷2
- 光伏工程各單位歸檔資料
- 《美麗中國是我家》 課件
- 全面依法治國
- GB/T 17215.304-2017交流電測量設(shè)備特殊要求第4部分:經(jīng)電子互感器接入的靜止式電能表
- 2023年最新的鄉(xiāng)鎮(zhèn)街道班子成員民主生活互相批評意見2023
- 商務(wù)溝通第二版第6章管理溝通
- 培訓(xùn)課件-核電質(zhì)保要求
- 過敏原檢測方法分析
- 室外給水排水和燃氣熱力工程抗震設(shè)計規(guī)范
- 【個人獨資】企業(yè)有限公司章程(模板)
- 外觀GRR考核表
評論
0/150
提交評論