环保212协议(HJT 212-2017) 数据接收后的解码_C#实现

1 篇文章 0 订阅
1 篇文章 0 订阅

1、解码类代码:

using LogHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class HJ212_2017
{
    /// <summary>
    /// 数据帧头
    /// </summary>
    public string header { get; set; }
    /// <summary>
    /// 数据长度
    /// </summary>
    public string data_length { get; set; }

    /// <summary>
    /// 数据头
    /// </summary>
    public Dictionary<string, string> DATA_HEAD { get; set; }
    / <summary>
    / 数据内容
    / </summary>
    public Dictionary<string, string> CP { get; set; }
    /// <summary>
    /// CRC校验
    /// </summary>
    public string CRC { get; set; }


    public bool DecodeData(string Text)
    {
        try
        {
            Text = Text.ToUpper().Replace(";CP=", "").Replace(" ", "");//有些厂家协议不很标准,有的大小写不一致,此处强制转大写字母
            header = Text.Substring(0, 2);
            data_length = Text.Substring(2, 4);
            string[] data_0 = Text.Substring(6, Text.Length - 6).Split(new char[] { '&', '&' }, StringSplitOptions.RemoveEmptyEntries);
            string[] data_1 = data_0[0].Split(new char[] { ';' });
            DATA_HEAD = new Dictionary<string, string>();
            for (int h = 0; h < data_1.Length; h++)
            {
                string[] d_1 = data_1[h].Split(new char[] { '=' });
                DATA_HEAD.Add(d_1[0], d_1[1]);
            }
            string[] data_2 = data_0[1].Split(new char[] { ';' });
            CP = new Dictionary<string, string>();
            for (int i = 0; i < data_2.Length; i++)
            {
                string[] d_6 = data_2[i].Split(new char[] { ',' });
                for (int j = 0; j < d_6.Length; j++)
                {
                    string[] d_7 = d_6[j].Split(new char[] { '=' });
                    CP.Add(d_7[0], d_7[1]);
                }
            }
            CRC = data_0[2];
            return true;
        }
        catch (Exception)
        {
            //数据接收不完整
            LogApi.WriteLog("解码失败:数据有问题," + Text);
            //throw;
            return false;
        }
    }


    /// <summary>
    /// 判断数据是否通过校验
    /// </summary>
    /// <param name="Text">原始数据</param>
    /// <returns>是否通过</returns>
    public bool Crc16(string Text)
    {
        try
        {          
            string CRC = Text.Substring(Text.Length - 4, 4);
           
            Text = Text.Substring(Text.IndexOf("QN"));
            Text = Text.Substring(0, Text.Length - 4);                    

            byte[] bytes = Encoding.ASCII.GetBytes(Text);
            int crcRegister = 0xFFFF;
            for (int i = 0; i < bytes.Length; i++)
            {
                crcRegister = (crcRegister >> 8) ^ bytes[i];
                for (int j = 0; j < 8; j++)
                {
                    int check = crcRegister & 0x0001;
                    crcRegister >>= 1;
                    if (check == 0x0001)
                    {
                        crcRegister ^= 0xA001;
                    }
                }
            }
            string result = string.Format("{0:X}", crcRegister);//转十六进制
            for (int i = result.Length; i < 4; i++)//补足 4 位
            {
                result = "0" + result;
            }
            //LogApi.WriteLog("计算校验码:" + result);
            if (result == CRC)
            {
                return true;
            }
            else
            {
                LogApi.WriteLog("校验码有误:" + CRC);
                LogApi.WriteLog("待校验数据:" + Text);
                LogApi.WriteLog("计算校验码:" + result);
                return false;


            }
        }
        catch (Exception)
        {
            //数据接收不完整
            LogApi.WriteLog("数据校验:数据有问题," + Text);
            return false;
            //throw;
        }

    }
}

2、数据【hj212_data】接收后解码调用:

HJ212_2017 hj212 = new HJ212_2017();

