这里仅做记录,以免忘记。
1.短信编解码
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 /// 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 }
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转换项目中的代码
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
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
/// <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
我在电力行业的公司中做软件开发,这些是工作中用到的规约和部分代码,希望对做电力软件的朋友有点借鉴意义,代码都不完整还请见谅。
工作将近4年,感觉到不学习新技术会被公司炒掉,不积累行业背景和经验会被社会炒掉,所以建了一个QQ群 19060470 来讨论行业解决方案,还请各行各业的软件同行们能够加入。