重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 317|回复: 5

德器烟气

[复制链接]

237

主题

589

帖子

3614

积分

学生管理组

Rank: 8Rank: 8

积分
3614
发表于 2019-11-11 12:06:19 | 显示全部楼层 |阅读模式
本帖最后由 李维强-15级 于 2019-11-11 12:17 编辑

需要解析的数据格式如下:
[C#] syntaxhighlighter_viewsource syntaxhighlighter_copycode
##0296QN=20191107113443000;ST=27;CN=2011;PW=123456;MN=1122334455;Flag=4;CP=&&DataTime=20191107113443;a00000-Rtd=0.06,a00000-Flag=N;v1-Rtd=0.69,v1-Flag=N;k1-Rtd=0.33,k1-Flag=N;y2-Rtd=0.0,y2-Flag=D;v2-Rtd=0.0,v2-Flag=D;k2-Rtd=0.0,k2-Flag=D;10-Rtd=0.0,10-Flag=N,21-Rtd=0.0,21-Flag=N,22-Rtd=0.0,22-Flag=N&&8941
##0133QN=20191107113443000;ST=27;CN=2021;PW=123456;MN=1122334455;Flag=5;CP=&&DataTime=20191107113443;SB1-RS=0;SB2-RS=0;SB3-RS=0;SB4-RS=0;&&7BC0

以上数据为下位机一次性传上来到buffer,但是可能存在其他脏数据、漏传等。故最后都有CRC16校验,程序需要自行编程容错。具体示例见文档19页
1:中间件程序需要开启TCPClient接口,用于接收下位机数据,端口:20010。
2:程序需开启连接超时值守线程,用于移除没有数据传输的超时连接

1_HJ-212-20170705(1).pdf (1.6 MB, 下载次数: 5)
回复

使用道具 举报

237

主题

589

帖子

3614

积分

学生管理组

Rank: 8Rank: 8

积分
3614
 楼主| 发表于 2019-11-11 21:14:40 | 显示全部楼层
[C#] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    public class CRC
    {
        #region  CRC16
        //public static byte[] CRC16(byte[] data)
        //{
        //    int len = data.Length;
        //    if (len > 0)
        //    {
        //        ushort crc = 0xFFFF;

        //        for (int i = 0; i < len; i++)
        //        {
        //            crc = (ushort)(crc ^ (data[i]));
        //            for (int j = 0; j < 8; j++)
        //            {
        //                crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);
        //            }
        //        }
        //        byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置
        //        byte lo = (byte)(crc & 0x00FF);         //低位置

        //        return new byte[] { hi, lo };
        //    }
        //    return new byte[] { 0, 0 };
        //}

        /// <summary>
        /// 针对HJ-212-2017的CRC16校验算法
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static byte[] CRC16(byte[] data)
        {
            int len = data.Length, check;
            if (len > 0)
            {
                ushort crc = 0xFFFF;

                for (int i = 0; i < len; i++)
                {
                    crc = (ushort)((crc >> 8) ^ (data[i]));
                    for (int j = 0; j < 8; j++)
                    {
                        check = crc & 0x0001;
                        crc >>= 1;
                        if (check == 0x001)
                        {
                            crc ^= 0xA001;
                        }

                        //crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);
                    }
                }
                byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置
                byte lo = (byte)(crc & 0x00FF);         //低位置

                return new byte[] { hi, lo };
            }
            return new byte[] { 0, 0 };
        }

        #endregion

        #region  ToCRC16
        public static string ToCRC16(string content)
        {
            return ToCRC16(content, Encoding.UTF8);
        }

        public static string ToCRC16(string content, bool isReverse)
        {
            return ToCRC16(content, Encoding.UTF8, isReverse);
        }

        public static string ToCRC16(string content, Encoding encoding)
        {
            return ByteToString(CRC16(encoding.GetBytes(content)), true);
        }

        public static string ToCRC16(string content, Encoding encoding, bool isReverse)
        {
            return ByteToString(CRC16(encoding.GetBytes(content)), isReverse);
        }

        public static string ToCRC16(byte[] data)
        {
            return ByteToString(CRC16(data), true);
        }

        public static string ToCRC16(byte[] data, bool isReverse)
        {
            return ByteToString(CRC16(data), isReverse);
        }
        #endregion

        #region  ToModbusCRC16
        public static string ToModbusCRC16(string s)
        {
            return ToModbusCRC16(s, true);
        }

        public static string ToModbusCRC16(string s, bool isReverse)
        {
            return ByteToString(CRC16(StringToHexByte(s)), isReverse);
        }

        public static string ToModbusCRC16(byte[] data)
        {
            return ToModbusCRC16(data, true);
        }

        public static string ToModbusCRC16(byte[] data, bool isReverse)
        {
            return ByteToString(CRC16(data), isReverse);
        }
        #endregion

        #region  ByteToString
        public static string ByteToString(byte[] arr, bool isReverse)
        {
            try
            {
                byte hi = arr[0], lo = arr[1];
                return Convert.ToString(isReverse ? hi + lo * 0x100 : hi * 0x100 + lo, 16).ToUpper().PadLeft(4, '0');
            }
            catch (Exception ex) { throw (ex); }
        }

        public static string ByteToString(byte[] arr)
        {
            try
            {
                return ByteToString(arr, true);
            }
            catch (Exception ex) { throw (ex); }
        }
        #endregion

        #region  StringToHexString
        public static string StringToHexString(string str)
        {
            StringBuilder s = new StringBuilder();
            foreach (short c in str.ToCharArray())
            {
                s.Append(c.ToString("X4"));
            }
            return s.ToString();
        }
        #endregion

        #region  StringToHexByte
        private static string ConvertChinese(string str)
        {
            StringBuilder s = new StringBuilder();
            foreach (short c in str.ToCharArray())
            {
                if (c <= 0 || c >= 127)
                {
                    s.Append(c.ToString("X4"));
                }
                else
                {
                    s.Append((char)c);
                }
            }
            return s.ToString();
        }

        private static string FilterChinese(string str)
        {
            StringBuilder s = new StringBuilder();
            foreach (short c in str.ToCharArray())
            {
                if (c > 0 && c < 127)
                {
                    s.Append((char)c);
                }
            }
            return s.ToString();
        }

        /// <summary>
        /// 字符串转16进制字符数组
        /// </summary>
        /// <param name="hex"></param>
        /// <returns></returns>
        public static byte[] StringToHexByte(string str)
        {
            return StringToHexByte(str, false);
        }

        /// <summary>
        /// 字符串转16进制字符数组
        /// </summary>
        /// <param name="str"></param>
        /// <param name="isFilterChinese">是否过滤掉中文字符</param>
        /// <returns></returns>
        public static byte[] StringToHexByte(string str, bool isFilterChinese)
        {
            string hex = isFilterChinese ? FilterChinese(str) : ConvertChinese(str);

            //清除所有空格
            hex = hex.Replace(" ", "");
            //若字符个数为奇数,补一个0
            hex += hex.Length % 2 != 0 ? "0" : "";

            byte[] result = new byte[hex.Length / 2];
            for (int i = 0, c = result.Length; i < c; i++)
            {
                result[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
            }
            return result;
        }
        #endregion


    }


调用
var A=CRC.ToCRC16("需要加密的字符串", false);        //输出:XXXX
回复 支持 反对

使用道具 举报

237

主题

589

帖子

3614

积分

学生管理组

Rank: 8Rank: 8

积分
3614
 楼主| 发表于 2019-11-15 23:40:28 | 显示全部楼层
QQ截图20191115233933.png
回复 支持 反对

使用道具 举报

0

主题

1

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2019-11-17 21:27:38 | 显示全部楼层
这熟悉的CRC函数  哈哈哈
回复 支持 反对

使用道具 举报

237

主题

589

帖子

3614

积分

学生管理组

Rank: 8Rank: 8

积分
3614
 楼主| 发表于 2019-11-24 19:57:44 | 显示全部楼层
本帖最后由 李维强-15级 于 2019-11-25 02:16 编辑

按小时排列,搜索出每个小时的平均值。
[SQL] syntaxhighlighter_viewsource syntaxhighlighter_copycode
BEGIN
declare @startDate datetime
declare @endDate datetime
 SELECT @startDate = '2019-11-24 02:00:00' ,@endDate = '2019-11-25 02:00:00'
;WITH tb AS (
SELECT @startDate AS 'DateHour'
UNION ALL
SELECT DATEADD(HOUR,1,DateHour) FROM tb WHERE DateHour<@endDate
)
SELECT DateHour,round(AVG(b.Y1),2) as Y1,round(AVG(b.V1),2) as V1,round(AVG(b.K1),2) as K1
from tb a LEFT JOIN t_o_data b ON 
CONVERT(VARCHAR(100),a.DateHour,112)=CONVERT(VARCHAR(100),b.DataTime,112) 
AND DATEPART(HOUR, a.datehour)=DATEPART(hour, b.DataTime) AND b.Y1>0 AND b.MN='1122334455'

GROUP BY datehour
ORDER BY datehour ASC
END
回复 支持 反对

使用道具 举报

237

主题

589

帖子

3614

积分

学生管理组

Rank: 8Rank: 8

积分
3614
 楼主| 发表于 2019-12-9 15:22:37 | 显示全部楼层
1)把名称修改为 Firmware.bin
2)加载后,在 系统/工程师登录里输入 333,然后稍等20秒钟后 ,掉电重启;
3)在系统/工程师登录里输入 pm,设置系统
Firmware_7101.zip (100.98 KB, 下载次数: 0)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2020-1-19 07:24 , Processed in 0.112582 second(s), 33 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表