2014-12-04 9 views
0

Я сделал небольшую программу в java (с NetBean), которая использует библиотеки libnodave libnodave-java.0.1 для чтения байта каждые 500 мс (интервал). Я был разочарован продолжительностью операции чтения, то есть около 250 мс (дт).libnodave java - длительность операции «читать»

Graphic Interface

Это мой основной класс. Как вы можете увидеть запрос на подключение выполняется только один раз на 9-й линии:

private int area; 
private long secondo=0; 
public MachCtrl() { 
    initComponents(); 
    Mradio.setSelected(true);         
    db.setText("0"); 
    db.setEnabled(false); 
    area=Nodave.FLAGS; 
    DataIsoTCP.Start("172.17.5.31"); 
    ActionListener listener = new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent evt) { 
      long start, elapsedTime; 
      if(type.getSelectedItem().toString()=="float"){       
       start = System.nanoTime(); 
       float r=(float)DataIsoTCP.Read(area, type.getSelectedItem().toString(), Integer.parseInt(db.getText()), Integer.parseInt(address.getText()), Integer.parseInt(bit.getSelectedItem().toString())); 
       elapsedTime = System.nanoTime() - start; 
       value.setText(Float.toString(r)); 
       dt.setText(Long.toString(Math.round(elapsedTime/1000000))); 
      }          
      if(type.getSelectedItem().toString()=="double"){ 
       start = System.nanoTime(); 
       long r=(long)DataIsoTCP.Read(area, type.getSelectedItem().toString(), Integer.parseInt(db.getText()), Integer.parseInt(address.getText()), Integer.parseInt(bit.getSelectedItem().toString())); 
       elapsedTime = System.nanoTime() - start; 
       value.setText(Long.toString(r)); 
       dt.setText(Long.toString(Math.round(elapsedTime/1000000))); 
      }          
      if(type.getSelectedItem().toString()=="word"){ 
       start = System.nanoTime(); 
       long r=(long)DataIsoTCP.Read(area, type.getSelectedItem().toString(), Integer.parseInt(db.getText()), Integer.parseInt(address.getText()), Integer.parseInt(bit.getSelectedItem().toString())); 
       elapsedTime = System.nanoTime() - start; 
       value.setText(Long.toString(r)); 
       dt.setText(Long.toString(Math.round(elapsedTime/1000000))); 
      }          
      if(type.getSelectedItem().toString()=="byte"){ 
       start = System.nanoTime(); 
       byte r=(byte)DataIsoTCP.Read(area, type.getSelectedItem().toString(), Integer.parseInt(db.getText()), Integer.parseInt(address.getText()), Integer.parseInt(bit.getSelectedItem().toString())); 
       elapsedTime = System.nanoTime() - start; 
       value.setText(Integer.toString(r)); 
       dt.setText(Long.toString(Math.round(elapsedTime/1000000))); 
      }          
      if(type.getSelectedItem().toString()=="bit"){ 
       start = System.nanoTime(); 
       byte r=(byte)DataIsoTCP.Read(area, type.getSelectedItem().toString(), Integer.parseInt(db.getText()), Integer.parseInt(address.getText()), Integer.parseInt(bit.getSelectedItem().toString())); 
       elapsedTime = System.nanoTime() - start; 
       value.setText(Integer.toString(r)); 
       dt.setText(Long.toString(Math.round(elapsedTime/1000000))); 
      } 
      interval.setText(Long.toString((System.nanoTime() - secondo)/1000000)); 
      secondo = System.nanoTime(); 
     } 
    }; 
    Timer timert = new Timer(500,listener); 
    timert.start(); 
} 

И это класс DataIsoTCP, который содержит функцию чтения. Как вы видите, это просто запрос «readBytes()», нет тяжелых операций, которые могли бы задержать выполнение кода.

package examples; 

import PLC.Nodave; 
import PLC.PLCinterface; 
import PLC.TCPConnection; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 

public class DataIsoTCP { 

    public static boolean Connection = false; 
    private static int i, j; 
    public static byte b, b1, b2, b3; 
    public static long a, c; 
    //private static float d, e, f; 
    private static char buf[]; 
    public static byte buf1[]; 
    public static PLCinterface di; 
    public static TCPConnection dc; 
    public static Socket sock; 
    private static int slot; 
    public static byte[] by; 
    public static String IP; 

