3通讯协议分析.docx
《3通讯协议分析.docx》由会员分享,可在线阅读,更多相关《3通讯协议分析.docx(19页珍藏版)》请在冰豆网上搜索。
3通讯协议分析
通讯协议分析
YC189D系列
D型设备的通讯方式采用串口通讯,机体内有一通讯板与PC的串口连接,内部系485通讯方式,但不是一条总线方式,而是多条485总线结构,表架上一条485总线控制误差计,一条总线控制电源部分,另外每个表位都有一个485接口,他们是串联在独立的一条总线上的,在通讯板上有电子开关控制不同总线的切换功能,这是通道的概念,比如定义通道1为误差计,通道2为电源,通道7为标准表通讯,因此与设备的通讯是串行,不可以平行通讯。
串口配制:
“19200,n,8,2”
帧格式:
FunctionCode
NumberofData
Data1
...
Datan
CRCHigh-byte
CRCLow-byte
以下分析目前最新版本的台体通讯协议:
台体通道:
2
误差计系统:
1
1.通道的切换
对应库的API函数:
OPENBOX();
230
CHNNo.
2
170
55
CRCHi
CRCLo
head
参数:
通道号
数据长度
D1
D2
返回:
230
Chanelnumber
2
79
75
速度很快,大约100ms后,返回数据
2.电流开路命令,对应函数名:
CHECKCURROAD,过程先打开通道1,然后通过串口送出一帧,格式如下
Device_ID
41
0
CRCHI
CRCLO
表ID(F1~F255)
命令字
数据长度0
返回
0
1
2
3
4
5
6
7
8
9
87
67
32
79
75
W
C
O
K
3.切换接线方式,对应函数名:
CONNECTMODECTRL();过程先打开电源通道2,然后送出一个数据帧,格式如下:
0
1
2
3
4
5
6
7
8
Dev_id
17
4
0/1
0
0~4
0/1
crchi
crclo
[0]:
dev_id包括三个数字,是三组信号源主板的485通讯地址,其中A相的主板地址系220,B相221,C相222;
[3]:
正/反相序标志,正相序=1,反相序=0;
[5]:
相序标记,包括5个数字,从0~4,其中
四线有功方式:
0
三线有功方式:
1
四线无功方式:
2
三线无功方式:
3
单相方式:
4
[6]:
容感性标记,两个数字0/1,其中容性负载=0,感性负载=1;
成功返回的帧格式:
0
1
2
3
4
5
6
7
8
9
87
67
32
79
75
W
C
O
K
4.相位更改指令,对应函数名:
COSOUT();过程先打开电源通道2,然后发出一帧数据,格式如下:
0
1
2
3
4
5
6
7
8
220/1/2
12
4
hi
…
…
low
crchi
crclo
成功返回的帧格式:
0
1
2
3
4
5
6
7
8
9
87
67
79
75
W
C
O
K
5.电流输出指令,对应函数名:
CURRENTOUT();过程系先切换电源通道2,然后发出一帧数据,格式如下:
0
1
2
3
4
5
6
7
8
220/1/2
10
4
crchi
crclo
成功返回的帧格式:
0
1
2
3
4
5
6
7
8
9
87
67
32
79
75
W
C
O
K
6.开路检测的毫安电流,函数名:
CurrentOut7mA;此函数用于在开路检测前,在0.1A挡输出7%的电流,为开路检测提供电流。
0
1
2
3
4
dev_id
35
0
crc_hi
crc_lo
返回
0
1
2
3
4
5
6
7
8
9
87
67
32
79
75
W
C
O
K
7.输出当前电流档位的百分比,函数名:
CurrentPercentOut。
此函数同样先打开电流通道,然后发出一帧数据,格式如下:
0
1
2
3
4
5
6
7
8
220/1/2
26
4
高位
…
…
低位
CRCHI
CRCLO
注意,电流的实际值要x100倍后填入3~6中。
返回帧为“WCOK”
8.电流谐波,函数名CurrentXieBo,关键参数包括电流幅值、谐波次数、谐波相位、谐波方式。
其中
a)电流幅值:
x100,数组长度2个bytes.
b)谐波次数:
整数,数组2个bytes
c)谐波相位:
x100取整,数组长度2个bytes.
d)谐波类型:
【1】为普通谐波,【2】次谐波,【3】偶谐波,【4】奇次谐波
0
1
2
3
4
5
6
7
8
9
10
11
DevId
21
7
a1
a2
b1
b2
c1
c2
d
CRC_H
CRC_L
返回帧【WCOK】
9.电流多次谐波合成,函数名CurrentXieBoMulti,参数接收幅值数组、谐波次数数组、和相位数组。
这个比较复杂,以下详细说明
多次谐波与上面的单次谐波,参数同样包括幅值、次数、相位,数组长度为21,三组数据放在一个长度为89的字节类型的数组里面,三个数组的参数按照偏移量21的方式,依次放在89个字节的数组里面,从数组第四个字节开始,幅值,数组索引值24(21+3)即次数的位置,而相位数据需要x10的两个字节,从42,43开始的位置存放相位数据。
0
1
2
3
。
。
24
。
。
44
43
。
。
87
88
DEVID
38
84
幅值
次数
相
位
CRCHI
CRCLO
返回帧【WCOK】
10.脉冲累计命令,原函数名:
ErrCounterAccumulationImpulse,此函数功能是累计标准表脉冲,用在校核常数测试上。
对应的硬件模块是需量板,但08年5月之后,改为第一块误差计板实现此功能。
指令格式如下
0
1
2
3
4
DEVID:
1
35
0
CRCHI
CRCLO
返会数据【WCOK】
11.清除误差标记指令,原函数名:
ErrCounterClearMark,主要用途,清除误差标记,当误差计算后,用户读数后,如果不擦除标记,那么数据一直保留不会刷新,因此在读数后,需要发这一条指令,使误差计某地址的内存的数据更新。
这条命令对应是读一个表位的数据时使用,对于“批量读”,这是读显存的数时候没用。
指令格式如下
0
1
2
3
4
DEVID(1~MAX)
10
0
CRCHI
CRCLO
返回数据【WCOK】
12.日计时误差指令,原函数名:
ErrCounterCumulationDay,启动误差计的计时模式。
参数有frequency,accesschannel,impulsemode,其中误差计支持高频脉冲,frequency允许大整数,14个byte表示长度14位的长整数,整数按每一位的阿拉伯数字的ascii码填入数组。
Accesschannel系通道号,多功能台一般都有通道盒,目前定义的通道有20个。
脉冲方式impulsemode包括上拉方式和下拉方式两种,但估计可能有第三种。
0
1
2
3
..
17
18
19
20
DEVID
31
16
frequency
Access
Impulse
CRCHI
CRCLO
注意:
杭州的多功能台特殊,每组电表增加多一个误差计,作为日计时误差专用,这样可以同步进行测试,解决误差计只能一种工作模式的问题,这当然是很特殊的情况,因为误差计设计太简单,没有分时计算的功能。
返回的数据还是【WCOK】
读脉冲数指令,原函数名:
ErrCounterImpulseReadData,这个指令是读取误差计在累计脉冲模式下的累计数。
指令格式如下
0
1
2
3
4
DEVIC
36
0
CRCHI
CRCLO
返回数据长度是20,累计数以ASCII码表示,从第四个字节开始到第18个字节,共15个bytes,即长度为15的数字的ASCII码。
以下返回格式
0
1
2
3
17
18
19
ASCII码
CRCHI
CRCLO
最大需量测试指令,原函数名:
ErrCounterMaxXL,这个指令是需量测试指令,使某个表位相关联的误差计进入需量测试模式,主要参数包括标准表常数、需量周期时间、滑差次数,标准表常数以数字的每个ASCII字符放在第三个开始的数组内。
0
1
2
3
16
17
18
19
20
DEVID
25
16
ASCII
..
周期
次数
CRCHI
CRCLO
返回格式【WCOK】
读需量测试的结果,原函数名:
ErrCounterMaxXLReadData,这个指令是读需量测试结果,主要传递三个参数,用于需量误差的计算,包括电流变比、电压变比和接线系数。
指令格式如下
0
1
2
3
4
DEVID
26
0
CRCHI
CRCLO
返回数据
IF
数据长度<9,读需量失败!
ELSEIF
数据长度=9,且
0
1
2
3
4
5
6
7
66
85
83
89
B
U
S
Y
表示需量正在进行中
ELSEIF
数据长度>=20
从索引3到17是数字的ASCII码,转换为数字后必须乘(电流变比+电压变比+接线系数),得到的结果就是需量测试的结果,但调用者可能还需要计算处理。
0
1
2
3
17
18
19
ASCII
..
CRCHI
CRCLO
潜动试验模式指令,原函数名:
ErrCounterQianDong,使某个表位相关联的误差计进入潜动试验模式。
传入的参数包括潜动时间、脉冲数、通道号和脉冲方式(上拉,下拉),潜动时间为整数,转换两个字节按照高低位存放在数组内,指令格式如下
0
1
2
3
4
5
6
7
8
9
DEVID
24
5
时间
脉冲
通道
方式
CRCHI
CRCLO
返回数据的格式【WCOK】
注意:
如果DEVID参数改为199,即表示广播方式,所有的误差计将全部进入潜动模式,但这个命令有个问题,如果误差计数量多,比如6个以上,会出现通讯问题,导致某些误差计没有进入模式,但返回的数据是对的。
因此解决这个问题,只能通过多次重发的方式解决,这个问题对于使用199的其它指令都是一样的。
启动试验模式指令,原函数名:
ErrCounterQiDong,使某个表位相关联的误差计进入启动试验模式。
传递的参数基本与潜动相同。
指令格式
0
1
2
3
4
5
6
7
8
9
DEVID
23
5
时间
脉冲
通道
方式
CRCHI
CRCLO
返回数据的格式【WCOK】
潜启动试验读数指令,原函数名:
ErrCounterQQReadData,读取某个表位的试验结果。
指令格式:
0
1
2
3
4
DEVID
11
0
CRCHI
CRCLO
返回数据
IF数据返回长度<9,读书命令失败,可能是通讯故障引起的。
ELSEIF数据长度=9,且从数据数组第四位置开始为BUSY,表示潜动正在进行之中。
ELSEIF数据长度=13,返回字符串,位置从数组第4个位置到第10位置的7个字符。
返回的字符是LED面板上显示的字符,比如PASS或者FAIL。
0
1
2
3
9
10
11
12
字符
?
CRCHI
CRCLO
读误差数据指令,原函数名:
ErrCounterReadData,该指令读取某表位关联误差计的缓存,即误差数据。
返回的数据包括误差的次数。
这个指令要配合另外一条清空缓存的指令用,因为如果不主动清空缓存,下次读回的数据还是原来的,没有改变。
指令如下(与潜启动读数相同):
0
1
2
3
4
DEVID
11
0
CRCHI
CRCLO
返回数据
与潜启动相同,但不同在于第11个位置,该位保存误差次数。
批量读误差数据指令,原函数名:
ErrCounterReadDataAll,该函数可以读误差计关联的表位的全部显存的数据,一般每个误差计关联6个表位的显示LED,此函数实际上就是读显存的数据。
格式如下:
0
1
2
3
4
DEVID
48
0
CRCHI
CRCLO
注:
DEVID是每个误差计关联的表位的第一个表位的序号。
返回的数据:
IF数据长度<9,误差计读数失败,可能是通讯原因。
ELSEIF数据长度=9,误差计正在处理中。
ELSEIF数据长度>=65,接收到误差。
数据的分解有两个分支,与一个参数DIGITALNO有关,是误差计显示的小数位,如果是<=3位数,数组开始的位置往前移一位,6个ASCII码表示误差数,而=4位数,则用7位数表示误差数(一个实数)。
共6组数据,分别是关联的6个表位的误差数据,每组10个bytes,每组最后一个BYTE为误差次数。
索引11为第一组数据的误差次数,往前推6个即索引5开始为第一组误差数据的ASCII码,如果4位显示,则往前推7个即索引4开始ASCII码。
因此索引11,21,31,41,51,61分别是6组数据的边界,可按照显示的位数往前推出5/6个ASCII码即为误差值。
0
1
4
5
11
61
63
64
=4
=3
次数
次数
CRCHI
CRCL0
读色标状态指令,函数名:
ErrCounterReadSeBiao,该指令的功能是读取误差计当前的色标状态(ON或者OFF),指令实际与读误差数是一样的。
指令如下
0
1
2
3
4
DEVID
11
0
CRCHI
CRCLO
返回数据与误差接收不同,
IF数据长度<9,读色标命令失败,
ELSEIF数据长度=9,而且返回字符串【BUSY】,表示正在处理色标,
ELSEIF数据长度=13,返回的数据数组索引从5开始到9,为返回的字符串的ASCII码。
含有“OFF”字串的表示色标已捕捉。
色标命令,函数名:
ErrCounterSeBiao,该函数使某一个表位关联的误差计进入色标捕捉模式,参数有通道号和脉冲类型(上拉和下拉)两个,指令格式:
0
1
2
3
4
5
6
DEVID
28
2
通道
方式
CRCHI
CRCLO
返回数据:
【WCOK】
误差计休眠指令,函数名:
ErrCounterSleep,该指令使误差计进入休眠模式,脉冲采集的端口封闭,这样外部的频率就不能影响误差计的工作,此用户高频的输入频率,容易导致误差计失灵。
指令:
0
1
2
3
4
DEVID
42
0
CRCHI
CRCLO
返回数据为【WCOK】
误差计算模式,函数名:
ErrCounterTest,这是最重要也是使用最频繁的指令,使该表位相关联的误差计进入误差计算模式,传递参数包括圈数、标准脉冲数、通道号、脉冲类型。
圈数系一个两个字节的INTEGER,在数组排列的方式由高到低;脉冲数是一个长整形,占四个字节;通道号为1个BYTE,脉冲方式也是一个BYTE。
另外还有两个参数误差上下限,占数组4个BYTEs,第一个参数是上限值,第二个是下限值,一般这两个值的绝对值都设的很大,否则LED会出现超差符号,不美观而且引起程序截取数据的问题。
指令格式如下
0
1
2
3~4
5~8
9
10
11~14
15~18
19~20
DEVID
22
16
圈数
标准数
通道
方式
上限
下限
CRC
返回数据【WCOK】
485通讯开关控制指令,函数名:
ErrCounterUser485KaiGuan,该指令控制485电子开关的闭合状态,只有当485电子开关开启时,外界才可以使用设备内的485总线与表位上的485接口进行通讯,关闭时不能通讯。
指令格式:
0
1
2
3
4
5
DEVID
14
1
STATUS:
0/1
CRCHI
CRCLO
注:
STATUS:
0表示关闭,1表示开启。
当DEVID=199时候,则全部打开485通道。
返回数据【WCOK】
需量周期测试指令,函数名:
ErrCounterXLzq,该指令使某表位关联的误差计进入需量周期测试模式,该函数传递的参数包括需量周期值、通道号、脉冲方式。
需量周期值系一个秒单位的整数,按4个字节整数放在数组的4个位置。
指令格式
0
1
2
3~6
7
8
9
10
DEVID
27
6
秒数
通道
方式
CRCHI
CRCLO
返回数据【WCOK】
脉冲计数模式,函数名:
ErrCounterZouZi,该指令实现误差计进入计数模式,累加接收到的脉冲个数,用于常数校核测试中。
函数传递脉冲方式、通道号和计数的脉冲数。
通常脉冲数没有意义,这是一个计数结束的条件,在校表程序中一般都设置一个很大的整数。
指令格式
0
1
2
3~6
7
8
9
10
DEVID
29
6
脉冲数
通道
方式
CRCHI
CRCLO
返回数据:
【WCOK】
读脉冲累计数,函数名:
ErrCounterZouZiReadData,此函数对应上函数ErrCounterZouZi,实现读取误差计内存当前脉冲累计数。
指令格式如下
0
1
2
3
4
DEVID
30
0
CRCHI
CRCLO
返回数据
IF数据长度<9,读脉冲累计数失败;
ELSEIF数据长度=9AND数组索引[3..6]是ASCII字符【BUSY】,正在处理脉冲累计;
ELSEIF数据长度>=20,索引3~17的ASCII码组成的字符串就是脉冲数。
市电频率功能,函数名:
FrequencyFollow,该函数影响电源的频率,电源的频率可以是标准的频率,也可以是外部电路的频率,即与外部电路保持一致的工作频率。
函数传递的参数包括一个设备地址号(220/221/222),和一个标记值整数:
1为市电频率;2为标准工作频率。
设备号是频率发生的相别,如果A相为频率发生地,则选择220,也有一种情况是采用C相作为频率发生源。
指令格式如下
0
1
2
3
4
5
DEVID
24
1
1/2
CRCHI
CRCLO
返回数据
【WCOK】
频率修改指令,函数名:
FrequencyOut,该指令修改电源的频率,频率值的范围从45~65之间,而且指令中的频率值要x1000后的4个字节整数按高低位存放在数组的索引3~6中,指令格式:
0
1
2
3~6
7
8
DEVID
13
4
X1000
CRCHI
CRCLO
返回数据:
【WCOK】
GPS模块初始化,函数名:
GPSint,先选通道4并打开,波特率“4800,N,8,1”,指令格式如下:
0
1
2
3
4
5
80
71
82
77
73
69
P
G
R
M
I
E
该指令无返回。
时间基准通讯指令,函数名:
RDFromTimeBase,该指令不同于之前的指令,保持类似三代源的通讯协议。
格式指令如下:
1
2
3
4
5
6
7
8
9
AA
5
AA
AA
AA
AA
AA
AA
AA
返回字节长度正确的是18个字节。
返回数据的数组首先长度要是18个字节,然后比较前9个字节的数字是否和指令相同,如果不同则后面的7个字节就是读回的时间值,最后两个字节应该是CRC校验码,但源程序没有使用它。
这里要注意的是串口通讯的设置“19200,M,8,1”
返回数据:
长度18个字节
10
11
12
13
14
15
16
Lo
Hi
month
day
hour
min
second
08
20
11
14
33
44
32
10x(33\16)+33mod16=21
21
32
20
后面三个数字表示时分秒,需要计算。
相序控制指令,函数名:
PhaseModeCtrl,该指令用于修改A/B/C的相序,一般需要依次改变A/B/C的相序。
指令格式
0
1
2
3
4
5
6
DEVID
17
2
0/1
0
CRCHI
CRCLO
0:
正1:
逆
返回数据:
【WCOK】
相位偏离度指令,函数名:
PhaseOffset,该指令使相位发生数值偏移,偏移的数值乘100,然后存放在2个BYTES的数组内(两个字节的整数)。
指令格式如下
0
1
2
3~4
5~6
DEVID
22
2
DATx100
CRC
返回数据:
【WCOK】
电流通/断状态查询指令,函数名:
ReadCurrentOnOff,这个指令在校表软件中无用,是一个作废的指令。
作用判断某个表位的电流断通状态,指令格式:
0
1
2