以下是代码:

读取寄存器数据:

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. java解压多目录Zip文件(解决中文乱码问题)--转载
  2. gsoap的几个常用设置选项
  3. Java对象运行时在内存中的情况
  4. 30. 实体和编码(2)
  5. IntPtr是什么,该怎么用?
  6. struts2 拦截器返回值问题
  7. gp数据库主节点故障导致数据库无法重启报错
  8. SDK二次开发摄像头语音转发功能和语音对讲
  9. IT人士要注意叻:太晚睡会导致的后果(转)
  10. Android 沉浸式体验
  11. 如何使用支付宝账号授权登录网站
  12. 编写python爬虫基础_0基础如何快速写python爬虫
  13. 出界的路径数----迭代问题与计算思维
  14. 北大计算机mooc题库,人工智能原理MOOC习题集及答案 北京大学 王文敏
  15. 二阶求导 算法 实现 寻峰问题(转)
  16. 香港劫匪盯上芯片,418 万元芯片在运输途中被劫
  17. P1244 [NOI2000] 青蛙过河 (推理
  18. ps3模拟器android,ps3模拟器手机版
  19. Vue的基本知识——wsdchong
  20. antd 源码解读 notification

热门文章

  1. Yahoo Programming Contest 2019.D.Ears(DP)
  2. 两个向量构成的平行四边形面积的求解 ————简单技巧
  3. java实现hbase表创建、数据插入、删除表
  4. 手机测试软件可以看cpu占用率,手机资源占用情况检测
  5. 给视频加字幕HTML代码,给Html5视频播放器添加字幕
  6. 项目经理解决冲突的模式
  7. Java基础 switch用法
  8. 软件自学成才到公司要学历吗_来自7位自学成才的编码人员的经验教训,他们现在全职从事软件开发人员的工作...
  9. vue3中reactive赋值失败
  10. Java的宝贝——反射