首页 > 其他分享 >PnFn信息点信息类工具类

PnFn信息点信息类工具类

时间:2024-09-05 09:39:16浏览次数:8  
标签:... String int 信息点 DA2 工具 PnFn DA1

数据单元标识定义

image
信息点 DA 由信息点元 DA1 和信息点组 DA2 两个字节构成。DA2 采用二进 制编码方式表示信息点组,DA1 对位表示某一信息点组的 1~8 个信息点,以此 共同构成信息点标识 Pn(256*8: n=1~2040)

信息点

image
当 DA1 和 DA2 全为“0”时,表示终端信息点,用 P0 表示;信息点标识 Pn 对应于不同信息类标识 Fn 可以是测点号、灯号、组号等

信息类

image
信息类 DT 由信息类元 DT1 和信息类组 DT2 两个字节构成。DT2 采用二进 制编码方式表示信息类组,DT1 对位表示某一信息类组的 1~8 种信息类型,以 此共同构成信息类标识 Fn

Java工具类

package com.utils;

/**
 *  信息点组 DA2 | 信息点元 DA1
 *  DA2从1开始   |  D7   D6   D5   D4   D3   D2   D1   D0
 * -------------|-----------------------------------------
 *       1      |  P8   P7   P6   P5   P4   P3   P2   P1
 *       2      | P16  P15  P14  P13  P12  P11  P10  P9
 *       3      | P24  P23  P22  P21  P20  P19  P18  P17
 *      ...     |  ...  ...  ...  ...  ...  ...  ...  ...
 *      255     |P2040 P2039 P2038 P2037 P2036 P2035 P2034 P2033
 *
 * Fn的两个字节组成
 * 信息类组 DT2 | 信息类元 DT1
 *   DT2从0开始   |  D7     D6     D5     D4     D3     D2     D1     D0
 * -------------|-----------------------------------------------------
 *       0      |  F8     F7     F6     F5     F4     F3     F2     F1
 *       1      | F16    F15    F14    F13    F12    F11    F10     F9
 *       2      | F24    F23    F22    F21    F20    F19    F18    F17
 *      ...     |  ...    ...    ...    ...    ...    ...    ...    ...
 *      30      |F248   F247   F246   F245   F244   F243   F242   F241
 * -------------|-----------------------------------------------------
 *     255      | 未定义
 */
public class GBPnFnUtil {

    public static void main(String[] args) {

        // 计算并返回 PnFn 的值
        String pnValue = getPnFn("00008003");
        System.out.println("PnFn value: " + pnValue);

        // PnFn P0F3
        String pnfn = "P0F32";
        // 计算并返回的十六进制值
        String hex = getHexFromPnFn(pnfn);
        System.out.println("Hex value: " + hex);

    }

    /**
     * 根据DA2 DA1 DT2 DT1十六进制获取数据
     * @param da1da2dt1dt2hex
     * @return
     */
    public static String getPnFn(String da1da2dt1dt2hex){
        short[] pnfnByte = HexUtil.hexStrToByteArray(da1da2dt1dt2hex);
        //设备传送过来的数据顺序DA1 DA2 DT1 DT2
        int da1 = pnfnByte[0];
        int da2 = pnfnByte[1];
        int dt1 = pnfnByte[2];
        int dt2 = pnfnByte[3];
        //获取PNFN使用数据时DA2 DA1 DT2 DT1
        String pnValue = getPnValue(da2, da1);
        String fnValue = getFnValue(dt2, dt1);
        return pnValue+fnValue;
    }


    private static String getPnValue(int da2, int da1) {
        // 特殊情况处理:当 DA1 和 DA2 全为“0”时,返回 P0
        if (da2 == 0 && da1 == 0) {
            return "P0";
        }
        // 每组包含 8 个 P 值
        int groupSize = 8;
        // 计算 Pn 的基索引
        int baseIndex = (da2-1) * groupSize;
        if (baseIndex<0) baseIndex = 0;
        // DA1 的每个位对应一个 P 值
        int bitIndex = Integer.numberOfTrailingZeros(da1);
        // 最终的 Pn 索引
        int pnIndex = baseIndex + bitIndex + 1;
        // 返回 Pn 值
        return "P" + pnIndex;
    }

