丁振凡,王小明,劉亞男,章 斌
(1.華東交通大學(xué),南昌 330013;2.江西安居兄弟建材有限公司,南昌 330233)
對(duì)生產(chǎn)線運(yùn)營(yíng)狀況的自動(dòng)化監(jiān)控是實(shí)現(xiàn)企業(yè)信息化、精細(xì)化、集成化管理的新要求。由于Web所采用HTTP協(xié)議的無狀態(tài)性,給Web界面的實(shí)時(shí)監(jiān)測(cè)應(yīng)用帶來不少挑戰(zhàn),其中最關(guān)鍵的是數(shù)據(jù)的實(shí)時(shí)傳輸問題。數(shù)據(jù)傳送在技術(shù)層面總體上分為拉方式和推方式兩種,拉方式的典型代表是采用AJAX技術(shù),客戶方定時(shí)輪詢從服務(wù)端取數(shù)據(jù),其最大問題是客戶端請(qǐng)求的頻率與服務(wù)器端數(shù)據(jù)更新頻率不一致會(huì)造成無謂的網(wǎng)絡(luò)流量浪費(fèi),拉方式總體上效率低下。推方式是服務(wù)器端有數(shù)據(jù)更新時(shí),將數(shù)據(jù)推送到客戶端,在HTML5出現(xiàn)前,推方式主要是依靠Socket通信的方法,用Java Applet或Flash作為客戶端,服務(wù)器上也要求編寫配合的服務(wù)程序,并采用多線程管理連接,編程較復(fù)雜,在應(yīng)用中不理想,效率也不高。隨著HTML5的WebSocket技術(shù)的出現(xiàn),在瀏覽器和服務(wù)器之間提供了一個(gè)基于TCP連接的雙向通道[1],為推技術(shù)的應(yīng)用提供了舞臺(tái),它支持基于發(fā)布/訂閱的通信,從而方便基于Web的實(shí)時(shí)應(yīng)用開發(fā)。
本系統(tǒng)將企業(yè)的兩條玻珠生產(chǎn)線整合為一套集中控制系統(tǒng)。通過Web技術(shù)實(shí)現(xiàn)對(duì)兩條生產(chǎn)線上設(shè)備工作狀態(tài)的實(shí)時(shí)監(jiān)測(cè)。可以在網(wǎng)頁上動(dòng)態(tài)顯示煤氣爐、燃?xì)饧訜釥t、膨脹爐、電預(yù)熱爐、料倉、包裝倉等各處設(shè)備的溫度、壓力、轉(zhuǎn)速等數(shù)據(jù)的實(shí)時(shí)變化,并進(jìn)行超限報(bào)警,傳輸數(shù)據(jù)中還包括對(duì)原料使用和包裝產(chǎn)品計(jì)量的信息。為滿足數(shù)據(jù)管理和分析要求,系統(tǒng)同時(shí)實(shí)現(xiàn)數(shù)據(jù)的集中存儲(chǔ),支持?jǐn)?shù)據(jù)的查詢、分析、統(tǒng)計(jì)報(bào)表打印等功能。作為遠(yuǎn)程控制,可在Web界面中實(shí)時(shí)設(shè)置系統(tǒng)的運(yùn)行參數(shù),發(fā)布生產(chǎn)指令等。
系統(tǒng)采用PLC控制獲取來自生產(chǎn)線數(shù)據(jù),通過溫度、壓力以及計(jì)量傳感器獲取數(shù)據(jù),經(jīng)過模擬/數(shù)字轉(zhuǎn)換送PLC。可編程控制器PLC是工業(yè)控制系統(tǒng)中最常用的控制器,它具有抗干擾好,可靠性高的特點(diǎn)[2],每條生產(chǎn)線的PLC連接有一臺(tái)操作顯示終端GOT,執(zhí)行本生產(chǎn)線運(yùn)行參數(shù)設(shè)置、參數(shù)與狀態(tài)顯示、設(shè)備調(diào)整、故障顯示等功能。一臺(tái)工控機(jī)IPC通過2個(gè)串口與2條生產(chǎn)線的PLC的串行通信模塊進(jìn)行通信。IPC通過無線網(wǎng)上網(wǎng),實(shí)現(xiàn)與Web服務(wù)器的通信。用戶通過訪問Web頁面實(shí)現(xiàn)對(duì)生產(chǎn)過程的雙向?qū)崟r(shí)監(jiān)測(cè)。系統(tǒng)基本組成如圖1所示。

