艾 博,許向陽,賈月明
(中國(guó)電子科技集團(tuán)公司第四十五研究所,北京100176)
在數(shù)據(jù)采集和監(jiān)視控制系統(tǒng)(SCADA)中,Modbus通常用來連接監(jiān)控計(jì)算機(jī)和遠(yuǎn)程終端控制系統(tǒng),因其開放、集成方便等特點(diǎn),如今成為工業(yè)領(lǐng)域全球最流行的通信協(xié)議[1-3]。為實(shí)現(xiàn)液氮補(bǔ)給裝置自動(dòng)控制,需實(shí)時(shí)采集和監(jiān)視液氮杜瓦罐內(nèi)的溫度、液位及周邊氧氣濃度數(shù)據(jù),并將采集結(jié)果發(fā)送給上位機(jī)。
本設(shè)計(jì)的數(shù)據(jù)采集平臺(tái)是基于RS-485總線和Modbus RTU協(xié)議,通過ADAM4117獲取各傳感器的模擬量電流值,實(shí)現(xiàn)實(shí)時(shí)監(jiān)測(cè)液氮杜瓦罐內(nèi)的溫度值、液氮液位值及裝置周邊的氧氣濃度值。同時(shí),該平臺(tái)除具有完成數(shù)據(jù)采集、數(shù)據(jù)分析和處理功能外,還需具有提供數(shù)據(jù)采集接口和人機(jī)交互接口的功能。
圖1為液氮補(bǔ)給裝置數(shù)據(jù)采集平臺(tái)的設(shè)計(jì)示意圖。在本系統(tǒng)設(shè)計(jì)中ADAM4117作為系統(tǒng)核心,由ADAM4117的通道0、通道1和通道2獲取溫度傳感器、液位傳感器和氧氣傳感器實(shí)時(shí)反饋的數(shù)據(jù),并通過串口Modbus RTU協(xié)議與上位機(jī)通信,在上位機(jī)軟件實(shí)現(xiàn)3個(gè)通道的數(shù)據(jù)采集、分析和處理。
圖1 數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)示意圖
其中,ADAM4117是16位A/D、8通道的模擬量輸入模塊,可以采集電壓、電流等模擬量輸入信號(hào),并且為所有通道提供了獨(dú)立的可編程的輸入范圍。在工業(yè)測(cè)量和監(jiān)控的應(yīng)用中,ADAM4117具有良好的性價(jià)比。它不僅能夠用于惡劣的環(huán)境中,而且還具有更加堅(jiān)固型的設(shè)計(jì)。本系統(tǒng)中ADAM4117設(shè)置為采集4~20 mA電流量程,將電流信號(hào)轉(zhuǎn)換為RS-485信號(hào),傳輸?shù)缴衔粰C(jī),Modbus協(xié)議讀到的數(shù)值為16進(jìn)制的整數(shù),數(shù)值從0~65 535,分別對(duì)應(yīng)量程的上下限。例如,當(dāng)量程為4~20 mA時(shí),輸入的電流值為12 mA,則讀取到的Modbus數(shù)值為32 767。
Modbus是一種串行通訊協(xié)議,是由Modicon公司于1979年提出,允許多個(gè)設(shè)備連接在同一個(gè)網(wǎng)絡(luò)上進(jìn)行通信。本文使用的RTU格式傳輸效率高,在相同速率下具有更大的數(shù)據(jù)流量,得到了廣泛認(rèn)可與使用。Modbus通信是主從通信機(jī)制,主機(jī)將消息幀發(fā)送給從機(jī),從機(jī)在接收到消息后,返回相應(yīng)的應(yīng)答幀,其主從關(guān)系如圖2所示[4]。
圖2 Modbus主從關(guān)系
Modbus RTU消息幀結(jié)構(gòu)如表1所示[5]。本文中讀取ADAM4117輸入寄存器的電流值,使用0x04功能碼控制。
表1 Modbus RTU消息結(jié)構(gòu)
上位機(jī)程序在VS2010環(huán)境中編寫,軟件實(shí)現(xiàn)流程如圖3所示。
圖3 上位機(jī)軟件實(shí)現(xiàn)流程圖
//串口控制塊
DCB dcb;/
/串口超時(shí)控制參數(shù)
COMMTIMEOUTS timeouts={100,1,500,1,100};
//串口名稱或設(shè)備路徑
m_hComm=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPE
N_EXISTING,0,NULL);
//獲取串口DCB設(shè)置參數(shù)
GetCommState(m_hComm,&dcb);
//設(shè)置波特率、位、停止位、校驗(yàn)方式
dcb.BaudRate=9600;dcb.ByteSize=8;
dcb.StopBits=ONESTOPBIT;dcb.Parity=NOPARITY;
//設(shè)置DCB參數(shù)
SetCommState(m_hComm,&dcb);
//設(shè)置超時(shí)參數(shù)
SetCommTimeouts(m_hComm,&timeouts)。
ADAM4117的設(shè)備地址為0x01,通過04功能碼讀取輸入寄存器電流數(shù)據(jù)。8通道的模擬量輸入采集電流模擬量輸入信號(hào),通過Modbus寄存器地址40001~40008來讀取CH0~CH7的數(shù)值。以讀取CH0為例,其請(qǐng)求指令如表2所示,返回幀如表3所示。
表2 讀取CH0請(qǐng)求指令
部分代碼如下:
主機(jī)向從機(jī)發(fā)送信息幀時(shí),將CRC(Cyclic Redundancy Check)校驗(yàn)碼一并發(fā)送。CRC校驗(yàn)碼包含2個(gè)字節(jié),即16位二進(jìn)制。CRC校驗(yàn)碼由主機(jī)計(jì)算,放置于發(fā)送信息的尾部。從機(jī)再重新計(jì)算接收到信息的CRC校驗(yàn)碼,比較計(jì)算得到的CRC校驗(yàn)碼是否與接收到的相符,如果兩者不相符,則表明出錯(cuò)[6]。計(jì)算CRC16校驗(yàn)碼的函數(shù)如下:
通過RS-485總線將ADAM4117連接到工控機(jī)的COM2口,讀取溫度傳感器、液位傳感器和氧氣濃度傳感器數(shù)值,上位機(jī)軟件界面如圖4所示。
圖4 軟件界面
打開上位機(jī)調(diào)試程序,對(duì)ADAM4117通訊進(jìn)行測(cè)試,可以正確讀取ADAM4117返回的電流值,經(jīng)過數(shù)據(jù)處理轉(zhuǎn)換為相對(duì)應(yīng)的數(shù)值,如表4所示。
表4 采集的數(shù)據(jù)
本文針對(duì)芯片測(cè)試設(shè)備的液氮補(bǔ)給自動(dòng)控制系統(tǒng)的數(shù)據(jù)采集需求,在VS2010環(huán)境下設(shè)計(jì)開發(fā)了基于Modbus RTU協(xié)議的數(shù)據(jù)采集平臺(tái),實(shí)現(xiàn)上位機(jī)與ADAM4117數(shù)據(jù)采集模塊的Modbus協(xié)議通信,采集各傳感器的電流數(shù)據(jù)。經(jīng)過對(duì)數(shù)據(jù)采集平臺(tái)的測(cè)試,軟件運(yùn)行穩(wěn)定、可靠,能夠?qū)崟r(shí)采集讀取各傳感器反饋的數(shù)據(jù)。