modbusrtu通訊協(xié)議簡(jiǎn)介_(kāi)第1頁(yè)
modbusrtu通訊協(xié)議簡(jiǎn)介_(kāi)第2頁(yè)
modbusrtu通訊協(xié)議簡(jiǎn)介_(kāi)第3頁(yè)
modbusrtu通訊協(xié)議簡(jiǎn)介_(kāi)第4頁(yè)
modbusrtu通訊協(xié)議簡(jiǎn)介_(kāi)第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、MODBUS-RTU通訊協(xié)議簡(jiǎn)介2008-01-15 23:15:09|分類(lèi): 技術(shù)人生 |標(biāo)簽: |字號(hào)大中小訂閱 什么是MODBUS?MODBUS是MODICON公司最先倡導(dǎo)的一種軟的通訊規(guī)約,經(jīng)過(guò)大多數(shù)公司的實(shí)際應(yīng)用,逐漸被認(rèn)可,成為一種標(biāo)準(zhǔn)的通訊規(guī)約,只要按照這種規(guī)約進(jìn)行數(shù)據(jù)通訊或傳輸,不同的系統(tǒng)就可以通訊。目前,在RS232/RS485通訊過(guò)程中,更是廣泛采用這種規(guī)約。 常用的MODBUS通訊規(guī)約有兩種,一種是MODBUSASCII,一種是MODBUSRTU。一般來(lái)說(shuō),通訊數(shù)據(jù)量少而且主要是文本的通訊則采用MODBUSASCII規(guī)約,通訊數(shù)據(jù)數(shù)據(jù)量大而且是二進(jìn)制數(shù)值時(shí),多采用MODB

2、USRTU規(guī)約。在實(shí)際的應(yīng)用過(guò)程中,為了解決某一個(gè)特殊問(wèn)題,人們喜歡自己修改MODBUS規(guī)約來(lái)滿(mǎn)足自己的需要(事實(shí)上,人們經(jīng)常使用自己定義的規(guī)約來(lái)通訊,這樣能解決問(wèn)題,但不太規(guī)范)。更為普通的用法是,少量修改規(guī)約,但將規(guī)約格式附在軟件說(shuō)明書(shū)一起,或直接放在幫助中,這樣就方便了用戶(hù)的通訊。MODBUS-RTU通訊協(xié)議簡(jiǎn)介 在本章主要講述如何利用軟件通過(guò)通訊口來(lái)操控該系列儀表。本章內(nèi)容的掌握需要您具有MODBUS協(xié)議的知識(shí)儲(chǔ)備并且通讀了本冊(cè)其它章節(jié)所有內(nèi)容,對(duì)本產(chǎn)品功能和應(yīng)用概念有較全面了解。本章內(nèi)容包括:MODBUS協(xié)議簡(jiǎn)述,通訊應(yīng)用格式詳解,本機(jī)的應(yīng)用細(xì)節(jié)及參量地址表。1.1 MODBUS協(xié)議

3、簡(jiǎn)述ACRXXXE系列儀表使用的是MODBUS-RTU通訊協(xié)議,MODBUS協(xié)議詳細(xì)定義了校驗(yàn)碼、數(shù)據(jù)序列等,這些都是特定數(shù)據(jù)交換的必要內(nèi)容。MODBUS協(xié)議在一根通訊線(xiàn)上使用主從應(yīng)答式連接(半雙工),這意味著在一根單獨(dú)的通訊線(xiàn)上信號(hào)沿著相反的兩個(gè)方向傳輸。首先,主計(jì)算機(jī)的信號(hào)尋址到一臺(tái)唯一的終端設(shè)備(從機(jī)),然后,終端設(shè)備發(fā)出的應(yīng)答信號(hào)以相反的方向傳輸給主機(jī)。MODBUS協(xié)議只允許在主機(jī)(PC,PLC等)和終端設(shè)備之間通訊,而不允許獨(dú)立的終端設(shè)備之間的數(shù)據(jù)交換,這樣各終端設(shè)備不會(huì)在它們初始化時(shí)占據(jù)通訊線(xiàn)路,而僅限于響應(yīng)到達(dá)本機(jī)的查詢(xún)信號(hào)。1.2 查詢(xún)回應(yīng)周期1.2.1 查詢(xún)查詢(xún)消息中的功能代

