1.需求样例
举例5:浮点数参数读取(读取温度测量值)
查看参数列表,温度测量值地址为320,根据Modbus协议,读取参数地址转换为16进制为:00H A0H,读取长度为2个字:00H 02H。
16进制发送读取命令如下:00 00 00 00 00 06 01 03 00 A0 00 02(复制使用时去掉中间空格,以16进制发送)
00 00 00 00 00 06 01:Modbus命令头,用户直接复制,不能更改
03:读取寄存器功能代码
00 A0:读取参数寄存器地址16进制代码
00 02:读取寄存器地址长度
接收到数据格式如下:00 00 00 00 00 07 01 03 04 42 48 02 C8
00 00 00 00 00 07 01:Modbus返回命令头
03:读取寄存器功能代码
04:返回数据长度,四个字节
42 48 02 C8:寄存器数据值,我们将此16进制数转换为浮点数值为:50.002716。
注:具体转换方法可以常见附件转换程序算法。
2.实现功能
通过Java与Modbus-TCP/IP网络通讯实现举例5中的功能
3.功能代码
1)
package com.nwpusct.csal.controller.tcpconnect;
import java.io.*;
import java.math.BigInteger;
import java.net.Socket;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.bind.DatatypeConverter;
import static org.apache.poi.util.HexDump.toHex;
/**
* 类描述:TODO
*
* @author HBO
* @date 2023-08-22 09:21
**/
public class SocketUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(SocketUtils.class);
private static Socket socket = null;
private static String archivesCenterAPIIP = "127.0.0.1";
private static String archivesCenterAPIPort ="502";
public static boolean connection() {
if (socket != null) {
return true;
}
try {
socket = new Socket(archivesCenterAPIIP, NumberUtils.toInt(archivesCenterAPIPort));
return true;
} catch (Exception e) {
LOGGER.error("connection error", e);
return false;
}
}
public static void stop() {
try {
if (socket != null) {
socket.close();
socket = null;
}
} catch (Exception e) {
LOGGER.error("connection error", e);
}
}
/**
* 发送数据
*
* @param cmd
* 需要发送的数据(十六进制的字符串形式)
* @return 接受到的数据(十六进制的字符串形式)
*/
public static String sendCmd(String cmd) {
if (!connection() || socket == null)<

本文介绍了如何使用Java与Modbus协议通过TCP/IP网络连接,实现读取温度测量值的功能,包括参数地址转换、数据发送与接收以及浮点数解析。
最低0.47元/天 解锁文章
1160

被折叠的 条评论
为什么被折叠?



