【问题标题】:unable to read modbus data using jamod 2( wimpi.modbus )无法使用 jamod 2 ( wimpi.modbus ) 读取 modbus 数据
【发布时间】:2014-10-21 02:27:05
【问题描述】:

我是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

    }

【问题讨论】:

    标签: java modbus


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 2016-10-08
      • 1970-01-01
      • 2020-12-23
      • 2018-07-20
      • 1970-01-01
      • 2020-01-11
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多