首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用JAMOD2( wimpi.modbus )读取modbus数据

无法使用JAMOD2( wimpi.modbus )读取modbus数据
EN

Stack Overflow用户
提问于 2014-09-15 15:06:33
回答 1查看 2.8K关注 0票数 0

我是java串口编程​的新手,

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

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

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

任何人都可以建议我什么可能是错误的原因。

代码语言:javascript
复制
<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

    }
EN

回答 1

Stack Overflow用户

发布于 2014-10-21 01:46:36

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25842507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档