4、碼告之被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí)行功能的任何附加信息。例如功能代碼03是要求從設(shè)備讀保持寄存器并返回它們的內(nèi)容。數(shù)據(jù)段必須包含要告之從設(shè)備的信息:從何寄存器開(kāi)始讀及要讀的寄存器數(shù)量。錯(cuò)誤檢測(cè)域?yàn)閺脑O(shè)備提供了一種驗(yàn)證消息內(nèi)容是否正確的方法。1.2.2 回應(yīng)如果從設(shè)備產(chǎn)生一正常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢(xún)消息中的功能代碼的回應(yīng)。數(shù)據(jù)段包括了從設(shè)備收集的數(shù)據(jù):如寄存器值或狀態(tài)。如果有錯(cuò)誤發(fā)生,功能代碼將被修改以用于指出回應(yīng)消息是錯(cuò)誤的,同時(shí)數(shù)據(jù)段包含了描述此錯(cuò)誤信息的代碼。錯(cuò)誤檢測(cè)域允許主設(shè)備確認(rèn)消息內(nèi)容是否可用。1.3 傳輸方式傳輸方式是指一個(gè)數(shù)據(jù)幀內(nèi)一系列獨(dú)立

5、的數(shù)據(jù)結(jié)構(gòu)以及用于傳輸數(shù)據(jù)的有限規(guī)則,下面定義了與MODBUS 協(xié)議 RTU方式相兼容的傳輸方式。每個(gè)字節(jié)的位: 1個(gè)起始位 8個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送 無(wú)奇偶校驗(yàn)位 1個(gè)停止位錯(cuò)誤檢測(cè)(Error checking):CRC(循環(huán)冗余校驗(yàn))1.4 協(xié)議當(dāng)數(shù)據(jù)幀到達(dá)終端設(shè)備時(shí),它通過(guò)一個(gè)簡(jiǎn)單的“端口”進(jìn)入被尋址到的設(shè)備,該設(shè)備去掉數(shù)據(jù)幀的“信封”(數(shù)據(jù)頭),讀取數(shù)據(jù),如果沒(méi)有錯(cuò)誤,就執(zhí)行數(shù)據(jù)所請(qǐng)求的任務(wù),然后,它將自己生成的數(shù)據(jù)加入到取得的“信封”中,把數(shù)據(jù)幀返回給發(fā)送者。返回的響應(yīng)數(shù)據(jù)中包含了以下內(nèi)容:終端從機(jī)地址(Address)、被執(zhí)行了的命令(Function)、執(zhí)行命令生成的被請(qǐng)

6、求數(shù)據(jù)(Data)和一個(gè)校驗(yàn)碼(Check)。發(fā)生任何錯(cuò)誤都不會(huì)有成功的響應(yīng),或者返回一個(gè)錯(cuò)誤指示幀。1.4.1 數(shù)據(jù)幀格式AddressFunctionDataCheck8-Bits8-BitsN x 8-Bits16-Bits1.4.2 地址(Address)域地址域在幀的開(kāi)始部分,由一個(gè)字節(jié)(8位二進(jìn)制碼)組成,十進(jìn)制為0255,在我們的系統(tǒng)中只使用1247,其它地址保留。這些位標(biāo)明了用戶(hù)指定的終端設(shè)備的地址,該設(shè)備將接收來(lái)自與之相連的主機(jī)數(shù)據(jù)。每個(gè)終端設(shè)備的地址必須是唯一的,僅僅被尋址到的終端會(huì)響應(yīng)包含了該地址的查詢(xún)。當(dāng)終端發(fā)送回一個(gè)響應(yīng),響應(yīng)中的從機(jī)地址數(shù)據(jù)便告訴了主機(jī)哪臺(tái)終端正與之

