999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種異種網(wǎng)絡(luò)Modbus軟件網(wǎng)關(guān)的實現(xiàn)

2015-01-26 14:13:30楊國棟高云嶺
物聯(lián)網(wǎng)技術(shù) 2015年1期

楊國棟+高云嶺

摘 要:針對Modbus網(wǎng)關(guān)大部分產(chǎn)品為硬件實現(xiàn)成本高,可擴展性差且功能單一的問題,提出了一種在基于軟件實現(xiàn)Modbus網(wǎng)關(guān)的方法。該方法支持異種網(wǎng)絡(luò)設(shè)備拓?fù)浼軜?gòu),支持多進程處理進一步提高Modbus協(xié)議的吞吐量。同時在嵌入式Linux和Arm硬件平臺架構(gòu)上對該方法的正確性進行了檢測驗證。

關(guān)鍵詞:Modbus;軟件網(wǎng)關(guān);異種網(wǎng)絡(luò);吞吐量

中圖分類號:TP273 ? ?文獻(xiàn)標(biāo)識碼:A ? ? 文章編號:2095-1302(2015)01-00-04

0 ?引 ?言

Modbus協(xié)議作為一種在工業(yè)控制領(lǐng)域廣泛使用的總線協(xié)議,其有著標(biāo)準(zhǔn)、開放,支持多種電氣接口,以及幀格式簡單、緊湊、通俗易懂等優(yōu)點。據(jù)不完全統(tǒng)計,自Modbus協(xié)議1979年面世以來,截止2007年,其已被應(yīng)用在了超過1 000萬個設(shè)備節(jié)點中。

由于Modbus協(xié)議本身支持TCP和RTU兩種鏈路連接方式。對于TCP,其基于以太網(wǎng)為物理連接鏈路。而對于RTU,一般基于RS 232或者RS 485作為物理鏈路連接。對于Modbus設(shè)備節(jié)點的組網(wǎng),通常會基于同種物理鏈路,基于TCP方式的組網(wǎng),可以使用以太網(wǎng)交換機來完成。而對于RTU方式的組網(wǎng),RS 485通過雙絞線直接串接在一起即可。

但由于實際應(yīng)用場景中,通常會結(jié)合兩種網(wǎng)絡(luò)的優(yōu)點。如以太網(wǎng)傳輸速度快,具有高吞吐率的特點,RS 485具有組網(wǎng)簡單,傳輸距離長的特點。通常采用Modbus硬件網(wǎng)關(guān)來結(jié)合兩種網(wǎng)絡(luò)組成異種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。但硬件網(wǎng)關(guān)具有接口數(shù)目固定,成本高,不便擴展等缺點。

本文針對這些實際應(yīng)用和產(chǎn)品維護期間遇到的問題,設(shè)計實現(xiàn)了一種針對異種網(wǎng)絡(luò)的,設(shè)置靈活,性能可靠,易擴展,低成本的軟件網(wǎng)關(guān)實現(xiàn)方法。

1 ?總體架構(gòu)設(shè)計

Modbus協(xié)議通常用在如油田、車間等有多設(shè)備需要進行組網(wǎng)且有復(fù)雜工況的環(huán)境下。多臺上位機可以通過RJ45連接到以太網(wǎng)交換機,其通過1502端口發(fā)送標(biāo)準(zhǔn)的TCP數(shù)據(jù)包到以太網(wǎng)交換機。運行有Modbus網(wǎng)關(guān)的Modbus Server連接到以太網(wǎng)交換機,其接收Modbus TCP數(shù)據(jù)請求并分析目的地址后將該數(shù)據(jù)請求分發(fā)到對應(yīng)的Modbus Server中。數(shù)據(jù)分發(fā)時,組件對應(yīng)的RS 485數(shù)據(jù)包并通過485總線傳遞數(shù)據(jù)。具體結(jié)構(gòu)如圖1所示。

圖1 ?Modbus異種網(wǎng)絡(luò)組網(wǎng)拓?fù)鋱D

