资讯详情

用java(modbus4j)如何给继电器发送RTU消息?

展开全部

使用modbus4j通过3231333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333e59b9ee7ad94333333393463串口读取数据,过程中遇到小问题。demo根据自己的需要修改)

1.串口不对应,导致串口不对应 gnu.io.NoSuchPortException。

2.PLC485串口转COMM端口、发送/发送线连接错误,导致数据无法读取

3.rxtxSerial.dll放置路径,查了一下,有人说放在myeclipse/jre/bin下面,但我放了C:\Windows\System32下,不知道原因。

4.RXTXcomm.jar包和rxtxSerial.dll如果文件不对应,可以在官网下载同一版本。

5.读保持式寄存器不同于读输入式寄存器。这是因为modbus协议,保持型功能码为03,输入型为04。api可以找到相应的方法,用法几乎相同。

package com.test.modbus;

import java.util.Arrays;

import com.serotonin.io.serial.SerialParameters;

import com.serotonin.modbus4j.ModbusFactory;

import com.serotonin.modbus4j.ModbusMaster;

import com.serotonin.modbus4j.exception.ModbusInitException;

import com.serotonin.modbus4j.exception.ModbusTransportException;

import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest;

import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse;

import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;

import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;

import com.serotonin.modbus4j.msg.WriteRegistersRequest;

import com.serotonin.modbus4j.msg.WriteRegistersResponse;

/**

* 串口分析MODBUS协议

* @author cl2

*

*/

public class TestModbusDemo {

//设定MODBUS从站地址

private final static int SLAVE_ADDRESS = 1;

// 串行波特率

private final static int BAUD_RATE = 9600;

public static void main(String[] args) {

SerialParameters serialParameters = new SerialParameters();

// 设定MODBUS通信串行口

serialParameters.setCommPortId("COM3");

// 设置为无奇偶校验

serialParameters.setParity(0);

// 将数据位设置为8位

serialParameters.setDataBits(8);

// 设置为一个停止位

serialParameters.setStopBits(1);

// 设置端口名称

serialParameters.setPortOwnerName("Numb nuts");

// 设置端口波特率

serialParameters.setBaudRate(BAUD_RATE);

// 创建ModbusFactory工厂实例

ModbusFactory modbusFactory = new ModbusFactory();

// 创建ModbusMaster实例

ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);

// 初始化

try {

master.init();

readHoldingRegistersTest(master,SLAVE_ADDRESS,0,100);

} catch (ModbusInitException e) {

e.printStackTrace();

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

short[] list = response.getShortData();

for(int i = 0; i < list.length; i ){

System.out.print(list[i] " ");

}

}

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

}

}

}

追问

从站地址和偏移量要怎么定义?

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

标签: ad8851继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台