7、進(jìn)行通信。1.4.3 功能(Function)域功能域代碼告訴了被尋址到的終端執(zhí)行何種功能。下表列出了該系列儀表用到的功能碼,以及它們的意義和功能。代碼意義行為03讀數(shù)據(jù)寄存器獲得一個(gè)或多個(gè)寄存器的當(dāng)前二進(jìn)制值16預(yù)置多寄存器設(shè)定二進(jìn)制值到一系列多寄存器中(不對(duì)ACRXXXE開(kāi)放)1.4.4 數(shù)據(jù)(Data)域數(shù)據(jù)域包含了終端執(zhí)行特定功能所需要的數(shù)據(jù)或者終端響應(yīng)查詢(xún)時(shí)采集到的數(shù)據(jù)。這些數(shù)據(jù)的內(nèi)容可能是數(shù)值、參考地址或者設(shè)置值。例如:功能域碼告訴終端讀取一個(gè)寄存器,數(shù)據(jù)域則需要指明從哪個(gè)寄存器開(kāi)始及讀取多少個(gè)數(shù)據(jù),內(nèi)嵌的地址和數(shù)據(jù)依照類(lèi)型和從機(jī)之間的不同內(nèi)容而有所不同。1.4.5 錯(cuò)誤校驗(yàn)(Ch

8、eck)域該域允許主機(jī)和終端檢查傳輸過(guò)程中的錯(cuò)誤。有時(shí),由于電噪聲和其它干擾,一組數(shù)據(jù)在從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)設(shè)備時(shí)在線(xiàn)路上可能會(huì)發(fā)生一些改變,出錯(cuò)校驗(yàn)?zāi)軌虮WC主機(jī)或者終端不去響應(yīng)那些傳輸過(guò)程中發(fā)生了改變的數(shù)據(jù),這就提高了系統(tǒng)的安全性和效率,錯(cuò)誤校驗(yàn)使用了16位循環(huán)冗余的方法(CRC16)。1.5 錯(cuò)誤檢測(cè)的方法錯(cuò)誤校驗(yàn)(CRC)域占用兩個(gè)字節(jié),包含了一個(gè)16位的二進(jìn)制值。CRC值由傳輸設(shè)備計(jì)算出來(lái),然后附加到數(shù)據(jù)幀上,接收設(shè)備在接收數(shù)據(jù)時(shí)重新計(jì)算CRC值,然后與接收到的CRC域中的值進(jìn)行比較,如果這兩個(gè)值不相等,就發(fā)生了錯(cuò)誤。CRC運(yùn)算時(shí),首先將一個(gè)16位的寄存器預(yù)置為全1,然后連續(xù)把數(shù)據(jù)幀

9、中的每個(gè)字節(jié)中的8位與該寄存器的當(dāng)前值進(jìn)行運(yùn)算,僅僅每個(gè)字節(jié)的8個(gè)數(shù)據(jù)位參與生成CRC,起始位和終止位以及可能使用的奇偶位都不影響CRC。在生成CRC時(shí),每個(gè)字節(jié)的8位與寄存器中的內(nèi)容進(jìn)行異或,然后將結(jié)果向低位移位,高位則用“0”補(bǔ)充,最低位(LSB)移出并檢測(cè),如果是1,該寄存器就與一個(gè)預(yù)設(shè)的固定值(0A001H)進(jìn)行一次異或運(yùn)算,如果最低位為0,不作任何處理。上述處理重復(fù)進(jìn)行,直到執(zhí)行完了8次移位操作,當(dāng)最后一位(第8位)移完以后,下一個(gè)8位字節(jié)與寄存器的當(dāng)前值進(jìn)行異或運(yùn)算,同樣進(jìn)行上述的另一個(gè)8次移位異或操作,當(dāng)數(shù)據(jù)幀中的所有字節(jié)都作了處理,生成的最終值就是CRC值。生成一個(gè)CRC的流程

10、為:1 預(yù)置一個(gè)16位寄存器為0FFFFH(全1),稱(chēng)之為CRC寄存器。2 把數(shù)據(jù)幀中的第一個(gè)字節(jié)的8位與CRC寄存器中的低字節(jié)進(jìn)行異或運(yùn)算,結(jié)果存回CRC寄存器。3 將CRC寄存器向右移一位,最高位填以0,最低位移出并檢測(cè)。4 如果最低位為0:重復(fù)第三步(下一次移位);如果最低位為1:將CRC寄存器與一個(gè)預(yù)設(shè)的固定值(0A001H)進(jìn)行異或運(yùn)算。5 重復(fù)第三步和第四步直到8次移位。這樣處理完了一個(gè)完整的八位。6 重復(fù)第2步到第5步來(lái)處理下一個(gè)八位,直到所有的字節(jié)處理結(jié)束。7 最終CRC寄存器的值就是CRC的值。此外還有一種利用預(yù)設(shè)的表格計(jì)算CRC的方法,它的主要特點(diǎn)是計(jì)算速度快,但是表格需要

11、較大的存儲(chǔ)空間,該方法此處不再贅述,請(qǐng)參閱相關(guān)資料。1.6 通訊應(yīng)用格式祥解本節(jié)所舉實(shí)例將盡可能的使用如圖所示的格式,(數(shù)字為16進(jìn)制)。AddrFunData start reg hiData start reg loData #of regs hiData #of regs loCRC16 loCRC16hi01H03H00H00H00H03H05HCBHAddr:從機(jī)地址Fun:功能碼Data start reg hi:數(shù)據(jù)起始地址 寄存器高字節(jié)Data start reg lo:數(shù)據(jù)起始地址 寄存器低字節(jié)Data #of reg hi:數(shù)據(jù)讀取個(gè)數(shù) 寄存器高字節(jié)Data #of reg