圖1 系統(tǒng)基本組成
正向監(jiān)測(cè)中,工控機(jī)將串口通信得到的PLC數(shù)據(jù),通過調(diào)用Web服務(wù)器上的Web服務(wù)參數(shù)傳送到Web服務(wù)器,在Web服務(wù)器上通過WebSocket通信發(fā)布給訂閱消息的瀏覽器。
為實(shí)現(xiàn)反向監(jiān)控,在Web服務(wù)器引入ActiveMQ消息服務(wù)器,瀏覽器可發(fā)送消息給ActiveMQ消息隊(duì)列,由工控機(jī)上Java程序獲取隊(duì)列的消息并經(jīng)串口轉(zhuǎn)發(fā)給PLC。
在整個(gè)應(yīng)用中,瀏覽器與服務(wù)器之間存在三種形式的通信:1)HTTP訪問,用于訪問Web頁面;2)AJAX訪問,用于從瀏覽器頁面訪問Web服務(wù),獲取服務(wù)器存儲(chǔ)的設(shè)備報(bào)警參數(shù)值;3)WebSocket通信,采用STOMP協(xié)議傳輸基于發(fā)布/訂閱的實(shí)時(shí)數(shù)據(jù)。瀏覽器通過HTML5的Canvas和DHTML技術(shù)繪制參數(shù)變化曲線。
Web服務(wù)器采用Tomcat8,消息服務(wù)器采用ActiveMQ,數(shù)據(jù)庫采用mysql。工控機(jī)和Web服務(wù)器上的程序代碼均采用Spring框架編程實(shí)現(xiàn)。Spring是一種輕量級(jí)的開源框架,它通過依賴注入實(shí)現(xiàn)Bean的配置,通過REST風(fēng)格的MVC編程實(shí)現(xiàn)Web服務(wù)[6]。
系統(tǒng)的一級(jí)功能菜單如圖2所示。在下級(jí)菜單中還要選擇具體監(jiān)測(cè)的生產(chǎn)線和具體的子功能。例如,總圖顯示包括:生產(chǎn)線1、生產(chǎn)線2、兩條生產(chǎn)線共3個(gè)選項(xiàng)。參數(shù)顯示時(shí),先選擇生產(chǎn)線,進(jìn)一步再選擇具體的監(jiān)控設(shè)備。

圖2 系統(tǒng)功能菜單
系統(tǒng)的首要功能是實(shí)時(shí)監(jiān)控,根據(jù)應(yīng)用需要,提供了兩種形式監(jiān)測(cè)顯示,總圖顯示在頁面上顯示生產(chǎn)線設(shè)備布置示意圖,在示意圖中對(duì)應(yīng)位置顯示相關(guān)設(shè)備的參數(shù)數(shù)據(jù);參數(shù)顯示則是將監(jiān)測(cè)設(shè)備的各參數(shù)變化分別繪制成曲線。在總圖顯示中含數(shù)據(jù)報(bào)警提示,接收到的數(shù)據(jù)與參數(shù)范圍進(jìn)行比較,到達(dá)報(bào)警值則用紅色顯示數(shù)據(jù)。數(shù)據(jù)查詢用于查詢個(gè)日期范圍中以分鐘為單位的數(shù)據(jù)記錄。系統(tǒng)利用Spring JdbcTemplate實(shí)現(xiàn)數(shù)據(jù)庫的訪問處理[3]。報(bào)表輸出要求在網(wǎng)頁上顯示日?qǐng)?bào)表和月報(bào)表。指令發(fā)布是從Web上發(fā)布指令給生產(chǎn)線上的GOT控制臺(tái)顯示,是一種反向的控制。數(shù)據(jù)分析可實(shí)現(xiàn)當(dāng)前生產(chǎn)情況與某查詢?nèi)掌谇闆r的數(shù)據(jù)可視化對(duì)比。其中,指令發(fā)布和參數(shù)設(shè)置功能需要進(jìn)行用戶認(rèn)證,用戶訪問控制用Spring Security實(shí)現(xiàn)[4]。
整個(gè)應(yīng)用設(shè)計(jì)包括PLC端的編程、工控機(jī)上的編程、Web服務(wù)器端的編程。應(yīng)用系統(tǒng)中各部分之間的數(shù)據(jù)通信是應(yīng)用設(shè)計(jì)的核心,系統(tǒng)通信架構(gòu)如圖3所示,該消息傳遞架構(gòu)的特點(diǎn)是實(shí)現(xiàn)應(yīng)用的松耦合和高效性,同時(shí)方便應(yīng)用的部署,Web服務(wù)器甚至可以部署到云平臺(tái)上。限于篇幅,本文僅討論控制機(jī)和Web服務(wù)端的編程處理,均用Spring框架編程實(shí)現(xiàn)。在圖3中,存在兩種Web服務(wù),兩者均為REST風(fēng)格,但Web服務(wù)1是供IPC的應(yīng)用程序調(diào)用,通過Spring RestTemplate調(diào)用,這種形式的服務(wù)常用于應(yīng)用間消息傳遞;而Web服務(wù)2是供瀏覽器頁面訪問。IPC上的消息監(jiān)聽程序與Web服務(wù)器上ActiveMQ采用異步方式通信。JMS提供了消息監(jiān)聽器接口MessageListener來實(shí)現(xiàn)消息的異步接收,根據(jù)消息事件觸發(fā)執(zhí)行的onMessage方法編程可對(duì)接收消息進(jìn)行處理。

