Flir AX8 红外摄像机获取温度值

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;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FLIR红外室内数据集是由FLIR Systems公司提供的一组用于室内红外图像分析的数据集。该数据集包含了一系列从红外相机拍摄的室内场景图像,用于帮助开发者和研究人员在室内环境中进行物体检测、跟踪和分类等任务。 FLIR红外室内数据集中的图像具有真实的室内背景,包含了不同种类的物体,如人类、家具、电器等。这些图像采用红外技术,可以穿透某些材料,因此可以在暗光和烟雾等环境下获取清晰的图像。 该数据集的使用可以应用于许多领域,如安防监控、自动驾驶、机器人、智能家居等。通过利用FLIR红外室内数据集,开发者可以训练和优化他们的算法和模型,以在各种室内场景中准确地检测和识别物体,从而实现智能决策和自主行动。 FLIR红外室内数据集相比于传统的可见光图像数据集具有独特的优势。红外图像能够提供物体的热分布信息,对于暗光环境和低能见度条件下的物体检测具有更好的性能。此外,红外图像可以穿透某些材料,使得可以对隐藏在表面之后的物体进行检测和识别。 总之,FLIR红外室内数据集为研究人员和开发者提供了在室内环境中进行红外图像分析的宝贵资源。通过利用这个数据集,可以推动红外技术在各个领域的应用发展,并为解决现实生活中的问题提供更准确和可靠的智能化解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值