Java与Modbus-TCP/IP网络通讯

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

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)<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值