一種在實際生產(chǎn)環(huán)境中經(jīng)常會見到的用例是:在油田監(jiān)控網(wǎng)絡(luò)中,上位機運行于監(jiān)控室監(jiān)控各個油井抽油機的狀態(tài)。而Modbus Server作為安裝在每一個油井抽油機上的監(jiān)控裝置用向采集油井狀態(tài)并向上位機匯報。運行有Modbus網(wǎng)關(guān)的Modbus Sever則可作為井場主監(jiān)控裝置起到一個數(shù)據(jù)轉(zhuǎn)發(fā)的作用。由于油井之間的距離長度通常會超過100 m,因此采用485串行物理鏈路的方式會更便于油井采集器之間的組網(wǎng)。而各個油井設(shè)備的數(shù)據(jù)匯聚到了主采集器之后,其過大的數(shù)據(jù)量對于485串行鏈路而言負(fù)擔(dān)較重,容易丟失數(shù)據(jù)。因此主采集器采用以太網(wǎng)物理鏈路與上位機連接。

1.1 ?網(wǎng)關(guān)結(jié)構(gòu)

Modbus網(wǎng)關(guān)運行于Modbus Server中,可根據(jù)配置文件來配置為是否啟動網(wǎng)關(guān)。啟動了網(wǎng)關(guān)的Modbus Server本身和其它Modbus Server設(shè)備一樣,也可以提供數(shù)據(jù)采集功能。

為了能接收多個上位機的數(shù)據(jù)請求,運行了Modbus網(wǎng)關(guān)的Modbus Server會啟動一個支持多路輸入的Socket服務(wù)器用于監(jiān)聽上位機的TCP數(shù)據(jù)請求。對于請求本機地址的數(shù)據(jù),將直接返回相關(guān)數(shù)據(jù)。而對于其它Modbus Server地址的數(shù)據(jù)請求,將被網(wǎng)關(guān)中的數(shù)據(jù)分發(fā)器Dispatcher通過啟動一個獨立進程的方式分發(fā)到Sub-Modbus Server中。為保證數(shù)據(jù)多個數(shù)據(jù)請求之間不會在485總線網(wǎng)絡(luò)中造成沖突,在數(shù)據(jù)分發(fā)器啟動的多個數(shù)據(jù)處理進程和Sub-Modbus Servers之間,會存在一個總線鎖。Modbus網(wǎng)關(guān)結(jié)構(gòu)如圖2所示。

圖2 ?Modbus網(wǎng)關(guān)結(jié)構(gòu)

1.2 ?目的地址傳遞

Modbus協(xié)議定義了一個與基礎(chǔ)通信層無關(guān)的簡單協(xié)議數(shù)據(jù)單元(PDU)。特定總線或者網(wǎng)絡(luò)上的Modbus協(xié)議映射能夠在應(yīng)用數(shù)據(jù)單元(ADU)上引入一些附加域,如地址域或差錯校驗域。Modbus通用數(shù)據(jù)幀如圖三所示。

圖3 ?Modbus通用數(shù)據(jù)幀

一個ADU最大長度為256 B。對于TCP通信鏈路,通常其ADU不包含差錯校驗部分,而會包含一個7 B的Modbus報文頭(MBAP)。MBAP的組成為2 B的事務(wù)元標(biāo)識符,2 B的協(xié)議標(biāo)識符以及2 B的數(shù)據(jù)包長度和1 B的單元標(biāo)識符。通常情況下,Modbus網(wǎng)關(guān)中在向串行鏈路設(shè)備轉(zhuǎn)發(fā)數(shù)據(jù)時的設(shè)備地址就保存在單元標(biāo)識符中。TCP通信鏈路下,ADU組成為:

TCP MODBUS ADU = 249 B+ MBAP (7 B) = 256 B

