400-808-5829
大數(shù)據(jù)分析將與物聯(lián)網(wǎng)技術(shù)結(jié)合,實(shí)現(xiàn)更精確的預(yù)測(cè)和智能化決策
?當(dāng)使用Modbus作為通信協(xié)議時(shí),有許多不同的解釋、術(shù)語(yǔ)和標(biāo)簽來說明如何訪問各種設(shè)備中的不同類型的數(shù)據(jù)。有時(shí),設(shè)備手冊(cè)只會(huì)提到支持的Modbus功能代碼以及這些功能代碼在哪個(gè)范圍內(nèi)可用。愛陸通幫助您了解modbus通訊協(xié)議功能碼。
Modbus的功能代碼(FC)是使用特定代碼的Modbus請(qǐng)求,在告知Modbus從設(shè)備訪問何種類型的內(nèi)存(如保持寄存器、輸入線圈等)以及對(duì)該內(nèi)存執(zhí)行何種操作(如讀取或?qū)懭耄┓矫嫫鹱饔?。下面的表格列出了TOPServerModbusSuite中包含的所有Modbus驅(qū)動(dòng)程序用于通信的特殊Modbus功能代碼:
根據(jù)您在客戶端應(yīng)用程序中讀取或?qū)懭氲牡刂奉愋停ū3旨拇嫫鳌?nèi)部寄存器、輸入線圈或輸出線圈),這將決定TOP服務(wù)器Modbus驅(qū)動(dòng)程序在處理您的實(shí)際協(xié)議請(qǐng)求時(shí)所使用的特定功能代碼設(shè)備。
在TOP服務(wù)器的Modbus驅(qū)動(dòng)程序中,還有一些特別的設(shè)置,可以增加設(shè)備中不同Modbus實(shí)現(xiàn)的靈活性。我們稍后會(huì)介紹這些設(shè)置。
此外,在本文中沒有詳細(xì)介紹,但TOP服務(wù)器的Modbus靈活性進(jìn)一步增強(qiáng),可以支持特定的非標(biāo)準(zhǔn)驅(qū)動(dòng)程序中的Modbus變體,例如EnronModbus、OMNIFlow、LufkinELAM、HoneywellUDC甚至基于YaskawaMemobus的驅(qū)動(dòng)程序。
就像我們之前提到的那樣,當(dāng)我們討論Modbus協(xié)議和訪問特定數(shù)據(jù)位置(或內(nèi)存類型)時(shí),一般有四種不同類型的Modbus地址:
保持寄存器是一個(gè)具有讀寫訪問權(quán)限的16位(模擬)地址,地址范圍在4xxxxx。
內(nèi)部寄存器是一種16位(模擬)地址寄存器,只能進(jìn)行只讀訪問。
輸入線圈是一種具有只讀訪問權(quán)限的地址,該地址為1位(布爾)的1xxxxx。
輸出線圈是一種具有讀/寫訪問權(quán)限的位(布爾)地址,其地址為0xxxxx。
前一次我們?cè)?jīng)討論過,設(shè)備文檔并不總是提供Modbus地址詳細(xì)列表,按照地址類型(例如4xxxx或保持寄存器)進(jìn)行分類。
所以,因?yàn)槲覀冋诟釉敿?xì)地討論Modbus功能碼,我們需要根據(jù)特定地址的內(nèi)存類型以及其讀寫能力來討論Modbus地址范圍。
這兩個(gè)因素決定了在向設(shè)備發(fā)送請(qǐng)求時(shí)所使用的Modbus功能代碼?,F(xiàn)在我們來討論每個(gè)功能代碼以及它們對(duì)應(yīng)的地址和功能的執(zhí)行。
Modbus功能碼1,以十六進(jìn)制表示為0x01。
當(dāng)需要讀取一個(gè)或多個(gè)(最多2000個(gè))輸出線圈或0xxxxx類型的離散/布爾地址時(shí),TOP服務(wù)器將使用該功能代碼。
在此列表下方,您將看到對(duì)功能代碼5和15的支持,即讀取和寫入訪問的線圈。
Modbus功能碼2表示讀取離散輸入,用十六進(jìn)制表示為0x02。
當(dāng)需要讀取多個(gè)(每次最多2000個(gè))輸入線圈或1xxxxx類型的離散/布爾地址中的一個(gè)時(shí),TOP服務(wù)器使用這個(gè)功能代碼。
在Modbus設(shè)備中,輸入線圈是只讀的,這意味著您無法使用功能代碼來寫入1xxxxx類型的地址。
Modbus功能代碼3(十六進(jìn)制0x03)
當(dāng)需要讀取一個(gè)或多個(gè)保持寄存器或4xxxxx類型的模擬地址時(shí),TOP服務(wù)器會(huì)使用該功能代碼。每次最多可以讀取125個(gè)地址。
您可以使用功能代碼3來訪問保持寄存器中的不同位。只需在末尾加上一個(gè).x的語(yǔ)法,其中x表示您想要讀取的寄存器中的位(例如,400001.0表示訪問保持寄存器偏移1的位0)。
由于保持寄存器在大多數(shù)支持Modbus的設(shè)備中是最常見的內(nèi)存類型,因此Modbus功能代碼3可能是最廣泛使用的功能代碼。
同時(shí),寄存器保持了讀/寫訪問的狀態(tài),因此您可以在列表底部找到對(duì)功能代碼6和16的支持。
Modbus的功能代碼4,也表示為十六進(jìn)制的0x04。
當(dāng)需要讀取一個(gè)或多個(gè)(一次最多125個(gè))內(nèi)部寄存器或3xxxxx類型的模擬地址時(shí),TOP服務(wù)器會(huì)使用這個(gè)功能代碼。
除了保持寄存器,我們還可以使用功能碼4訪問內(nèi)部寄存器中的各個(gè)位。例如,我們可以使用4*u,e,300004.2來獲取基于1與0的位尋址的信息寄存器中的內(nèi)容。
在Modbus設(shè)備中,與輸入線圈類似,內(nèi)部寄存器也是只讀的。因此,您不會(huì)找到專門用于寫入3xxxxxx類型地址的功能代碼。
備注:是的,如果您留意到,F(xiàn)C3是用于訪問4xxxxx地址的,而FC4是用于訪問3xxxxx地址的,就好像FC1用于訪問0xxxxx地址,而FC2用于訪問1xxxxx地址一樣——這些并非打印錯(cuò)誤。
Modbus的功能代碼5為十六進(jìn)制0x05。
在寫入單個(gè)輸出線圈(0xxxxx)時(shí),TOP服務(wù)器使用的是此功能代碼,也被稱為“強(qiáng)制”線圈。
Modbus功能碼6(十六進(jìn)制0x06)
當(dāng)TOP服務(wù)器寫入單個(gè)保持寄存器(4xxxxx)時(shí),會(huì)使用此功能代碼,該寄存器也被稱為“預(yù)置”寄存器。
Modbus通信協(xié)議的功能碼是Modbus功能代碼15(十六進(jìn)制0x0F)。
當(dāng)在TOP服務(wù)器寫入多個(gè)輸出線圈(0xxxxx)時(shí),通常會(huì)使用此功能代碼。不過,現(xiàn)在很多設(shè)備僅支持FC15對(duì)輸出線圈進(jìn)行單次和多次寫入的情況,并且這種情況并不少見。
為了應(yīng)對(duì)這種情況,TOP服務(wù)器的Modbus驅(qū)動(dòng)程序增加了一個(gè)特殊設(shè)置項(xiàng),可以禁用"Modbus功能05"。當(dāng)此設(shè)置被禁用時(shí),驅(qū)動(dòng)程序?qū)H使用FC15指令來對(duì)輸出線圈進(jìn)行寫入操作。
十六進(jìn)制代碼為0x10的功能代碼16
此功能代碼用于TOP服務(wù)器在寫入(預(yù)設(shè))多個(gè)保持寄存器(4xxxxx)時(shí)的操作。與FC15相似,設(shè)備制造商通常只支持FC16,可用于單次和多次寫入保持寄存器的情況,這是一種更經(jīng)濟(jì)的實(shí)現(xiàn)方式,只需要添加對(duì)一個(gè)與兩個(gè)功能代碼的支持。
為了解決這個(gè)問題,TOP服務(wù)器Modbus驅(qū)動(dòng)程序還有一個(gè)設(shè)置選項(xiàng),可以讓您禁用“Modbus功能06”。這樣一來,當(dāng)您禁用該選項(xiàng)時(shí),驅(qū)動(dòng)程序?qū)⒅皇褂肍C16來進(jìn)行對(duì)保持寄存器的所有寫入操作。
Modbus功能碼22(十六進(jìn)制0x16)
這個(gè)功能是專為保持寄存器(4xxxxx)中的位寫入而設(shè)計(jì)的,它僅適用于單個(gè)事務(wù)。默認(rèn)情況下,在TOP服務(wù)器的Modbus驅(qū)動(dòng)程序設(shè)備屬性中是禁用的,因?yàn)樵S多Modbus設(shè)備不支持FC22,可以選擇支持其他方法。
另一種方法是默認(rèn)且常用的方式,即對(duì)于保持在寄存器中的位進(jìn)行讀取、修改和寫入操作。
正如您所料,這種常用的方法存在一些風(fēng)險(xiǎn),尤其是當(dāng)您的Modbus設(shè)備中的寄存器值經(jīng)常發(fā)生變化時(shí)。進(jìn)行讀取/修改/寫入操作可能會(huì)導(dǎo)致位被更改為不正確的狀態(tài),因?yàn)橹暗母牟僮骺赡苓€沒有完成所需的時(shí)間。
舉個(gè)例子,假設(shè)我們正在對(duì)400001的第1位進(jìn)行讀取/修改/寫入操作。如果在操作開始時(shí)第2位是“打開”的狀態(tài),但在寫入之前已切換為“關(guān)閉”,那么它將再次錯(cuò)誤地被“打開”。
FC22的設(shè)計(jì)目標(biāo)是通過直接修改保持寄存器中的特定位來規(guī)避潛在風(fēng)險(xiǎn),同時(shí)保持其余位不受影響。然而,使用FC22需要確保實(shí)際的Modbus從設(shè)備支持該功能,而這種情況并非普遍存在。
所以,請(qǐng)確保您的設(shè)備是否真的支持FC22。如果支持,在TOP服務(wù)器的Modbus驅(qū)動(dòng)程序的設(shè)備屬性中,您可以啟用“HoldingRegisterBitWrites”選項(xiàng)。
TOP服務(wù)器將會(huì)執(zhí)行一個(gè)FC3讀取,讀取整個(gè)寄存器。
接著,驅(qū)動(dòng)程序僅修改出問題的位(這將改變保持寄存器16位值的整體值)。
然后根據(jù)設(shè)備的支持以及特殊設(shè)置的描述,將經(jīng)過修改的16位值寫回Modbus從設(shè)備,可以使用FC6或16功能碼。
因此,該函數(shù)的作用是確定正在訪問的內(nèi)存類型以及其讀寫操作。然而,該功能代碼與Modbus請(qǐng)求中的其他信息一起使用,這些信息包括所謂的偏移量。
TOPServerModbusSuite驅(qū)動(dòng)程序可以支持多種不同類型的內(nèi)存地址范圍:
注冊(cè)賬號(hào)為:400001-465536
內(nèi)部存儲(chǔ)器的地址段為300001到365536。
請(qǐng)?zhí)峁┮粋€(gè)從100001到165536的輸入線圈編號(hào)范圍。
輸出線圈的編號(hào)從000001到065536。
我們支持的是1到65,536范圍內(nèi)所有內(nèi)存類型的偏移值。但是,關(guān)于偏移值的定義是什么呢?
通常情況下,解釋偏移量的方法是根據(jù)地址的首位數(shù)字(4、3、1或0)來確定驅(qū)動(dòng)程序訪問的是哪種類型的內(nèi)存。首位數(shù)字后面的所有內(nèi)容構(gòu)成了偏移量,表示你所關(guān)注的特定內(nèi)存地址在該內(nèi)存類型中的位置。
在Modbus文件中記錄了保持寄存器的偏移量。TOP服務(wù)器聲稱它能夠支持以下偏移量:400140000140001400001。
在Modbus請(qǐng)求中,Modbus功能代碼和偏移量一起運(yùn)作,它們用于指示設(shè)備返回或修改特定信息。
尋址Modbus可以采用兩種方式,分別是從零開始和從一開始。
零尋址是指設(shè)備的寄存器地址從0開始遞增,第一個(gè)寄存器的地址為0,第二個(gè)為1,以此類推。
一尋址是指設(shè)備的寄存器地址從1開始編號(hào),第一個(gè)寄存器的地址為1,第二個(gè)為2,依次遞增。
對(duì)于Modbus通信協(xié)議,可以使用兩種不同的尋址方式,具體選擇哪一種方式取決于設(shè)備的要求和用戶的使用習(xí)慣。
當(dāng)討論基于偏移的Modbus尋址時(shí),還有一個(gè)關(guān)鍵的細(xì)節(jié)是設(shè)備是否支持零或一作為起始地址。最初,零作為起始地址是Modbus的預(yù)期實(shí)現(xiàn)方式。然而,隨著時(shí)間的推移和Modbus作為一種廣泛采用的開放協(xié)議,一些設(shè)備制造商引入了一種名為one-based尋址的概念。
從零開始進(jìn)行尋址是指在訪問內(nèi)存類型時(shí),第一個(gè)偏移量為零。例如,如果您想要訪問寄存器400001,那么在Modbus協(xié)議中的請(qǐng)求將是FC3,并且其偏移量為0。類似地,當(dāng)訪問寄存器400002時(shí),請(qǐng)求將是偏移量為1的FC3,以此類推。
因此,一些制造商采用了一種名為基于一的尋址的實(shí)現(xiàn)方式。在這種方式下,從1開始進(jìn)行尋址,偏移量與實(shí)際地址請(qǐng)求保持對(duì)齊。舉個(gè)例子,如果您要求使用寄存器1,那么請(qǐng)求仍然使用FC3,但偏移量為1。同樣地,400002將請(qǐng)求FC3,但偏移量為2,以此類推。這種方法更加“友好”于用戶。
然而,了解這一點(diǎn)非常重要,因?yàn)橛行┰O(shè)備支持從0開始尋址,而其他設(shè)備支持從1開始尋址。TOP服務(wù)器的Modbus驅(qū)動(dòng)程序有一個(gè)可配置的設(shè)置,可以指定您的Modbus從設(shè)備所支持的實(shí)現(xiàn)方式。
Modbus規(guī)范的默認(rèn)設(shè)置是啟用“基于零的尋址”。如果禁用此設(shè)置,驅(qū)動(dòng)程序?qū)⑹褂没?的尋址。請(qǐng)確保始終使用正確的設(shè)置,以免顯示的值為設(shè)備中的錯(cuò)誤地址。
舉一個(gè)例子,假設(shè)您讀取到了值400001,與您預(yù)期的值相比,它被認(rèn)為是一個(gè)“錯(cuò)誤”的值。在這種情況下,請(qǐng)檢查一下與400001相鄰的寄存器的值。如果確實(shí)相鄰,您需要將寄存器的尋址方式從1換為從零開始(反之亦然)。
另外,還有一種基于1或基于0的位尋址方式可供選擇。默認(rèn)情況下,TOPServerModbus驅(qū)動(dòng)程序支持從零開始的位尋址,因?yàn)檫@是Modbus規(guī)范的默認(rèn)設(shè)置。這就意味著位的尋址范圍是從0到15。
使用1位尋址,可以從1到16位進(jìn)行尋址,這對(duì)于處理16位數(shù)據(jù)更加直觀自然。此外,根據(jù)您的設(shè)備支持情況,TOPServerModbus驅(qū)動(dòng)程序具有可配置的設(shè)置。
為了確保準(zhǔn)確訪問位值,您在TOPServer中選擇的位尋址方法必須與設(shè)備支持的尋址方式相一致。如果設(shè)置錯(cuò)誤,可能會(huì)導(dǎo)致訪問到錯(cuò)誤的位值。該設(shè)置允許您啟用0-15位的訪問或禁用1-16位的訪問。
為確認(rèn)制造商所支持的方法,請(qǐng)持續(xù)查閱制造商的文件或與其進(jìn)行交流。若發(fā)現(xiàn)某選項(xiàng)因錯(cuò)誤設(shè)置為“開啟”而實(shí)際所需為“關(guān)閉”,或相反情況,則可能需切換該設(shè)置。
Modbus具有許多獨(dú)特的特點(diǎn),這是由于它是一個(gè)非常成熟和廣泛使用的開放協(xié)議。一個(gè)靈活的Modbus主站,例如TOP服務(wù)器,提供了一系列可配置的選項(xiàng),以與各種制造商的Modbus從站配合使用,以實(shí)現(xiàn)最大的兼容性。