modbus java 开发

调试工具:modbus slave(从),modbus调试精灵

java方法:

final class HardneedlTest {

    //MODBUS网络上从站地址

    private final static int SLAVE_ADDRESS=5;

 

    //串行口波特率

    private final static int BAUD_RATE = 9600;

    

    public static void main(String[] args) throws Exception {

        SerialParameters serialParameters = new SerialParameters();

 

        //设定MODBUS通讯的串行口

        serialParameters.setCommPortId("COM3");

 

        //设定成无奇偶校验

        serialParameters.setParity(0);

 

        //设定成数据位是8位

        serialParameters.setDataBits(8);

 

        //设定为1个停止位

        serialParameters.setStopBits(1);

 

        serialParameters.setPortOwnerName("Numb nuts");

 

        //串行口上的波特率

        serialParameters.setBaudRate(BAUD_RATE);

 

        ModbusFactory modbusFactory = new ModbusFactory();

        ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);

        try {

            master.init();

            readDiscreteInputTest(master,SLAVE_ADDRESS,0,8);

            writeRegistersTest(master,SLAVE_ADDRESS, 0, new short[]{0x31,0xb,0xc,0xd,0xe,0x9, 0x8, 0x7, 0x6} );

            readHoldingRegistersTest(master,SLAVE_ADDRESS,0,8);

        }

        finally {

            master.destroy();

        }

    }

 

    /**

     * 读开关量型的输入信号

     * @param master 主站

     * @param slaveId 从站地址

     * @param start 起始偏移量

     * @param len 待读的开关量的个数

     */

    private static void readDiscreteInputTest(ModbusMaster master, int slaveId, int start, int len) {

        try {

            ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, start, len);

            ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);

 

            if (response.isException())

                System.out.println("Exception response: message=" + response.getExceptionMessage());

            else

                System.out.println(Arrays.toString(response.getBooleanData()));

        }

        catch (ModbusTransportException e) {

            e.printStackTrace();

        }

    }

 

    /**

     * 读保持寄存器上的内容

     * @param master 主站

     * @param slaveId 从站地址

     * @param start 起始地址的偏移量

     * @param len 待读寄存器的个数

     */

    private static void readHoldingRegistersTest(ModbusMaster master, int slaveId, int start, int len) {

        try {

            ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, start, len);

            ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);

 

            if (response.isException())

                System.out.println("Exception response: message=" + response.getExceptionMessage());

            else

                System.out.println(Arrays.toString(response.getShortData()));

        }

        catch (ModbusTransportException e) {

            e.printStackTrace();

        }

    }

 

    /**

     * 批量写数据到保持寄存器

     * @param master 主站

     * @param slaveId 从站地址

     * @param start 起始地址的偏移量

     * @param values 待写数据

     */

    public static void writeRegistersTest(ModbusMaster master, int slaveId, int start, short[] values) {

        try {

            WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values);

            WriteRegistersResponse response = (WriteRegistersResponse) master.send(request);

 

            if (response.isException())

                System.out.println("Exception response: message=" + response.getExceptionMessage());

            else

                System.out.println("Success");

        }

        catch (ModbusTransportException e) {

            e.printStackTrace();

        }

    }

}

上面的代码摘抄自

https://blog.csdn.net/u010655348/article/details/52665170

当然,代码是一回事,你投入的时间够了以后就可以面对很多问题了

com.serotonin.modbus4j.exception.ModbusTransportException: CRC mismatch: given=262, calc=0

这个就是测温的单片机返回的数据,没有crc校验,这个和你程序本身没什么关系,因为用虚拟的端口测试没问题。而且这个异常好像是惯例似的。

e6cfc19e18746fa30842a13300b379090f4.jpg

Modbus rtu 从站就像上面的块存储,alias是别名,可以不设置。右边的00000则是数值,左边的0-9是数据地址起始位置。没有深入学习,只学习了03H读,06H写,知识学无止境,注意方法,下次别熬夜到现在,加油,阿门。

转载于:https://my.oschina.net/gxs2012/blog/2244965

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值