if(!hj212.Crc16(hj212_data) || !hj212.DecodeData(hj212_data)) //未通过验证或解码失败
{
     return; //不解码
}  
                      
string CN = hj212.DATA_HEAD["CN"];          //数据类型
string MN = hj212.DATA_HEAD["MN"];          //设备MN

string DATATIME = hj212.CP["DATATIME"];     //上报时间


string AVOC01_RTD = hj212.CP["AVOC01-RTD"]; //voc实时值
string AVOC01_COU = hj212.CP["AVOC01-COU"]; //voc历史累计值
string AVOC01_MAX = hj212.CP["AVOC01-MAX"]; //voc历史最大值
string AVOC01_MIN = hj212.CP["AVOC01-MIN"]; //voc历史最小值
string AVOC01_AVG = hj212.CP["AVOC01-AVG"]; //voc历史平均值

string AVOC01_FLAG = hj212.CP["AVOC01-FLAG"];      //设备状态

......

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: 组态王是一种能够对工业控制系统进行编程和可视化操作的软件工具。它可以帮助工程师轻松地设计和配置工业控制系统,并且具有用户友好的界面和丰富的功能。组态王可以与各种不同的硬件设备和通信协议进行兼容,使得它在各个行业的控制系统中被广泛应用。 而hjt212_2017[66.1.4.3]是指中国国家标准委员会发布的关于环境监测数据传输标准的规范。这个规范规定了环境监测数据的格式、传输方式和通信协议,旨在统一环境监测领域中各种设备的数据传输和交互方式。hjt212_2017[66.1.4.3]标准规定了数据格式的具体要求,包括数据的时间戳、监测项目、数据类型和传输方式等。这个标准的应用可以确保不同厂商和设备之间的数据传输的一致性和可靠性。 因此,组态王与hjt212_2017[66.1.4.3]可以结合应用。工程师可以使用组态王来设计和配置环境监测系统的控制界面,然后根据hjt212_2017[66.1.4.3]标准规范来传输和解析环境监测数据。这样做的好处是可以确保各个环境监测设备之间的数据传输的一致性和可靠性,方便系统的维护和管理。同时,使用组态王还可以简化系统的操作界面,提高工作效率,并且能够快速响应环境监测系统的实时数据。最终,组态王与hjt212_2017[66.1.4.3]的结合应用可以提升环境监测系统的稳定性和可靠性,为相关领域的工作人员带来更好的工作体验。 ### 回答2: 组态王是一种用于工业自动化系统的软件平台,它提供了一个可视化界面和配置工具,用于创建和管理工业控制系统的操作界面和参数设置。通过组态王,用户可以创建各种图形化界面,实时监测和控制设备的状态,并进行报警处理和数据记录等操作。组态王具有用户友好的操作界面和丰富的功能模块,可以根据不同的应用需求进行定制和扩展。 hjt212_2017[66.1.4.3]是一种用于数据交换和传输的协议标准。这是国家标准哈尔滨双汇通科技有限公司制定的一种通信协议,主要用于水资源管理、工业自动化控制等领域。hjt212_2017[66.1.4.3]采用了统一的数据格式和通信规范,以确保数据的可靠传输和解析。该协议支持多种通信方式,如TCP/IP、串口和无线通信等。它定义了数据包的格式、协议命令、数据解析规则等,使得设备之间可以进行有效的数据交换和通信。 组态王与hjt212_2017[66.1.4.3]在工业自动化领域中通常是相互配合使用的。组态王可以通过hjt212_2017[66.1.4.3]协议与设备进行通信,获取设备的实时状态和数据信息,并将其显示在操作界面上。同时,组态王可以向设备发送控制指令,实现对设备的远程控制。通过使用hjt212_2017[66.1.4.3]协议,组态王可以与多种设备进行通信,使得系统集成更加方便和可靠。总而言之,组态王与hjt212_2017[66.1.4.3]的结合可以实现工业自动化控制系统的可视化和远程控制,提高系统的运行效率和稳定性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzl640

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值