圖3 系統(tǒng)的消息通信傳遞架構(gòu)
瀏覽器與PLC之間雙向信息傳遞的具體實(shí)施步驟 如下:
1)正向?qū)崟r(shí)監(jiān)測(cè)
將生產(chǎn)線數(shù)據(jù)的實(shí)時(shí)傳遞到客戶瀏覽器顯示,用實(shí)線表示。具體過程是:(1)PLC將傳感器得到的數(shù)據(jù)通過串口發(fā)送給工控機(jī)IPC;(2)IPC通過調(diào)用Web服務(wù)將收到的數(shù)據(jù)傳遞給Web服務(wù)器處理;(3)Web服務(wù)器通過WebSocket消息代理將數(shù)據(jù)推送給訂閱了消息的瀏覽器頁面進(jìn)行顯示,同時(shí)數(shù)據(jù)也將記錄到MySql數(shù)據(jù)庫表格中,以便查詢分析。
2)反向發(fā)布指令
反向發(fā)布指令是從瀏覽器發(fā)送數(shù)據(jù)給PLC處理,用虛線表示。具體過程是:(1)在工控機(jī)上的Java應(yīng)用程序通過定義MessageListener對(duì)象實(shí)現(xiàn)對(duì)ActiveMQ消息隊(duì)列的監(jiān)聽;(2)瀏覽器通過HTTP提交消息給相應(yīng)Web服務(wù);(3)Web服務(wù)借助Spring JmsTemplate將消息發(fā)送給ActiveMQ消息服務(wù)器的指定隊(duì)列;(4)消息服務(wù)器通過消息驅(qū)動(dòng)事件監(jiān)聽者的onMessage方法處理消息,將消息通過串口發(fā)送給PLC,PLC收到數(shù)據(jù)后在GOT上顯示。
工控機(jī)的Java應(yīng)用程序負(fù)責(zé)消息的中轉(zhuǎn),一方面接收來自PLC的數(shù)據(jù),將數(shù)據(jù)通過Web服務(wù)傳遞到Web服務(wù)器;另一方面接收來自ActiveMQ消息隊(duì)列的數(shù)據(jù),將數(shù)據(jù)發(fā)送給PLC。
系統(tǒng)利用J2SE提供的擴(kuò)展包c(diǎn)omm.jar實(shí)現(xiàn)串口通信編程[5]。在串口通信編程中,采用多線程技術(shù)監(jiān)聽數(shù)據(jù)并采用字節(jié)緩沖區(qū)存儲(chǔ)數(shù)據(jù)。2條生產(chǎn)線的數(shù)據(jù)分別由IPC的2個(gè)串口讀取。PLC發(fā)送的數(shù)據(jù)每隔4秒傳輸1次,每次傳輸?shù)臄?shù)據(jù)為73字節(jié),其中含供同步識(shí)別的起始和結(jié)束標(biāo)記,每個(gè)參數(shù)的數(shù)據(jù)占2個(gè)字節(jié)。串口數(shù)據(jù)先由消息接收線程逐字節(jié)接收,送到消息緩沖區(qū),在接收到1條生產(chǎn)線數(shù)據(jù)的結(jié)束標(biāo)志時(shí),將緩沖區(qū)數(shù)據(jù)進(jìn)行分析處理,系統(tǒng)自動(dòng)根據(jù)接收到的數(shù)據(jù)特征識(shí)別處理數(shù)據(jù),將分析整理后的數(shù)據(jù)封裝為代表生產(chǎn)線的Java對(duì)象,在經(jīng)過Google的Gson工具包進(jìn)行串行化處理后,通過Web服務(wù)調(diào)用的參數(shù)傳遞發(fā)送給Web服務(wù)器,這里,通過Spring的RestTemplate對(duì)象的getForObject方法調(diào)用部署在Web服務(wù)器上的REST風(fēng)格的Web服務(wù)[6]。
Web服務(wù)器端的編程處理是整個(gè)系統(tǒng)設(shè)計(jì)的難點(diǎn),系統(tǒng)在瀏覽器端的應(yīng)用界面功能均依賴Web服務(wù)端的編程。WebSocket編程處理是Web實(shí)時(shí)監(jiān)測(cè)的關(guān)鍵,通過Spring框架的WebSocket編程支持,可實(shí)現(xiàn)基于發(fā)布/訂閱的數(shù)據(jù)通信,瀏覽器只需要在頁面裝載時(shí)建立與服務(wù)器的WebSocket連接,并發(fā)送相應(yīng)主題的訂閱請(qǐng)求,就可以不斷收到來自服務(wù)器的推送數(shù)據(jù)。
系統(tǒng)采用Spring4框架實(shí)現(xiàn)編程,通過maven實(shí)現(xiàn)工程的依賴管理。Spring框架只有4.0以上版本才支持WebSocket。Spring框架通過簡(jiǎn)單的注解配置就可以定義WebSocket的服務(wù)代理及訪問端點(diǎn)。以下注解配置程序指定采用基于內(nèi)存的簡(jiǎn)單消息代理,在注冊(cè)stomp訪問端點(diǎn)時(shí)設(shè)置支持SockJS連接。其中,“/topic”是消息主題端點(diǎn),瀏覽器訂閱消息以及用服務(wù)器的消息代理對(duì)象發(fā)布消息時(shí),指示消息目標(biāo)隊(duì)列要使用該標(biāo)識(shí)為前綴;“/app”是瀏覽器發(fā)送給服務(wù)器消息代理時(shí)指定消息目標(biāo)的前綴;“/ws”是websocket連接端點(diǎn),SockJs是一個(gè)WebSocket的通信js庫,withSockJS()方法啟用Spring對(duì)js庫的支持。本應(yīng)用中,客戶瀏覽器與Web服務(wù)器建立WebSocket連接時(shí)通過“/monitor/ws”路徑標(biāo)識(shí),其中,monitor為Web應(yīng)用的工程名。各部分的具體使用關(guān)系如圖4所示。Spring4消息代理采用發(fā)布/訂閱的方式工作,消息發(fā)布者將消息發(fā)布到主題隊(duì)列中,由消息代理將消息推送到主題隊(duì)列的訂閱者。