    /**
     * Fn的两个字节组成
     * 信息类组 DT2 | 信息类元 DT1
     *              |  D7     D6     D5     D4     D3     D2     D1     D0
     * -------------|-----------------------------------------------------
     *       0      |  F8     F7     F6     F5     F4     F3     F2     F1
     *       1      | F16    F15    F14    F13    F12    F11    F10     F9
     *       2      | F24    F23    F22    F21    F20    F19    F18    F17
     *      ...     |  ...    ...    ...    ...    ...    ...    ...    ...
     *      30      |F248   F247   F246   F245   F244   F243   F242   F241
     * -------------|-----------------------------------------------------
     *     255      | 未定义
     * @param dt2
     * @param dt1
     * @return
     */
    private static String getFnValue(int dt2, int dt1) {
        // 特殊情况处理:当 DA1 和 DA2 全为“0”时,返回 P0
        if (dt2 == 0 && dt1 == 0) {
            return "F0";
        }
        // 每组包含 8 个 P 值
        int groupSize = 8;
        // 计算 Pn 的基索引
        int baseIndex = dt2 * groupSize;
        if (baseIndex<0) baseIndex = 0;
        // DA1 的每个位对应一个 P 值
        int bitIndex = Integer.numberOfTrailingZeros(dt1);
        // 最终的 Fn 索引
        int fnIndex = baseIndex + bitIndex + 1;
        // 返回 Fn 值
        return "F" + fnIndex;
    }




    /**
     * 根据PnFn字符串获取对应的十六进制数据
     * @param pnfnstr
     * @return
     */
    public static String getHexFromPnFn(String pnfnstr){
        // 提取 Pn 和 Fn
        String pn = pnfnstr.substring(0, pnfnstr.indexOf('F'));
        String fn = pnfnstr.substring(pnfnstr.indexOf('F'));

        // 获取 DA1 DA2
        int[] da1da2 = getHexFromPn(pn);
        int da1 = da1da2[0];
        int da2 = da1da2[1];

        // 获取 DT1 DT2
        int[] dt1dt2 = getHexFromFn(fn);
        int dt1 = dt1dt2[0];
        int dt2 = dt1dt2[1];

        // 组合为十六进制字符串
        return String.format("%02X%02X%02X%02X", da1, da2, dt1, dt2);
    }

    private static int[] getHexFromPn(String pn) {
        int pnIndex = Integer.parseInt(pn.substring(1));

        // 特殊情况处理:当 Pn 为 P0 时,返回 DA1 = 0, DA2 = 0
        if (pnIndex == 0) {
            return new int[]{0, 0};
        }

        int groupSize = 8;
        int da2 = (pnIndex - 1) / groupSize + 1;
        int bitIndex = (pnIndex - 1) % groupSize;
        int da1 = 1 << bitIndex;

        return new int[]{da1, da2};
    }

    private static int[] getHexFromFn(String fn) {
        int fnIndex = Integer.parseInt(fn.substring(1));

        // 特殊情况处理:当 Fn 为 F0 时,返回 DT1 = 0, DT2 = 0
        if (fnIndex == 0) {
            return new int[]{0, 0};
        }

        int groupSize = 8;
        int dt2 = (fnIndex - 1) / groupSize;
        int bitIndex = (fnIndex - 1) % groupSize;
        int dt1 = 1 << bitIndex;

        return new int[]{dt1, dt2};
    }
}

标签:...,String,int,信息点,DA2,工具,PnFn,DA1
From: https://www.cnblogs.com/aeolian/p/18397715