對于串型鏈路通信來說,其地址域為一個字節(jié)長度。而差錯校驗部分存儲的數(shù)據(jù)通過CRC16算法所得,其數(shù)據(jù)長度為2 B。因此最大PDU長度為253 B。一個最大長度的ADU組成為:

RS 232 / RS 485 ADU = 253 B + 服務(wù)器地址(1 B) + CRC (2 B) = 256 B。

1.3 ?數(shù)據(jù)包解析

Modbus定義了4種具有不同特征的數(shù)據(jù)模型,分別是:

(1)離散量輸入,為只讀的單個比特位;

(2)線圈變量,為可讀寫的單個比特位;

(3)輸入寄存器,為只讀的2 B;

(4)輸出寄存器,為可讀寫的2 B。

對于這4種數(shù)據(jù),Modbus協(xié)議都允許單個選擇65 536個數(shù)據(jù)項,但實際而言,數(shù)據(jù)的大小規(guī)格限制和事務(wù)處理的功能碼是相關(guān)聯(lián)的。在本實現(xiàn)中,取工業(yè)控制領(lǐng)域常用的8個功能碼來作為數(shù)據(jù)網(wǎng)關(guān)中處理的數(shù)據(jù)請求,如下:

0x01 讀線圈

0x02 讀輸入離散量

0x03 讀多個輸出寄存器

0x04 讀多個輸入寄存器

0x05 寫單個線圈

0x06 寫單個寄存器

0x0F 寫多個線圈

0x10寫多個寄存器

以讀多個輸出寄存器為例。讀數(shù)據(jù)時,請求PDU中需指定輸出寄存器的起始地址和讀取數(shù)量。一個讀取輸出寄存器第108到110的3個寄存器的數(shù)據(jù)如表1所示。

表1 ?讀輸出寄存器

請求 響應(yīng)

名稱 數(shù)值(十

六進制) 名稱 數(shù)值(十

六進制)

功能碼 03 功能碼 03

起始地址(高) 00 數(shù)據(jù)長度 06

起始地址(低) 6B 寄存器值(高)- 108 02

讀取寄存器個(高) 00 寄存器值(低)- 108 2B

讀取寄存器個(低) 03 寄存器值(高)- 109 00

寄存器值(低)- 109 00

寄存器值(高)- 110 00

寄存器值(低)- 110 64

在網(wǎng)關(guān)中對數(shù)據(jù)解析時,對于不同的功能碼,應(yīng)根據(jù)Modbus協(xié)議中的數(shù)據(jù)格式定義來對數(shù)據(jù)包進行解析。

2 ?模塊功能詳細(xì)設(shè)計

2.1 ?Socket服務(wù)器模塊設(shè)計

軟件網(wǎng)關(guān)與上位機之間通過TCP進行連接,網(wǎng)關(guān)將啟動一個socket服務(wù)器監(jiān)聽來自上位機的Modbus客戶端的請求。由于會存在多臺上位機,socket服務(wù)器在設(shè)計中需考慮可同時接受多個TCP請求。而對于TCP請求,在一條鏈路已經(jīng)建立以后,來自同一臺上位機的再次請求應(yīng)不需要再次進行鏈路的建立。

首先對于一個未建立過連接的TCP請求,需要為該請求創(chuàng)建必要的工作環(huán)境并保存環(huán)境。考慮到網(wǎng)關(guān)的處理能力,對于允許的最大連接數(shù)將通過配置文件進行讀取。

// Clear the reference set of socket

FD_ZERO(&refset);

// Add the server socket

FD_SET(server_socket, &refset);

// Keep track of the max file descriptor

fdmax = server_socket;

for (;;) {

rdset = refset;

select(fdmax+1, &rdset, NULL, NULL, NULL);

// Run through the existing connections looking for data to be read

for (master_socket = 0; master_socket <= fdmax; master_socket++) {

if (FD_ISSET(master_socket, &rdset)) {

if (master_socket == server_socket) {

/* A client is asking a new connection */

memset(&clientaddr, 0, sizeof(clientaddr));

newfd = accept(server_socket, (struct sockaddr *)&clientaddr, &addrlen);

if (newfd == -1) { perror(“Server accept() error”); ?}

else { FD_SET(newfd, &refset);

if (newfd > fdmax) {

fdmax = newfd; ?/* Keep track of the maximum */

} ? } ? }

}

}

}

