以下是代码:

读取寄存器数据:

public class readRegisters {

/**

* 工厂。

*/

static ModbusFactory modbusFactory;

static {

if (modbusFactory == null) {

modbusFactory = new ModbusFactory();

}

}

/**

* 获取master

*

* @return

* @throws ModbusInitException

*/

public static ModbusMaster getMaster() throws ModbusInitException {

IpParameters params = new IpParameters();

params.setHost("192.168.1.100");//测试的时候填写从机ip

params.setPort(502);//从机端口

// modbusFactory.createRtuMaster(wapper); //RTU 协议

// modbusFactory.createUdpMaster(params);//UDP 协议

// modbusFactory.createAsciiMaster(wrapper);//ASCII 协议

ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 协议

try {

//设置超时时间

master.setTimeout(30000);

//设置重连次数

master.setRetries(5);

//初始化

master.init();

} catch (ModbusInitException e) {

e.printStackTrace();

}

return master;

}

/**

* 读01功能码

*

* @param ip        从站IP

* @param port      modbus端口

* @param start     起始地址偏移量

* @param readLenth 待读寄存器个数

* @return

* @throws ModbusInitException

*/

public static ByteQueue ReadCoilsRequest( int slaveId,int start, int readLenth) throws ModbusInitException {

ModbusRequest modbusRequest = null;

try {

modbusRequest = new ReadCoilsRequest(slaveId, start, readLenth);

} catch (ModbusTransportException e) {

e.printStackTrace();

}

ModbusResponse modbusResponse = null;

try {

modbusResponse = getMaster().send(modbusRequest);

} catch (ModbusTransportException e) {

e.printStackTrace();

}

ByteQueue byteQueue = new ByteQueue(1024);

modbusResponse.write(byteQueue);

System.out.println("功能码:" + modbusRequest.getFunctionCode());

System.out.println("从站地址:" + modbusRequest.getSlaveId());

System.out.println("收到的响应信息大小:" + byteQueue.size());

System.out.println("收到的响应信息值:" + byteQueue);

return byteQueue;

}

/**

* 读02功能码

*

* @param ip        从站IP

* @param port      modbus端口

* @param start     起始地址偏移量

* @param readLenth 待读寄存器个数

* @return

* @throws ModbusInitException

*/

public static ByteQueue ReadDiscreteInputsRequest(  int slaveId,int start, int readLenth) throws ModbusInitException {

ModbusRequest modbusRequest = null;

try {

modbusRequest = new ReadDiscreteInputsRequest(slaveId, start, readLenth);

} catch (ModbusTransportException e) {

e.printStackTrace();

}

ModbusResponse modbusResponse = null;

try {

modbusResponse = getMaster().send(modbusRequest);

} catch (ModbusTransportException e) {

e.printStackTrace();

}

ByteQueue byteQueue = new ByteQueue(1024);

modbusResponse.write(byteQueue);

System.out.println("功能码:" + modbusRequest.getFunctionCode());

System.out.println("从站地址:" + modbusRequest.getSlaveId());

System.out.println("收到的响应信息大小:" + byteQueue.size());

System.out.println("收到的响应信息值:" + byteQueue);

return byteQueue;

}

/**

* 读03功能码内容

*

* @param ip        从站IP

* @param port      modbus端口

* @param start     起始地址偏移量

* @param readLenth 待读寄存器个数

* @return

* @throws ModbusInitException

*/

public static ByteQueue ReadHoldingRegistersRequest( int slaveId,int start, int readLenth) throws ModbusInitException {

ModbusRequest modbusRequest = null;

try {

// 功能码03 读取保持寄存器的值

modbusRequest = new ReadHoldingRegistersRequest(slaveId, start, readLenth);

} catch (ModbusTransportException e) {

e.printStackTrace();

}

ModbusResponse modbusResponse = null;

try {

modbusResponse = getMaster().send(modbusRequest);

} catch (ModbusTransportException e) {

e.printStackTrace();

}

ByteQueue byteQueue = new ByteQueue(1024);

modbusResponse.write(byteQueue);

System.out.println("功能码:" + modbusRequest.getFunctionCode());

System.out.println("从站地址:" + modbusRequest.getSlaveId());

System.out.println("收到的响应信息大小:" + byteQueue.size());

System.out.println("收到的响应信息值:" + byteQueue);

return byteQueue;

}

/**

* 读04功能码

*

* @param ip        从站IP

* @param port      modbus端口

* @param start     起始地址偏移量

* @param readLenth 待读寄存器个数

* @return

* @throws ModbusInitException

*/

public static ByteQueue ReadInputRegistersRequest(  int slaveId,int start, int readLenth) throws ModbusInitException {

ModbusRequest modbusRequest = null;

try {

modbusRequest = new ReadInputRegistersRequest(slaveId, start, readLenth);

} catch (ModbusTransportException e) {

e.printStackTrace();

}

ModbusResponse modbusResponse = null;

try {

modbusResponse = getMaster().send(modbusRequest);

} catch (ModbusTransportException e) {

e.printStackTrace();

}

ByteQueue byteQueue = new ByteQueue(1024);

modbusResponse.write(byteQueue);

System.out.println("功能码:" + modbusRequest.getFunctionCode());

System.out.println("从站地址:" + modbusRequest.getSlaveId());

System.out.println("收到的响应信息大小:" + byteQueue.size());

System.out.println("收到的响应信息值:" + byteQueue);

return byteQueue;

}

public static void main(String[] args) {

try {

ReadHoldingRegistersRequest(1,0,1);

} catch (ModbusInitException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

对寄存器写入数据:

public class writeRegisters {

/**

* 工厂。

*/

static ModbusFactory modbusFactory;

static {

if (modbusFactory == null) {

modbusFactory = new ModbusFactory();

}

}

/**

* 获取master

*

* @return

* @throws ModbusInitException

*/

public static ModbusMaster getMaster() throws ModbusInitException {

IpParameters params = new IpParameters();

params.setHost("127.0.0.1");

params.setPort(502);

//

// modbusFactory.createRtuMaster(wapper); //RTU 协议

// modbusFactory.createUdpMaster(params);//UDP 协议

// modbusFactory.createAsciiMaster(wrapper);//ASCII 协议

ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 协议

try {

// 设置超时时间

master.setTimeout(30000);

// 设置重连次数

master.setRetries(3);

// 初始化

master.init();

} catch (ModbusInitException e) {

e.printStackTrace();

}

return master;

}

/**

* 写单个开关量到01功能码

* @param slaveId 从站ID

* @param start   起始地址偏移量

* @param values  待写数据

* @throws ModbusInitException

*/

public static void WriteCoilRequest( int slaveId, int start, boolean value) throws ModbusInitException {

try {

WriteCoilRequest request = new WriteCoilRequest(slaveId, start, value);

WriteCoilResponse response = (WriteCoilResponse) getMaster().send(request);

if (response.isException()) {

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

} else {

System.out.println("Success");

}

} catch (ModbusTransportException e) {

e.printStackTrace();

}

}

/**

* 写入批量开关量到01功能码

* @param slaveId 从站ID

* @param start   起始地址偏移量

* @param values  待写数据

* @throws ModbusInitException

*/

public static void WriteCoilsRequest( int slaveId, int start, boolean[] value) throws ModbusInitException {

try {

WriteCoilsRequest request = new WriteCoilsRequest(slaveId, start, value);

WriteCoilsResponse response = (WriteCoilsResponse) getMaster().send(request);

if (response.isException()) {

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

} else {

System.out.println("Success");

}

} catch (ModbusTransportException e) {

e.printStackTrace();

}

}

/**

*

*

* @param slaveId 从站ID

* @param start   起始地址偏移量

* @param anMask

* @param orMask

* @throws ModbusInitException

*/

public static void WriteMaskRegisterRequest( int slaveId, int start, int andMask, int orMask) throws ModbusInitException {

try {

WriteMaskRegisterRequest request = new WriteMaskRegisterRequest(slaveId, start, andMask, orMask);

WriteMaskRegisterResponse response = (WriteMaskRegisterResponse) getMaster().send(request);

if (response.isException()) {

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

} else {

System.out.println("Success");

}

} catch (ModbusTransportException e) {

e.printStackTrace();

}

}

/**

* 单个写数据到03功能码

*

* @param slaveId 从站ID

* @param start   起始地址偏移量

* @param values  待写数据

* @throws ModbusInitException

*/

public static void WriteRegisterRequest( int slaveId, int start, int values) throws ModbusInitException {

try {

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

WriteRegisterResponse response = (WriteRegisterResponse) getMaster().send(request);

if (response.isException()) {

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

} else {

System.out.println("Success");

}

} catch (ModbusTransportException e) {

e.printStackTrace();

}

}

/**

* 批量写数据到03功能码

*

* @param slaveId 从站ID

* @param start   起始地址偏移量

* @param values  待写数据

* @throws ModbusInitException

*/

public static void WriteRegistersRequest( int slaveId, int start, short[] values) throws ModbusInitException {

try {

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

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

if (response.isException()) {

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

} else {

System.out.println("Success");

}

} catch (ModbusTransportException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

boolean[] data = {true,true,true,true,true,true,true};

try {

WriteCoilsRequest(1,0,data);

} catch (ModbusInitException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

注意进行硬件测试的时候本机ip与从机ip的网址要在同一网段

附带相关jar包https://download.csdn.net/download/ilsld/12400231

java modbus4j_java使用modbus4j来实现modbusTCP通信相关推荐

  1. Java实现ModbusTCP通信

    原文:https://blog.csdn.net/ioufev/article/details/100554691 相关链接:Java实现使用Modbus4j+seroUtils读取Mudbus RT ...

  2. 关于跨网闸数据同步的方式调研Java实现ModbusTCP通信

    1 网闸的概念 网闸_百度百科 (baidu.com) 2 跨网闸数据同步的方式了解 目前了解到有三种方式: 1 配置开放ip.端口,外网直接访问http://www.voidcn.com/artic ...

  3. Java实现使用Modbus4j+seroUtils读取Mudbus RTU/ASCII Over TCP/IP连接设备数据

    使用Modbus4j+seroUtils读取风速风向仪数据,现有设备IP,端口号,从机地址,寄存器读取开始地址,读取的寄存器数量.没有上述jar包可以自行搜索,网上资源挺多 /*** @author ...

  4. JAVA学习-JAVA实现客户端与服务器端的TCP通信

    JAVA实现客户端与服务器端的TCP通信 (JAVA 工程训练阶段一.训练任务三基本通信能力.基本任务3.2javaTCP 通信) 编写两个java application 应用程序,完成以下功能: ...

  5. 使用java网络编程模拟简单网络即时通信

    使用java网络编程模拟简单网络即时通信 通信流程图: 解析: 1.在上图中我们可以看出对于任何一个客户端,都由两部分构成,发送端和接收端(分别由两个线程来维系) 2.客户端在每一次请求链接时都会轮询 ...

  6. 西门子300PLC连接组态王KingSCADA实现ModbusTCP通信

    西门子S7300系列PLC连接组态王实现ModbusTCP通信 西门子300系列PLC 本案例用PLC的是315-2DP,此型号PLC有两个通信接口分别是MPI.DP口. 首先把300PLC连接兴达易 ...

  7. S7-200SMART PLC ModbusTCP通信(ModbusTcp服务器)

    S7-200SMART PLC 作为ModbusTCP通信(客户端)编程应用和程序详细讲解可以查看下面的博客,链接地址如下: S7-200SMART PLC ModbusTCP通信(多服务器多从站轮询 ...

  8. java socket 全双工客户端_[Java教程]用socket模拟实现全双工通信

    [Java教程]用socket模拟实现全双工通信 0 2017-04-04 00:00:14 //源码下载 http://download.csdn.net/detail/qq_24054661/98 ...

  9. Java进阶知识 - 多线程与线程间通信

    CountdownLatch, CyclicBarrier 分别适合什么场景呢? 大部分情况下, 子线程只需要关心自身执行的任务. 但在某些复杂的情况下, 需要使用多个线程来协同完成某个任务, 这就涉 ...

最新文章

  1. f5 会话保持 负载均衡_F5负载均衡配置-运维管理
  2. 纪事地图和Yahoo Cloud服务基准
  3. 常见的linux命令及其翻译
  4. php 的命名空间 看鸟哥后的随笔
  5. 定时器new Timer().schedule()的使用
  6. 程序一旦发觉写得不理想,那就得重构它
  7. java画笔覆盖在界面_Java画笔的简单实用方法
  8. php i++和++i的区别,初学者搞懂i++和++i
  9. spark中local模式与cluster模式使用场景_Spark内核及通信框架概述-针对面试(后面有源码分析)...
  10. leetcode前缀树java_Java实现 LeetCode 208 实现 Trie (前缀树)
  11. 访问艺术馆(codevs 1163)树形DP
  12. 4月第三周网络安全报告:发现放马站点域名437个
  13. 2000-2018年各省研发投入面板数据
  14. apache OpenNLP简要介绍
  15. 电脑重装系统后Word表格自动换行的方法
  16. Luminati通过住宅IP网络工作,其可靠性如何?
  17. css实现文字或者div盒子水平垂直居中的方法
  18. 商品管理系统SSM练习开发详细手册
  19. (八):docker swarm简单使用
  20. unity中的缓动插值曲线,Easing Curves的那些事

热门文章

  1. 中医药大学远程教育计算机,北京中医药大学远程教育计算机基础(2008版) 第6次...
  2. 影视剧中的武汉取景地,你去过几个?
  3. 从位图图像中读取2D纹理(C ++,OpenGL)
  4. UNIAPP中H5微信登录
  5. http://southpeak.github.io/blog/2014/08/02/reactiv
  6. 英语语法笔记——长难句分析其他方式(七)
  7. mysql的锁机制(读锁,写锁,表锁,行锁,悲观锁,乐观锁,间隙锁)
  8. Winpcap 动态链接库调用npf.sys
  9. 2022必撸八股!198道K8s/Docker/DevOps面试真题大汇总
  10. QMT vs Ptrade 速度对比 (一) 历史行情获取速度