相关文章

  • 推荐一款开源、高效、灵活的Redis桌面管理工具:Tiny RDM!支持调试与分析功能!
    1、引言在大数据和云计算快速发展的今天,Redis作为一款高性能的内存键值存储系统,在数据缓存、实时计算、消息队列等领域发挥着重要作用。然而,随着Redis集群规模的扩大和复杂度的增加,如何高效地管理和运维Redis数据库成为了许多开发者和运维人员面临的挑战。TinyRDM(TinyRedisDes......
  • 40款主流的AI工具集盘点,这些好用的AI软件一定要知道!
    AI工具哪款好,有哪些值得推荐?不可否认,当下各式各样的AI工具层出不穷,面对不断涌现的AI工具,各位在选用时是否无从下手,或是抽不出时间,逐一体验对比不同AI工具的差异……这也是现如今许多人共同面对的问题,为了让大家更快地找到自己需要的AI工具,笔者花费了数天时间,从500+软件中精选......
  • Cinema 4D v2024 激活版下载与安装教程 (3D建模工具)
    安装步骤Cinema4Dv2024版:Cinema4D_2024_2024.3.0.zip1、下载解压后点击如下图运行安装2、选择安装路径,将C改成D,安装到D盘符3、安装中,耐心等待2-5分钟4、安装完取消勾选,点击完成,请先不要启动软件。5、将crack文件夹c4d_base.xdl64文件覆盖corelibs文件夹,如下图所示找......
  • Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
    文章目录一、字节码文件1.1以正确的方式打开文件1.2字节码文件的组成1.2.1基础信息1.2.2常量池1.2.3方法1.3字节码常用工具1.4总结二、Java注解2.1什么是Java注解2.2注释和注解Annotation的区别(掌握)2.3如何使用注解(掌握)2.4Java中已经存在的注解(掌握)2.5自定义注解(了解)2.......
  • 免费视频压缩软件下载?2024年最新15款好用的视频压缩工具推荐!
    做过短视频的朋友,肯定都知道大部分平台的视频大小都有限制,那么如何通过无损压缩,上传体积小、清晰度高的视频,成为了不少同学的锥心之痛!今天,俺就以一名剪辑师的身份,分享圈里人用的比较多的视频压缩工具,大部分都是免费哒,绝对可以让你的是制作如虎添翼!1、压缩宝官网:https://www.......
  • 【python因果推断库6】使用 pymc 模型的工具变量建模 (IV)1
    目录使用pymc模型的工具变量建模(IV)使用pymc模型的工具变量建模(IV)这份笔记展示了一个使用工具变量模型(InstrumentalVariable,IV)的例子。我们将会遵循Acemoglu,Johnson和Robinson(2001)的一个案例研究,该研究尝试解开强大的政治机构对于以国内生产总值(GDP)......
  • IncarnaMind: 革命性AI工具实现文档无缝交互与数据提取
    IncarnaMind:开创文档交互新纪元在当今数字时代,有效管理和利用个人文档中的信息变得越来越重要。IncarnaMind应运而生,为用户提供了一种革命性的方式来与个人文档进行交互并提取关键信息。这款创新工具利用先进的自然语言处理技术和独特的数据提取方法,为用户打造了一个智能......
  • 如何使用Docker Compose运行Nexus并将本地仓库管理工具发布至公网
    文章目录前言1.Docker安装Nexus2.本地访问Nexus3.Linux安装Cpolar4.配置Nexus界面公网地址5.远程访问Nexus界面6.固定Nexus公网地址7.固定地址访问Nexus前言本文主要介绍在Linux中使用Docker来一键部署NexusMaven私有仓库工具并结合Cpolar内网穿透实现远程......
  • 一文教会你如何用好通义灵码,让这款 AI 编码工具帮你做更多工作,更高效
    通义灵码,是阿里云与通义实验室联合打造的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。国际市场研究机构Gartner发布业界首个AI代码助手魔......
  • 一文教会你如何用好通义灵码,让这款 AI 编码工具帮你做更多工作,更高效
    通义灵码,是阿里云与通义实验室联合打造的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。国际市场研究机构Gartner发布业界首个AI代码助手魔......