无法使用jamod 2(wimpi.modbus)读取modbus数据

时间:2014-09-15 07:06:33

标签: java modbus

我是java串口编程的新手,

我试图通过我的java应用程序的串口通过modbus RTU从modbus从设备读取数据。

我正在使用Jamod java库来读取modbus协议。

在我的情况下,我的应用程序无法从设备接收完整的modbus响应。请查找我的java编码和错误日志供您参考。

任何人都可以告诉我可能是错误的原因。

<br/>

**ERROR**<br/>
 Clear input: 02 c2 c1<br/>
 Sent: 01 04 03 e8 00 05 b0 79 <br/>
 Last request: 01 04 03 e8 00 05 b0 79<br/>
 CRC Error in received frame: 0 bytes: <br/>
 Response: 01 84 <br/>
 net.wimpi.modbus.ModbusIOException: I/O exception - failed to read<br/>
 at net.wimpi.modbus.io.ModbusRTUTransport.readResponse(ModbusRTUTransport.java:163)<br/>
 at net.wimpi.modbus.io.ModbusSerialTransaction.execute(ModbusSerialTransaction.java:187)<br/>
 at modbusnewapplication.ModbusConnection.main(ModbusConnection.java:8<br/>


Modbus Program <br/>
---------------<br/>

package modbusnewapplication;<br/>

import java.io.;<br/>
import javax.comm.;<br/>
import net.wimpi.modbus.ModbusCoupler;<br/>
import net.wimpi.modbus.io.ModbusSerialTransaction;<br/>
import net.wimpi.modbus.msg.ReadInputRegistersRequest;<br/>
import net.wimpi.modbus.msg.ReadInputRegistersResponse;<br/>
import net.wimpi.modbus.net.SerialConnection;<br/>
import net.wimpi.modbus.util.SerialParameters;<br/>

public class ModbusConnection {<br/>

public static void main(String[] args) {<br/>

// if (args.length < 4) {<br/>
// System.out.println("not enough args");<br/>
// System.exit(1);<br/>
// }else{<br/>
try {<br/>

    System.out.println("Serial Port Connection");<br/><br/>
    /* The important instances of the classes mentioned before */<br/>
    SerialConnection con = null; //the connection<br/>
    ModbusSerialTransaction trans = null; //the transaction<br/>
    ReadInputRegistersRequest req = null; //the request<br/>
    ReadInputRegistersResponse res = null; //the response<br/>

     // **1 Variables for storing the parameters** <br/>
     String portname= "COM1"; //the name of the serial port to be used<br/>
     int unitid = 1; //the unit identifier we will be talking to<br/>
     int ref = 1000; //the reference, where to start reading from<br/>
     int count = 5; //the count of IR's to read<br/>
     int repeat = 1; //a loop for repeating the transaction  <br/>
     boolean isopen = false;<br/><br/>

    **// 2. Set master identifier**
    // ModbusCoupler.createModbusCoupler(null);
    // ModbusCoupler.getReference().setMaster(master); I added this in
    // ModbusCoupler.getReference().setMaster(true);
    // ModbusCoupler.getReference().setUnitID(1); 

    **// 3. Setup serial parameters**<br/>
    SerialParameters params = new SerialParameters();<br/>
    params.setPortName("COM1");<br/>
    params.setBaudRate(9600);<br/>
    params.setDatabits(8);<br/>
    params.setParity("None");<br/>
    params.setStopbits(1);<br/>
    params.setEncoding("RTU");<br/>
    params.setEcho(false);<br/>

    System.setProperty("net.wimpi.modbus.debug", "true");<br/>
    **// 4. Open the connection**<br/>
    con = new SerialConnection(params);
    System.out.println("Connection..." + con.toString());
    con.open();

     isopen = con.isOpen();<br/>
     System.out.println("Serial port status..." + isopen);<br/>

    **// 5. Prepare a request<br/>**
    req = new ReadInputRegistersRequest(ref, count);<br/>
    req.setUnitID(unitid);<br/>
    req.setHeadless();<br/>

    **// 6. Prepare a transaction<br/>**
    trans = new ModbusSerialTransaction(con);<br/>
    trans.setRequest(req);<br/>

    **// 7. Execute the transaction repeat times<br/>**
    int k = 0;<br/>
    do { <br/>
    trans.execute();<br/>
    res = (ReadInputRegistersResponse) trans.getResponse();<br/>
    for (int n = 0; n < res.getWordCount(); n++) {<br/>
    System.out.println("Word " + n + "=" + res.getRegisterValue(n));<br/>
    }<br/>
    k++;<br/>
    } while (k < repeat);<br/>

    **// 8. Close the connection**<br/>
    con.close();<br/>

    } catch (Exception ex) {<br/>
      ex.printStackTrace();<br/>
    }<br/>
    //}//else<br/>
    }//main

    }

1 个答案:

答案 0 :(得分:0)

您应该在Thread.sleep(500)库中的requestresponse方法之间添加jamod之类的方法。也许这种错误通常是由响应数据的长度引起的。 jamod库没有考虑响应数据的长度。因此,我们需要请求并等待,直到从串行接口收到所有数据。如果没有,因为没有收到所有数据,CRC检查将失败并导致错误。