12、 lo:數(shù)據(jù)讀取個(gè)數(shù) 寄存器低字節(jié)CRC16 Hi: 循環(huán)冗余校驗(yàn) 高字節(jié)CRC16 Lo: 循環(huán)冗余校驗(yàn) 低字節(jié)1.6.1 讀數(shù)據(jù)(功能碼03)l 查詢(xún)數(shù)據(jù)幀此功能允許用戶(hù)獲得設(shè)備采集與記錄的數(shù)據(jù)及系統(tǒng)參數(shù)。主機(jī)一次請(qǐng)求的數(shù)據(jù)個(gè)數(shù)沒(méi)有限制,但不能超出定義的地址范圍。下面的例子是從01號(hào)從機(jī)讀3個(gè)采集到的基本數(shù)據(jù)(數(shù)據(jù)幀中每個(gè)地址占用2個(gè)字節(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)包含從機(jī)地址、功能碼、數(shù)據(jù)的數(shù)量和CRC錯(cuò)誤校驗(yàn)。下面的例子是讀取UA、UB、UC (UA=082CH,UB=082AH,UC=082CH的響應(yīng)。 AddrFunByte countData1 hiData1 lo Data2 hiData2 loData3 hiData3 loCRC16 loCRC16 hi01H03H06H08H2CH08H2AH08H2CH94H4EHl 錯(cuò)誤指示碼如果主機(jī)請(qǐng)求的地址不存在則返回錯(cuò)誤指示碼:FFH。1.6.2 預(yù)置多寄存器(功能碼16,不對(duì)ACRXXXE開(kāi)放)l 查詢(xún)數(shù)據(jù)

14、幀 功能碼16允許用戶(hù)改變多個(gè)寄存器的內(nèi)容,該儀表中系統(tǒng)參數(shù)、開(kāi)關(guān)量輸出狀態(tài)等可用此功能號(hào)寫(xiě)入。主機(jī)一次最多可以寫(xiě)入16個(gè)(32字節(jié))數(shù)據(jù)。下面的例子是預(yù)置ACR220EK、ACR320EFK及ACR420EK地址都為1時(shí)同時(shí)輸出開(kāi)關(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ù)幀對(duì)于預(yù)置單寄存器請(qǐng)求的正常響應(yīng)是在寄存器

16、值改變以后回應(yīng)機(jī)器地址、功能號(hào)、數(shù)據(jù)起始地址、數(shù)據(jù)個(gè)數(shù)(ACR320EFK為數(shù)據(jù)字節(jié)數(shù))、CRC校驗(yàn)碼。如圖。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 錯(cuò)誤指示碼如果主機(jī)請(qǐng)求的地址不

17、存在或數(shù)據(jù)個(gè)數(shù)不正確則返回錯(cuò)誤指示碼:FFH。1.7 ACRXXXE的應(yīng)用細(xì)節(jié)及參量地址表該系列測(cè)量值用Modbus-RTU 通訊規(guī)約的03號(hào)命令讀出。通訊值與實(shí)際值之間的對(duì)應(yīng)關(guān)系如下表:(約定Val_t為通訊讀出值,Val_s為實(shí)際值)適用參量對(duì)應(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瓦時(shí)(wh)乏時(shí)(varh)功率因數(shù)值PFA、PFB、PFC、PFSVal_sVal_t / 1000無(wú)單位頻率FRVal_sVal_t / 100赫茲(Hz)范例:UA的通訊讀出值為08C6H(2246),DPT為5,則UA的實(shí)際值Va =(2246/10000)*(105) = 22.46KV。 IA的通訊讀出值為0FA0H(4000),DCT為3,則IA的實(shí)際值Ia =(4000/10000)*(103) = 400.0A。幾點(diǎn)說(shuō)明:1 數(shù)據(jù)類(lèi)型:“BYTE”指1個(gè)字節(jié);“word” 指16位無(wú)符號(hào)整數(shù);“Integer”指16位有

19、符號(hào)整數(shù);“Dword” 指32位無(wú)符號(hào)整數(shù),“Fword”指32位浮點(diǎn)數(shù)。2 讀寫(xiě)屬性:“R”只讀,讀參量用03H號(hào)命令;“R/W”可讀可寫(xiě),寫(xiě)系統(tǒng)參量用10H號(hào)命令。禁止向未列出的或不具可寫(xiě)屬性的地址寫(xiě)入。3 波特率的設(shè)定范圍4800 bps,9600 bps,19200 bps,38400 bps.在此范圍外的設(shè)定是不允許的。如果寫(xiě)入超范圍的設(shè)定值,儀表會(huì)啟用默認(rèn)波特率:38400 bps。4 ACR320EFK所測(cè)電能值均為二次側(cè)電能。高字節(jié)在前,低字節(jié)在后,單位WH 或VARH, 統(tǒng)計(jì)一次側(cè)電能數(shù)據(jù)的時(shí)候,請(qǐng)乘以相應(yīng)的變比。例如10KV/100V,75A/5A 的儀表,請(qǐng)?jiān)谟?jì)量抄表的

20、數(shù)據(jù)乘以PT=100和CT=15 的乘積1500。5 ACR320EFK提供4 路開(kāi)關(guān)量輸入功能和2路繼電器開(kāi)關(guān)量輸出功能。4 路開(kāi)關(guān)輸入是采用濕接點(diǎn)電阻開(kāi)關(guān)信號(hào)輸入方式,儀表內(nèi)部配備+5V 的工作電源,無(wú)須外部供電。當(dāng)外部接通的時(shí)候,經(jīng)過(guò)儀表開(kāi)關(guān)輸入模塊DI 采集其為接通信息、顯示為1;當(dāng)外部斷開(kāi)的時(shí)候,經(jīng)過(guò)儀表開(kāi)關(guān)輸入模塊DI 采集其為斷開(kāi)信息、顯示為0。開(kāi)關(guān)量輸入模塊不僅能夠采集和顯示本地的開(kāi)關(guān)信息,同時(shí)可以通過(guò)儀表的數(shù)字接口RS485 實(shí)現(xiàn)遠(yuǎn)程傳輸功能,即“遙信”功能;2路繼電器輸出功能可用于各種場(chǎng)所下的報(bào)警指示、保護(hù)控制等輸出功能。在開(kāi)關(guān)輸出有效的時(shí)候,繼電器輸出導(dǎo)通,顯示為1;開(kāi)關(guān)

21、輸出關(guān)閉的時(shí)候,顯示為0,繼電器輸出關(guān)斷。6 ACRXXXE(K)電度一次側(cè)時(shí)的值采用浮點(diǎn)變量數(shù)據(jù)類(lèi)型。它用符號(hào)位表示數(shù)的符號(hào),用階碼和尾數(shù)表示數(shù)的大小。儀表采用的數(shù)據(jù)格式為IEEE754數(shù)據(jù)格式具有24位精度,尾數(shù)的高位始終為“1”,因而不保存,位的分布如下 1位符號(hào)位; 8位指數(shù)位; 23位尾數(shù)。符號(hào)位是最高位,尾數(shù)為最低的23位,按字節(jié)描述如下:地址+0+1+2+3內(nèi)容SEEE EEEEEMMM MMMMMMMM MMMMMMMM MMMM其中, S:符號(hào)位,1表示負(fù),0表示正;E:階碼(在兩個(gè)字節(jié)中)偏移為127;M:23位尾數(shù),最高位為“1”。具體舉例如下:讀出01000111010

22、0 1011 1010 1100 0000 0000B0 代表符號(hào)位,“1”為負(fù),“0”為正;10001110為計(jì)算指數(shù),設(shè)為a, a為10進(jìn)制,a為142;100 1011 1010 1100 0000 0000為計(jì)算尾數(shù),設(shè)為b,b為10進(jìn)制,b為4959232。計(jì)算公式: 一次側(cè)電量=上例計(jì)算結(jié)果為:=52140Modbus通訊協(xié)議Modbus協(xié)議 Modbus協(xié)議最初由Modicon公司開(kāi)發(fā)出來(lái),在1979年末該公司成為施耐德自動(dòng)化(Schneider Automation)部門(mén)的一部分,現(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é)議作為他們之間的通訊標(biāo)準(zhǔn)。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。 當(dāng)在網(wǎng)絡(luò)上通信時(shí),Modbus協(xié)議決定了每個(gè)控制器須要知道它們的設(shè)備地址,識(shí)別按地址發(fā)來(lái)的消息,決定要產(chǎn)生何種行動(dòng)。如果需要回應(yīng),控制器將生成應(yīng)答并使用Modbus協(xié)議發(fā)送給詢(xún)問(wèn)方。 Modbus協(xié)議包括ASCII、RTU、TCP等,并沒(méi)有規(guī)定物理層。此協(xié)議定義了控制器能夠認(rèn)識(shí)和使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。標(biāo)準(zhǔn)的Modicon控制器使用RS232C實(shí)現(xiàn)串行的Modbus。Modbus的ASCII、

24、RTU協(xié)議規(guī)定了消息、數(shù)據(jù)的結(jié)構(gòu)、命令和就答的方式,數(shù)據(jù)通訊采用Maser/Slave方式,Master端發(fā)出數(shù)據(jù)請(qǐng)求消息,Slave端接收到正確消息后就可以發(fā)送數(shù)據(jù)到Master端以響應(yīng)請(qǐng)求;Master端也可以直接發(fā)消息修改Slave端的數(shù)據(jù),實(shí)現(xiàn)雙向讀寫(xiě)。 Modbus協(xié)議需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),串行協(xié)議中除有奇偶校驗(yàn)外,ASCII模式采用LRC校驗(yàn),RTU模式采用16位CRC校驗(yàn),但TCP模式?jīng)]有額外規(guī)定校驗(yàn),因?yàn)門(mén)CP協(xié)議是一個(gè)面向連接的可靠協(xié)議。另外,Modbus采用主從方式定時(shí)收發(fā)數(shù)據(jù),在實(shí)際使用中如果某Slave站點(diǎn)斷開(kāi)后(如故障或關(guān)機(jī)),Master端可以診斷出來(lái),而當(dāng)故障修復(fù)后

