国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

用動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)Modbus應(yīng)答

2009-10-26 09:35:10唐崇華
新媒體研究 2009年13期
關(guān)鍵詞:客戶機(jī)字節(jié)寄存器

唐崇華

[摘要]MODBUS協(xié)議是應(yīng)用于電子控制器上的一種通用協(xié)議。通過(guò)此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備之間可以通信。它已經(jīng)成為一種通用工業(yè)標(biāo)準(zhǔn)。不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò)進(jìn)行集中監(jiān)控。此協(xié)議定義一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。它描述控制器請(qǐng)求訪問(wèn)其它設(shè)備的過(guò)程,如何回應(yīng)來(lái)自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定消息域格局和內(nèi)容的公共格式。

MODBUS是OSI模型第7層上的應(yīng)用層報(bào)文傳輸協(xié)議,它在連接至不同類型總線或網(wǎng)絡(luò)的設(shè)備之間提供客戶機(jī)/服務(wù)器通信。自從1979年出現(xiàn)工業(yè)串行鏈路的事實(shí)標(biāo)準(zhǔn)以來(lái),MODBUS使成千上萬(wàn)的自動(dòng)化設(shè)備能夠通信。目前,繼續(xù)增加對(duì)簡(jiǎn)單而雅觀的MODBUS結(jié)構(gòu)支持。

[關(guān)鍵詞]ModbusTCP/IP工業(yè)控制

中圖分類號(hào):TP3文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1671-7597(2009)0710066-02

一、MODBUS協(xié)議描述

MODBUS是一個(gè)請(qǐng)求/應(yīng)答協(xié)議,并且提供功能碼規(guī)定的服務(wù)。目前,以以太網(wǎng)上的TCP/IP使用MODBUS比較常見(jiàn)。

圖1ModBus協(xié)議格式

MODBUS協(xié)議定義了一個(gè)與基礎(chǔ)通信層無(wú)關(guān)的簡(jiǎn)單協(xié)議數(shù)據(jù)單元(PDU)。特定總線或網(wǎng)絡(luò)上的MODBUS協(xié)議映射能夠在應(yīng)用數(shù)據(jù)單元(ADU)上引入一些附加域。Modbus協(xié)議格式如圖1所示。TCP/IP上的MODBUS的請(qǐng)求/響應(yīng)協(xié)議格式如圖2所示。

啟動(dòng)MODBUS事務(wù)處理的客戶機(jī)創(chuàng)建MODBUS應(yīng)用數(shù)據(jù)單元。功能碼向服務(wù)器指示將執(zhí)行哪種操作。

MODBUS報(bào)文傳輸服務(wù)提供設(shè)備之間的客戶機(jī)/服務(wù)器通信,這些設(shè)備聯(lián)接在一個(gè)Ethernet(以太網(wǎng))TCP/IP網(wǎng)絡(luò)上。

這種客戶機(jī)/服務(wù)器模式是基于4種類型報(bào)文:

MODBUS請(qǐng)求:客戶機(jī)在網(wǎng)絡(luò)上發(fā)送用來(lái)啟動(dòng)事務(wù)處理的報(bào)文。

MODBUS證實(shí):在客戶端接收的響應(yīng)信息。

MODBUS指示:服務(wù)端接收的請(qǐng)求報(bào)文。

MODBUS響應(yīng):服務(wù)器發(fā)送的響應(yīng)信息。

圖2TCP/IP上的MODBUS的請(qǐng)求/響應(yīng)協(xié)議格式

在TCP/IP上使用一種專用報(bào)文頭識(shí)別MODBUS應(yīng)用數(shù)據(jù)單元。將這種報(bào)文頭稱為MBAP報(bào)文頭(MODBUS協(xié)議報(bào)文頭)。

MBAP報(bào)文頭包括下列域:

報(bào)文頭為7個(gè)字節(jié)長(zhǎng):

事務(wù)處理標(biāo)識(shí)符:用于事務(wù)處理配對(duì)。在響應(yīng)中,MODBUS服務(wù)器復(fù)制請(qǐng)求的事務(wù)處理標(biāo)識(shí)符。

協(xié)議標(biāo)識(shí)符:用于系統(tǒng)內(nèi)的多路復(fù)用。通過(guò)值0識(shí)別MODBUS協(xié)議。

長(zhǎng)度:長(zhǎng)度域是下一個(gè)域的字節(jié)數(shù),包括單元標(biāo)識(shí)符和數(shù)據(jù)域。

單元標(biāo)識(shí)符:為了系統(tǒng)內(nèi)路由使用這個(gè)域。專門用于通過(guò)以太網(wǎng)TCP-IP網(wǎng)絡(luò)和MODBUS串行鏈路之間的網(wǎng)關(guān)對(duì)MODBUS或MODBUS+串行鏈路從站的通信。MODBUS客戶機(jī)在請(qǐng)求中設(shè)置這個(gè)域,在響應(yīng)中服務(wù)器必須利用相同的值返回這個(gè)域。

