2016-03-30 36 views
6

Ho bisogno di trasferire valori decimali tra il programma Java e un modello Simulink, per farlo uso i socket UDP, non sono un problema nel lato java. In Simulink sono in grado di inviare i valori usando il blocco 'Stream Output', ma il problema si presenta durante la ricezione da java! il blocco 'Stream input' non riceve nulla. Sto usando il protocollo standard UDP, con la porta UDP locale corretta e l'indirizzo è 'localhost'. Per favore dimmi come ricevere correttamente un doppio in simulink con udp, o anche con altri metodi, che importa trasferire i dati. grazie in anticipo. qui sono un certo codice:trasferimento doppio tra java e simulink usando udp

localSocket = new DatagramSocket(9010); 

...

public static void localSend(String msg,int PORT) throws Exception{ 
    DatagramPacket sendPacket = null,encPacket=null; 
    try { 
     sendPacket = new DatagramPacket(msg.getBytes(), msg.getBytes().length, InetAddress.getLocalHost(), PORT); 
    } catch (Exception e) { 
     System.out.printf("Error!"); 
    } 
    localSocket.send(sendPacket); 
} 

e nel metodo principale:

localSend(myMessage, 9005); 

'setup Board' del blocco del 'Input flusso' è Simulink è come qui sotto: enter image description here

ecco come ricevo d ata da Simulink ins Java (il metodo):

public static String localReceive() throws Exception{      
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
    int count=0; 
     try { 
      localSocket.receive(receivePacket); 
      return new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength()); 
      } catch (SocketTimeoutException socketTimeoutException) { 
       return defaultValue; 
      } 
} 

e la configurazione di blocco "Uscita Stream" in Simulink: enter image description here

+0

è necessario dirci le impostazioni dei parametri di blocco, sei sicuro che la porta/indirizzo sono tutti corretti? – GameOfThrows

+0

ok, modifico la domanda – mkm

+0

@ nuser1955419 - Mostraci come stai inviando dati da Simulink e il codice Java pertinente --- questo è insufficiente per dedurre una risposta! –

risposta

0

ho fatto un trucco. 'Packet Input' blocco Simulink, e 'decodifica ASCII', blocks connection

i regolare i parametri di questi 2 blocchi come segue:

the 'Packet Input' block

the 'ASCII Decoder

e nel lato java , ho riformattato il doppio con questo metodo:

public static String reformat(String str){ 
    double d = 0; 
    DecimalFormat df=null; 
    try { 
     d = Double.parseDouble(str); 
    } catch (NumberFormatException numberFormatException) { 
     return "0.00000"; 
    } 
    if(d>=0){ 
    String[] sp=str.split("\\."); 
    if(sp[0].length()==0) 
    df= new DecimalFormat("0.00000"); 
    if(sp[0].length()==1) 
    df= new DecimalFormat("0.00000"); 
    if(sp[0].length()==2) 
     df= new DecimalFormat("00.0000"); 
    if(sp[0].length()==3) 
     df= new DecimalFormat("000.000"); 
    if(sp[0].length()==4) 
     df= new DecimalFormat("0000.00"); 
    if(sp[0].length()==5) 
     df= new DecimalFormat("00000.0"); 
    } 
    else{ 
    String[] sp=str.split("\\."); 
    if(sp[0].length()==1) 
    df= new DecimalFormat("0.0000"); 
    if(sp[0].length()==2) 
    df= new DecimalFormat("0.0000"); 
    if(sp[0].length()==3) 
     df= new DecimalFormat("00.000"); 
    if(sp[0].length()==4) 
     df= new DecimalFormat("000.00"); 
    if(sp[0].length()==5) 
     df= new DecimalFormat("0000.0"); 
    if(sp[0].length()==6) 
     df= new DecimalFormat("000000"); 
    } 

    try { 
     return df.format(d); 
    } catch (Exception e) { 
     return "0.00000"; 
    } 
} 