而對于一個已經(jīng)建立好的連接,則需要調(diào)用轉(zhuǎn)發(fā)函數(shù)將其轉(zhuǎn)發(fā)到對應(yīng)的子設(shè)備中去。對于目的地址為網(wǎng)關(guān)設(shè)備本身的,需要根據(jù)上位機的請求,將網(wǎng)關(guān)設(shè)備本身采集到的數(shù)據(jù)返回給上位機或者完成對應(yīng)的寫數(shù)據(jù)操作。在對于網(wǎng)關(guān)設(shè)備本身的操作中,由于modbus數(shù)據(jù)通常為由一個獨立的進程采集并存放到共享內(nèi)存中,因此在操作共享內(nèi)存時,需使用信號量來保證數(shù)據(jù)的正確性。

/* An already connected master has sent a new query */

modbus_set_socket(ctx, master_socket);

rc = modbus_receive(ctx, query);

if (rc > 0) {if (query[header_length -1] != config->server_id) {

device_write_hook (query, header_length, config, (share_mm_data *)share_mm);

sem_wait(&sem);

copy_mem_from_sharing (share_mm, mb_mapping); ?// copy memory form sharing mem into modbus mapping area.

sem_post(&sem);

} else {modbus_dispatch (ctx, query, config); } ?// For gateway mode switch

modbus_reply(ctx, query, rc, mb_mapping);}

2.2 ?組包模塊設(shè)計

在組建Modbus數(shù)據(jù)包時, 由于不同的Modbus請求命令其數(shù)據(jù)包組成結(jié)構(gòu)不相同,因此需根據(jù)Modbus請求命令的不同來進行判斷。

組包模塊主要提供2個函數(shù),其定義如下:

int package_read_data (char *data_485, char *data_tcp, int direction);

int package_write_data (char *data_485, char *data_tcp, int direction);

package_read_data函數(shù)用于將Modbus的讀數(shù)據(jù)請求進行TCP數(shù)據(jù)包和485數(shù)據(jù)包之間的轉(zhuǎn)換,根據(jù)direction參數(shù)的變化來決定轉(zhuǎn)換的方向。而package_write_data函數(shù)則用于將Modbus的寫數(shù)據(jù)請求進行TCP數(shù)據(jù)包和485數(shù)據(jù)包之間的轉(zhuǎn)換。

對于讀數(shù)據(jù),收到的數(shù)據(jù)包中相關(guān)的Modbus功能碼為0x01、0x02、0x03、0x04,其數(shù)據(jù)復(fù)制組包的過程如圖4所示:

圖4 ?讀數(shù)據(jù)時數(shù)據(jù)復(fù)制包過程

對于寫數(shù)據(jù),收到的數(shù)據(jù)包中相關(guān)的Modbus功能碼為0x05、0x06、0x0F、0x10,其數(shù)據(jù)復(fù)制組包的過程如圖5所示:

圖5 ?寫數(shù)據(jù)時數(shù)據(jù)復(fù)制包過程

2.3 ?轉(zhuǎn)發(fā)模塊設(shè)計

數(shù)據(jù)轉(zhuǎn)發(fā)模塊首先會啟動一個獨立的進程并在該進程中完成數(shù)據(jù)轉(zhuǎn)發(fā)的全部過程。由于數(shù)據(jù)轉(zhuǎn)發(fā)的過程中,可能會有其它上位機的數(shù)據(jù)請求再次到來并啟動一個進程通過485總線向下位機傳遞數(shù)據(jù),因此在任意一個進程通過485總線傳輸數(shù)據(jù)時,需對該總線進行上鎖。同2.1節(jié)中設(shè)計一樣,此處采用信號量完成該工作。

網(wǎng)關(guān)運行過程中,由于父進程可能會隨時退出,在數(shù)據(jù)轉(zhuǎn)發(fā)子進程中需監(jiān)控父進程信息。如父進程退出,則數(shù)據(jù)轉(zhuǎn)發(fā)子進程也應(yīng)退出從而避免成為僵尸進程。核心代碼如下:

pid=fork();

if (pid == -1) { exit(1); ?}

else if (pid == 0) {

// Child

share_mm= shmat (shmid, 0, 0);

ctx = modbus_new_rtu(config->dev, config->baudrate, config->parity, config->data_bit, config->stop_bit);

package_485_data (query, output);

sem_wait(&sem_485);

send_485_data (output);

sem_post(&sem_485);

while (1) { ? ?// 判斷父進程是否已退出

if (getppid() == 1) { exit(0); ?}

// Wait response

modbus_receive_confirmation(ctx, response);

if (response != -1) { ?break; ?}

}

package_tcp_data (response, output);

send_tcp_data (output);

}

其流程如圖6所示:

圖6 ?數(shù)據(jù)轉(zhuǎn)發(fā)流程

3 ?功能驗證

以AT91RM9200為硬件平臺,以Linux 3.8為內(nèi)核以及基于Busybox 1.2.0組件的根文件系統(tǒng)為軟件平臺作為Modbus服務(wù)器的測試平臺。上位機為普通PC,運行Ubutntu 12.04。基于本文中圖一搭建測試網(wǎng)絡(luò)結(jié)構(gòu)。驗證的主要過程如下:

3.1 ?客戶端配置

(1)配置服務(wù)器IP及Modbus網(wǎng)關(guān)IP。假設(shè)服務(wù)器端IP地址信息為192.168.1.110,運行網(wǎng)關(guān)的Modbus網(wǎng)關(guān)服務(wù)器的IP地址信息為:192.168.1.111。需更改Modbus網(wǎng)關(guān)服務(wù)器應(yīng)用程序配置文件/etc/modbus/config.ini文件如下:

[GLOBAL]

type=route

mode=tcp

server_id=1

[NETWORK]

ip_addr=192.168.1.111

(2)將子Modbus服務(wù)器通過485線纜連接到Modbus網(wǎng)關(guān)服務(wù)器。

(3)啟動Modbus網(wǎng)關(guān)應(yīng)用程序。

(4)各子Modbus服務(wù)器啟動Modbus服務(wù)應(yīng)用。

3.2 ?服務(wù)器端配置

服務(wù)器端運行一個封裝了標(biāo)準(zhǔn)Modbus請求的客戶端應(yīng)用程序即可。通過TCP方式向Modbus網(wǎng)關(guān)服務(wù)器發(fā)送Modbus數(shù)據(jù)請求。

3.3 ?驗證結(jié)果

在Ubuntu 12.04 上位機開始執(zhí)行Modbus,以TCP方式向Modbus網(wǎng)關(guān)服務(wù)器分別發(fā)送讀、寫數(shù)據(jù)請求。測試Modbus網(wǎng)關(guān)收到了信息并進行了數(shù)據(jù)轉(zhuǎn)發(fā),而對應(yīng)的子Modbus服務(wù)器也收到了從Modbus網(wǎng)關(guān)服務(wù)器發(fā)送的485數(shù)據(jù)格式的數(shù)據(jù)請求。測試結(jié)果如圖7所示。

圖7 ?調(diào)試信息采集和集成測試

測試重點完成了兩項驗證,其一,上位機發(fā)送的數(shù)據(jù)被Modbus網(wǎng)關(guān)所收到并進行了轉(zhuǎn)發(fā);其二,子Modbus服務(wù)器收到了Modbus網(wǎng)關(guān)的數(shù)據(jù)請求。

4 ?結(jié) ?語