二、MODBUS功能碼舉例

以讀保持寄存器(功能碼3)為例。

在一個(gè)遠(yuǎn)程設(shè)備中,使用該功能碼讀取保持寄存器連續(xù)塊的內(nèi)容。請(qǐng)求PDU說(shuō)明了起始寄存器地址和寄存器數(shù)量。從零開始尋址寄存器。將響應(yīng)報(bào)文中的寄存器數(shù)據(jù)分成每個(gè)寄存器有兩字節(jié),在每個(gè)字節(jié)中直接地調(diào)整二進(jìn)制內(nèi)容。對(duì)于每個(gè)寄存器,第一個(gè)字節(jié)包括高位比特,并且第二個(gè)字節(jié)包括低位比特。

請(qǐng)求

響應(yīng)(*N=寄存器的數(shù)量)

錯(cuò)誤

這是一個(gè)請(qǐng)求讀寄存器108-110的實(shí)例:

將寄存器108的內(nèi)容表示為兩個(gè)十六進(jìn)制字節(jié)值02 2B,或十進(jìn)制555。將寄存器109-110的內(nèi)容分別表示為十六進(jìn)制00 00和00 64,或十進(jìn)制0和100。

三、用動(dòng)態(tài)鏈接庫(kù)封裝MODBUS應(yīng)答服務(wù)

采用動(dòng)態(tài)鏈接庫(kù)(Dynamic-Linbk Library)實(shí)現(xiàn)對(duì)MODBUS應(yīng)答服務(wù)的封裝。應(yīng)客戶要求此動(dòng)態(tài)鏈接庫(kù)主要的功能為響應(yīng)客戶MODBUS請(qǐng)求并按請(qǐng)求將從設(shè)備采集到的數(shù)據(jù)以MODBUS協(xié)議格式發(fā)送給客戶。數(shù)據(jù)為32位浮點(diǎn)數(shù),采用IEEE754格式編碼。為便于用VB等開發(fā)工具開發(fā)的客戶端調(diào)用,采用標(biāo)準(zhǔn)的動(dòng)態(tài)鏈接庫(kù)格式,即函數(shù)用__stdcall定義。

1.Modbus協(xié)議解析函數(shù)

函數(shù)processMsg(unsigned char mdreq):負(fù)責(zé)解析modbus請(qǐng)求。主要代碼:

switch(mRrequest[7])//按照modbus協(xié)議該位置為功能號(hào)