brevemente: il blocco di input del pacchetto riceve 7 ASCII ogni volta, e in java i riformatta il doppio da combinare di 7 caratteri (compreso il punto e il meno).

Spero che questo aiuti qualcuno.

aggiornamento:

some self explanatory extra code: 

//somewhere before: 
//Global variables 
    String defaultValue="0",ip="xxx.xx.xx.xx"; 
    DatagramSocket remoteSocket,localSocket; 
    byte[] receiveArray,receiveKey,receiveSig,sendSig; 
    int remoteSendPort=xxx,localSendport=xxx, 
     remoteReceivePort=xxx,localReceivePort=xxx;  
    String feedback,control_val,ReceivedTimeStamp; 
    InetAddress IPAddress;  
... 
//receive message from the other java program in pc2 
    public void remoteMsgSend(byte[] msg,InetAddress IPAddress, int PORT) {  
     try {  
      DatagramPacket sendPacket = null; 
      try { 
       sendPacket = new DatagramPacket(msg, msg.length, IPAddress, PORT); 
      } catch (Exception e) { 
       System.out.printf("Error! check ports"); 
      } 
      remoteSocket.send(sendPacket); 
     } catch (IOException ex) { 
      System.out.println("IOException! remote send"); 
     } 
    } 
    //receive message from the other java program in pc2 
    public String remoteMsgReceive() {      
     DatagramPacket receivePacket = new DatagramPacket(receiveArray, receiveArray.length); 
     byte[] r1; 
     int count=0,len,offset; 
      try { 
       remoteSocket.receive(receivePacket); 
       r1=receivePacket.getData(); 
       len=receivePacket.getLength(); 
       offset=receivePacket.getOffset(); 
       r1=Arrays.copyOfRange(r1, offset, len); 
       remoteOk=true; 
       return new String(r1); 
       } catch (Exception ex) { 
//     System.out.println("remote receive time out: " +ex.getMessage()); 
        remoteOk=false; 
        return defaultValue; 
       } 
    } 

    //send data to matlab on this pc 
    public void localSend(String msg,int PORT) { 
     DatagramPacket sendPacket = null; 
     try { 
      sendPacket = new DatagramPacket(msg.getBytes(), msg.getBytes().length, InetAddress.getLocalHost(), PORT); 
     } catch (Exception e) { 
      System.out.printf("Error! check ports"); 
     } 
     try { 
      localSocket.send(sendPacket); 
     } catch (IOException ex) { 
      System.out.println("localsend error"); 
     } 
    } 
    //receive data from Matlab on this pc 
    public String localReceive() {      
     DatagramPacket receivePacket = new DatagramPacket(receiveArray, receiveArray.length); 

     String rec; 
      try { 
       localSocket.receive(receivePacket); 
       rec=new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength()); 
       localOk=true; 
       return rec; 
       } catch (Exception ex) { 
//       System.out.println("local receive time out " +ex.getMessage()); 
          localOk=false; 
          return defaultValue; 
       } 
    } 
+0

Puoi per favore mostrare il codice per questa risposta? Ho un problema molto simile e sto usando gli stessi blocchi, ma semplicemente non posso ricevere i dati dal pc in esecuzione sul pc matlab. – Flower

+1

Ciao @Flower, mi spiace di essere offline per un po '. per prima cosa assicurati che la tua connessione sia ben stabilita (nessun firewall, buone porte ...) puoi usare un software per testarlo come [link] (https://packetsender.com/) PacketSended. inserirò il mio codice richiesto in un aggiornamento. (A proposito, la mia seconda risposta era meglio risolvere il problema descritto nella domanda) – mkm

+1

Non è necessario inserire il codice in un aggiornamento. Sono stato in grado di farlo funzionare. Grazie mille, la tua risposta mi ha aiutato molto. – Flower

0

Un'altra soluzione, con l'ingresso flusso in Simulink. Basta aggiungere un terminatore "\ n" a ciascun messaggio da java.