圖4 消息代理配置的訪問標(biāo)識(shí)示意圖
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSo cketMessageBrokerConfigurer {
public void configureMessageBroker(MessageBrok erRegistry config) {
config.enableSimpleBroker("/topic"); //采用簡(jiǎn)單消息代理,指明主題前綴
config.setApplicationDestinationPrefixes("/app");//用于瀏覽器發(fā)送消息
}
public void registerStompEndpoints(StompEndpointR egistry r) {
r.addEndpoint("/ws").withSockJS(); //指定消息代理連接端點(diǎn)
}
}
在Spring框架的控制器的配置中,通過@Controller注解定義控制器,其中允許兩類Mapping并存,一種是@RequestMapping,代表定義REST風(fēng)格的Web服務(wù),接收HTTP請(qǐng)求,相應(yīng)的注解參數(shù)為REST風(fēng)格的URL路徑信息;另一種是@MessageMapping,接收來自瀏覽器發(fā)送的WebSocket消息,相應(yīng)的注解參數(shù)為消息隊(duì)列,并通過所注解方法的參數(shù)獲取相應(yīng)的Java消息對(duì)象。
圖3中Web服務(wù)1用于接收調(diào)用者發(fā)送的來自生產(chǎn)線1的數(shù)據(jù),在服務(wù)處理代碼中將參數(shù)傳遞得到數(shù)據(jù)進(jìn)行反串行化處理轉(zhuǎn)化為代表生產(chǎn)線數(shù)據(jù)的Java對(duì)象,通過依賴注入的SimpMessagingTemplate對(duì)象的convertAndSend方法將Java對(duì)象發(fā)送給WebSocket的主題名為“l(fā)ine1”或“l(fā)ine2”的隊(duì)列,進(jìn)而由消息代理推送給訂閱了該主題的瀏覽器客戶端。
@Controller
public class MvcController {
@Autowired private SimpMessagingTemplate template;
@RequestMapping(“/info/produceline*”)
@ResponseBody
public String lineProcess( @RequestParam(“message”) String mess,
@RequestParam(“l(fā)ine”) String line) {
Gson json = new Gson(); //利用Gson對(duì)象進(jìn)行串行化處理
ProduceLine me = json.fromJson(mess, ProduceLine.class);
template.convertAndSend("/topic/line"+line, me); //發(fā)布消息
return "ok";
}
}
其中,ProduceLine為代表生產(chǎn)線的實(shí)體類,該類中封裝有代表生產(chǎn)線的各種參數(shù)數(shù)據(jù)。應(yīng)用中,為方便Java對(duì)象的傳遞,采用Google公司Gson對(duì)象進(jìn)行串行化處理。
為了進(jìn)行基于SockJs的stomp消息通信。客戶方要用到“sockjs-0.3.4.js”和“stomp.js”。瀏覽器通過執(zhí)行以下Javascript腳本可建立與服務(wù)器的WebSocket連接。以下代碼在連接成功后,客戶方將發(fā)送訂閱主題“l(fā)ine1”的請(qǐng)求給服務(wù)端的消息代理。
var socket = new SockJS(‘/monitor/ws’); //連接服務(wù)器的消息代理
stompClient = Stomp.over(socket); //采用STOMP協(xié)議通信
stompClient.connect({}, function(frame) { //連接成功執(zhí)行以下代碼
stompClient.subscribe('/topic/line1',
function(produceLine){ //收到消息執(zhí)行
mess=JSON.parse(produceLine.body);
…… //利用DHTML顯示數(shù)據(jù)
});
當(dāng)瀏覽器收到主題為“l(fā)ine1”的消息時(shí),將觸發(fā)執(zhí)行函數(shù)function(produceLine)。通過函數(shù)參數(shù)中的body屬性可得到消息內(nèi)容,服務(wù)器發(fā)送的消息均進(jìn)行了串行化,客戶方通過用JSON.parse分析將消息內(nèi)容轉(zhuǎn)化為Java對(duì)象,通過訪問對(duì)象的屬性可得到來自生產(chǎn)線各設(shè)備的參數(shù)值,利用DHTML技術(shù)在頁面上顯示。
瀏覽器與Web服務(wù)器之間這種發(fā)布/訂閱通信是一種高效靈活的消息推送機(jī)制。來自串口的生產(chǎn)線數(shù)據(jù)可以推送給所有瀏覽器的訂閱者,某頁面中也可以通過訂閱不同的主題來獲取來自不同發(fā)布者的數(shù)據(jù)。
系統(tǒng)提供了總圖顯示和參數(shù)顯示兩種形式的數(shù)據(jù)監(jiān)測(cè)。在總圖顯示中,如圖5所示,利用仿真生產(chǎn)線各工序流程的圖形作為頁面顯示背景,在圖形的對(duì)應(yīng)位置利用DHTML技術(shù)顯示相關(guān)的參數(shù)數(shù)據(jù),從而能直觀形象地觀測(cè)到生產(chǎn)線上各工序的生產(chǎn)狀況。在總圖顯示的實(shí)時(shí)監(jiān)控中,當(dāng)前數(shù)據(jù)到達(dá)報(bào)警值時(shí)要用紅色顯示數(shù)據(jù)。為了方便客戶方對(duì)參數(shù)的報(bào)警值和目標(biāo)值的讀取,系統(tǒng)采用HTML5的本地存儲(chǔ)技術(shù),每次報(bào)警檢查只要與客戶方的本地存儲(chǔ)變量進(jìn)行比較即可。為檢查本地存儲(chǔ)是否最新設(shè)置,可專門引入一個(gè)時(shí)間變量,當(dāng)本地記錄的時(shí)間變量與服務(wù)器參數(shù)設(shè)置的時(shí)間變量不一致,則代表參數(shù)設(shè)置有變,系統(tǒng)利用AJAX技術(shù)獲取存儲(chǔ)在服務(wù)器上的XML參數(shù)配置信息。可在網(wǎng)頁加載時(shí)進(jìn)行參數(shù)變化檢查,并通過WebSocket通道訂閱參數(shù)變化消息,來跟蹤參數(shù)的變化,特權(quán)賬戶每次更改參數(shù)將發(fā)布參數(shù)變化消息,如此可保持客戶本地存儲(chǔ)的參數(shù)信息與服務(wù)器上XML文件中配置信息的同步一致。應(yīng)用效率也能保持高效。

圖5 總圖顯示
在參數(shù)曲線顯示中,采用HTML5的canvas實(shí)現(xiàn)各監(jiān)控項(xiàng)目的數(shù)據(jù)變化曲線的圖形繪制,如圖6所示。Canvas實(shí)現(xiàn)曲線繪制過程:1)用Canvas的getContext("2d")取得圖形環(huán)境,后面的操作均針對(duì)圖形環(huán)境對(duì)象進(jìn)行訪問;2)用strokeStyle屬性設(shè)置顏色;3)用其moveTo方法定位起點(diǎn);4)用lineTo方法定位要經(jīng)過的點(diǎn);5)用stroke()方法實(shí)現(xiàn)線條填充繪制。但要注意,為了在同一畫布中繪制不同顏色的曲線,每次繪制新線條前要使用beginPath()方法進(jìn)行設(shè)置,否則,Canvas會(huì)用最后的顏色去填充所有的線條。

