引言
隨著計算機網絡技術的發展,現場工況環境對采集控制系統的可靠性、便攜性、抗干擾性、實時性、多任務操作等方面提出越來越高的要求標準。
主要研究內容和目的
嵌入式Linux在短短的幾年內,就突破了計算場景的所有方面,提供了低成本、開放資源方案,支持開放標準、網絡、通信、Internet、圖形等,Linux現在能夠支持和處理器一樣廣泛的“傳統”嵌入式操作系統。因此,本次課題要設計研發一款高性能,接口多樣,功能豐富并兼顧多功能用途的嵌入式工控終端設備,并在其平臺基礎上開發多串口轉換網關以及遠程視頻采集與傳輸解決方案。
嵌入式工控平臺的設計
硬件系統主要分為CPU、運行和存儲部分、通信接口、音頻接口、擴展接口和用戶接口幾部分;各部分的詳細功能模塊詳見表1。
軟件平臺的搭建工作包括:
1、建立嵌入式linux交叉編譯環境。
2、移植U-Boot,包括U-Boot的移植實現和移植驗證[1]。
3、Linux內核的裁剪和移植[2]。
4、Linux下設備驅動程序的實現,包括串口驅動程序、ALSA音頻驅動程序、Flash驅動和MMC/SD卡驅動的實現[3]。
5、文件系統的實現[4]。
以上工作均已完成并且通過測試。
多串口轉換網關的設計與實現
隨著企業規模的擴大和Internet技術的廣泛普及,如何將多個串行口的數據轉發到網絡上,實現設備的遠程控制、數據的遠程傳輸便成了一個亟待解決的問題。同時,考慮到成本問題,以往設備又不可能全部淘汰,由此,基于本平臺的軟硬件資源,設計開發了一種基于TCP/IP的多串口轉換網關,可從根本上解決這一難題。
多串口轉換網關可以實現設備靈活的組網方式,針對不同設備的通信協議可以開發相應的服務程序[5]。
本系統平臺上有六個串口和一個網絡接口,設計的網關服務程序在整個監控系統中的作用如圖1所示。網關服務程序可以采用原始數據傳輸模式,在與串口服務器建立TCP/IP連接后,就可以直接傳輸數據;本服務程序同時設計了基于Modbus協議數據傳輸模式。程序設計中采用多進程技術,作為一種多任務、并發的工作方式,多進程程序可以提高應用程序響應,改善程序結構。本文建立了兩個子進程,分別用于處理串口數據經網卡發送和網卡數據經串口發送兩個功能,程序流程如圖2所示。程序設計的基本目的是為了實現串口和socket端口數據的互相轉換,一方數據一到來,先存在緩沖區,再立即發送到另一方,涉及到Linux下的串口編程、socket編程和多進程編程。程序基于面向連接的TCP實現,其流程如圖2所示。
采用TCP方式的服務器,在沒有新客戶端連接時,將一直阻塞在accept()函數處,如果有新的客戶端發起連接,將返回一個新的文件描述符,新的文件描述符用來處理該連接,而原來的文件描述符仍然處于監聽狀態,因此利用accept的返回值client_fd,為每個client_fd創建新的一個子進程來處理,從而實現對多個客戶端的并發訪問。關鍵代碼如下:
while(1)
{//阻塞接收數據
if ((client_fd=accept(sockfd,(struct sockaddr*) remote_addr,sin_ size))==-1)
{ perror (\"accept error\");
continue; }
//打開串口,并設置相應串口號的波特率、數據位、校驗位和停止位
if ((com_fd = opencomport(ConfgInfo.device, ConfgInfo.BaudRate,
ConfigInfo.DataBits, ConfigInfo. StopBits,ConfgInfo.Parity)) == -1)
{ continue; }
//創建接收子進程,當pid==0是為子進程,pid不為0時是父進程
if((pid=fork())>0)
{ close(client_fd);
continue; }
else if(pid==0)
{ close(sockfd);
//創建子進程后交由process_cli函數處理
process_cli(client_fd,com_ fd,ConfgInfo. Flag);
exit(0); } }
進程處理函數process_cli利用多路復用技術,即使用select函數實現某個進程阻塞于多個文件描述符的情況,從而提高應用效率。針對文件描述符的操作如下所示:
FD_ZERO(rfdset);
//初始化文件描述符rfdset為空
FD_SET (client_fd, rfdset);
//將網絡描述符添加到rfdset
FD_SET (com_fd, rfdset);
//將串口描述符添加到rfdset
//輪詢等待,從文件描述符rfdset中獲取狀態變化后的消息
status = select (FD_SETSIZE,rfdset, NULL, NULL, timeout);
bzero (buf, sizeof (buf));
//清空緩沖區
struct timeval timeout = { 60, 0 };
//timeout設置超時等待時間
在select()函數中采用了輪詢處理辦法,只要其中一個或多個文件描述符發生變化都將返回,主要針對select的返回值進行選擇性的執行處理代碼。例如當串口中斷產生數據請求FD_ISSET(com_fd, rfdset),即從串口讀取數據readcomport (buff, BDFFUE_LEN),而當以太網接到數據時FD_ISSET (client_fd, rfdset),從網絡接收數據到緩沖區recv (client_fd, buf, BDFFUE_LEN, 0)。
Modbus RTU/TCP協議處理模塊
MODBUS是一種主/從規約,由于Modbus協議是工業測控領域的標準通信協議,在現場智能儀表中有廣泛的應用[6],本服務程序設計了Modbus協議數據的轉換。如表2所示,Modbus RTU類型報文,無論上、下行,具有相同的結構。M o d b u s T C P為Modbus的TCP網絡協議,TCP網絡端口號為502。Modbus TCP在RTU協議前,增加了6個字節的協議頭,同時取消了Modbus RTU的CRC16校驗和,格式如表3所示。
程序實現從TCP接收來自modbus主站的請求,轉換成modbus RTU格式,經串口發送給從站,由函數tcp2mod()實現;并將從站相應數據經串口接收后,轉換成TCP Modbus格式信息返回主站,由函數mod2tcp()實現。函數tcp2mod()功能為去掉包頭的6個字節的TCP協議頭,將剩余的字節加上CRC循環校驗碼,發送給modbus從機器。函數mod2tcp()的功能是將來自從機的應答碼,去掉結尾的兩個CRC校驗,加上TCP包頭的6個字節,返回給主站。
遠程視頻采集與傳輸解決方案
系統方案基于本文所研發的AT91SAM9G20軟硬件平臺,分為前端監控資源采集、視頻傳輸,后端平臺組建等幾部分。整個系統全部采用全網絡視頻監控架構,前端采用本工控單板機進行圖形和音頻數據采集,通過網絡接口直接進入網絡中,傳輸到后端進行集中存儲和管理。后端采用管理平臺來完成整個視頻監控系統的集中預覽、控制、管理、存儲以及視頻分發等功能,實現視頻監控系統的集中管理[7]。系統構成框架如圖4所示。
本方案采用USB攝像頭采集圖像,對現場圖象進行高速捕捉,然后將捕捉圖象通過USB總線傳輸到ARM處理器進行壓縮處理,同時將錄制的音頻文件也進行壓縮處理,打包生成UDP包,向網絡發送;最后,通過網絡接口,在PC上保存和接收,用戶使用標準的網絡瀏覽器和流媒體播放程序即可查看遠程視頻影像,同時也可以通過網絡控制視頻采集設備。
結語
本文主要在AT91SAM9G20芯片基礎上,比較分析了多種操作系統的特點,最后采用Linux操作系統為研究對象并以2.6.30內核版本為基礎,成功移植開發了一個穩定、高效的嵌入式Linux系統,實現系統外設的驅動程序,并在此基礎上實現了多串口聯網的功能,給出一個基于本平臺的視頻監控系統的解決方案。多串口轉換網關可以實現設備靈活的組網方式,針對不同設備的通信協議可以開發相應的服務程序,視頻監控方案可擴展應用在工業控制、遠程監控系統等諸多領域。
參考文獻:
[1] 王勇.嵌入式系統原理與設計[M].浙江:浙江大學出版社,2007:15-20
[2] 王曉寧,王振臣,張少兵,姚帆.Linux操作系統在ARM9處理器上的移植[J].工自動化及儀表,2010,37(2):67-69
[3] 彭朝勇,薛兵.一種嵌入式Linux串口驅動開發模式[J].微計算機信息,2007,23(5):46-48
[4] Liunx Doc Project[EB/OL].http://www.linuxdoc.org
[5] 范煒.基于ARM的嵌入式多串口網絡服務器的設計與實現[D].北京:北京交通大學,2007
[6] Modbus-IDA. MODBUS Application Protocol Specification[EB/OL]. http://www.Modbus.org/docs
[7] 劉春成.基于嵌入式Linux的USB攝像頭驅動開發[J].計算機工程與設計,2007,28(8):24-27
[8] 袁莎莎,蔣健,陳煒.基于AT91SAM9G20構建嵌入式Linux系統[J].電子系統設計.2011,10:25-28