    DataIsoTCP(String host) { 
     IP = host; 
     //Nodave.Debug=Nodave.DEBUG_ALL; 
     buf = new char[Nodave.OrderCodeSize]; 
     buf1 = new byte[Nodave.PartnerListSize]; 
     try { 
      sock = new Socket(host, 102); 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
    } 

    public static void Start(String adres) { 
     Nodave.Debug=Nodave.DEBUG_ALL^(Nodave.DEBUG_IFACE|Nodave.DEBUG_SPECIALCHARS); 

     DataIsoTCP tp = new DataIsoTCP(adres); 
     DataIsoTCP.StartConnection(); 
    } 

    public static void StartConnection() { 
     Connection = false; 
     OutputStream oStream = null; 
     InputStream iStream = null; 
     slot = 2; 

     if (sock != null) { 
      try { 
       oStream = sock.getOutputStream(); 
      } catch (IOException e) { 
       System.out.println(e); 
      } 
      try { 
       iStream = sock.getInputStream(); 
      } catch (IOException e) { 
       System.out.println(e); 
      } 
      di = new PLCinterface(
        oStream, 
        iStream, 
        "IF1", 
        0, 
        Nodave.PROTOCOL_ISOTCP); 

      dc = new TCPConnection(di, 0, slot); 
      int res = dc.connectPLC(); 
      if (0 == res) { 
       Connection = true; 
       System.out.println("Connection OK "); 
      } else { 
       System.out.println("No connection"); 
      } 
     } 
    } 

    public static void StopConnection() { 
     if (Connection == true) { 
      Connection = false; 
      dc.disconnectPLC(); 
      di.disconnectAdapter(); 
     } 
    } 

    public static float Read(int area, String type, int db, int address, int bit) { 
     int bytes; 
     if("float".equals(type)){ 
      float r=0; 
      bytes=4; 
      int res = dc.readBytes(area, db, address, bytes, null); 
      if(res==0){ 
       r=dc.getFloat(); 
      } 
      return r;  
     } 
     else if("double".equals(type)){ 
      float r=0; 
      bytes=4; 
      int res = dc.readBytes(area, db, address, bytes, null); 
      if(res==0){ 
       r=dc.getU32(); 
      } 
      return r;  
     } 
     else if("word".equals(type)){ 
      int r=0; 
      bytes=2; 
      int res = dc.readBytes(area, db, address, bytes, null); 
      if(res==0){ 
       r=dc.getWORD(); 
      } 
      return r;  
     } 
     else if("byte".equals(type)){ 
      int r=0; 
      bytes=1; 
      int res = dc.readBytes(area, db, address, bytes, null); 
      if(res==0){ 
       r=dc.getBYTE(); 
      } 
      return r;  
     } 
     else if("bit".equals(type)){ 
      int r=0; 
      bytes=1; 
      int res = dc.readBytes(area, db, address, bytes, null); 
      if(res==0){ 
       r=dc.getBYTE(); 
      } 
      return (r >> bit)&1;  
     }else{ 
      return 0; 
     } 
    }  
} 

я должен был бы читать данные, по крайней мере, то следует уменьшить вдвое каждые 250 мс продолжительность операции чтения. Кто-то удалось ускорить эту операцию? Спасибо за помощь! Stefano

+1

Есть комментарии других пользователей сайта SourceForge, жалующиеся на замедленность. Возможно, либо библиотека неэффективна, либо коммуникация устройства по своей сути медленна. –

ответ

0

Я пробовал также с библиотеками VB с тем же результатом. Я пробовал как с PLCSIM, так и с IM151-8. Результат тот же. Я пробовал также симулировать CPU315 и CPU317 без успеха. После того, как вы обратитесь к поддержке Siemens, это, по-видимому, задержка отклика ПЛК, введенная циклической работой ПЛК (возможно, для защиты продуктов Siemens). Этот ответ не удовлетворил меня, поэтому я собираюсь попробовать разные способы быстрого реагирования на ПЛК.

 Смежные вопросы

  • Нет связанных вопросов^_^