圖6 參數(shù)顯示
上面的曲線繪制的內(nèi)容是當(dāng)前時(shí)刻生產(chǎn)線的數(shù)據(jù),對(duì)于本班已有數(shù)據(jù)應(yīng)先行繪制,系統(tǒng)采用AJAX技術(shù)獲取數(shù)據(jù),在服務(wù)器上還將來自生產(chǎn)線的數(shù)據(jù)存儲(chǔ)在一個(gè)數(shù)組列表中,數(shù)組列表的內(nèi)容動(dòng)態(tài)增加。如此,可保證查看不同參數(shù)時(shí)能看到完整的曲線變化。
根據(jù)用戶需求,系統(tǒng)設(shè)計(jì)了多種查詢和報(bào)表,包括每天各班種的日生產(chǎn)統(tǒng)計(jì)報(bào)表,企業(yè)的月統(tǒng)計(jì)報(bào)表。本系統(tǒng)是要在Web頁面中顯示報(bào)表,系統(tǒng)利用Spring框架的PDF視圖實(shí)現(xiàn)報(bào)表顯示,在訪問控制器設(shè)計(jì)時(shí),通過REST的訪問參數(shù)得到報(bào)表需要的參數(shù)數(shù)據(jù),將參數(shù)數(shù)據(jù)填入模型傳遞給視圖。Spring的AbstractPdfView抽象類用于生成PDF格式的視圖,通過覆蓋該類的buildPdfDocument方法可將代碼產(chǎn)生的PDF文檔送客戶端。系統(tǒng)利用iText組件實(shí)現(xiàn)PDF報(bào)表的動(dòng)態(tài)生成[7]。報(bào)表處理需要引入com.lowagie.text依賴,但注意com.lowagie.text引入的jar包不支持中文,需要進(jìn)行特殊處理。本系統(tǒng)采用Window系統(tǒng)的字體來構(gòu)建基本字體對(duì)象。
BaseFont basefont = BaseFont.createFont("c:\windows\fonts\simkai.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
在基本字體的基礎(chǔ)上,表格內(nèi)容使用的字體可再設(shè)置具體的大小。例如:
Font myfont= new Font(basefont, 18);
借助PdfPTable及相關(guān)類可容易編程方式生成報(bào)表,并實(shí)現(xiàn)報(bào)表數(shù)據(jù)的動(dòng)態(tài)填寫。最后,視圖返回給瀏覽器的就是一個(gè)PDF報(bào)表文檔,客戶可打印或另存該文檔。
根據(jù)廠商要求,需要按白班和晚班進(jìn)行生產(chǎn)數(shù)據(jù)的統(tǒng)計(jì)。19:00前開機(jī)為白班,19:00以后開機(jī)為晚班。連續(xù)作業(yè)到19:00時(shí)自動(dòng)轉(zhuǎn)為晚班狀態(tài),連續(xù)作業(yè)到早上7:00時(shí)自動(dòng)轉(zhuǎn)為白班狀態(tài)。在換班時(shí)要對(duì)統(tǒng)計(jì)變量進(jìn)行初始化。另外系統(tǒng)要求每隔1分鐘要對(duì)期間的數(shù)據(jù)進(jìn)行1次分析處理,將數(shù)據(jù)寫入歷史表,以便日后統(tǒng)計(jì)分析。Spring框架提供的任務(wù)定時(shí)機(jī)制可容易實(shí)現(xiàn)此類應(yīng)用需求,最直觀高效的是采用@Scheduled注解的方法[8]。只需要在方法前加上@Scheduled注解,并通過cron表達(dá)式或者fixedDelay就可讓方法按指定的時(shí)刻或間隔定時(shí)執(zhí)行。例如,@Scheduled(cron = "0 0 7 * * ?") 指定每天早7點(diǎn)執(zhí)行, @Scheduled(fixedDelay = 60000) 指定每隔1分執(zhí)行。
本文介紹的企業(yè)生產(chǎn)線監(jiān)測(cè)系統(tǒng)采用分布式架構(gòu)方式,通過引入Web服務(wù)和消息隊(duì)列實(shí)現(xiàn)應(yīng)用各組成部分之間數(shù)據(jù)傳遞的松耦合。實(shí)際企業(yè)中由于場(chǎng)地條件,工控機(jī)采用無線上網(wǎng),而Web服務(wù)器可以部署在Internet的任何一臺(tái)服務(wù)器上。來自PLC生產(chǎn)線數(shù)據(jù)通過數(shù)據(jù)傳輸,可及時(shí)傳遞到Web服務(wù)器上,并通過基于WebSocket的發(fā)布/訂閱通信實(shí)時(shí)推送到瀏覽器客戶端。
該系統(tǒng)通過統(tǒng)一的架構(gòu)對(duì)來自企業(yè)的兩條生產(chǎn)線的數(shù)據(jù)實(shí)施監(jiān)控。通過Web服務(wù)的參數(shù)區(qū)分?jǐn)?shù)據(jù)所處生產(chǎn)線,可以對(duì)兩條生產(chǎn)線同時(shí)進(jìn)行監(jiān)測(cè)、并自動(dòng)實(shí)現(xiàn)數(shù)據(jù)記錄和統(tǒng)計(jì)。有效提升了企業(yè)的產(chǎn)品管理能力,有利于企業(yè)產(chǎn)品質(zhì)量監(jiān)督和控制。
[1] 李慧云,何震葦,李麗,等.HTML5技術(shù)與應(yīng)用模式研究[J].電信科學(xué),2012.5:24-29.
[2] 戚立強(qiáng),葉文華,陳蔚芳,等.基于PLC的廢金屬破碎生產(chǎn)線監(jiān)控系統(tǒng)設(shè)計(jì)[J].制造業(yè)自動(dòng)化,2014.36(1):117-119.
[3] 丁振凡.Spring REST風(fēng)格Web服務(wù)的Json消息封裝及解析研究[J].智能計(jì)算機(jī)與應(yīng)用,2012.2(2):9-11.
[4] 丁振凡,李馨梅.基于JdbcTemplate的數(shù)據(jù)庫訪問處理[J].智能計(jì)算機(jī)與應(yīng)用,2012.2(3):29-32.
[5] 丁振凡.基于Spring Security的Web資源訪問控制[J].宜春學(xué)院學(xué)報(bào),2012.34(8):71-74.
[6] 丁振凡,王小明,鄧建明,等.基于Java的串口通信應(yīng)用編程[J].微型機(jī)與應(yīng)用,2012.31(13):84-86.
[7] 丁振凡,王小明,吳小元,等.利用iText包實(shí)現(xiàn)Java報(bào)表打印[J].微型機(jī)與應(yīng)用,2012.31(18):84-86.
[8] 丁振凡.Spring3.x編程技術(shù)與應(yīng)用[M].北京:北京郵電大學(xué)出版社,2013.8.