• 
    <ul id="auswy"><sup id="auswy"></sup></ul>
  • <ul id="auswy"></ul>
    ABB
    關(guān)注中國(guó)自動(dòng)化產(chǎn)業(yè)發(fā)展的先行者!
    CAIAC 2025
    2025工業(yè)安全大會(huì)
    OICT公益講堂
    當(dāng)前位置:首頁(yè) >> 案例 >> 案例首頁(yè)

    案例頻道

    工業(yè)控制網(wǎng)絡(luò)監(jiān)控系統(tǒng)及其軟件設(shè)計(jì)的探討(下)
    • 企業(yè):控制網(wǎng)     領(lǐng)域:電源     行業(yè):網(wǎng)絡(luò)通訊    
    • 點(diǎn)擊數(shù):2761     發(fā)布時(shí)間:2004-11-19 14:15:00
    • 分享到:

     

     

    5  實(shí)例

     

        以一個(gè)交流調(diào)速網(wǎng)絡(luò)監(jiān)控系統(tǒng)為例說(shuō)明網(wǎng)絡(luò)監(jiān)控軟件的開發(fā)。系統(tǒng)組成見圖2。

     

    2  交流調(diào)速網(wǎng)絡(luò)監(jiān)控系統(tǒng)

        系統(tǒng)采用Java結(jié)合C++進(jìn)行系統(tǒng)設(shè)計(jì)。需要用到Java Socket、JNI、JDBCJava多線程以及C++ DLL等應(yīng)用。

        (1)  現(xiàn)場(chǎng)端實(shí)現(xiàn)現(xiàn)場(chǎng)數(shù)據(jù)的收集

        JNI調(diào)用C++ DLL實(shí)現(xiàn)轉(zhuǎn)速反饋數(shù)據(jù)的采集

        系統(tǒng)由JNI調(diào)用操作數(shù)據(jù)采集卡的DLL完成實(shí)時(shí)數(shù)據(jù)的采集。如類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");} //調(diào)入本地庫(kù)

          //聲明三種本地方法:inport()用于返回?cái)?shù)據(jù)采集卡端口號(hào),outport()用于向指定的端口輸出數(shù)值,sample()用于啟動(dòng)采樣,返回采集到的數(shù)據(jù)。

           public static void main(String args[])

           {  ACTimingNC ACtiming=new ACTimingNC("交流調(diào)速網(wǎng)絡(luò)監(jiān)控現(xiàn)場(chǎng)端");

              ......  } }

        然后在命令提示符下鍵入javac  ACTimingNC.java進(jìn)行編譯生成ACTimingNC.class,再運(yùn)行javah  ACTimingNC,得到C++文件ACTimingNC.h,然后編制相應(yīng)的ACTimingNC.cpp文件實(shí)現(xiàn)對(duì)應(yīng)的本地方法即可,最后編譯形成動(dòng)態(tài)鏈接庫(kù)DLL文件,放到應(yīng)用程序路徑下。運(yùn)行時(shí)就實(shí)現(xiàn)了Java調(diào)用DLL對(duì)硬件的操作。

           Java串口包實(shí)現(xiàn)對(duì)變頻器的參數(shù)查詢和控制

        利用Sun公司提供的串口包,再結(jié)合臺(tái)達(dá)變頻器的控制協(xié)議,就可以實(shí)現(xiàn)雙方的數(shù)據(jù)交流了。例如控制命令串的發(fā)送代碼如下:

        import java.io.*;import java.util.*;import javax.comm.*;

        class SerialportIO

        {  public static void main(String args[])

           {  …… //得到對(duì)串口COM1的控制權(quán)

        try{  serialPort.setSerialPortParams(4800,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_ODD); 

            //實(shí)施臺(tái)達(dá)變頻器串口協(xié)議:波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)位分別為4800、8、1O(奇校驗(yàn))。

            }catch(UnsupportedCommOperationException e3){}

            try{  String s="......"; //s為控制命令串,具體參照說(shuō)明書

                 os.writeUTF(s);  }catch(IOException e3){}  }}}}}

     

            (2)  Java Socket實(shí)現(xiàn)數(shù)據(jù)在現(xiàn)場(chǎng)端和服務(wù)器端的傳輸

            例如從現(xiàn)場(chǎng)端向服務(wù)器端傳送數(shù)據(jù):由現(xiàn)場(chǎng)端提交監(jiān)測(cè)數(shù)據(jù),數(shù)據(jù)服務(wù)器端接收數(shù)據(jù)?,F(xiàn)場(chǎng)端部分代碼如下:

            public  class SceneServer  //數(shù)據(jù)服務(wù)器端

            {  public static void main(String args[])

             { try{ Socket socket=new Socket("202.199.133.46",PORT); //與服務(wù)器建立連接

                  PrintStream os=new PrintStream(wss.getOut- putStream()); //輸出流

                  DataInputStream is=new DataInputStream(wss.get- InputStream());//輸入流

                  StringBuffer buf=new StringBuffer(100); //定義數(shù)據(jù)緩沖區(qū)

                  ... ...//進(jìn)行數(shù)據(jù)發(fā)送

                 }catch(IOException e) {}  }  }

            在數(shù)據(jù)服務(wù)器端,考慮到以后系統(tǒng)的擴(kuò)展,可能有多臺(tái)現(xiàn)場(chǎng)端智能設(shè)備提出發(fā)送數(shù)據(jù)請(qǐng)求,所以程序必須實(shí)現(xiàn)多線程。部分代碼如下:

            public class DSServer   //數(shù)據(jù)服務(wù)器端

            {  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()

               {  ……//接通輸入輸出流,實(shí)現(xiàn)數(shù)據(jù)傳輸以及操作到庫(kù)。 } }

            這段程序由兩個(gè)類組成,主類SceneServer負(fù)責(zé)建立處理連接請(qǐng)求,線程類ServerThread用于創(chuàng)建一個(gè)新的線程,負(fù)責(zé)處理現(xiàn)場(chǎng)端的輸入輸出請(qǐng)求。反方向的控制信息傳輸只要加入相應(yīng)代碼即可。

     

            (3)  服務(wù)器端采用JSP結(jié)合Java Bean實(shí)現(xiàn)監(jiān)控

            JDBC訪問SQL Server2000數(shù)據(jù)庫(kù)

            對(duì)于本系統(tǒng),在SQL Server中需建立用戶表Users、設(shè)備表Devices、實(shí)時(shí)數(shù)據(jù)表RTData、歷史數(shù)據(jù)表HistoryData。用戶表用于進(jìn)行身份驗(yàn)證,不同的用戶有不同的管理權(quán)限;而設(shè)備表包括現(xiàn)場(chǎng)設(shè)備的清單及其狀態(tài);實(shí)時(shí)數(shù)據(jù)表保存實(shí)時(shí)數(shù)據(jù),如可以保存一天內(nèi)的實(shí)時(shí)數(shù)據(jù),在本系統(tǒng)中主要指轉(zhuǎn)速反饋、工作電流、工作頻率,然后每天將當(dāng)天數(shù)據(jù)挪進(jìn)歷史數(shù)據(jù)表;歷史數(shù)據(jù)表用于保存一段時(shí)期中的運(yùn)行數(shù)據(jù)。于是Web服務(wù)器可以根據(jù)客戶端的不同請(qǐng)求作出響應(yīng),由JDBC操作數(shù)據(jù)庫(kù)。這里數(shù)據(jù)庫(kù)實(shí)際上成為了現(xiàn)場(chǎng)數(shù)據(jù)上傳和控制信息下達(dá)的通信中樞。部分代碼如下:

            import java.sql.*;

            class DataIO

            {  public static void main(String args[])

               {  try{  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  //驅(qū)動(dòng)器

                       String url="jdbc:odbc:ACTiming";  //數(shù)據(jù)源

                       con=DriverManager.getConnection(url,"",""); //連接數(shù)據(jù)庫(kù)

                       state=con.createStatement();

                       String query="select freq,curr,rev from HistoryData where DeviceID=1 and date>20030410 and         date<20030412"; //例如查看歷史數(shù)據(jù)表中1號(hào)設(shè)備在2003-4-102003-4-12號(hào)之間頻率、電流、轉(zhuǎn)速的運(yùn)行數(shù)據(jù)。

                     ResultSet result=statement.executeQuery(query);

                       ... ...  //然后可以從結(jié)果集中取數(shù)據(jù)分析或送顯

                 }catch(Exceptione) ystem.out.println(e.toString());} }

            系統(tǒng)的登陸

            對(duì)不同的用戶登陸給出不同的操作界面。系統(tǒng)管理管理員可以完全操作整個(gè)系統(tǒng),包括用戶管理、系統(tǒng)管理;對(duì)不同的現(xiàn)場(chǎng)系統(tǒng)的負(fù)責(zé)人只能監(jiān)控自己的系統(tǒng);而對(duì)網(wǎng)上演示,允許游客登陸只能觀看給定的系統(tǒng),不能控制。登陸界面通過JSP連接用戶表進(jìn)行身份驗(yàn)證,通過驗(yàn)證后給出相應(yīng)界面。

        ③  其他,如顯示曲線類、數(shù)據(jù)分析類、報(bào)表打印類等

        這些類均可以制作成Java Bean,嵌入JSP中實(shí)現(xiàn)。其功能分別實(shí)現(xiàn)接收到數(shù)據(jù)后的趨勢(shì)曲線繪制和顯示,可以采用雙緩沖技術(shù)來(lái)進(jìn)行。數(shù)據(jù)分析可以實(shí)現(xiàn)一定的智能算法,以便進(jìn)行在線系統(tǒng)分析、故障預(yù)測(cè)等。報(bào)表打印類實(shí)現(xiàn)打印報(bào)表,包括故障報(bào)警記錄、歷史記錄、當(dāng)天記錄等等。

     

    6  結(jié)語(yǔ)

     

        基于Java進(jìn)行網(wǎng)絡(luò)監(jiān)控軟件的開發(fā)可以充分利用Java的網(wǎng)絡(luò)特性,并可以集成C++代碼,實(shí)現(xiàn)本地系統(tǒng)控制與遠(yuǎn)程網(wǎng)絡(luò)監(jiān)控的統(tǒng)一,極大地提高了軟件開發(fā)效率。對(duì)交流調(diào)速網(wǎng)絡(luò)監(jiān)控軟件的設(shè)計(jì)過程以及實(shí)驗(yàn)室校園網(wǎng)環(huán)境下的調(diào)試運(yùn)行顯示系統(tǒng)性能良好。進(jìn)一步完善軟件系統(tǒng)設(shè)計(jì)以及進(jìn)行在線算法調(diào)整和控制是今后研究中很有意義的課題。

    熱點(diǎn)新聞

    推薦產(chǎn)品

    x
    • 在線反饋
    1.我有以下需求:



    2.詳細(xì)的需求:
    姓名:
    單位:
    電話:
    郵件: