springboot中modbus使用
pom.xml配置:
false
true
ias-snapshots
Infinite Automation Snapshot Repository
true
false
ias-releases
Infinite Automation Release Repository
https://maven.mangoautomation.net/repository/ias-release/
com.infiniteautomation
modbus4j
3.0.3
modbus配置类:
package com.induo.common.modbus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import com.induo.domain.mapper.IpControlMapper;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.ip.IpParameters;
import java.util.HashMap;
@Configuration
/*
* 使用@Bean,就不用使用@Import来导入相应的类了,@Bean生成的bean的名字默认为方法名,由于hashMap使用很广泛,
* 所以使用@Bean的方式引入依赖,这样在注入的时候可以指定名称,以免注入错误的对象
* @Import({java.util.HashMap.class,com.serotonin.modbus4j.ModbusFactory.class})
*/
@Import(com.serotonin.modbus4j.ModbusFactory.class)
public class ModbusConfig {
@Bean
public HashMap modbusMasterHashMap() {
return new HashMap<>();
}
@Autowired
IpControlMapper ipControlMapper;
@Autowired
private ModbusFactory modbusFactory;
@Autowired
@Qualifier("modbusMasterHashMap")
private HashMap masterMap;
/**
* @Title getMaster
* @Description: 通过ip获取对应的modbus连接器
* @params: [ip]
* @return: com.serotonin.modbus4j.ModbusMaster
* @author: caiwei
* @date: 2019/5/1 13:58
*/
public ModbusMaster getMaster(String ip) {
ModbusMaster modbusMaster = masterMap.get(ip);
if(modbusMaster == null) {
setMaster(ip, ipControlMapper.queryControlByIp(ip).getPort());
modbusMaster = masterMap.get(ip);
}
return modbusMaster;
}
/**
* @Title setMaster
* @Description: 设置ip对应的modbus连接器
* @params: [ip, port]
* @return: void
* @author: caiwei
* @date: 2019/5/1 13:59
*/
private void setMaster(String ip, Integer port) {
ModbusMaster master;
IpParameters params = new IpParameters();
params.setHost(ip);
params.setPort(port);
//设置为true,会导致TimeoutException: request=com.serotonin.modbus4j.ip.encap.EncapMessageRequest@774dfba5",
//params.setEncapsulated(true);
master = modbusFactory.createTcpMaster(params, false);// TCP 协议
try {
//设置超时时间
master.setTimeout(3*1000);
//设置重连次数
master.setRetries(3);
//初始化
master.init();
} catch (ModbusInitException e) {
e.printStackTrace();
}
masterMap.put(ip, master);
}
}
modbus工具类:
package com.induo.common.modbus;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.msg.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @ClassName: ModbusUtil
* @Description: modbus读写工具类
* @auther: caiwei
* @date: 2019/5/1 15:44
*/
@Component
public class ModbusUtil {
//从机默认值
private Integer slaveId = 1;
@Autowired
private ModbusConfig modbusConfig;
/**
* @Title readCoilStatus
* @Description: 读(线圈)开关量数据,相当于功能码:01H-读线圈状态
* @params: [ip, slaveId, offset, numberOfRegister]
* @return: boolean[]
* @throws:
* @author: caiwei
* @date: 2019/5/1 14:32
*/
public boolean[] readCoilStatus(String ip, int offset, int numberOfRegister) throws ModbusTransportException {
ModbusMaster master = modbusConfig.getMaster(ip);
ReadCoilsRequest request = new ReadCoilsRequest(slaveId, offset, numberOfRegister);
ReadCoilsResponse response = (ReadCoilsResponse) master.send(request);
boolean[] booleans = response.getBooleanData();
return valueRegroup(numberOfRegister, booleans);
}
/**
* @Title readInputStatus
* @Description: 读取外围设备输入的开关量,相当于功能码:02H-读离散输入状态
* @params: [ip, offset, numberOfRegister]
* @return: boolean[]
* @throws:
* @author: caiwei
* @date: 2019/5/1 14:49
*/
public boolean[] readInputStatus(String ip, int offset, int numberOfRegister) throws ModbusTransportException {
ModbusMaster master = modbusConfig.getMaster(ip);
ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId,offset, numberOfRegister);
ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);
boolean[] booleans = response.getBooleanData();
return valueRegroup(numberOfRegister, booleans);
}
/**
* @Title readHoldingRegister
* @Description: 读取保持寄存器数据,相当于功能码:03H-读保持寄存器
* @params: [ip, offset, numberOfRegister]
* @return: short[]
* @throws:
* @author: caiwei
* @date: 2019/5/1 15:53
*/
public short[] readHoldingRegister(String ip, int offset, int numberOfRegister) throws ModbusTransportException {
ModbusMaster master = modbusConfig.getMaster(ip);
ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, offset, numberOfRegister);
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);
return response.getShortData();
}
/**
* @Title readInputRegisters
* @Description: 读取外围设备输入的数据,相当于功能码:04H-读输入寄存器
* @params: [ip, offset, numberOfRegister]
* @return: short[]
* @throws:
* @author: caiwei
* @date: 2019/5/1 15:56
*/
public short[] readInputRegisters(String ip, int offset, int numberOfRegister) throws ModbusTransportException {
ModbusMaster master = modbusConfig.getMaster(ip);
ReadInputRegistersRequest request = new ReadInputRegistersRequest(slaveId, offset, numberOfRegister);
ReadInputRegistersResponse response = (ReadInputRegistersResponse) master.send(request);
return response.getShortData();
}
/**
* @Title writeCoil
* @Description: 写单个(线圈)开关量数据,相当于功能码:05H-写单个线圈
* @params: [ip, writeOffset, writeValue]
* @return: boolean
* @throws:
* @author: caiwei
* @date: 2019/5/1 16:00
*/
public boolean writeCoil(String ip, int writeOffset, boolean writeValue) throws ModbusTransportException {
ModbusMaster tcpMaster = modbusConfig.getMaster(ip);
WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);
WriteCoilResponse response = (WriteCoilResponse) tcpMaster.send(request);
return !response.isException();
}
/**
* @Title writeCoils
* @Description: 写多个开关量数据(线圈),相当于功能码:0FH-写多个线圈
* @params: [ip, startOffset, data]
* @return: boolean
* @throws:
* @author: caiwei
* @date: 2019/5/1 16:00
*/
public boolean writeCoils(String ip, int startOffset, boolean[] data) throws ModbusTransportException {
ModbusMaster tcpMaster = modbusConfig.getMaster(ip);
WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, data);
WriteCoilsResponse response = (WriteCoilsResponse) tcpMaster.send(request);
return !response.isException();
}
/**
* @Title writeHoldingRegister
* @Description: 写单个保持寄存器,相当于功能码:06H-写单个保持寄存器
* @params: [ip, writeOffset, writeValue]
* @return: boolean
* @throws:
* @author: caiwei
* @date: 2019/5/1 16:02
*/
public boolean writeHoldingRegister(String ip, int writeOffset, short writeValue) throws ModbusTransportException, ModbusInitException {
ModbusMaster tcpMaster = modbusConfig.getMaster(ip);
WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);
WriteRegisterResponse response = (WriteRegisterResponse) tcpMaster.send(request);
return !response.isException();
}
/**
* @Title writeHoldingRegisters
* @Description: 写多个保持寄存器,相当于功能码:10H-写多个保持寄存器
* @params: [ip, slaveId, startOffset, data]
* @return: boolean
* @throws:
* @author: caiwei
* @date: 2019/5/1 16:03
*/
public boolean writeHoldingRegisters(String ip, int startOffset, short[] data) throws ModbusTransportException, ModbusInitException {
ModbusMaster tcpMaster = modbusConfig.getMaster(ip);
WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, data);
WriteRegistersResponse response = (WriteRegistersResponse) tcpMaster.send(request);
return !response.isException();
}
/**
* @Title valueRegroup
* @Description: 转换工具,将Boolean转换成0,1
* @params: [numberOfBits, values]
* @return: boolean[]
* @throws:
* @author: caiwei
* @date: 2019/5/1 15:55
*/
private boolean[] valueRegroup(int numberOfBits, boolean[] values) {
boolean[] bs = new boolean[numberOfBits];
int temp = 1;
for (boolean b : values) {
bs[temp - 1] = b;
temp++;
if (temp > numberOfBits) {
break;
}
}
return bs;
}
}
ipControlMapper:
package com.induo.area.domain.mapper;
import java.util.List;
import com.induo.area.domain.entity.IpControl;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface IpControlMapper {
@Results(id = "ipControlMap", value = {
@Result(column = "ip", property = "ip", javaType = String.class),
@Result(column = "port", property = "port", javaType = Integer.class),
@Result(column = "ip_type", property = "ipType", javaType = Integer.class),
@Result(column = "device_data_gather_cycle", property = "deviceDataGatherCycle", javaType = Integer.class),
@Result(column = "device_data_gather_interval", property = "deviceDataGatherInterval", javaType = Integer.class),
@Result(column = "note_alarm_data_gather_cycle", property = "noteAlarmDataGatherCycle", javaType = Integer.class),
@Result(column = "environment_data_gather_cycle", property = "environmentDataRecordCycle", javaType = Integer.class)
}) 无锡人流医院哪家好 http://mobile.wxbhnkyy120.com/
//通过ip查询控制器
@Select("select ip, port, ip_type, device_data_gather_cycle, device_data_gather_interval, note_alarm_data_gather_cycle, environment_data_gather_cycle " +
"from control " +
"where ip = #{ip}")
IpControl queryControlByIp(String ip);
//通过ip类型(0:区域控制器, 1:八防控制器)查询控制器
@Select("select ip " +
"from control " +
"where ip_type = #{ipType}")
List queryAllIpControlIp(String ipType);
//插入控制器
@Insert("insert into control(ip, port, ip_type, device_data_gather_cycle, device_data_gather_interval, note_alarm_data_gather_cycle, environment_data_gather_cycle) " +
"values (#{ip}, #{port}, #{ipType}, #{deviceDataGatherCycle}, #{deviceDataGatherInterval}, #{noteAlarmDataGatherCycle}, #{environmentDataRecordCycle})")
void addIpControl(IpControl ipControl);
//更新区域控制器
@Update("")
void updateIpControl(IpControl ipControl);
//通过ip删除相应的控制器
@Delete("delete " +
"from control " +
"where ip = #{ip}")
void deleteIpControl(String ip);
}
springboot中modbus使用的更多相关文章
- SpringBoot中yaml配置对象
转载请在页首注明作者与出处 一:前言 YAML可以代替传统的xx.properties文件,但是它支持声明map,数组,list,字符串,boolean值,数值,NULL,日期,基本满足开发过程中的所 ...
- 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧
做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...
- springboot中swaggerUI的使用
demo地址:demo-swagger-springboot springboot中swaggerUI的使用 1.pom文件中添加swagger依赖 2.从github项目中下载swaggerUI 然 ...
- spring-boot+mybatis开发实战:如何在spring-boot中使用myabtis持久层框架
前言: 本项目基于maven构建,使用mybatis-spring-boot作为spring-boot项目的持久层框架 spring-boot中使用mybatis持久层框架与原spring项目使用方式 ...
- 由浅入深学习springboot中使用redis
很多时候,我们会在springboot中配置redis,但是就那么几个配置就配好了,没办法知道为什么,这里就详细的讲解一下 这里假设已经成功创建了一个springboot项目. redis连接工厂类 ...
- Springboot中使用AOP统一处理Web请求日志
title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...
- SpringBoot 中常用注解
本篇博文将介绍几种SpringBoot 中常用注解 其中,各注解的作用为: @PathVaribale 获取url中的数据 @RequestParam 获取请求参数的值 @GetMapping 组合注 ...
- SpringBoot中关于Mybatis使用的三个问题
SpringBoot中关于Mybatis使用的三个问题 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8495453.html 原本是要讲讲PostgreSQL ...
- 在SpringBoot中配置aop
前言 aop作为spring的一个强大的功能经常被使用,aop的应用场景有很多,但是实际的应用还是需要根据实际的业务来进行实现.这里就以打印日志作为例子,在SpringBoot中配置aop 已经加入我 ...
随机推荐
- spring-boot 知识集锦
1.spring-boot项目在外部tomcat环境下部署 https://blog.csdn.net/james_wade63/article/details/51009423 https://bl ...
- python初级(302) 6 对象(五)
一.复习 1.什么是多态 2.什么是继承 二.继承:向父母学习 在面向对象编程中,类可以从其他类继承属性和方法.这样就有了类的整个家族,这个家族中的每个类共享相同的属性和方法.这样一来,每次向家族增加 ...
- 初学nodejs express小案例——小小相册(不涉及数据库,非常详细)
业务简介: 显示文件夹 点击显示相册 上传相册 一.在主页显示文件夹 首先,我们要建立以上的文件夹,其中views用于放模板ejs,uploads里放的是相册文件夹,public是网页所需要的css ...
- C# Task 暂停与取消 或 C#中可取消的Task
(1)https://www.cnblogs.com/zhengzc/p/10724839.html (2)https://blog.csdn.net/hxfhq1314/article/detail ...
- [分享会] 微服务框架设计 (基于Swoole)
框架三要素 1. Service 通信 2. 服务管理 3. 开发组件 为什么需要服务 1.自治性 2.可组合 3.异构性 2.弹性扩展 -实现方式- 共享库 1.二进制文件/Compos ...
- spring boot使用WebClient调用其他系统提供的HTTP服务
WebClient的请求模式属于异步非阻塞,能够以少量固定的线程处理高并发的HTTP请求 WebClient是Spring WebFlux模块提供的一个非阻塞的基于响应式编程的进行Http请求的客户端 ...
- sqlalchemy python中的mysql数据库神器
在介绍sqlalchemy之前,我们先了解一下ORM. ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.也就是说ORM 将数据库中的表与面向对象语言中的类建 ...
- ThinkPHP3(命名空间、RBAC)
命名空间 当开发大型项目的时候,可以会需要成千上万的文件 面向对象通过命名空间来解决这个问题的. PHP命名空间是PHP5.3以后才出现的. 命名空间中可以出现:类,函数,常量 只有const定义的常 ...
- 引用类型前需要加ref?
方法的参数前加ref代表的是传的参数的地址,值类型前加ref的作用相当于把这个值类型当成引用类型在用,那引用类型作为参数有一种情况也需要加ref,不然得到的值会有差. 不加ref: class Pro ...
- 【笔试题】Overloading in Java
笔试题 Overloading in Java Question 1 以下程序的输出结果为( ). public class Test { public int getData() { return ...