對(duì)于使用 Modbus 作為其通信協(xié)議的各種設(shè)備,您會(huì)發(fā)現(xiàn)關(guān)于如何訪(fǎng)問(wèn)這些設(shè)備中不同類(lèi)型的數(shù)據(jù)的許多不同的解釋、術(shù)語(yǔ)和標(biāo)簽。有時(shí),設(shè)備手冊(cè)可能僅提及支持的 Modbus 功能代碼以及這些功能代碼可用的偏移范圍。聚英電子逐步介紹 Modbus 功能代碼的細(xì)節(jié)以及它們與尋址的關(guān)系,以及它們?nèi)绾斡绊懺?Wonderware 應(yīng)用程序的 TOP Server 中使用的地址。
TOP 服務(wù)器支持的 Modbus 功能碼
Modbus 中的功能代碼 (FC) 是 Modbus 請(qǐng)求中使用的特定代碼,用于告訴 Modbus 從設(shè)備訪(fǎng)問(wèn)哪種類(lèi)型的內(nèi)存(即保持寄存器、輸入線(xiàn)圈等)以及對(duì)該內(nèi)存執(zhí)行什么操作(即讀取或?qū)懽?。下表列出了TOP Server Modbus Suite中包含的所有 Modbus 驅(qū)動(dòng)程序用于通信的特定 Modbus 功能代碼:
根據(jù)您從客戶(hù)端應(yīng)用程序讀取或?qū)懭氲牡刂奉?lèi)型(保持寄存器、內(nèi)部寄存器、輸入線(xiàn)圈或輸出線(xiàn)圈),這將決定 TOP 服務(wù)器 Modbus 驅(qū)動(dòng)程序?qū)⒃趯?duì)您的實(shí)際協(xié)議請(qǐng)求中使用哪些特定功能代碼設(shè)備。
TOP 服務(wù)器 Modbus 驅(qū)動(dòng)程序中還有一些特殊設(shè)置,可以為設(shè)備中的不同 Modbus 實(shí)現(xiàn)提供更大的靈活性,我們將在稍后介紹。
而且,雖然我們不會(huì)在這篇文章中詳細(xì)介紹,但 TOP 服務(wù)器中的 Modbus 靈活性更進(jìn)一步,它支持特定非標(biāo)準(zhǔn)驅(qū)動(dòng)程序中的 Modbus 變體,例如Enron Modbus、OMNI Flow、Lufkin ELAM、Honeywell UDC和甚至是基于 Yaskawa Memobus 的驅(qū)動(dòng)程序。
Modbus 功能代碼如何對(duì)應(yīng)尋址
正如我們上次提到的,當(dāng)我們談?wù)?Modbus 協(xié)議和尋址特定數(shù)據(jù)位置(或內(nèi)存類(lèi)型)時(shí),通常有四種不同類(lèi)型的 Modbus 地址:
保持寄存器——具有讀/寫(xiě)訪(fǎng)問(wèn)權(quán)限的 16 位(模擬)地址 (4xxxxx)
內(nèi)部寄存器——具有只讀訪(fǎng)問(wèn)權(quán)限的 16 位(模擬)地址 (3xxxxx)
輸入線(xiàn)圈——具有只讀訪(fǎng)問(wèn)權(quán)限的 1 位(布爾)地址 (1xxxxx)
輸出線(xiàn)圈——具有讀/寫(xiě)訪(fǎng)問(wèn)權(quán)限的 1 位(布爾)地址 (0xxxxx)上次我們還討論了很多設(shè)備文檔并不總是根據(jù)地址類(lèi)型(例如 4xxxx 或保持寄存器)提供 Modbus 地址的詳細(xì)列表。
因此,由于我們正在更深入地討論 Modbus 功能代碼,因此我們必須根據(jù)特定地址的內(nèi)存類(lèi)型以及它是否可以讀取和寫(xiě)入或只能讀取來(lái)討論 Modbus 地址從。
這兩個(gè)因素決定了向設(shè)備發(fā)送請(qǐng)求時(shí)將使用哪個(gè) Modbus 功能代碼。 讓我們討論每個(gè)功能代碼及其執(zhí)行的相應(yīng)地址和功能:
Modbus 功能代碼 1 (Hex 0x01)
當(dāng)請(qǐng)求讀取一個(gè)或多個(gè)(一次最多 2000 個(gè))輸出線(xiàn)圈或 0xxxxx 類(lèi)型的離散/布爾地址時(shí),TOP 服務(wù)器使用此功能代碼。
輸出線(xiàn)圈是讀/寫(xiě)訪(fǎng)問(wèn) - 您將在列表的下方看到對(duì)功能代碼 5 和 15 的支持。
Modbus 功能代碼 2 (Hex 0x02)
當(dāng)請(qǐng)求讀取多個(gè)(一次最多 2000 個(gè))輸入線(xiàn)圈或 1xxxxx 類(lèi)型離散/布爾地址中的一個(gè)時(shí),TOP 服務(wù)器使用此功能代碼。
輸入線(xiàn)圈在 Modbus 設(shè)備中是只讀的,因此您會(huì)注意到?jīng)]有指定用于寫(xiě)入 1xxxxx 類(lèi)型地址的功能代碼。
Modbus 功能代碼 3 (Hex 0x03)
當(dāng)請(qǐng)求讀取一個(gè)或多個(gè)(一次最多 125 個(gè))保持寄存器或 4xxxxx 類(lèi)型的模擬地址時(shí),TOP 服務(wù)器使用此功能代碼。
也可以使用功能代碼 3 訪(fǎng)問(wèn)保持寄存器中的各個(gè)位,只需在末尾附加一個(gè) .x 語(yǔ)法,其中 x 表示您希望讀取的寄存器中的位(即 400001.0 將訪(fǎng)問(wèn)保持寄存器偏移 1 中的位 0) .
因?yàn)楸3旨拇嫫魇谴蠖鄶?shù)支持 Modbus 的設(shè)備中最常支持的內(nèi)存類(lèi)型,所以 Modbus 功能代碼 3 可能是使用最廣泛的功能代碼。
并且保持寄存器是讀/寫(xiě)訪(fǎng)問(wèn) - 因此您將在列表的下方看到對(duì)功能代碼 6 和 16 的支持。
Modbus 功能代碼 4 (Hex 0x04)
當(dāng)請(qǐng)求讀取一個(gè)或多個(gè)(一次最多 125 個(gè))內(nèi)部寄存器或 3xxxxx 類(lèi)型的模擬地址時(shí),TOP 服務(wù)器使用此功能代碼。
與保持寄存器一樣,也可以使用功能代碼 4 *u,e, 300004.2 訪(fǎng)問(wèn)內(nèi)部寄存器中的各個(gè)位 1) - 稍后繼續(xù)閱讀以獲取基于 1 與 0 的位尋址的信息寄存器內(nèi)。
與輸入線(xiàn)圈一樣,內(nèi)部寄存器在 Modbus 設(shè)備中是只讀的,因此您不會(huì)看到指定用于寫(xiě)入 3xxxxxx 類(lèi)型地址的功能代碼。
筆記: 是的,如果您注意到,F(xiàn)C 3 用于訪(fǎng)問(wèn) 4xxxxx 地址,F(xiàn)C 4 用于訪(fǎng)問(wèn) 3xxxxx 地址,就像 FC 1 訪(fǎng)問(wèn) 0xxxxx 和 FC 2 訪(fǎng)問(wèn) 1xxxxx 地址一樣——這些不是印刷錯(cuò)誤。
Modbus 功能代碼 5 (Hex 0x05)
此功能代碼由 TOP 服務(wù)器在寫(xiě)入單個(gè)輸出線(xiàn)圈 (0xxxxx) 時(shí)使用 - 也稱(chēng)為“強(qiáng)制”線(xiàn)圈。
Modbus 功能代碼 6 (Hex 0x06)
此功能代碼由 TOP 服務(wù)器在寫(xiě)入單個(gè)保持寄存器 (4xxxxx) 時(shí)使用 - 也稱(chēng)為“預(yù)置”寄存器。
Modbus 功能代碼 15 (Hex 0x0F)
此功能代碼由 TOP 服務(wù)器在寫(xiě)入(強(qiáng)制)多個(gè)輸出線(xiàn)圈 (0xxxxx) 時(shí)使用?,F(xiàn)在,某些設(shè)備僅支持 FC 15 對(duì)輸出線(xiàn)圈進(jìn)行單次和多次寫(xiě)入的情況并不少見(jiàn)。
為了解決這種情況,TOP 服務(wù)器 Modbus 驅(qū)動(dòng)程序在設(shè)備設(shè)置中有一個(gè)特殊設(shè)置,用于禁用“Modbus 功能 05” - 當(dāng)禁用時(shí),驅(qū)動(dòng)程序?qū)H使用 FC 15 對(duì)輸出線(xiàn)圈的所有寫(xiě)入。
Modbus 功能代碼 16 (Hex 0x10)
此功能代碼由 TOP 服務(wù)器在寫(xiě)入(預(yù)設(shè))多個(gè)保持寄存器 (4xxxxx) 時(shí)使用。與 FC 15 一樣,設(shè)備制造商僅支持 FC 16 以對(duì)保持寄存器進(jìn)行單次和多次寫(xiě)入的情況并不少見(jiàn) - 這是一種更便宜的實(shí)施方式,只需添加對(duì)一個(gè)與兩個(gè)功能代碼的支持。
針對(duì)這種情況,TOP 服務(wù)器 Modbus 驅(qū)動(dòng)程序中還有一個(gè)設(shè)置,允許您禁用“Modbus 功能 06”,這樣,當(dāng)禁用時(shí),驅(qū)動(dòng)程序?qū)H使用 FC 16 對(duì)保持寄存器的所有寫(xiě)入。
Modbus 功能代碼 22 (Hex 0x16)
此功能專(zhuān)門(mén)用于單個(gè)事務(wù)中保持寄存器 (4xxxxx) 中的位寫(xiě)入 - 默認(rèn)情況下,在 TOP 服務(wù)器的 Modbus 驅(qū)動(dòng)程序設(shè)備屬性中禁用它,因?yàn)樵S多 Modbus 設(shè)備不支持 FC 22、選擇代替支持另一種方法。
另一種方法是默認(rèn)和最常用的方法,即對(duì)保持寄存器中的位執(zhí)行讀/修改/寫(xiě)操作。
在此方法中,當(dāng)客戶(hù)端應(yīng)用程序請(qǐng)求寫(xiě)入保持寄存器位時(shí),會(huì)發(fā)生以下情況:
正如您可能已經(jīng)猜到的那樣,這種常用方法存在一些風(fēng)險(xiǎn),特別是如果您的 Modbus 設(shè)備中的寄存器值經(jīng)常更改 - 執(zhí)行讀取/修改/寫(xiě)入操作可能會(huì)將位更改為不正確的狀態(tài),如果它們之前已更改操作完成所需的時(shí)間。
例如,假設(shè)我們正在對(duì) 400001 的第 1 位執(zhí)行讀取/修改/寫(xiě)入操作。如果第 2 位在操作開(kāi)始時(shí)為“on”,但在寫(xiě)入之前已切換為“off”,則它將是再次錯(cuò)誤地“打開(kāi)”。
FC 22 旨在通過(guò)直接修改保持寄存器中的各個(gè)位來(lái)避免這種風(fēng)險(xiǎn),而周?chē)奈槐3植蛔儭?wèn)題是 FC 22 只有在實(shí)際的 Modbus 從設(shè)備實(shí)現(xiàn)了對(duì) FC 22 的支持時(shí)才能使用,而這種情況通常并非如此。
因此,請(qǐng)務(wù)必確認(rèn)您的設(shè)備是否真的支持 FC 22 - 如果支持,您可以在 TOP 服務(wù)器的 Modbus 驅(qū)動(dòng)程序的設(shè)備屬性中啟用“Holding Register Bit Writes”。
TOP 服務(wù)器將對(duì)整個(gè)寄存器執(zhí)行 FC 3 讀取
然后驅(qū)動(dòng)程序只修改有問(wèn)題的位(這會(huì)改變?cè)摫3旨拇嫫鞯?16 位值的整體值)
然后使用 FC 6 或 16 將修改后的 16 位值寫(xiě)回 Modbus 從設(shè)備(取決于您的設(shè)備支持什么以及根據(jù)剛才描述的特殊設(shè)置啟用什么)。因此,該函數(shù)確定正在訪(fǎng)問(wèn)哪種類(lèi)型的內(nèi)存以及它是讀操作還是寫(xiě)操作。但是功能代碼與 Modbus 請(qǐng)求中的其他信息一起使用,包括所謂的偏移量。
偏移尋址如何與 Modbus 功能代碼一起使用
TOP Server Modbus Suite 驅(qū)動(dòng)程序支持不同內(nèi)存類(lèi)型的以下地址范圍:
持有登記冊(cè) – 400001- 465536
內(nèi)部寄存器 – 300001- 365536
輸入線(xiàn)圈 – 100001- 165536
輸出線(xiàn)圈 – 000001- 065536所以我們支持所有內(nèi)存類(lèi)型的偏移量 1 到 65,536。但什么是偏移量?
我通常解釋偏移量的方式是,您必須查看地址的第一個(gè)數(shù)字(即 4、3、1 或 0)來(lái)告訴驅(qū)動(dòng)程序訪(fǎng)問(wèn)哪種類(lèi)型的內(nèi)存。第一個(gè)數(shù)字之后的所有內(nèi)容都是偏移量 - 您在該內(nèi)存類(lèi)型中感興趣的特定內(nèi)存地址。
Modbus 保持寄存器偏移Modbus 文件說(shuō):TOP 服務(wù)器說(shuō)它支持:400140000140001400001
Modbus 功能代碼和偏移量在 Modbus 請(qǐng)求中協(xié)同工作,以告知設(shè)備應(yīng)返回或修改的特定信息。
什么是 Modbus 從零與從一的尋址?
在討論基于偏移的 Modbus 尋址時(shí),最后一個(gè)重要的細(xì)節(jié)是設(shè)備是否支持基于零或一的尋址。最初,從零開(kāi)始的尋址是 Modbus 的預(yù)期實(shí)現(xiàn)方式。但是,隨著時(shí)間的推移和 Modbus 作為一種開(kāi)放協(xié)議被如此廣泛地采用,某些設(shè)備制造商采用了一種稱(chēng)為 one-based 尋址的概念。
從零開(kāi)始的尋址涉及從零開(kāi)始的內(nèi)存類(lèi)型的第一個(gè)偏移量。因此,例如,如果您請(qǐng)求保持寄存器 400001,則實(shí)際的 Modbus 協(xié)議請(qǐng)求將為偏移量 0 的 FC 3。而 400002 將請(qǐng)求偏移量 1 的 FC 3,依此類(lèi)推。
正如您可以想象的那樣,這可能會(huì)令人困惑。因此,一些制造商采用了一種稱(chēng)為基于一的尋址的實(shí)現(xiàn)方式。對(duì)于從 1 開(kāi)始的尋址,偏移量與實(shí)際地址請(qǐng)求對(duì)齊。例如,如果您請(qǐng)求保持寄存器 1,則該請(qǐng)求仍然使用 FC 3,但用于偏移量 1。而 400002 將請(qǐng)求 FC 3 用于偏移量 2,依此類(lèi)推。它更加“用戶(hù)友好”。
但是,由于有些設(shè)備支持從零開(kāi)始尋址,而有些設(shè)備支持從一開(kāi)始的尋址,因此了解這一點(diǎn)很重要。TOP 服務(wù)器 Modbus 驅(qū)動(dòng)程序有一個(gè)可配置的設(shè)置,用于指定您的 Modbus 從設(shè)備支持的實(shí)現(xiàn)。
“基于零的尋址”的默認(rèn)設(shè)置已啟用,因?yàn)檫@是 Modbus 規(guī)范的默認(rèn)設(shè)置。將此設(shè)置切換為禁用將導(dǎo)致驅(qū)動(dòng)程序使用基于 1 的尋址。始終確保您使用的是正確的設(shè)置,否則意味著顯示的值可能是您設(shè)備中的錯(cuò)誤地址。
例如,如果您讀取 400001 的值,并且與您期望的值相比,它是“錯(cuò)誤”值,請(qǐng)查看它是否是 400001 旁邊的寄存器的值。如果是,您需要從 1 交換為從零開(kāi)始尋址(反之亦然)。
此外,還有基于 1 或基于 0 的位尋址。默認(rèn)情況下,TOP Server Modbus 驅(qū)動(dòng)程序也支持從零開(kāi)始的位尋址,因?yàn)樗?Modbus 規(guī)范的默認(rèn)設(shè)置。這意味著位的尋址范圍為 0 到 15。
基于 1 的位尋址意味著位從 1 到 16 尋址——同樣,對(duì)于計(jì)算 16 位的人來(lái)說(shuō),這感覺(jué)更自然。而且,TOP Server Modbus 驅(qū)動(dòng)程序有一個(gè)可配置的設(shè)置,這取決于您的設(shè)備支持什么。
與偏移尋址一樣,在 TOP Server 中選擇的位尋址方法必須與您的設(shè)備支持的匹配 - 否則,如果不正確,您將訪(fǎng)問(wèn)的位值將用于錯(cuò)誤的位。該設(shè)置應(yīng)為 0-15 位訪(fǎng)問(wèn)啟用,或應(yīng)為 1-16 位訪(fǎng)問(wèn)禁用。
始終查閱制造商的文檔或與制造商交談以確定他們支持的方法。如果您注意到某位“開(kāi)啟”但應(yīng)該“關(guān)閉”(反之亦然),您可能需要切換此設(shè)置。
正如您所看到的,Modbus 有很多怪癖,因?yàn)樗且粋€(gè)如此完善和廣泛使用的開(kāi)放協(xié)議。一個(gè)靈活的 Modbus 主站,如 TOP 服務(wù)器,提供了一系列可配置的設(shè)置(包括交換字節(jié)、字和雙字排序,將在以后的文章中介紹)以與最廣泛的 Modbus 從站實(shí)現(xiàn)一起工作,無(wú)論制造商如何,以獲得最大的兼容性。