Flir AX8 红外摄像机获取六个点温度以及框的最高最低温度
设备信息
实现原理
该摄像机支持modbus Tcp 通讯 只需要通过Java的modbus驱动包将相机寄存器内的相应寄存器值获取到即可 其实还可以获取别的设备状态设备文档中有详细解释这里不做过多说明。
源码
maven引入jar包
modbus4j-3.0.5.jar下载【链接】
<!-- Modbus4j引入 -->
<dependency>
<groupId>com.infiniteautomation</groupId>
<artifactId>modbus4j</artifactId>
<version>3.0.3</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/modbus4j-3.0.5.jar</systemPath>
</dependency>
modbus读取寄存器类
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;
import java.text.DecimalFormat;
/**
* @Description: 红外温度获取类(型号:AX8)可以获取六个点温度以及六个框最大温度
* @version 1.0
* @Author: Hisen
* @Date: 2019-08-07
*/
public class InfraredUtil {
private static String modbusIp;//相机IP地址 000.000.000.000
private static int modbusPort;//相机端口 默认502
private static int slaveId = 1; //寄存器ID
/**
* 初始化Modbus工厂
*/
private static ModbusFactory modbusFactory;
static {
if (modbusFactory == null) {
modbusFactory = new ModbusFactory();
}
}
/**
* @Description: 参数配置
* @Param: []
* @return: com.serotonin.modbus4j.ModbusMaster
* @Author: Hisen
* @Date: 2019/12/24
* @throws ModbusInitException
*/
private static ModbusMaster getMaster() throws ModbusInitException {
IpParameters params = new IpParameters();
/* 指定IP地址和端口*/
params.setHost(modbusIp);
params.setPort(modbusPort);
/* 协议选择*/
ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 协议
master.init();
return master;
}
/**
* 读取寄存器[Holding Register类型 2x类型存储单元]模拟量数据
*
* @param slaveId slave Id
* @param offset 位置
* @param dataType 数据类型
* @return getMaster().getValue(loc)
* @throws ModbusTransportException 传输异常
* @throws ErrorResponseException 错误响应异常
* @throws ModbusInitException 初始化异常
*/
private static Number readHoldingRegister(int slaveId, int offset, int dataType) throws ModbusTransportException, ErrorResponseException, ModbusInitException {
//Holding Register类型数据读取
BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);
return getMaster().getValue(loc);
}
/**
* 温度格式转换
*
* @param data 温度
* @return temperature 转换后的温度
*/
private static double temperatureConversion(Number data) {
try {
//Number转成字符串
String temp = data.toString();
//字符串转Double并温度转化(开氏转摄氏)
double temp1 = Double.parseDouble(temp) - 273.15;
//精确两位
DecimalFormat df = new DecimalFormat("######0.00");
double temperature = Double.parseDouble(df.format(temp1));
return temperature;
} catch (Exception e) {
//Log4j记录
LOG.error("温度转换失败" + e);
return 0.0;
}
}
/**
* 获取点温度
*
* @param deviceIp 设备地址 String [格式实例:192.168.1.1]
* @param devicePort 端口号 int [默认:502]
* @param deviceNumber 点编号 int [取值范围 1~6]
* @return temperature 温度 double [温度值]
*/
public double getSpotValue(String deviceIp, int devicePort, int deviceNumber) {
modbusIp = deviceIp;
modbusPort = devicePort;
double temperature = 0.0;
try {
//点温度
switch (deviceNumber) {
case 1:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1019, DataType.FOUR_BYTE_FLOAT));
break;
case 2:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1031, DataType.FOUR_BYTE_FLOAT));
break;
case 3:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1043, DataType.FOUR_BYTE_FLOAT));
break;
case 4:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1055, DataType.FOUR_BYTE_FLOAT));
break;
case 5:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1067, DataType.FOUR_BYTE_FLOAT));
break;
case 6:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1079, DataType.FOUR_BYTE_FLOAT));
break;
default:
temperature = 0;
break;
}
} catch (Exception e) {
//Log4j记录
LOG.info("[红外]:设备:"+deviceIp+"连接超时!");
}
return temperature;
}
/**
* 获取框最高温度
*
* @param deviceIp 设备地址 String [格式实例:192.168.1.1]
* @param devicePort 端口号 int [默认:502]
* @param deviceNumber 框编号 int [取值范围 1~6]
* @return temperature 温度 double [温度值]
*/
public double getBoxMaxValue(String deviceIp, int devicePort, int deviceNumber) {
modbusIp = deviceIp;
modbusPort = devicePort;
double temperature = 0.0;
try {
//框温度
switch (deviceNumber) {
case 1:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1023, DataType.FOUR_BYTE_FLOAT));
break;
case 2:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1035, DataType.FOUR_BYTE_FLOAT));
break;
case 3:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1047, DataType.FOUR_BYTE_FLOAT));
break;
case 4:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1059, DataType.FOUR_BYTE_FLOAT));
break;
case 5:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1078, DataType.FOUR_BYTE_FLOAT));
break;
case 6:
temperature = temperatureConversion(readHoldingRegister(slaveId, 1090, DataType.FOUR_BYTE_FLOAT));
break;
default:
temperature = 0;
break;
}
} catch (Exception e) {
//Log4j记录
LOG.warn("[红外]:设备:"+deviceIp+"连接超时!");
}
return temperature;
}
}