记录仪与上位机通讯协议Word文件下载.docx
《记录仪与上位机通讯协议Word文件下载.docx》由会员分享,可在线阅读,更多相关《记录仪与上位机通讯协议Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
Length1
1011(0xb)
数据块正文的长度,分2个字节
Length2
数据块正文的长度
Data
1000(0x8)
数据块正文
CRC
1001(0x9)
CRC数据
EndCom
1111
通信命令结束
1110(0xe)
保留
1111(0xf)
地址划分表
节点
节点地址
广播节点
0000,0000
所有在线的节点都要接收
主机节点
0001,xxxx
可以存在16台主机节点
记录仪节点
01xx,xxxx
可以存在64台记录仪节点
参数解释:
1、Command为一个字节,以0b1010,xxxx或0b1101,xxxx表示。
高四位1010或0b1101为命令标志;
低四位xxxx(0000~1111)表示具体的命令。
2、EndCom以一个字节0b1010,1111表示。
3、Status为一个字节,以0b1011,xxxx表示。
高四位1011为状态标志;
低四位xxxx为具体的状态信息,其中0000表示操作成功,0001~1111为常见的通信出错信息。
具体的出错代码请参见错误代码表,并将在日后的程序开发中继续完善。
4、Source为源地址,即通信数据发送者的地址,为一个字节。
具体信息见地址划分表。
5、Dest为目的地址,即通信数据接收者的地址,为一个字节。
具体信息见地址划块表。
6、Length(L1、L2、L3、L4):
数据包正文的长度,拆分成四个字节,低字节在前,高字节在后,以0b1011,xxxx表示。
高四位1011为长度标志;
低四位xxxx(0000~1111)表示后面紧跟的数据长度。
例如当数据包正文长度为512字节时,Length=0x100,则L1=0xB0,L2=0xB0,L3=0xB1,L4=0xB0。
如果Status不为0xC0,即状态出错,则Length=0。
7、Data(Data1、Data2、…Datan):
以字节0b1000,xxxx表示。
高四位1000为数据信息标志;
低四位xxxx(0000~1110)表示具体的数据。
在此情况下,本协议要求将一个八位的数据拆分成两个八位的数据进行传输。
例如当有发送数据为0x34f8时,则实际发送的数据流为Data(m)=0xC8,Data(m+1)=0xCF,Data(m+2)=0xC4,Data(m+3)=0xC3。
因此数据的长度肯定为偶数。
8、CRC以字节0b1001,xxxx表示,共两个字节。
本协议采用标准CRC16计算,计算方法见附录二,发送时,需要拆分成两个部分进行传输,具体见Data的拆分方法。
错误代码表
错误代码
代码含义
1
通信延时到退出
2
在地址匹配后,通信校验出错
3
通道组态失败
4
通道没有累积
5
仪表无累积功能
6
不是PID输出通道
7
超过系统通道数
8
9
10
11
12
13
14
15
二、通讯的具体命令
以下都是在通讯正常的情况,即Status=0xC0,如果Status=0xC1~0xCF,则Length=0。
2.0PC机从记录仪读取通道历史数据DGIVE(0xA4)
PC机→记录仪:
Command=0xA4
Length=1
Data=通道号
记录仪→PC机:
Status=0xC0
Length=114
Data=通道号+历史数据长度+起始时间+终止时间+历史数据
注:
PC机从记录仪读取通道历史数据,记录仪每次向上发送100字节数据,待PC机继续发送CONTINUE命令时,再发送下100字节数据,直至发送终止时间=当前时间后,记录仪向上发送如下信息,告诉上位机数据发送完毕:
其中历史数据长度=0
2.1PC机从记录仪读取通道实时数据NDGIVE(0xA5)
Command=0xA5
Length=9
Data=通道号+当前时间+实时数据
2.2PC机中止记录仪的数据传送STOP(0xA6)
Command=0xA6
Length=0
2.3PC机继续从记录仪读取通道历史数据CONTINUE(0xA7)
Command=0xA7
2.4PC机从记录仪读取某一时间段历史数据TDGIVE(0xAB)
Command=0xAB
Length=13
Data=通道号+起始时间+终止时间
Status=0xC0
Length=114
Data=通道号+历史数据长度+起始时间+终止时间+历史数据
PC机从记录仪读取通道历史数据,记录仪向上发送100字节数据。
2.5PC机向记录仪重新读取上一组历史数据DAGAIN(0xAE)
Command=0xAE
Length=1
Data=通道号
附录一数据格式
1、实时数据:
每个通道2字节
2、历史数据:
每个通道(512*m/n)K字节,其中m为闪存数,n为记录点数。
3、报警记录:
报警年份1字节
报警月份1字节
报警日期1字节
报警时1字节
报警分1字节
报警秒1字节
报警类型1字节
0:
上上限1:
上限2:
下限3:
下下限
总计:
7字节
附录二CRC计算方法
下面是C源程序。
首先采用标准CRC16计算方法得到两个字节的CRC(CRC[0]、CRC[1])后,然后对CRC[0]和CRC[1]进行异或计算,所得到的结果再按照通讯格式中CRC段的字节拆分方式拆分成两个字节。
voidCalculateCRC(unsignedcharBuff[],unsignedcharCRC[],intBuffLength)
{unsignedcharA,B,C;
CRC[0]=0;
CRC[1]=0;
for(inti=0;
i<
BuffLength;
i++)
{
A=Buff[i];
A=A^CRC[0];
B=A;
CRC[0]=CRC[1];
A=BCCTAB1[A];
CRC[1]=A;
A=B;
A=BCCTAB2[A];
CRC[0]=CRC[0]^A;
}
C=CRC[0]^CRC[1];
CRC[0]=C&
0x0f;
CRC[0]=CRC[0]|0x90;
CRC[1]=C>
>
4;
CRC[1]=CRC[1]|0x90;
}
;
===============单字节的CRC-16循环冗余校验码表================
staticintBCCTAB1[]={
0x00,0x6F,0x0DE,0x0B1,0x0BC,0x0D3,0x62,0x0D,
0x78,0x17,0x0A6,0x0C9,0x0C4,0x0AB,0x1A,0x75,
0x0F0,0x9F,0x2E,0x41,0x4C,0x23,0x92,0x0FD,
0x88,0x0E7,0x56,0x39,0x34,0x5B,0x0EA,0x85,
0x0E0,0x8F,0x3E,0x51,0x5C,0x33,0x82,0x0ED,
0x98,0x0F7,0x46,0x29,0x24,0x4B,0x0FA,0x95,
0x10,0x7F,0x0CE,0x0A1,0x0AC,0x0C3,0x72,0x1D,
0x68,0x07,0x0B6,0x0D9,0x0D4,0x0BB,0x0A,0x65,
0x0C0,0x0AF,0x1E,0x71,0x7C,0x13,0x0A2,0x0CD,
0x0B8,0x0D7,0x66,0x09,0x04,0x6B,0x0DA,0x0B5,
0x30,0x5F,0x0EE,0x81,0x8C,0x0E3,0x52,0x3D,
0x48,0x27,0x96,0x0F9,0x0F4,0x9B,0x2A,0x45,
0x20,0x4F,0x0FE,0x91,0x9C,0x0F3,0x42,0x2D,
0x58,0x37,0x86,0x0E9,0x0E4,0x8B,0x3A,0x55,
0x0D0,0x0BF,0x0E,0x61,0x6C,0x03,0x0B2,0x0DD,
0x0A8,0x0C7,0x76,0x19,0x14,0x7B,0x0CA,0x0A5,
0x80,0x0EF,0x5E,0x31,0x3C,0x53,0x0E2,0x8D,
0x0F8,0x97,0x26,0x49,0x44,0x2B,0x9A,0x0F5,
0x70,0x1F,0x0AE,0x0C1,0x0CC,0x0A3,0x12,0x7D,
0x08,0x67,0x0D6,0x0B9,0x0B4,0x0DB,0x6A,0x05,
0x60,0x0F,0x0BE,0x0D1,0x0DC,0x0B3,0x02,0x6D,
0x18,0x77,0x0C6,0x0A9,0x0A4,0x0CB,0x7A,0x15,
0x90,0x0FF,0x4E,0x21,0x2C,0x43,0x0F2,0x9D,
0x0E8,0x87,0x36,0x59,0x54,0x3B,0x8A,0x0E5,
0x40,0x2F,0x9E,0x0F1,0x0FC,0x93,0x22,0x4D,
0x38,0x57,0x0E6,0x89,0x84,0x0EB,0x5A,0x35,
0x0B0,0x0DF,0x6E,0x01,0x0C,0x63,0x0D2,0x0BD,
0x0C8,0x0A7,0x16,0x79,0x74,0x1B,0x0AA,0x0C5,
0x0A0,0x0CF,0x7E,0x11,0x1C,0x73,0x0C2,0x0AD,
0x0D8,0x0B7,0x06,0x69,0x64,0x0B,0x0BA,0x0D5,
0x50,0x3F,0x8E,0x0E1,0x0EC,0x083,0x32,0x5D,
0x28,0x47,0x0F6,0x99,0x94,0x0FB,0x4A,0x25};
staticintBCCTAB2[]={
0x00,0x01,0x02,0x03,0x05,0x04,0x07,0x06,
0x0B,0x0A1,0x09,0x08,0x0E,0x0F,0x0C,0x0D,
0x16,0x17,0x14,0x14,0x13,0x12,0x11,0x10,
0x1D,0x1C,0x1F,0x1E,0x18,0x19,0x1A,0x1B,
0x2D,0x2C,0x2F,0x2E,0x28,0x29,0x2A,0x2B,
0x26,0x27,0x24,0x24,0x23,0x22,0x21,0x20,
0x3B,0x31,0x39,0x38,0x3E,0x3F,0x3C,0x3D,
0x30,0x31,0x32,0x33,0x35,0x34,0x37,0x36,
0x5B,0x51,0x59,0x58,0x5E,0x5F,0x5C,0x5D,
0x50,0x51,0x52,0x53,0x55,0x54,0x57,0x56,
0x4B,0x41,0x49,0x48,0x4E,0x4F,0x4C,0x4D,
0x46,0x47,0x44,0x44,0x43,0x42,0x41,0x40,
0x76,0x77,0x74,0x74,0x73,0x72,0x71,0x70,
0x7D,0x7C,0x7F,0x7E,0x78,0x79,0x7A,0x7B,
0x60,0x61,0x62,0x63,0x65,0x64,0x67,0x66,
0x6B,0x61,0x69,0x68,0x6E,0x6F,0x6C,0x6D,
0x0B7,0x0B6,0x0B5,0x0B4,0x0B2,0x0B3,0x0B0,0x0B1,
0x0BC,0x0BD,0x0BE,0x0BF,0x0B9,0x0B8,0x0BB,0x0BA,
0x0A1,0x0A0,0x0A3,0x0A2,0x0A4,0x0A5,0x0A6,0x0A7,
0x0AA,0x0AB,0x0A8,0x0A9,0x0AF,0x0AE,0x0AD,0x0AC,
0x9A,0x9B,0x98,0x99,0x9F,0x9E,0x9D,0x9C,
0x91,0x90,0x93,0x92,0x94,0x95,0x96,0x97,
0x8C,0x8D,0x8E,0x8F,0x89,0x88,0x8B,0x8A,
0x87,0x86,0x85,0x84,0x82,0x83,0x80,0x81,
0x0EC,0x0ED,0x0EE,0x0EF,0x0E9,0x0E8,0x0EB,0x0EA,
0x0E7,0x0E6,0x0E5,0x0E4,0x0E2,0x0E3,0x0E0,0x0E1,
0x0FA,0x0FB,0x0F8,0x0F9,0x0FF,0x0FE,0x0FD,0x0FC,
0x0F1,0x0F0,0x0F3,0x0F2,0x0F4,0x0F5,0x0F6,0x0F7,
0x0C1,0x0C0,0x0C3,0x0C2,0x0C4,0x0C5,0x0C6,0x0C7,
0x0CA,0x0CB,0x0C8,0x0C9,0x0CF,0x0CE,0x0CD,0x0CC,
0x0D7,0x0D6,0x0D5,0x0D4,0x0D2,0x0D3,0x0D0,0x0D1,
0x0DC,0x0DD,0x0DE,0x0DF,0x0D9,0x0D8,0x0DB,0x0DA};
附录三3字节浮点数表示法
二进制浮点操作数:
用三个字节表示,第一个字节的最高位为数符,其余七位为
阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。
当尾数的最高位为1时,便称为规格化浮点数,简称操作数。
在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:
当[R0]=-6.000时,则二进制浮点数表示为83C000H。
若(R0)=30H,则(30H)=83H,(31H)=0C0H,(32H)=00H。
示例:
十进制小数->
二进制浮点数
0.1347E8938
27.8405DEB8
3528.01089D0
-6.15783C507
读系统参数:
0xA00x100x450xB00xB00xB00xB00x9C0x9F0xAF0xC00x450x100xBF0xB00xB00xB00x880x800x820x830x840x810x850x800x870x800x830x810x800x800x800x800x800x800x860x800x800x800x800x800x800x800x800x800x800x800x9F0x920xAF写系统参数:
0xA10x100x450xBF0xB00xB00xB00x880x800x820x830x880x800x850x800x870x800x830x810x800x800x800x800x800x800x860x800x800x800x800x800x800x800x800x800x800x800x990x990xAF读通道参数:
0xA20x100x450xB10xB00xB00xB00x800x800x940x920xAF0xC00x450x100xB80xB10xB00xB00x800x800x8A0x800x840x810x850x800x800x800x8B0x8F0x8F0x8F0x850x800x800x800x850x800x800x800x8B0x8F0x8F0x8F0x8B0x8F0x8F0x8F0x800x800x800x800x800x800x800x800x810x800x810x800x800x800x800x800x840x800x960x900xAF写通道参数:
0xA30x100x450xB80xB10xB00xB00x820x800x820x800x840x810x840x800x800x8B0x8F0x8F0x8C0x860x840x800x800x8B0x840x800x800x8B0x8F0x8F0x8C0x860x8F0x8F0x8C0x860x800x800x800x800x800x800x800x800x800x800x810x800x800x800x800x800x840x800x950x940xAF0xC00x450x100xB10xB00xB00xB00x820x800x9E0x9C0xAF发送:
A51041B1B0B0B08180969CAF
接收:
C04110B9B0B0B08180858087808A818880838083808E8381859E92AF
测量值按这个计算如:
3E51(15953)除以65536*(上限-下限)+下限