zoukankan      html  css  js  c++  java
  • 规约工作记录

    这里仅做记录,以免忘记。

    1.短信编解码

      CodingHelper 和 At指令 

    At 指令
     1  /// <summary>
     2     /// SIM300dAT命令集合
     3     /// </summary>
     4     public enum AtCmdTextEnum
     5     {
     6         [Description("ATI\r\n")]
     7         芯片版本,
     8 
     9         [Description("AT+CSQ\r\n")]
    10         网络状态,
    11 
    12         [Description("AT+CMGF?\r\n")]
    13         查询短信编码格式,
    14 
    15         [Description("AT+CMGF=0\r\n")]
    16         设置短信编码格式PDU,
    17 
    18         [Description("AT+CPMS?\r\n")]
    19         查询存储模式,
    20 
    21         [Description("AT+CSCA?\r\n")]
    22         查询短信中心号码,
    23 
    24         [Description("AT+COPS?\r\n")]
    25         查询网络营运商,
    26 
    27         [Description("AT+CSQ\r\n")]
    28         查询网络信号,
    29 
    30         [Description("AT+CNMI?\r\n")]
    31         查询短信输出模式,
    32 
    33         [Description("AT+CNMI=2,2\r\n")]
    34         设置短信输出模式22,
    35 
    36         [Description("AT+CMGL=4\r\n")]
    37         枚举短信信息4,
    38 
    39         [Description("AT&W\r\n")]
    40         写入存储器,
    41     };

    2. Modbus规约

       Modbus是问答式规约,在铁芯接地项目中将串口接收的Modbus报文转成CDT规约通过网口发给其它厂家

      Modbus的数据帧和串口、网口的接收处理代码 Modbus

    校验和算法
     1   private void GetCRC(byte[] message, ref byte[] CRC)
     2         {
     3             //Function expects a modbus message of any length as well as a 2 byte CRC array in which to 
     4             //return the CRC values:
     5 
     6             ushort CRCFull = 0xFFFF;
     7             byte CRCHigh = 0xFF, CRCLow = 0xFF;
     8             char CRCLSB;
     9 
    10             for (int i = 0; i < (message.Length) - 2; i++)
    11             {
    12                 CRCFull = (ushort)(CRCFull ^ message[i]);
    13 
    14                 for (int j = 0; j < 8; j++)
    15                 {
    16                     CRCLSB = (char)(CRCFull & 0x0001);
    17                     CRCFull = (ushort)((CRCFull >> 1& 0x7FFF);
    18 
    19                     if (CRCLSB == 1)
    20                         CRCFull = (ushort)(CRCFull ^ 0xA001);
    21                 }
    22             }
    23             CRC[1= CRCHigh = (byte)((CRCFull >> 8& 0xFF);
    24             CRC[0= CRCLow = (byte)(CRCFull & 0xFF);
    25         }

    3.CDT规约

      通过网络接收开关的报文进行处理。也是问答式,只有召唤才回复数据。下面这是从Modbus到CDT转换项目中的代码

      CDT

    4.仿IEC101规约

      

    在IEC101规约里地址域是两个字节我们项目需要使用了6个字节,同时扩展了数据域

    P101 字段
     1   #region 字段
     2 
     3         private string m_DataStart = "68";//帧起始符
     4         private string m_Addr = "140900000002";//地址域
     5         private string m_FrameStart = "68";//帧起始符
     6         private string m_DataControl = "01";//控制码
     7         private string m_DataLeng = "000C";//数据域长度
     8         private string m_ClientType = "0006";//从属设备类型
     9         private string m_ClientAddr = "0000";//从属设备地址
    10         private string m_PID = "0001";//PID
    11         private string m_PackageCount = "0001";//总包数
    12         private string m_PackageNum = "0001";//本包编号
    13         private string m_Data = "0000";//数据     
    14         private string m_CheckDigit = "0B";//校验码
    15         private string m_DataEnd = "16";//结束符
    16 
    17         #endregion

    5.104规约

    完整104规约

    帧结构
       #region 帧结构
            
    /// <summary>
            
    /// 启动符
            
    /// </summary>      
            public byte BeginFlag = 0x68;

            
    private byte dataLength;
            
    /// <summary>
            
    /// 数据长度
            
    /// </summary>
            public byte DataLength
            {
                
    get
                {
                    
    return dataLength;
                }
                
    private set
                {
                    dataLength 
    = value;
                }

            }


            
    private ushort sendNo = 0x0;
            
    /// <summary>
            
    /// 发送序列号,默认值 0x0
            
    /// </summary>
            public ushort SendNo
            {
                
    get
                {
                    
    return sendNo;
                }
                
    set
                {
                    sendNo 
    = value;
                }
            }

            
    private ushort receiveNo = 0x0;
            
    /// <summary>
            
    /// 接收序列号,默认值 0x0
            
    /// </summary>
            public ushort ReceiveNo
            {
                
    get
                {
                    
    return receiveNo;
                }
                
    set
                {
                    receiveNo 
    = value;
                }
            }

            
    private byte flag = 0x0;
            
    /// <summary>
            
    /// 类型标识,默认值 0x0
            
    /// </summary>
            public byte Flag
            {
                
    get
                {
                    
    return flag;
                }
                
    set
                {
                    flag 
    = value;
                }

            }

            
    private byte determiner = 0x00;

            
    /// <summary>
            
    /// 可变结构限定词,默认值 0x0
            
    /// </summary>
            public byte Determiner
            {
                
    get
                {
                    
    return determiner;
                }
                
    set
                {
                    determiner 
    = value;
                }

            }

            
    private ushort sendReason = 0x0;

            
    /// <summary>
            
    /// 传输原因,默认值 0x0
            
    /// </summary>
            public ushort SendReason
            {
                
    get
                {
                    
    return sendReason;
                }
                
    set
                {
                    sendReason 
    = value;
                }

            }

            
    private ushort publicAddress = 0x0;
            
    /// <summary>
            
    /// 公共地址,默认值 0x0
            
    /// </summary>
            public ushort PublicAddress
            {
                
    get
                {
                    
    return publicAddress;
                }
                
    set
                {
                    publicAddress 
    = value;
                }
            }

            
    private int messageAddress = 0x0;
            
    /// <summary>
            
    /// 信息对象地址 3Byte,默认值 0x0
            
    /// </summary>
            public int MessageAddress
            {
                
    get
                {
                    
    return messageAddress;
                }
                
    set
                {
                    messageAddress 
    = value;
                }
            }

            
    private byte[] data = new byte[] { 0x00 };
            
    /// <summary>
            
    /// 数据,默认值 0x0
            
    /// </summary>
            public byte[] Data
            {
                
    get
                {
                    
    return data;
                }
                
    set
                {
                    data 
    = value;
                }
            }

            
    #endregion

    104帧结果和枚举

     

    我在电力行业的公司中做软件开发,这些是工作中用到的规约和部分代码,希望对做电力软件的朋友有点借鉴意义,代码都不完整还请见谅。

    工作将近4年,感觉到不学习新技术会被公司炒掉,不积累行业背景和经验会被社会炒掉,所以建了一个QQ群 19060470 来讨论行业解决方案,还请各行各业的软件同行们能够加入。

  • 相关阅读:
    oracle中的DECODE
    服务器修改密码cmd
    oracle 创建用户,授权用户,创建表,查询表
    Oralce 处理字符串函数
    oracle 非数字型转数字型
    d3
    linux SVN 安装配置
    JAVA with Cassandra
    Struts2实现文件上传和下载
    xmanager 5图文使用教程
  • 原文地址:https://www.cnblogs.com/zhaobl/p/2025256.html
Copyright © 2011-2022 走看看