Java 使用Modsim32进行modbus-tcp协议模拟(从机)并使用java当做主机(Maven项目)进行从机信息获取及修改

2 篇文章 0 订阅

近期在搞物联网相关内容,接触到了modbus协议,做个记录方便以后使用。

本篇文章主要给大家演示如何通过java对接modbus-tcp协议,后续还会介绍如何通过Java对接modbus-rtu协议。

一、环境准备

关于modbus的协议介绍,这里就不过多赘述了,百度很多,我们直接进入正题。

1.下载modscan32,其中应该会包含modscan32(主机)及modsim32(从机),我们后续会使用modsim32模拟从机。
下载地址或自行百度搜索(网上资源还是很多的):
https://download.csdn.net/download/liboyang71/74307745

请添加图片描述

2.java环境准备,此处我们使用的是jdk1.8

二、代码编写

2.1 modsim准备

首先我们先使用modsim将从机数据进行准备,流程入下图所示

1.点击 连接设置->连接->Modbus/TCP 服务器

在这里插入图片描述
2.文件->新建
在这里插入图片描述
3.配置从机相关数据

我们将address设置位0001,deviceId设置为1,point type选择03,这三个参数后续需要和代码有对应关系,我们说明一下,如下图所示,然后我们将0001设置为5721,0002设置为随机数变动。

在这里插入图片描述

到这里,我们关于modsim的相关准备工作就做完了,相当于我们模拟了一个modbus-tcp协议的硬件设备,接下来我们来编写代码。

2.2编写Java代码

1.创建一个maven项目
2.添加jlibmodbus依赖

        <dependency>
            <groupId>com.intelligt.modbus</groupId>
            <artifactId>jlibmodbus</artifactId>
            <version>1.2.9.7</version>
        </dependency>

3.编写Java代码

package com.beyondli;

import com.intelligt.modbus.jlibmodbus.Modbus;
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;

import java.net.InetAddress;

public class ModbusPollTCPTest {
 
		public static void main(String[] args) {
			try {
				// 设置主机TCP参数
				TcpParameters tcpParameters = new TcpParameters();

				// 设置TCP的ip地址
				InetAddress adress = InetAddress.getByName("127.0.0.1");

				// TCP参数设置ip地址
				// tcpParameters.setHost(InetAddress.getLocalHost());
				tcpParameters.setHost(adress);

				// TCP设置长连接
				tcpParameters.setKeepAlive(true);
				// TCP设置端口,这里设置是默认端口502
				tcpParameters.setPort(Modbus.TCP_PORT);


				// 创建一个主机
				ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
				Modbus.setAutoIncrementTransactionId(true);

				int slaveId = 1;//从机地址
				int offset = 0;//寄存器读取开始地址
				int quantity = 5;//读取的寄存器数量

				while (true) {
					try {

						if (!master.isConnected()) {
							master.connect();// 开启连接
						}

						// 读取对应从机的数据,readInputRegisters读取的写寄存器,功能码04
						//int[] registerValues = master.readInputRegisters(slaveId, offset, quantity);
							int[] registerValues = master.readHoldingRegisters(slaveId, offset, quantity);
							// 控制台输出
							for (int value : registerValues) {
								System.out.println(" Value: " + value);
							}
							//修改3号位为7165
							master.writeSingleRegister(slaveId, 2, 7165);
							Thread.sleep(1000);

					}catch (Exception e) {
						e.printStackTrace();
						Thread.sleep(1000);
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

}

以上代码我们获取到了modbus中0001和0002的数据,并且将0003的位置数据改为了7165,对应注释都在代码中,整体效果入下图所示。

在这里插入图片描述在这里插入图片描述

以上就是java与modbus-tcp的对接方式,各位同学可根据自己的业务进行一些调整,此文章没有去过多的讲一些理论和概念,主要为了方便后续使用做一些记录,modbus-tcp的对接方式相对简单,后续还会编写一篇modbus-rtu的连接文档,会相对复杂一点。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值