25、,網(wǎng)絡(luò)又可自動(dòng)接通。因此,Modbus協(xié)議的可靠性較好。 下面我來(lái)簡(jiǎn)單的給大家介紹一下,對(duì)于Modbus的ASCII、RTU和TCP協(xié)議來(lái)說(shuō),其中TCP和RTU協(xié)議非常類(lèi)似,我們只要把RTU協(xié)議的兩個(gè)字節(jié)的校驗(yàn)碼去掉,然后在RTU協(xié)議的開(kāi)始加上5個(gè)0和一個(gè)6并通過(guò)TCP/IP網(wǎng)絡(luò)協(xié)議發(fā)送出去即可。所以在這里我僅介紹一下Modbus的ASCII和RTU協(xié)議。 下表是ASCII協(xié)議和RTU協(xié)議進(jìn)行的比較: 協(xié)議開(kāi)始標(biāo)記結(jié)束標(biāo)記校驗(yàn)傳輸效率程序處理ASCII:(冒號(hào))CR,LFLRC低直觀,簡(jiǎn)單,易調(diào)試RTU無(wú)無(wú)CRC高不直觀,稍復(fù)雜通過(guò)比較可以看到,ASCII協(xié)議和RTU協(xié)議相比擁有開(kāi)始和結(jié)束標(biāo)記

