基于嵌入式Linux的無(wú)紙記錄儀通信設(shè)計(jì)
在工業(yè)自動(dòng)化控制系統(tǒng)中,記錄儀起著十分重要的作用,它可以實(shí)時(shí)采集、監(jiān)測(cè)和記錄一些影響工藝過程和產(chǎn)品質(zhì)量的重要參數(shù),被廣泛應(yīng)用于石化、冶金、電力、機(jī)械、醫(yī)藥、輕工業(yè)等行業(yè)。隨著電子技術(shù)的不斷發(fā)展,記錄儀已從傳統(tǒng)的有紙模擬式發(fā)展到如今的無(wú)紙數(shù)字式[1]。與傳統(tǒng)的有紙記錄儀相比,無(wú)紙記錄儀無(wú)機(jī)械磨損、顯示直觀、使用方便、故障率低和設(shè)備耗材少,因此被越來越多的應(yīng)用于工業(yè)控制領(lǐng)域。
本文引用地址:http://butianyuan.cn/article/104913.htm隨著工業(yè)過程自動(dòng)化的高速發(fā)展,企業(yè)對(duì)無(wú)紙記錄儀提出了越來越高的要求,基于8位單片機(jī)的無(wú)紙記錄儀的功能已遠(yuǎn)遠(yuǎn)達(dá)不到用戶的要求。嵌入式ARM微處理核的32位RISC處理器以其強(qiáng)大的性能豐富的接口以及優(yōu)異的性價(jià)比等諸多優(yōu)勢(shì),而被越來越多的應(yīng)用于無(wú)紙記錄儀,隨著硬件的改進(jìn),傳統(tǒng)的串行通訊方法也迫切需要改進(jìn),因此本文提出了基于嵌入式Linux的串口通信方案。嵌入式Linux操作系統(tǒng)是在標(biāo)準(zhǔn)Linux的基礎(chǔ)上針對(duì)嵌入式系統(tǒng)進(jìn)行內(nèi)核裁剪和優(yōu)化后形成[2],它繼承了Linux的開放源代碼、多任務(wù)、穩(wěn)定性高,內(nèi)核可裁剪等諸多優(yōu)點(diǎn),其內(nèi)核精簡(jiǎn)而高效,具有非常好的網(wǎng)絡(luò)性能。本文將使用嵌入式Linux作為無(wú)紙記錄儀上位機(jī)操作系統(tǒng),并利用其多線程編程技術(shù)實(shí)現(xiàn)上位機(jī)與下位機(jī)的串口通信。
1 記錄儀中的通信協(xié)議
由于無(wú)紙記錄儀主要在過程控制現(xiàn)場(chǎng)或監(jiān)控室中使用,與之進(jìn)行通信的現(xiàn)場(chǎng)設(shè)備接口以串口居多,因此在該裝置的開發(fā)過程中采用十分通用的MODBUS協(xié)議作為串口通信協(xié)議。MODBUS協(xié)議是MODICON公司于1979年為建立智能設(shè)備間的主從式通信而開發(fā)的一種通信協(xié)議,它規(guī)定在一個(gè)系統(tǒng)中,每次命令應(yīng)由系統(tǒng)中主設(shè)備發(fā)起,從設(shè)備通過解析地址位決定是否應(yīng)答[3]。該協(xié)議具有兩種報(bào)文傳送幀格式,ASCII和RTU報(bào)文幀格式,分別如圖1和圖2所示。
圖1 ASCII報(bào)文幀格式
圖2 RTU報(bào)文幀格式
將兩種報(bào)文傳送幀格式異同總結(jié)如表1。由表1可知,兩種報(bào)文幀格式各有優(yōu)劣:ASCII格式使用的字符是RTU格式的兩倍,但ASCII格式數(shù)據(jù)的譯碼和處理更為容易一些;使用RTU報(bào)文幀格式傳輸數(shù)據(jù)時(shí),報(bào)文字符必須以連續(xù)數(shù)據(jù)流的形式傳送,而使用ASCII格式,字符之間允許長(zhǎng)達(dá)1s的時(shí)間間隔。
表1 ASCII與RTU報(bào)文幀格式比較
通常情況下,在一個(gè)MODBUS網(wǎng)絡(luò)中只采用一種報(bào)文幀格式進(jìn)行數(shù)據(jù)交換。但在一些特殊情況下,同一系統(tǒng)中需要用到不同傳輸模式的控制器,即同時(shí)采用兩種報(bào)文幀傳輸格式。為了使無(wú)紙記錄儀具有更強(qiáng)的通用性,本文提出了一種新的可同時(shí)使用兩種報(bào)文幀格式的串口通信方案。在以下闡述過程中, 以ASCII和RTU報(bào)文幀格式傳輸?shù)臄?shù)據(jù)將分別簡(jiǎn)稱為ASCII和RTU數(shù)據(jù)。
2 記錄儀的通信實(shí)現(xiàn)
2.1 整體設(shè)計(jì)
無(wú)紙記錄儀主要通信對(duì)象為工業(yè)現(xiàn)場(chǎng)設(shè)備,因此通信過程中數(shù)據(jù)交換應(yīng)快速、準(zhǔn)確無(wú)誤。在MODBUS協(xié)議中,ASCII與RTU數(shù)據(jù)打包與解碼均不相同,數(shù)據(jù)讀寫方面需要獨(dú)立起來。串口通信功能框架如圖3所示。
圖3 串口通信功能框架圖
設(shè)備注冊(cè)掃描模塊主要負(fù)責(zé)設(shè)備地址表的維護(hù),每間隔一定時(shí)間掃描在線設(shè)備,并記錄下設(shè)備地址和使用的報(bào)文幀格式,同時(shí)根據(jù)掃描得到信息動(dòng)態(tài)開辟ASCII和RTU數(shù)據(jù)緩存區(qū)。ASCII數(shù)據(jù)讀寫模塊負(fù)責(zé)打包和解碼ASCII數(shù)據(jù),RTU數(shù)據(jù)讀寫模塊負(fù)責(zé)打包和解碼RTU數(shù)據(jù)。數(shù)據(jù)發(fā)送模塊根據(jù)優(yōu)先級(jí)排列好打包好的數(shù)據(jù)依次發(fā)送。數(shù)據(jù)接收模塊僅解碼下位機(jī)儀表每次傳回?cái)?shù)據(jù)的首位,判斷是RTU數(shù)據(jù)還是ASCII數(shù)據(jù),存入RTU或ASCII數(shù)據(jù)緩存區(qū),以待處理。
為了實(shí)現(xiàn)ASCII與RTU數(shù)據(jù)的共存,首要問題是每次設(shè)備掃描注冊(cè)時(shí)對(duì)使用ASCII和使用RTU數(shù)據(jù)的設(shè)備加以區(qū)分。由ASCII和RTU的報(bào)文幀格式可知,傳輸數(shù)據(jù)首位是判斷數(shù)據(jù)類型的關(guān)鍵,所以使用RTU報(bào)文幀格式的設(shè)備地址需避開ASCII數(shù)據(jù)的起始位和結(jié)束符。在未知在線設(shè)備情況下,上位機(jī)將所有設(shè)備地址輪詢一遍,解析接收數(shù)據(jù)首位,如果是ASCII的起始位,則ASCII設(shè)備注冊(cè),反之,則RTU設(shè)備注冊(cè)。
2.2 編程實(shí)現(xiàn)
軟件實(shí)現(xiàn)上,采用Linux的多線程編程技術(shù),可以更好的滿足工業(yè)現(xiàn)場(chǎng)的實(shí)時(shí)性要求。多線程程序采用多任務(wù)、并發(fā)的工作方式[4],可以提高應(yīng)用程序響應(yīng)時(shí)間并且改善程序結(jié)構(gòu)。Linux操作系統(tǒng)中提供了Linuxthread 庫(kù)[5],它實(shí)現(xiàn)了符合POSIX1003.1c標(biāo)準(zhǔn)的多線程支持,而且是內(nèi)核級(jí)方式。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論