本文主要描述了一種異種網(wǎng)絡(luò)Modbus軟件網(wǎng)關(guān)的設(shè)計與實現(xiàn),考慮了多種實際工作中的應(yīng)用場景。結(jié)合了485物理鏈路和以太網(wǎng)物理鏈路的優(yōu)點,可以應(yīng)用在多任務(wù)、多設(shè)備的復(fù)雜網(wǎng)絡(luò)拓?fù)渲小M容^目前常見的硬件網(wǎng)關(guān)而言,其低成本、易擴展的特點具有非常現(xiàn)實的積極意義。而在油田中部署的油井監(jiān)控系統(tǒng)也充分驗證了本系統(tǒng)的設(shè)計與實現(xiàn)。

參考文獻(xiàn)

[1]李英奇,吳桂初.Modbus-ModbusTCP/IP的網(wǎng)關(guān)設(shè)計[J]. 微型機與應(yīng)用, 2013(10):48-50.

[2]翁建年,張浩,彭道剛,等. 基于嵌入式ARM的Modbus/TCP協(xié)議的研究與實現(xiàn)[J].計算機應(yīng)用與軟件,2009,26(10):36-39.

[3] Wikipedia.Modbus[EB/OL]. http://en.wikipedia.org/wiki/Modbus,2013.

主站蜘蛛池模板: 色成人综合| 亚洲国产AV无码综合原创| 欧亚日韩Av| 99热这里只有免费国产精品| 久久久久亚洲AV成人网站软件| 国产福利一区视频| 日本亚洲欧美在线| 国产男人天堂| 国产欧美网站| 专干老肥熟女视频网站| 国产亚洲第一页| 青青操国产| 亚洲a级在线观看| 在线看AV天堂| 欧美日韩国产一级| 国产欧美日韩精品综合在线| 国产精品.com| 国产成人综合日韩精品无码不卡| 国产性生大片免费观看性欧美| 日韩精品无码免费专网站| 亚洲一区波多野结衣二区三区| 国产a在视频线精品视频下载| 国产成人精品优优av| 免费又黄又爽又猛大片午夜| 亚洲av日韩av制服丝袜| 伊人欧美在线| 小说区 亚洲 自拍 另类| 视频一本大道香蕉久在线播放| 亚洲国产无码有码| 日韩av高清无码一区二区三区| 亚洲成a人片在线观看88| 久久精品日日躁夜夜躁欧美| 国产精品毛片一区| 精品无码一区二区三区在线视频| 影音先锋丝袜制服| av在线手机播放| 欧美福利在线| 亚洲国产成人综合精品2020| 免费看的一级毛片| 亚洲大尺码专区影院| 麻豆AV网站免费进入| 九色在线观看视频| 色综合a怡红院怡红院首页| 欧美日韩成人在线观看| 免费一级成人毛片| 青草视频网站在线观看| 亚洲av综合网| 国产色婷婷视频在线观看| 久久香蕉国产线看观看精品蕉| 日韩在线欧美在线| 久草中文网| 在线观看免费黄色网址| 一区二区在线视频免费观看| 日本伊人色综合网| 色悠久久久久久久综合网伊人| 色综合激情网| 国产99欧美精品久久精品久久| 日韩av在线直播| 好吊妞欧美视频免费| 国产乱子伦精品视频| 欧美综合激情| 亚洲无码免费黄色网址| 国产成人精品一区二区免费看京| WWW丫丫国产成人精品| 国内精品九九久久久精品| 欧美一区二区自偷自拍视频| 日本爱爱精品一区二区| 日韩成人高清无码| 国产日韩AV高潮在线| 韩国自拍偷自拍亚洲精品| 亚洲伊人电影| 欧美色视频在线| 亚洲成年网站在线观看| 国产中文一区a级毛片视频| 精品伊人久久久大香线蕉欧美 | 日韩无码黄色| 久久久久青草线综合超碰| 国产精品亚洲片在线va| 99热这里只有精品国产99| 免费人成在线观看成人片 | 国产第一福利影院| 色综合天天娱乐综合网|