26、,因此在進(jìn)行程序處理時(shí)能更加方便,而且由于傳輸?shù)亩际强梢?jiàn)的ASCII字符,所以進(jìn)行調(diào)試時(shí)就更加的直觀,另外它的LRC校驗(yàn)也比較容易。但是因?yàn)樗鼈鬏數(shù)亩际强梢?jiàn)的ASCII字符,RTU傳輸?shù)臄?shù)據(jù)每一個(gè)字節(jié)ASCII都要用兩個(gè)字節(jié)來(lái)傳輸,比如RTU傳輸一個(gè)十六進(jìn)制數(shù)0xF9,ASCII就需要傳輸F9的ASCII碼0x39和0x46兩個(gè)字節(jié),這樣它的傳輸?shù)男示捅容^低。所以一般來(lái)說(shuō),如果所需要傳輸?shù)臄?shù)據(jù)量較小可以考慮使用ASCII協(xié)議,如果所需傳輸?shù)臄?shù)據(jù)量比較大,最好能使用RTU協(xié)議。下面對(duì)兩種協(xié)議的校驗(yàn)進(jìn)行一下介紹。1、LRC校驗(yàn)LRC域是一個(gè)包含一個(gè)8位二進(jìn)制值的字節(jié)。LRC值由傳輸設(shè)備來(lái)計(jì)算并放

27、到消息幀中,接收設(shè)備在接收消息的過(guò)程中計(jì)算LRC,并將它和接收到消息中LRC域中的值比較,如果兩值不等,說(shuō)明有錯(cuò)誤。LRC校驗(yàn)比較簡(jiǎn)單,它在ASCII協(xié)議中使用,檢測(cè)了消息域中除開(kāi)始的冒號(hào)及結(jié)束的回車(chē)換行號(hào)外的內(nèi)容。它僅僅是把每一個(gè)需要傳輸?shù)臄?shù)據(jù)按字節(jié)疊加后取反加1即可。下面是它的VC代碼: BYTE GetCheckCode(const char * pSendBuf, int nEnd)/獲得校驗(yàn)碼 BYTE byLrc = 0; char pBuf4; int nData = 0; for(i=1; iend; i+=2)/i初始為1,避開(kāi)“開(kāi)始標(biāo)記”冒號(hào) /每?jī)蓚€(gè)需要發(fā)送的ASCII碼

