规约工作记录

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

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 来讨论行业解决方案,还请各行各业的软件同行们能够加入。

原文地址:https://www.cnblogs.com/zhaobl/p/2025256.html