PnFn信息点信息类工具类

news/2024/11/15 22:51:25/文章来源:https://www.cnblogs.com/aeolian/p/18397715

数据单元标识定义

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 P0F3String 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 DT2int da1 = pnfnByte[0];int da2 = pnfnByte[1];int dt1 = pnfnByte[2];int dt2 = pnfnByte[3];//获取PNFN使用数据时DA2 DA1 DT2 DT1String pnValue = getPnValue(da2, da1);String fnValue = getFnValue(dt2, dt1);return pnValue+fnValue;}private static String getPnValue(int da2, int da1) {// 特殊情况处理:当 DA1 和 DA2 全为“0”时,返回 P0if (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”时,返回 P0if (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 和 FnString pn = pnfnstr.substring(0, pnfnstr.indexOf('F'));String fn = pnfnstr.substring(pnfnstr.indexOf('F'));// 获取 DA1 DA2int[] da1da2 = getHexFromPn(pn);int da1 = da1da2[0];int da2 = da1da2[1];// 获取 DT1 DT2int[] 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 = 0if (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 = 0if (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};}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/792440.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDT(一):概览

1. 参考链接官网https://udt.sourceforge.io/谷博士对UDT的简单介绍https://udt.sourceforge.io/doc/udt-2009.ppt获取UDT源码https://sourceforge.net/projects/udt/files/udt/4.11/udt.sdk.4.11.tar.gz/download?use_mirror=pilotfiberUDT讨论贴https://sourceforge.net/p/u…

南沙信C++陈老师解一本通题:1075:药房管理

​题目描述】随着信息技术的蓬勃发展,医疗信息化已经成为医院建设中必不可少的一部分。计算机可以很好地辅助医院管理医生信息、病人信息、药品信息等海量数据,使工作人员能够从这些机械的工作中解放出来,将更多精力投入真正的医疗过程中,从而极大地提高了医院整体的工作效…

跨越网络边界:内外网数据摆渡最优方案!

随着网络技术的演进,网络攻击、数据窃取、数据泄露事件也愈发频繁,给企业造成损失和负面影响,企业数据防泄漏治理是大趋势,也是自身迫切需求。网络隔离技术作为网络安全和数据安全的重要保障手段被广泛应用到各个行业领域,对于金融行业,国家出台的《金融行业信息系统信息…

推荐一款开源、高效、灵活的Redis桌面管理工具:Tiny RDM!支持调试与分析功能!

1、引言 在大数据和云计算快速发展的今天,Redis作为一款高性能的内存键值存储系统,在数据缓存、实时计算、消息队列等领域发挥着重要作用。然而,随着Redis集群规模的扩大和复杂度的增加,如何高效地管理和运维Redis数据库成为了许多开发者和运维人员面临的挑战。Tiny RDM(T…

河道漂浮物识别 智慧水利 智慧水务

河道漂浮物识别根据智能视频分析,漂浮物检验报警设备自动分析识别视频图像信息内容,不用人工干涉;河道漂浮物识别监控区域里的河面漂浮物,出现异常状况时更快开展预警信息,真真正正完成预警信息、正常的检验、规范化管理,合理帮助管理者最大限度地降低乱报和少报;还能够…

智慧港口安全预警AI智能视频分析平台

智慧港口安全预警AI智能视频分析平台,各种算法识别精度达到90%以上,实现对动火作业的智能化全过程监管,减少港口安全事故发生的可能性,智慧港口安全预警AI智能视频分析平台紧跟港口物流智能化视频分析平台的发展趋势,从人力监管模式转变为高效、精准的智能化监管模式,提高…

工地安全帽佩戴识别

工地安全帽佩戴识别根据安装在现场施工工地的各种各样监控系统,创建智能监管和防护系统软件,开展面部识别、个人行为识别和安全帽子识别,工地安全帽佩戴识别合理填补施工现场监管中传统式方式和技术性的缺点,真真正正完成预警信息、正常的检验、规范化管理。工地安全帽佩戴…

视频图像智能识别系统

视频图像智能识别系统根据优化算法对项目现场封闭地区开展监控和防卸,对项目现场实时全天候监控识别分析,当监测到有人的身体进入时,视频图像智能识别系统会全自动警报和警示,适用三种颜色智能展现不一样情况,数据可视化监管 。在项目施工作业区域开展侵入监管,如安全防护…

智能视频图像识别

智能视频图像识别系统选用人工智能识别算法技术,能够随时监控和剖析现场各大品牌相机中的视频图像。智能视频图像识别系统软件关键运用相机拍摄的图像开展智能实时分析,抓拍监控识别和检作业现场的违规操作及行为,并向责任人推送信息。与传统监控系统软件对比,智能视频图像…

Qt/C++编写的Onvif调试助手调试神器工具/支持云台控制/预置位设置等/有手机版本

一、功能特点广播搜索设备,支持IPC和NVR,依次返回。 可选择不同的网卡IP进行对应网段设备的搜索。 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。 可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。 可对每个设备设置Onvif用户信息,用于认证获取…

Javascript-原型/原型链

OOP 面向对象 对象是什么?为什么要面向对象?面向对象的优势? 特点:迁移更灵活、代码复用性高、高度模块化的体现,例如vue中new Vue() 对象 对象是对单个物体的简单抽象 =>怎么让多个对象产生关联 对象是基础 也是容器(可以承载其他的对象) => 属性、方法、对象字面…

在keil中使用git

目录在keil中使用git搜集官方相关帮助1.application note2.软件附带帮助文件基础准备git命令行MDK版本操作步骤1.Abstract(摘要)2.Introduction3.Workflows3.1.Centralized Workflow4.Using Git with Vision4.1.Project Files under Version Control4.2.Files that do not need…