28、轉(zhuǎn)化為一個(gè)十六進(jì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校驗(yàn) CRC域是兩個(gè)字節(jié),包含一16位的二進(jìn)制值。它由傳輸設(shè)備計(jì)算后加入到消息中。接收設(shè)備重新計(jì)算收到消息的CRC,并與接收到的CRC域中的值比較,如果兩值不同,則有誤。CRC是先調(diào)入一值是全“1”的16位寄存器,然后調(diào)用一過(guò)程將消息中連續(xù)的8位字節(jié)各當(dāng)前寄存器中的值進(jìn)行處理。僅每個(gè)字符中的8Bi

29、t數(shù)據(jù)對(duì)CRC有效,起始位和停止位以及奇偶校驗(yàn)位均無(wú)效。CRC產(chǎn)生過(guò)程中,每個(gè)8位字符都單獨(dú)和寄存器內(nèi)容相或(OR),結(jié)果向最低有效位方向移動(dòng),最高有效位以0填充。LSB被提取出來(lái)檢測(cè),如果LSB為1,寄存器單獨(dú)和預(yù)置的值或一下,如果LSB為0,則不進(jìn)行。整個(gè)過(guò)程要重復(fù)8次。在最后一位(第8位)完成后,下一個(gè)8位字節(jié)又單獨(dú)和寄存器的當(dāng)前值相或。最終寄存器中的值,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。CRC添加到消息中時(shí),低字節(jié)先加入,然后高字節(jié)。下面是它的VC代碼: WORD GetCheckCode(const char * pSendBuf, int nEnd)/獲得校驗(yàn)碼 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;對(duì)于一條RTU協(xié)議的命令可以簡(jiǎn)單的通過(guò)以下的步驟轉(zhuǎn)化為ASCII協(xié)議的命令:1、 把命令的CRC校驗(yàn)去掉,并且計(jì)算出LRC校驗(yàn)取代。2、 把生成的命令串的每一個(gè)字節(jié)轉(zhuǎn)化成對(duì)應(yīng)的兩個(gè)字節(jié)的ASCII碼,比如0x03轉(zhuǎn)化成0x30,0x33(0的ASCII碼和3的ASCII碼)。3、 在命令的開(kāi)頭加上起始標(biāo)記“:”,它的ASCII碼為0x3A

31、。4、 在命令的尾部加上結(jié)束標(biāo)記CR,LF(0xD,0xA),此處的CR,LF表示回車(chē)和換行的ASCII碼。所以以下我們僅介紹RTU協(xié)議即可,對(duì)應(yīng)的ASCII協(xié)議可以使用以上的步驟來(lái)生成。下表是Modbus支持的功能碼:功能碼 名稱(chēng) 作用 01 讀取線(xiàn)圈狀態(tài) 取得一組邏輯線(xiàn)圈的當(dāng)前狀態(tài)(ON/OFF) 02 讀取輸入狀態(tài) 取得一組開(kāi)關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF) 03 讀取保持寄存器 在一個(gè)或多個(gè)保持寄存器中取得當(dāng)前的二進(jìn)制值 04 讀取輸入寄存器 在一個(gè)或多個(gè)輸入寄存器中取得當(dāng)前的二進(jìn)制值 05 強(qiáng)置單線(xiàn)圈 強(qiáng)置一個(gè)邏輯線(xiàn)圈的通斷狀態(tài) 06 預(yù)置單寄存器 把具體二進(jìn)值裝入一個(gè)保持寄存器 0

32、7 讀取異常狀態(tài) 取得8個(gè)內(nèi)部線(xiàn)圈的通斷狀態(tài),這8個(gè)線(xiàn)圈的地址由控制器決定 08 回送診斷校驗(yàn) 把診斷校驗(yàn)報(bào)文送從機(jī),以對(duì)通信處理進(jìn)行評(píng)鑒 09 編程(只用于484) 使主機(jī)模擬編程器作用,修改PC從機(jī)邏輯 10 控詢(xún)(只用于484) 可使主機(jī)與一臺(tái)正在執(zhí)行長(zhǎng)程序任務(wù)從機(jī)通信,探詢(xún)?cè)搹臋C(jī)是否已完成其操作任務(wù),僅在含有功能碼9的報(bào)文發(fā)送后,本功能碼才發(fā)送 11 讀取事件計(jì)數(shù) 可使主機(jī)發(fā)出單詢(xún)問(wèn),并隨即判定操作是否成功,尤其是該命令或其他應(yīng)答產(chǎn)生通信錯(cuò)誤時(shí) 12 讀取通信事件記錄 可是主機(jī)檢索每臺(tái)從機(jī)的ModBus事務(wù)處理通信事件記錄。如果某項(xiàng)事務(wù)處理完成,記錄會(huì)給出有關(guān)錯(cuò)誤 13 編程(184/

33、384 484 584) 可使主機(jī)模擬編程器功能修改PC從機(jī)邏輯 14 探詢(xún)(184/384 484 584) 可使主機(jī)與正在執(zhí)行任務(wù)的從機(jī)通信,定期控詢(xún)?cè)搹臋C(jī)是否已完成其程序操作,僅在含有功能13的報(bào)文發(fā)送后,本功能碼才得發(fā)送 15 強(qiáng)置多線(xiàn)圈 強(qiáng)置一串連續(xù)邏輯線(xiàn)圈的通斷 16 預(yù)置多寄存器 把具體的二進(jìn)制值裝入一串連續(xù)的保持寄存器 17 報(bào)告從機(jī)標(biāo)識(shí) 可使主機(jī)判斷編址從機(jī)的類(lèi)型及該從機(jī)運(yùn)行指示燈的狀態(tài) 18 (884和MICRO 84) 可使主機(jī)模擬編程功能,修改PC狀態(tài)邏輯 19 重置通信鏈路 發(fā)生非可修改錯(cuò)誤后,是從機(jī)復(fù)位于已知狀態(tài),可重置順序字節(jié) 20 讀取通用參數(shù)(584L) 顯示

