2016-03-30 4 views
6

Ich muss Dezimalwerte zwischen Java-Programm und einem Simulink-Modell zu übertragen, um dies zu tun, verwende ich UDP-Sockets, sie sind kein Problem in der Java-Seite. In Simulink kann ich die Werte senden mit 'Stream Output' Block, aber das Problem stellt sich beim Empfang von Java! der 'Stream-Eingang' Block erhält keine Sache. Ich verwende Standardgeräte UDP-Protokoll, mit dem richtigen lokalen UDP-Port und die Adresse ist 'localhost. Bitte sagen Sie mir, wie man ein Double in Simulink mit UDP oder sogar mit anderen Methoden korrekt erhält, was ist die Übertragung der Daten. danke im voraus. hier sind einige Code:Transfer verdoppelt zwischen Java und Simulink mit 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); 
} 

und im Hauptverfahren:

localSend(myMessage, 9005); 

der 'Vorstand Setup' des 'Input Stream' Block ist Simulink ist wie folgt: enter image description here

hier ist, wie ich d ata aus Simulink ins Java (das Verfahren):

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; 
      } 
} 

und die Einrichtung von "Output Stream" Block in Simulink: enter image description here

+0

Sie müssen uns Ihre Blockparametereinstellungen mitteilen, sind Sie sicher, dass der Port/die Adresse alle korrekt sind? – GameOfThrows

+0

ok, ich werde die Frage bearbeiten – mkm

+0

@ nuser1955419 - Zeigen Sie uns, wie senden Sie Daten aus Simulink, und die entsprechenden Java-Code --- so viel ist nicht genug, um eine Antwort abzuleiten! –

Antwort

0

ich habe einen Trick. 'Packet Input' Simulink-Block und 'ASCII Decode' blocks connection

i passen die Parameter dieser 2 Blocks wie folgt:

the 'Packet Input' block

the 'ASCII Decoder

und in der Java-Seite Ich formatiere das Doppelte mit dieser Methode:

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"; 
    } 
} 

kurz: der Packet-Input-Block empfängt jedesmal 7 ASCII-Zeichen, und in Java formatiere ich das zu kombinierende Double-Zeichen aus 7 Zeichen (einschließlich Punkt und Minus).

Hoffe, dass diese jemandem helfen.

Update:

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

Können Sie bitte den Code für diese Antwort zeigen? Ich habe ein sehr ähnliches Problem und ich benutze die gleichen Blöcke, aber ich kann einfach nicht die Daten vom PC erhalten, die zum Matlab-PC laufen. – Flower

+1

Hallo @Flower, sorry, ich war eine Weile offline. Stellen Sie zuerst sicher, dass Ihre Verbindung gut aufgebaut ist (keine Firewalls, gute Ports ...) Sie können eine Software verwenden, um sie wie [link] (https://packetsender.com/) PacketSended zu testen. Ich werde meinen angeforderten Code in ein Update setzen. (Übrigens war meine zweite Antwort besser, um das in der Frage beschriebene Problem zu lösen) – mkm

+1

Es besteht keine Notwendigkeit, Ihren Code in ein Update zu stecken. Ich konnte es zum Laufen bringen. Vielen Dank, Sie haben mir sehr geholfen. – Flower

0

Eine andere Lösung, mit dem Strom Eingang in Simulink. Fügen Sie einfach einen Terminator "\ n" zu jeder Nachricht von Java hinzu.