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++代码,实现本地系统控制与远程网络监控的统一,极大地提高了软件开发效率。对交流调速网络监控软件的设计过程以及实验室校园网环境下的调试运行显示系统性能良好。进一步完善软件系统设计以及进行在线算法调整和控制是今后研究中很有意义的课题。