{ case 3://請(qǐng)求保持寄存器

{unsigned regNo = getWord(mRrequest, 8);//起始寄存器地址

Unsigned regCount = getWord(mRrequest, 10);// 寄存器數(shù)量

if (len != 12) { //標(biāo)準(zhǔn)Modbus請(qǐng)求為12個(gè)字節(jié),否則非法請(qǐng)求,填寫錯(cuò)誤響應(yīng)

mRrequest [7] |= 0x83;//錯(cuò)誤碼

mRrequest [8] = 3;// 異常碼

mRrequest [5] = 3; // length

break;

}

if (regCount < 1 || regCount > 125 || regNo >= num4xRegs || (regCount + regNo) > num4xRegs) {// 請(qǐng)求寄存器范圍不合法,填寫錯(cuò)誤響應(yīng)

mRrequest [7] |= 0x83;// //錯(cuò)誤碼

mRrequest [8] = 2; // 異常碼

mRrequest [5] = 3; // length

break;

}

// 正確的請(qǐng)求,填寫響應(yīng)

mRrequest [8] = 2 * regCount;//數(shù)據(jù)字節(jié)數(shù)

mRrequest [5] = mRrequest [8] + 3;//響應(yīng)信息長(zhǎng)度

for (i=0;i

{//訪問(wèn)設(shè)備,得到數(shù)據(jù)項(xiàng)并賦值。

… …

}

}

break;

… …

}

return6+ mRrequest [5];

2.通信模型的選擇

由于采用動(dòng)態(tài)鏈接庫(kù)的方式實(shí)現(xiàn)對(duì)Modbus通信幀的監(jiān)聽(tīng)和解析,為了避免窗體的使用,所以采用SELECT模型負(fù)責(zé)網(wǎng)絡(luò)通信工作。SELECT模式是Winsock中最常見(jiàn)的I/O模型。之所以稱其為“select模式”,是由于它的中心思想是利用SELECT函數(shù),實(shí)現(xiàn)對(duì)I/O的管理。利用SELECT函數(shù),可以判斷套接字上是否存在數(shù)據(jù),或者能否向一個(gè)套接字寫入數(shù)據(jù),從而實(shí)現(xiàn)數(shù)據(jù)的收發(fā)工作。采用SELECT主要用到函數(shù)ioctlsocket、select和FD_ZERO、FD_SET、FD_ISSET和FD_CLR宏。

在應(yīng)用開發(fā)時(shí),通過(guò)以下步驟,完成對(duì)套接字的可讀可寫判斷。

(1)使用FD_ZERO宏,初始化感興趣的套接字集合fd_set,可以為可讀套接字集合和可寫套接字集合。例如FD_ZERO(ReadFD)。

(2)使用FD_SET宏將套接字分配給參與操作的fd_set集合。例如FD_SET(s,ReadFD)。

(3)以fd_set為參數(shù)調(diào)用select函數(shù)。等待在指定的fd_set集合中I/O活動(dòng)設(shè)置好套接字。select函數(shù)完成后會(huì)返回在所有fd_set集合中設(shè)置的套接字句柄總數(shù),并對(duì)每個(gè)集合進(jìn)行相應(yīng)的更新。

(4)select函數(shù)成功返回后,使用FD_ISSET宏,對(duì)每個(gè)fd_set集合進(jìn)行檢查。例如,FD_ISSET(s,ReadFD)。如果該宏的值為TRUE,則說(shuō)明該套接字可讀。

(5)調(diào)用相應(yīng)的Windows Sockets API進(jìn)行數(shù)據(jù)的接受和發(fā)送。

四、MODBUS異常響應(yīng)

異常響應(yīng)報(bào)文有兩個(gè)與正常響應(yīng)不同的域:

功能碼域:在正常響應(yīng)中,服務(wù)器利用響應(yīng)功能碼域來(lái)應(yīng)答最初請(qǐng)求的功能碼。所有功能碼的最高有效位(MSB)都為0(它們的值都低于十六進(jìn)制80)。在異常響應(yīng)中,服務(wù)器設(shè)置功能碼的MSB為1。這使得異常響應(yīng)中的功能碼值比正常響應(yīng)中的功能碼值高十六進(jìn)制80。通過(guò)設(shè)置功能碼的MSB,客戶機(jī)的應(yīng)用程序能夠識(shí)別異常響應(yīng),并且能夠檢測(cè)異常碼的數(shù)據(jù)域。

數(shù)據(jù)域:在正常響應(yīng)中,服務(wù)器可以返回?cái)?shù)據(jù)域中數(shù)據(jù)或統(tǒng)計(jì)表(請(qǐng)求中要求的任何報(bào)文)。在異常響應(yīng)中,服務(wù)器返回?cái)?shù)據(jù)域中的異常碼。

客戶機(jī)請(qǐng)求和服務(wù)器異常響應(yīng)的實(shí)例:

在這個(gè)實(shí)例中,客戶機(jī)對(duì)服務(wù)器設(shè)備尋址請(qǐng)求。功能碼(01)用于讀輸出狀態(tài)操作。它將請(qǐng)求地址1245(十六進(jìn)制04A1)的輸出狀態(tài)。

如果在服務(wù)器設(shè)備中不存在輸出地址,那么服務(wù)器將返回異常碼(02)的異常響應(yīng)。這就說(shuō)明從站的非法數(shù)據(jù)地址。

參考文獻(xiàn):

[1]《MODBUS Protocol Reference Guide》,http://www.Modbus-IDA.org.

[2]《MODBUS MESSAGEING ON TCP/IP IMPLEMENTATION GUIDE V1.0a》,

Http://www.Modbus-IDA.org.

[3]《MODBUS Application Protocol Specification》,http://www.Modbus-IDA.org.

[4]孫海民,《Windows Sockets 網(wǎng)絡(luò)開發(fā)-基于Visual C++實(shí)現(xiàn)》,人民郵電出版社.

猜你喜歡
客戶機(jī)字節(jié)寄存器
Reducing the global cancer burden with gastrointestinal screening: China’s 30 years practice
No.8 字節(jié)跳動(dòng)將推出獨(dú)立出口電商APP
Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
No.10 “字節(jié)跳動(dòng)手機(jī)”要來(lái)了?
簡(jiǎn)談MC7字節(jié)碼
分簇結(jié)構(gòu)向量寄存器分配策略研究*
高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
瘦客戶機(jī):安全與便捷的選擇
一種可重構(gòu)線性反饋移位寄存器設(shè)計(jì)
人類進(jìn)入“澤它時(shí)代”
鄯善县| 九江市| 全椒县| 曲靖市| 横峰县| 富阳市| 大姚县| 厦门市| 玉树县| 安溪县| 宣化县| 商洛市| 大竹县| 秦皇岛市| 博罗县| 湘西| 水城县| 荃湾区| 奈曼旗| 凌海市| 临江市| 甘孜| 盐池县| 伽师县| 祥云县| 宜春市| 青海省| 喜德县| 涞水县| 桂平市| 延庆县| 保山市| 讷河市| 喜德县| 唐山市| 禹城市| 修文县| 永宁县| 城固县| 满洲里市| 黄浦区|