5 實例
以一個交流調速網絡監控系統為例說明網絡監控軟件的開發。系統組成見圖2。
圖2 交流調速網絡監控系統
系統采用Java結合C++進行系統設計。需要用到Java Socket、JNI、JDBC、Java多線程以及C++ DLL等應用。
(1) 現場端實現現場數據的收集
① 由JNI調用C++ DLL實現轉速反饋數據的采集
系統由JNI調用操作數據采集卡的DLL完成實時數據的采集。如類ACTimingNC.java
public class ACTimingNC
{ ......
public native short inport(short port); //聲明本地方法inport(),
public native void outport(short port,int value); //聲明本地方法outport()
public native float sample(short base,int num);//聲明本地方法sample()
static{ System.loadLibrary("PCL8112.dll");} //調入本地庫
//聲明三種本地方法:inport()用于返回數據采集卡端口號,outport()用于向指定的端口輸出數值,sample()用于啟動采樣,返回采集到的數據。
public static void main(String args[])
{ ACTimingNC ACtiming=new ACTimingNC("交流調速網絡監控現場端");
...... } }
然后在命令提示符下鍵入javac ACTimingNC.java進行編譯生成ACTimingNC.class,再運行javah ACTimingNC,得到C++文件ACTimingNC.h,然后編制相應的ACTimingNC.cpp文件實現對應的本地方法即可,最后編譯形成動態鏈接庫DLL文件,放到應用程序路徑下。運行時就實現了Java調用DLL對硬件的操作。
② Java串口包實現對變頻器的參數查詢和控制
利用Sun公司提供的串口包,再結合臺達變頻器的控制協議,就可以實現雙方的數據交流了。例如控制命令串的發送代碼如下:
import java.io.*;import java.util.*;import javax.comm.*;
class SerialportIO
{ public static void main(String args[])
{ …… //得到對串口COM1的控制權
try{ serialPort.setSerialPortParams(4800,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_ODD);
//實施臺達變頻器串口協議:波特率、數據位、停止位和奇偶校驗位分別為4800、8、1、O(奇校驗)。
}catch(UnsupportedCommOperationException e3){}
try{ String s="......"; //s為控制命令串,具體參照說明書
os.writeUTF(s); }catch(IOException e3){} }}}}}
(2) 由Java Socket實現數據在現場端和服務器端的傳輸
例如從現場端向服務器端傳送數據:由現場端提交監測數據,數據服務器端接收數據。現場端部分代碼如下:
public class SceneServer //數據服務器端
{ public static void main(String args[])
{ try{ Socket socket=new Socket("202.199.133.46",PORT); //與服務器建立連接
PrintStream os=new PrintStream(wss.getOut- putStream()); //輸出流
DataInputStream is=new DataInputStream(wss.get- InputStream());//輸入流
StringBuffer buf=new StringBuffer(100); //定義數據緩沖區
... ...//進行數據發送
}catch(IOException e) {} } }
在數據服務器端,考慮到以后系統的擴展,可能有多臺現場端智能設備提出發送數據請求,所以程序必須實現多線程。部分代碼如下:
public class DSServer //數據服務器端
{ public static final PORT=5000; ServerSocket ss=null; Socket s=null;
public static void main(String args[])
{ try{ ss=new ServerSocket(PORT);
while(true) {s=ss.accept(); new ServerThread(s).start(); }
}catch(IOException e1) {} ... ... } }
class ServerThread extends Thread
{ Socket socket=null;
ServerThread(Socket socket)
{ super("ServerThread"); this.socket=socket; }
public void run()
{ ……//接通輸入輸出流,實現數據傳輸以及操作到庫。 } }
這段程序由兩個類組成,主類SceneServer負責建立處理連接請求,線程類ServerThread用于創建一個新的線程,負責處理現場端的輸入輸出請求。反方向的控制信息傳輸只要加入相應代碼即可。
(3) 服務器端采用JSP結合Java Bean實現監控
① 由JDBC訪問SQL Server2000數據庫
對于本系統,在SQL Server中需建立用戶表Users、設備表Devices、實時數據表RTData、歷史數據表HistoryData。用戶表用于進行身份驗證,不同的用戶有不同的管理權限;而設備表包括現場設備的清單及其狀態;實時數據表保存實時數據,如可以保存一天內的實時數據,在本系統中主要指轉速反饋、工作電流、工作頻率,然后每天將當天數據挪進歷史數據表;歷史數據表用于保存一段時期中的運行數據。于是Web服務器可以根據客戶端的不同請求作出響應,由JDBC操作數據庫。這里數據庫實際上成為了現場數據上傳和控制信息下達的通信中樞。部分代碼如下:
import java.sql.*;
class DataIO
{ public static void main(String args[])
{ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //驅動器
String url="jdbc:odbc:ACTiming"; //數據源
con=DriverManager.getConnection(url,"",""); //連接數據庫
state=con.createStatement();
String query="select freq,curr,rev from HistoryData where DeviceID=1 and date>20030410 and date<20030412"; //例如查看歷史數據表中1號設備在2003-4-10到2003-4-12號之間頻率、電流、轉速的運行數據。
ResultSet result=statement.executeQuery(query);
... ... //然后可以從結果集中取數據分析或送顯
}catch(Exceptione) ystem.out.println(e.toString());} }
② 系統的登陸
對不同的用戶登陸給出不同的操作界面。系統管理管理員可以完全操作整個系統,包括用戶管理、系統管理;對不同的現場系統的負責人只能監控自己的系統;而對網上演示,允許游客登陸只能觀看給定的系統,不能控制。登陸界面通過JSP連接用戶表進行身份驗證,通過驗證后給出相應界面。
③ 其他,如顯示曲線類、數據分析類、報表打印類等
這些類均可以制作成Java Bean,嵌入JSP中實現。其功能分別實現接收到數據后的趨勢曲線繪制和顯示,可以采用雙緩沖技術來進行。數據分析可以實現一定的智能算法,以便進行在線系統分析、故障預測等。報表打印類實現打印報表,包括故障報警記錄、歷史記錄、當天記錄等等。
6 結語
基于Java進行網絡監控軟件的開發可以充分利用Java的網絡特性,并可以集成C++代碼,實現本地系統控制與遠程網絡監控的統一,極大地提高了軟件開發效率。對交流調速網絡監控軟件的設計過程以及實驗室校園網環境下的調試運行顯示系統性能良好。進一步完善軟件系統設計以及進行在線算法調整和控制是今后研究中很有意義的課題。