34、擴(kuò)展存儲(chǔ)器文件中的數(shù)據(jù)信息 21 寫(xiě)入通用參數(shù)(584L) 把通用參數(shù)寫(xiě)入擴(kuò)展存儲(chǔ)文件,或修改之 2264 保留作擴(kuò)展功能備用 6572 保留以備用戶(hù)功能所用 留作用戶(hù)功能的擴(kuò)展編碼 73119 非法功能 120127 保留 留作內(nèi)部作用 128255 保留 用于異常應(yīng)答 在這些功能碼中較長(zhǎng)使用的是1、2、3、4、5、6號(hào)功能碼,使用它們即可實(shí)現(xiàn)對(duì)下位機(jī)的數(shù)字量和模擬量的讀寫(xiě)操作。 1、讀可讀寫(xiě)數(shù)字量寄存器(線(xiàn)圈狀態(tài)):計(jì)算機(jī)發(fā)送命令:設(shè)備地址 命令號(hào)01 起始寄存器地址高8位 低8位 讀取的寄存器數(shù)高8位 低8位 CRC校驗(yàn)的低8位 CRC校驗(yàn)的高8位 例:110100130025CRC低C

35、RC高 意義如下:設(shè)備地址:在一個(gè)485總線(xiàn)上可以?huà)旖佣鄠€(gè)設(shè)備,此處的設(shè)備地址表示想和哪一個(gè)設(shè)備通訊。例子中為想和17號(hào)(十進(jìn)制的17是十六進(jìn)制的11)通訊。 命令號(hào)01:讀取數(shù)字量的命令號(hào)固定為01。起始地址高8位、低8位:表示想讀取的開(kāi)關(guān)量的起始地址(起始地址為0)。比如例子中的起始地址為19。寄存器數(shù)高8位、低8位:表示從起始地址開(kāi)始讀多少個(gè)開(kāi)關(guān)量。例子中為37個(gè)開(kāi)關(guān)量。CRC校驗(yàn):是從開(kāi)頭一直校驗(yàn)到此之前。在此協(xié)議的最后再作介紹。此處需要注意,CRC校驗(yàn)在命令中的高低字節(jié)的順序和其他的相反。 設(shè)備響應(yīng):設(shè)備地址 命令號(hào)01 返回的字節(jié)個(gè)數(shù)數(shù)據(jù)1數(shù)據(jù)2.數(shù)據(jù)nCRC校驗(yàn)的低8位 CRC校驗(yàn)的高8位 例:110105CD6BB20E1BCRC低CRC高 意義如下:設(shè)備地址和命令號(hào)和上面的相同。返回的字節(jié)個(gè)數(shù):表示數(shù)據(jù)的字節(jié)個(gè)數(shù),也就是數(shù)據(jù)1,2.n中的n的值。數(shù)據(jù)1.n:由于每一個(gè)數(shù)據(jù)是一個(gè)8位的數(shù),所以每一個(gè)數(shù)據(jù)表示8個(gè)開(kāi)關(guān)量的值,每一位為0表示對(duì)應(yīng)的開(kāi)關(guān)斷開(kāi),為1表示閉合。比如例子中,表示20號(hào)(索引號(hào)為19)開(kāi)關(guān)閉合,21號(hào)斷開(kāi),22閉合,23閉合,24斷開(kāi),25斷開(kāi),26閉合,27閉合.如果詢(xún)問(wèn)的開(kāi)關(guān)量不是8的整倍數(shù),那么最后一個(gè)字節(jié)的高位部分無(wú)意義,置為0。CRC校驗(yàn)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論