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);

  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM