羅 林,庹先國(guó),張貴宇,3,王 昆,高 婧
(1.四川輕化工大學(xué) 自動(dòng)化與信息工程學(xué)院,四川 宜賓 644000;2.四川輕化工大學(xué) 人工智能四川省重點(diǎn)實(shí)驗(yàn)室,四川 宜賓 644000;3.西南科技大學(xué) 信息工程學(xué)院,四川 綿陽(yáng) 621010)
在白酒固態(tài)發(fā)酵環(huán)節(jié),發(fā)酵溫度與窖內(nèi)微生物的新陳代謝相互影響,間接導(dǎo)致白酒品質(zhì)受到影響。發(fā)酵時(shí)入窖溫度偏高,會(huì)使發(fā)酵過(guò)程中的升溫速度過(guò)快,可能導(dǎo)致酵母菌活性降低,從而引發(fā)白酒品質(zhì)下降等問(wèn)題。入窖溫度適宜,則釀造的酒大多品質(zhì)較高。對(duì)于整個(gè)發(fā)酵周期,溫度需滿足“前緩、中挺、后緩落”的變化趨勢(shì)。
鑒于發(fā)酵溫度對(duì)白酒品質(zhì)的影響,各大酒企對(duì)白酒固態(tài)發(fā)酵過(guò)程中的溫度數(shù)據(jù)十分關(guān)注。傳統(tǒng)的白酒釀造過(guò)程中利用人工監(jiān)測(cè)方式對(duì)發(fā)酵過(guò)程中的溫度數(shù)據(jù)進(jìn)行監(jiān)測(cè),以溫度計(jì)作為數(shù)據(jù)采集手段,利用紙質(zhì)方式記錄和存儲(chǔ),但存在數(shù)據(jù)誤差大、時(shí)效性差及人工成本高等問(wèn)題。近年來(lái),各白酒企業(yè)為提高生產(chǎn)效率紛紛投入到自動(dòng)化釀造研究中,欲借助自動(dòng)化技術(shù)實(shí)現(xiàn)白酒的信息化、智能化生產(chǎn),以技術(shù)創(chuàng)新降低人力成本,同時(shí)提高生產(chǎn)效率?,F(xiàn)已實(shí)現(xiàn)潤(rùn)糧、裝甑、流酒等工序的自動(dòng)化,但發(fā)酵過(guò)程中的自動(dòng)化技術(shù)發(fā)展卻相對(duì)滯后,無(wú)論是數(shù)據(jù)存儲(chǔ)還是發(fā)酵過(guò)程可視化方面都并未有有效的監(jiān)測(cè)軟件。針對(duì)發(fā)酵環(huán)節(jié)自動(dòng)化水平的滯后性以及發(fā)酵溫度的重要性,以發(fā)酵溫度為主要研究對(duì)象,借助Android設(shè)備便攜、開(kāi)發(fā)成本低等優(yōu)點(diǎn),設(shè)計(jì)了一款白酒發(fā)酵過(guò)程信息化監(jiān)測(cè)軟件,為白酒行業(yè)在發(fā)酵過(guò)程中實(shí)現(xiàn)精確化控制、數(shù)字化管理提供條件,突破人工監(jiān)測(cè)的局限。
本設(shè)計(jì)以Android為載體進(jìn)行人機(jī)交互環(huán)境的搭建,借助移動(dòng)設(shè)備的便攜性解決發(fā)酵現(xiàn)場(chǎng)難以隨時(shí)隨地監(jiān)控的問(wèn)題。信息化監(jiān)測(cè)軟件以C/S模式設(shè)計(jì),由服務(wù)器和客戶端組成。軟件結(jié)構(gòu)如圖1所示。服務(wù)器內(nèi)部的數(shù)據(jù)分析模塊可對(duì)數(shù)據(jù)進(jìn)行邏輯處理,為客戶端進(jìn)行正確應(yīng)答,客戶端負(fù)責(zé)與用戶交互,并為用戶呈現(xiàn)發(fā)酵過(guò)程中產(chǎn)生的實(shí)時(shí)數(shù)據(jù)。
圖1 軟件結(jié)構(gòu)
為滿足實(shí)際需求,軟件總體功能模塊分為管理功能和基礎(chǔ)功能兩大部分,其中管理功能模塊負(fù)責(zé)軟件中車(chē)間的創(chuàng)建與刪除、車(chē)間窖池信息鎖定及各項(xiàng)報(bào)警閾值的設(shè)定?;A(chǔ)功能模塊分為用戶模塊、發(fā)酵概況模塊、報(bào)警模塊和窖池詳情模塊,用于展示分析或者響應(yīng)結(jié)果。功能結(jié)構(gòu)關(guān)系如圖2所示。
圖2 功能結(jié)構(gòu)
軟件所有交互性功能模塊均在Login_Activity、Home_Activity和WorkShop_Activity三個(gè)自定義Activity中實(shí)現(xiàn),各Activity與功能模塊的關(guān)系如圖3所示。Activity間通過(guò)Intent對(duì)象傳遞用戶等級(jí)和狀態(tài)標(biāo)志等信息,進(jìn)行正確的資源更新。
圖3 Activity關(guān)系
Home_Activity作為軟件的主頁(yè),需要將每個(gè)車(chē)間的整體發(fā)酵情況呈現(xiàn)給工作人員,空間壓力較大。鑒于Viewpager左右滑動(dòng)的特性,可成功解決空間占用問(wèn)題,故本軟件利用Viewpager+Fragment,通過(guò)滑頁(yè)的方式將發(fā)酵概況模塊與報(bào)警模塊進(jìn)行顯示。由于Viewpager內(nèi)部機(jī)制的原因,會(huì)加載用戶不需要的資源,導(dǎo)致資源浪費(fèi),運(yùn)行速率降低,為處理資源問(wèn)題,本軟件采用懶加載機(jī)制進(jìn)行資源加載。
懶加載機(jī)制可讓軟件在用戶可見(jiàn)時(shí)加載資源,降低軟件任務(wù)量??赏ㄟ^(guò)監(jiān)聽(tīng)Viewpager滾動(dòng)或調(diào)用Fragment內(nèi)部API兩種方式實(shí)現(xiàn),為使軟件具有更好的封裝性,本軟件采用調(diào)用Fragment內(nèi)部API的方式。
Fragment內(nèi)部的setUserVisibleHint函數(shù)會(huì)在用戶可見(jiàn)時(shí)調(diào)用,故Viewpager加載機(jī)制加載的Fragment不會(huì)執(zhí)行此函數(shù),基于此在 Fragment的生命周期函數(shù)和setUserVisibleHint函數(shù)中做邏輯處理即可成功實(shí)現(xiàn)懶加載機(jī)制。
本軟件的車(chē)間管理功能可以根據(jù)企業(yè)車(chē)間情況對(duì)車(chē)間進(jìn)行創(chuàng)建與刪除,將想要觀測(cè)的車(chē)間添加到軟件上,同時(shí)也可將無(wú)需觀測(cè)的車(chē)間從軟件上刪除。車(chē)間管理功能由Recyclerview、Viewpager、自定義的SaveStatue類 以及PopupWindow共同實(shí)現(xiàn)。Recyclerview作為軟件的車(chē)間條目,可以保證軟件使用的流暢性。SaveStatue是SharePreference的一個(gè)封裝類,通過(guò)鍵值對(duì)對(duì)必要數(shù)據(jù)進(jìn)行保存,用于保存軟件狀態(tài)信息。車(chē)間創(chuàng)建的窗口由PopupWindow實(shí)現(xiàn)。功能執(zhí)行流程如圖4所示。
圖4 車(chē)間管理執(zhí)行流程
車(chē)間創(chuàng)建完成后需要對(duì)車(chē)間進(jìn)行窖池信息匹配,建立好待監(jiān)測(cè)窖池ID與車(chē)間之間的關(guān)聯(lián),從而獲取正確的數(shù)據(jù)信息。為減少重復(fù)布局,車(chē)間窖池鎖定功能利用自定義的窖池選擇控件實(shí)現(xiàn),考慮到存在車(chē)間窖池?cái)?shù)量太多的情況,將匹配方式分為點(diǎn)擊匹配和輸入匹配兩種。點(diǎn)擊匹配為工作人員提供一個(gè)含有所有窖池ID的復(fù)選框界面,工作人員可勾選車(chē)間包含的ID進(jìn)行匹配設(shè)置。輸入匹配為工作人員提供一個(gè)區(qū)間輸入的界面,有上限和下限兩個(gè)輸入項(xiàng),當(dāng)兩個(gè)項(xiàng)輸入內(nèi)容相同時(shí)表示匹配一個(gè)窖池ID,否則表示匹配區(qū)間內(nèi)所有ID。設(shè)置信息會(huì)由自定義窖池選擇控件傳到Fragment,再由Fragment傳到Activity中利用SharePreference進(jìn)行持久化處理。自定義窖池選擇控件、Fragment、Activity之間通過(guò)接口通信。功能執(zhí)行流程如圖5所示。
圖5 窖池ID匹配流程
在本軟件開(kāi)發(fā)中需要用到大量的重復(fù)布局,使用Android原生UI將會(huì)使程序結(jié)構(gòu)臃腫,不僅開(kāi)發(fā)效率低而且維護(hù)成本也較高。為提升開(kāi)發(fā)效率和維護(hù)性,選擇控件與本軟件的自定義UI均通過(guò)自定義組合控件的方式實(shí)現(xiàn),實(shí)現(xiàn)步驟如下:(1)將原生UI進(jìn)行組合布局到XML文件中;(2)在Values.attrs.xml文件中為自定義組合控件設(shè)置屬性集;(3)自定義UI類繼承布局基類LinearLayout或RelativeLayout,構(gòu)造方法中獲取屬性設(shè)置信息,并在此類中定義好相應(yīng)交互接口。
當(dāng)車(chē)間的窖池ID設(shè)置完成后,Android端會(huì)將設(shè)置的車(chē)間窖池ID發(fā)送到服務(wù)器,獲取該車(chē)間所有窖池的溫度數(shù)據(jù)以及測(cè)溫設(shè)備的電量等信息,為工作人員提供數(shù)據(jù)展示。為避免ANR現(xiàn)象,采用異步任務(wù)的方式進(jìn)行網(wǎng)絡(luò)請(qǐng)求。數(shù)據(jù)展示共有普通展示模式和列表展示模式兩種,每種模式對(duì)應(yīng)一種自定義的窖池UI。一個(gè)自定義窖池UI對(duì)應(yīng)一口窖池信息,以輪詢的方式進(jìn)行實(shí)時(shí)數(shù)據(jù)獲取并更新。溫度曲線繪制由MPAndroidChart實(shí)現(xiàn),將每個(gè)窖池在本發(fā)酵周期內(nèi)一定量的溫度數(shù)據(jù)分上中下三層進(jìn)行繪制。此外,還提供了入窖日期篩選、溫度篩選以及發(fā)酵天數(shù)篩選3個(gè)子篩選功能,用戶可根據(jù)需求按照酒培入窖日期、酒培上中下三層溫度、酒培已發(fā)酵天數(shù)進(jìn)行數(shù)據(jù)篩選。
輪詢主要以Service、BroadcastReceiver、AlarmManager三大組件實(shí)現(xiàn)。當(dāng)開(kāi)啟服務(wù)時(shí),在Service內(nèi)部動(dòng)態(tài)注冊(cè)廣播監(jiān)聽(tīng)器,并開(kāi)設(shè)用于通知Activity更新數(shù)據(jù)顯示的線程,然后利用AlarmManager設(shè)置定時(shí)任務(wù),到達(dá)設(shè)定時(shí)間時(shí)激活廣播,廣播反向激活Service,并發(fā)送線程使能標(biāo)志到Service,此時(shí)被再次激活的Service便會(huì)啟用線程,對(duì)服務(wù)器發(fā)起訪問(wèn),實(shí)現(xiàn)實(shí)時(shí)更新。
報(bào)警功能如下:
(1)報(bào)警綜合顯示是將測(cè)溫設(shè)備電量異常、服務(wù)器異常、入窖溫度過(guò)高、入窖溫度過(guò)低、頂火溫度過(guò)高、頂火溫度過(guò)低、頂火溫度出現(xiàn)過(guò)早、頂火溫度出現(xiàn)過(guò)遲8個(gè)方面的異常情況放于主頁(yè)進(jìn)行綜合顯示,以輪詢的方式向服務(wù)器不斷檢測(cè)是否發(fā)生異常,根據(jù)報(bào)警數(shù)據(jù)量動(dòng)態(tài)生成TextView控件并布置到主頁(yè)對(duì)應(yīng)布局進(jìn)行顯示。
(2)報(bào)警分類顯示是依據(jù)8個(gè)報(bào)警項(xiàng)設(shè)8個(gè)報(bào)警條目,當(dāng)用戶點(diǎn)擊某個(gè)條目時(shí)以彈窗顯示該車(chē)間內(nèi)哪些窖池有此異常,以及這些窖池何處出現(xiàn)異常。
(3)報(bào)警歸檔功能會(huì)將報(bào)警信息保存到Android本地,由File類和IO流實(shí)現(xiàn),當(dāng)發(fā)現(xiàn)某車(chē)間有窖池存在發(fā)酵異常時(shí),軟件先借助Context的getExernalFilesDir獲取本應(yīng)用程序在Android設(shè)備中的存儲(chǔ)路徑,然后利用File類在該路徑下創(chuàng)建該車(chē)間的報(bào)警文件夾,結(jié)合輸出流將報(bào)警信息歸檔到本地存儲(chǔ)。當(dāng)進(jìn)行歸檔數(shù)據(jù)讀取時(shí),軟件會(huì)利用輸入流對(duì)對(duì)應(yīng)車(chē)間的歸檔文件夾進(jìn)行查詢,以動(dòng)態(tài)布局的方式顯示歸檔數(shù)據(jù)。
發(fā)酵天數(shù)概況模塊用于對(duì)某車(chē)間中發(fā)酵天數(shù)在一定區(qū)間范圍內(nèi)的窖池進(jìn)行數(shù)量統(tǒng)計(jì),以柱形圖的方式展示。
由于白酒發(fā)酵主要關(guān)注“前緩”和“中挺”兩個(gè)階段,而濃香型白酒一般在發(fā)酵后的15~30天內(nèi)結(jié)束“中挺”階段,故橫坐標(biāo)上共設(shè)10個(gè)刻度點(diǎn),每個(gè)刻度點(diǎn)表示一個(gè)發(fā)酵天數(shù)區(qū)間,針對(duì)發(fā)酵天數(shù)區(qū)間從“1~3天”以三天為一段一直到“28~30天”的窖池?cái)?shù)量進(jìn)行柱形圖繪制,柱形圖繪制以MPAndroidChart實(shí)現(xiàn)。
除對(duì)對(duì)應(yīng)發(fā)酵天數(shù)的窖池?cái)?shù)量進(jìn)行展示外,為顯示對(duì)應(yīng)天數(shù)區(qū)間的窖池具體情況,還針對(duì)“數(shù)量”設(shè)立了詳情功能。詳情功能通過(guò)OnChartValueSelectedListen接口監(jiān)聽(tīng)柱形圖是否被點(diǎn)擊,點(diǎn)擊事件被觸發(fā)則獲取對(duì)應(yīng)的刻度信息,即天數(shù)區(qū)間,并調(diào)用異步任務(wù)將其作為參數(shù)傳至服務(wù)器查詢,以PopupWindow和Fragment形成的彈窗對(duì)結(jié)果進(jìn)行展示。
數(shù)據(jù)庫(kù)是軟件的基礎(chǔ),良好的數(shù)據(jù)庫(kù)可以為軟件運(yùn)行提供有力支撐。設(shè)計(jì)時(shí)需充分考慮數(shù)據(jù)完整性、冗余性等問(wèn)題,以避免出現(xiàn)刪除異常、更新異常等情況。本軟件采用SQL Server數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)存儲(chǔ)。為提高軟件運(yùn)行效率,以范式標(biāo)準(zhǔn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行限制和設(shè)計(jì)。
3.1.1 信息表設(shè)計(jì)
根據(jù)實(shí)際企業(yè)需求,需要對(duì)發(fā)酵過(guò)程中各車(chē)間中各窖池的設(shè)備狀態(tài)以及產(chǎn)生的溫度數(shù)據(jù)進(jìn)行存儲(chǔ),據(jù)此分析可得到車(chē)間、窖池、記錄信息和測(cè)溫設(shè)備4大實(shí)體,各實(shí)體間的屬性以及邏輯結(jié)構(gòu)如圖6所示。Workshop對(duì)應(yīng)實(shí)體車(chē)間,Pit對(duì)應(yīng)實(shí)體窖池,Record_Info對(duì)應(yīng)實(shí)體記錄信息,Equip_Measure對(duì)應(yīng)實(shí)體測(cè)溫設(shè)備。
圖6 E-R圖
4大實(shí)體分別對(duì)應(yīng)車(chē)間信息表、窖池信息表、記錄信息表和設(shè)備信息表。車(chē)間信息表用于記錄生產(chǎn)車(chē)間的基礎(chǔ)信息。窖池信息表記錄發(fā)酵窖池的基礎(chǔ)信息。記錄信息表記錄對(duì)應(yīng)發(fā)酵過(guò)程中產(chǎn)生的重要信息,如上中下三層的發(fā)酵溫度、溫度采集時(shí)間等。測(cè)溫設(shè)備信息表記錄測(cè)溫設(shè)備的基礎(chǔ)信息,如測(cè)溫設(shè)備型號(hào)、設(shè)備購(gòu)入時(shí)間等。以記錄信息表結(jié)構(gòu)為例進(jìn)行展示,見(jiàn)表1所列。
表1 記錄信息表
3.1.2 表間關(guān)系結(jié)構(gòu)
各表之間的關(guān)系可通過(guò)主鍵和外鍵進(jìn)行構(gòu)造,以保證實(shí)體完整性和數(shù)據(jù)完整性。如窖池ID可以對(duì)窖池信息表進(jìn)行唯一標(biāo)志,在記錄表中又可以將窖池ID設(shè)立為外鍵,保證數(shù)據(jù)一致性,表間關(guān)系結(jié)構(gòu)如圖7所示。
圖7 EDR圖
服務(wù)器是在.Net框架下創(chuàng)建的一個(gè)Web服務(wù)端,由WebService和ADO.Net實(shí)現(xiàn),負(fù)責(zé)對(duì)客戶端請(qǐng)求進(jìn)行相應(yīng)的業(yè)務(wù)處理,并返回處理結(jié)果,為客戶端提供計(jì)算支持。
WebService以消息互操作的方式完成分布式計(jì)算,具有跨軟件操作的優(yōu)點(diǎn),利用WebService向Android客戶端提供訪問(wèn)接口,以完成PC與Android的信息交互,Web服務(wù)端與客戶端之間以Soap協(xié)議通信,本軟件利用Ksoap2進(jìn)行消息的序列化處理,遠(yuǎn)程調(diào)用Web服務(wù)接口。
ADO.Net是.Net框架下的數(shù)據(jù)庫(kù)訪問(wèn)組件,通過(guò)Connection、Command、DataReader和 DataAdapter四 大 核心元素完成數(shù)據(jù)庫(kù)信息交互。
該軟件的實(shí)現(xiàn)使得現(xiàn)場(chǎng)監(jiān)測(cè)的人力成本下降,由現(xiàn)場(chǎng)監(jiān)測(cè)變成了移動(dòng)監(jiān)測(cè)。引入懶加載機(jī)制后數(shù)據(jù)加載速度獲得了極大提升。具體數(shù)據(jù)見(jiàn)表2、表3所列。
表2 懶加載效率表
表3 人力成本使用情況表
考察了實(shí)際發(fā)酵工藝環(huán)節(jié)后,從實(shí)用性、穩(wěn)定性、可拓展性等方面入手設(shè)計(jì)并實(shí)現(xiàn)了發(fā)酵溫度信息化應(yīng)用軟件,使得人工現(xiàn)場(chǎng)監(jiān)測(cè)變成了移動(dòng)監(jiān)測(cè),改變了白酒行業(yè)傳統(tǒng)的數(shù)據(jù)監(jiān)測(cè)方式,大大提升了監(jiān)測(cè)效率,為發(fā)酵環(huán)節(jié)的數(shù)字化、信息化、精細(xì)化提供了基礎(chǔ)。軟件在設(shè)計(jì)上充分考慮了發(fā)酵溫度的重要性,從基礎(chǔ)信息展示、異常數(shù)據(jù)報(bào)警,以及數(shù)據(jù)統(tǒng)計(jì)等方面完成了發(fā)酵過(guò)程中溫度數(shù)據(jù)的有效監(jiān)測(cè),此外,還提供了測(cè)溫設(shè)備信息展示功能。在實(shí)現(xiàn)上以輪詢方式保證數(shù)據(jù)實(shí)時(shí)更新,通過(guò)懶加載方式減輕資源壓力。
物聯(lián)網(wǎng)技術(shù)2022年10期