首页 >常见问题 >测控组网系统
北京捷麦JMBUS协议说明

1通信协议范围及规范

         此协议适用于无线测控系统中主站与分站之前的数据传输协议,如下图所示的绿色部分的通信。


         协议规定

1.       当分站收到主站的数据请求时,必须要在1秒以内作出响应。

2.       该协议是通过包传输的,串口是以3.5T无数据为包结束条件,例如在串口波特率1200bp/s下,传输3.5个数据所需的时间大约为30ms(3.5T30ms),收到一个数据开始计时,如果收到这个数据后30ms内没有再收到下一个数据,则认为此包结束,这个数据就是这个包的最后一个数据,之前所收到的所有数据就是这包的内容。

3.       协议采用CRC-16校验(生产多项式x16+x15+ x2+1,简记式为8005),校验失败后这包丢弃不做协议解析。

4.       超时重发机制由主站完成,分站无此机制。

5.       传输的字节序采用“little endian”方式,即我们通常所说的小端朝前(Intelx86系列CPU结构),意味着字节时首先要发送一个整形数据(两个字节)内容为0x1234,就先的低字节0x34 然后再0x12,同理浮点型的四个数据也是如此发送。协议中所有的数据都是采用这种字节序。


 

2 协议整体组成

         每个通信的数据包都有捷麦标示头、通信头和请求或响应内容三部分组成,如下图所示:

2.1 捷麦标示头

捷麦标示头有两种协议头,普通采集与响应类型和分站主动上传这两种类型,无论哪种类型,捷麦标示头固定为6个字节。具体内容如下:

         普通采集与响应的标示头为:4F 3F 2F 1F 5F 6F

         分站主动上传标示头           4F 3F 2F 1F 5F 5F

 

2.2 通信头

         通信头的数据长度是固定的,一共是18格字节,包含的内容如下图所示:

 

2.2.1 设备/应用号

         标示此包数据是哪个设备或者应用的,固定为两个字节。

例如P5037设备的设备号为 10 01,站点测试应用的应用号为 00 05

2.2.2 包标示

         包标示从0开始,请求和响应的包标示相同。新包在原有包标示的基础上加1。重发时包标示不变(主站对包标示进行加1操作,分站响应时,包标示不做任何处理)。占两个字节

2.2.3包长度

包长的实际数值是请求或响应的数据的字节数量,也就是上面协议整体组成示意图中的蓝色部分的字节数量,占两个字节(字节序低字节在前)。

 

2.2.4包类型

类型码

定义

方向

备注

00H

请求 

主站分站

对分站点的CPU模块

80H

应答

分站主站


02H

请求 

主站分站

对分站点的通信管理模块的存储器

82H

有存储内容应答

分站主站

当无存储内容时包长为0,无绿色部分

84H

主动上传

分站主站


04H

主动上传的响应

主站分站


05H

主动上传的响应并接下来有请求

主站分站


 

2.2.5 路径

         路径占三个字节,表示这包数据的传输路径,用于电台在中继时的协议支持。缺省值(不使用中继)为 EF FF F0

24位(三个字节)的路径信息中前2个字节表示数据的路径信息。每一级路径用4位二进制表示。这4位表示在这一级上中转站的编号。如果这个站是中转站其编号范围是0D。共可表达4级树形路径。第三个字节的后4位表示数据传递的当前路径级数。用F表示对应的字段无内容。用E表示树形结构的终点。数据的结构如下:

2.2.6 备用

         备用占两个字节,用于协议扩展,缺省值为0x00 0x00

2.2.7 目的地址与源地址

         目的地址表示数据包的目的。源地址表示数据的来源。每个请求数据中的请求对应着响应数据中的一个响应。请求和响应是成对出现的。

         在一个系统中,每一个分站和主站都有唯一的地址。

地址用两个字节表示,字节序采用低字节在前,比如一个分站的地址为12,那么地址表示为:0C 00

2.8 通信头CRC

         通信头部分的CRC校验,也就是灰色部分的数据CRC,不包含“捷麦标示头”部分和“请求或响应数据”部分。

 

2.3 请求与响应内容

         该协议一包可以获取不同数据类型的数据,获取的这一小段称为数据段,请求和响应的协议格式如下图所示:

 

         注意请求内容或者响应内荣包中的“内容”字段的长度依据功能码等,可能有些功能码没有“内容”字段。

请求(响应)总个数:表示数据段的总个数,段数的最大值为20,请求和响应是一一对应。

数据段:每一个数据段都是由序号、功能码、地址偏移、寄存器数和内容构成。序号是从1依次增加的,功能码等参加下文。

内容校验:内容CRC是指对包内容(请求或者响应内容)做CRC处理,不包含“捷麦标示头”部分和“通信头”部分。


 

功能码定义汇总


数据类型

名称

功能码意义

功能码(HEX

->

数据访问

1位访问

物理离散输入

读离散输入

02

42/82

物理继电器

读离散输出

01

41/81

写离散输出

0F

4F/8F

8位访问

单字节寄存器

读字节输入寄存器

33

73/B3

读字节输出寄存器

34

74/B4

写字节输出寄存器

35

75/B5

16位访问

整形寄存器

读整形输入寄存器

04

44/84

读整形输出寄存器

03

43/83

写整形输出寄存器

10

50/90

32位访问

实数寄存器

读实数输入寄存器

36

76/B6

读实数输出寄存器

37

77/B7

写实数输出寄存器

38

78/B8

        

 

2.3.1读离散输出(0x01

    01功能代码是远程设备用来读取离散输出的1~2000邻近状态。请求协议数据单元详细说明了离散输出的起始地址和离散输出的个数。离散输出的地址从0开始。

    响应信息中的离散输出被按字节打包,数据字节的每一位都有一个离散输出与之相对应。状态1=ON0=OFF。起始地址的内容被放入数据第一字节的最低有效位,依次类推。

    如果返回输出的位数不是8的倍数,剩余高位用0补。计数字节详细记录了完整数据字节的数量。

 

请求协议数据单元

功能代码

1字节

0x01

起始地址

2字节

0x00000xFFFF

感应器数量

2字节

120000x7D0

 

响应协议数据单元

  功能代码

1字节

0x01

起始地址

2字节

0x00000xFFFF

感应器数量

2字节

120000x7D0

  感应器状态

n字节

n=N或者N+1

N*=输出量/8,如果剩余量不为0,则N=N+1

 

下面举一个例子是关于请求读离散输出(20-38):

请求

响应

字段名称

Hex

字段名称

Hex

功能

起始地址低位

起始地址高位

输出位数的低位

输出位数的高位

 

01

功能

起始地址低位

起始地址高位

输出位数的低位

输出位数的高位

27-20的输出状态

35-28的输出状态

38-36的输出状态

01

13

13

00

00

13

13

00

00


CD

6B

05

 

    十六进制数CD或二进制数1100 1101包含了输出位27的状态“1”。输出位27是这个字节的最高位,输出位20为这个字节的最地位。

    在通常的情况下,一个字节的左边是最高有效位,右边是最低有效位。这样输出的第一个字节从左边到右边依次是位2720,下一个字节从左到右依次是位3528。当传输这些输出状态时,从最低有效位到最高有效位:20…2728…35依次类推。

    在最后一个字节,十六进制数05或二进制数0000 0101是输出位38-36的状态。输出位38是从左边开始数的第六位,输出位36是这个字节的最低位。剩余的五个高位用0补。

注意:剩余的五个位(高位)用0补。

 

2.3.2读离散输入(0x02)

    功能代码是远程安装设备驱动程序用来读取离散输入的12000个邻近状态。请求PDU详细说明了离散输入的起始地址,第一个离散输入的地址域和离散输入的个数。离散输入的地址从0开始,因此,离散输入感应器1-16的地址为0-15

    响应信息中的离散输入被按字节打包,数据字节的每一位都有一个离散输入与之相对应。状态1=ON0=OFF。起始地址的内容被放入数据第一字节的最低有效位,依次类推。

    如果返回输出的位数不是8的倍数,剩余高位用0补。计数字节详细记录了完整数据字节的数量。

 

请求协议数据单元

功能代码

1字节

0x02

起始地址

2字节

0x00000xFFFF

输入量

2字节

120000x7D0

 

响应协议数据单元

  功能代码

1字节

0x02

起始地址

2字节

0x00000xFFFF

输入量

2字节

120000x7D0

  感应器状态

N*×1字节


N*=输出量/8,如果剩余量不为0,则N=N+1

 

下面举一个例子是关于请求读离散输入(197-218):

请求

响应

字段名称

Hex

字段名称

Hex

功能

起始地址低位

起始地址高位

输入位数的低位

输入位数的高位

 

02

功能

起始地址高位

起始地址低位

输入位数的高位

输入位数的低位204-197的输入状态

212-205的输入状态

218-213的输入状态

02

C4

C4

00

00

16

16

00

00


AC

DB

35

 

    从十六进制数AC或二进制数1010 1100中可以读出离散输入204-197的状态,输入位204是这个字节最高位,197是这个字节的最低位。

    从十六进制数35或二进制数0011 0101中可以读出离散输入204-197的状态,输入位218是字节从左边数的第三位,输入位213是这个字节的最低位

注意:剩余的两位(高位)用0

 

2.3.3写离散输出0x0f

这个功能代码是远程设备用来确定离散输出序列中的离散输出的ONOFF状态。请求协议数据单元详细说明了离散输出的起始地址和输出数量。离散输出的地址是从0开始的,因此离散输出1的地址为0

在请求协议数据单元详细说明了请求状态ONOFF。这个区域的相应位为逻辑“1”时,对应的输出为ON,逻辑“0”对应OFF

正常的响应返回功能代码,起始地址和对应离散输出的数量。

请求协议数据单元

功能代码

1字节

0FH

起始地址

2字节

0000H007FH

输出数量

2字节

0001H0080H

  输出值

N*×1字节


 

N*=输出量/8,如果剩余量不为0,则N=N+1

 

响应协议数据单元

  功能代码

1字节

0FH

  起始地址

2字节

0000H007FH

输出数量

2字节

0001H0080H

 

下面举一个例子,写一连串的10个离散输出,从离散输出20开始

 被传输的数据的第一字节CD是存储器码为27-20的状态,最低位表达的是离散输出20的状态,下一字节存储器码为29-28的状态,最低位表达的是离散输出28的状态。在最后一字节没有用到的位用0补。

请求       

响应

字段名称

Hex

字段名称

Hex

功能

起始地址低位

起始地址高位

输出数量低位

输出数量高位

27-20的状态

29-28的状态

0F

功能

起始地址低位

起始地址高位

输出数量低位

输出数量高位

 

0F

13

13

00

00

0A

0A

00

00

CD


01

 

 

2.3.5读字节输入寄存器(0x33

这个功能代码是用来读远程设备相邻的字节输入寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为一个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。

 

请求协议数据单元          

功能代码

1字节

33H

起始地址

2字节

0000H到13FFH

数据字节个数

2字节

14000001-190H




 

响应协议数据单元

  功能代码

1字节

33H

  起始地址

2字节

0000H到13FFH

  数据字节个数

2字节

14000001-190H

  数据

N*字节


 

N*=数据字节个数

 

下面这个例子是读从字节寄存器2开始读内容为00 0A 01 02到寄存器,:

 

请求       

响应

字段名称

Hex

字段名称

Hex

功能

33

功能

33

起始地址低位

01

起始地址低位

01

起始地址高位

00

起始地址高位

00

数据字节低位

04

数据字节低位

04

数据字节高位

00

数据字节高位

00



数据值VB00001

数据值VB00002

数据值VB00003

数据值VB00004

00

0A

01

02

 

2.3.5读字节输出寄存器(0x34

这个功能代码是用来读远程设备相邻的字节输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为一个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。

 

请求协议数据单元          

功能代码

1字节

34H

起始地址

2字节

0000H到13FFH

数据字节个数

2字节

14000001-190H




 

响应协议数据单元

  功能代码

1字节

34H

  起始地址

2字节

0000H到13FFH

  数据字节个数

2字节

14000001-190H

  数据

N*字节


 

N*=数据字节个数

 

下面这个例子是读从字节寄存器2开始读内容为00 0A 01 02到寄存器,:

 

请求       

响应

字段名称

Hex

字段名称

Hex

功能

34

功能

34

起始地址低位

01

起始地址低位

01

起始地址高位

00

起始地址高位

00

数据字节低位

04

数据字节低位

04

数据字节高位

00

数据字节高位

00



数据值VB00001

数据值VB00002

数据值VB00003

数据值VB00004

00

0A

01

02

 

2.3.4写字节输出寄存器(0x35

这个功能代码是远程设备用来写相邻的字节输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和输出数量。每个寄存器为一个字节。正常的的响应会返回功能代码,起始地址和写入的寄存器的数量。

 

请求协议数据单元          

功能代码

1字节

35H

起始地址

2字节

0000H到13FFH

数据字节个数

2字节

14000001-190H

  数据

N*字节


 

N*=数据字节个数

响应协议数据单元

  功能代码

1字节

35H

  起始地址

2字节

0000H到13FFH

  数据字节个数

2字节

14000001-190H

 

下面这个例子是写00 0A 01 02到寄存器,从字节寄存器2开始:

 

请求       

响应

字段名称

Hex

字段名称

Hex

功能

35

功能

35

起始地址低位

01

起始地址低位

01

起始地址高位

00

起始地址高位

00

数据字节低位

04

数据字节低位

04

数据字节高位

00

数据字节高位

00

数据值VB00001

00



数据值VB00002

0A

数据值VB00003

01

数据值VB00004

02

 

 

2.3.6读整形输入寄存器(0x04

这个功能代码是用来读远程设备相邻的整形(int双字节)输入寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为两个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。

 

请求协议数据单元          

功能代码

1字节

04H

起始地址

2字节

0000H到13FFH

寄存器个数

2字节

14000001-190H




 

响应协议数据单元

  功能代码

1字节

04H

  起始地址

2字节

0000H到13FFH

  寄存器个数

2字节

14000001-190H

  数据

N*字节


 

N*=数据字节个数*2

 

下面这个例子是读从整形寄存器2开始读内容为00 0A01 02到寄存器,:

 

请求       

响应

字段名称

Hex

字段名称

Hex

功能

04

功能

04

起始地址低位

01

起始地址低位

01

起始地址高位

00

起始地址高位

00

寄存器个数低位

02

寄存器个数低位

02

寄存器个数高位

00

寄存器个数高位

00



数据值ViD2低字节

数据值VID2高字节

数据值VID3低字节

数据值VID3高字节

00

0A

01

02

 

2.3.7读整形输出寄存器(0x03

这个功能代码是用来读远程设备相邻的整形(int双字节)输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为两个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。

 

请求协议数据单元          

功能代码

1字节

03H

起始地址

2字节

0000H到13FFH

寄存器个数

2字节

14000001-190H




 

响应协议数据单元

  功能代码

1字节

03H

  起始地址

2字节

0000H到13FFH

  寄存器个数

2字节

14000001-190H

  数据

N*字节


 

N*=数据字节个数*2

 

下面这个例子是读从整形输出寄存器2开始读内容为00 0A01 02到寄存器,:

 

请求       

响应

字段名称

Hex

字段名称

Hex

功能

03

功能

03

起始地址低位

01

起始地址低位

01

起始地址高位

00

起始地址高位

00

寄存器个数低位

02

寄存器个数低位

02

寄存器个数高位

00

寄存器个数高位

00



数据值VOD2低字节

数据值VOD2高字节

数据值VOD3低字节

数据值VOD3高字节

00

0A

01

02

 

 

2.3.8写整形输出寄存器(0x10

这个功能代码是用来写远程设备相邻的整形(int双字节)输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为两个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。

 

请求协议数据单元          

功能代码

1字节

10H

起始地址

2字节

0000H到13FFH

寄存器个数

2字节

14000001-190H

  数据

N*字节


 

N*=数据字节个数*2

 

响应协议数据单元

  功能代码

1字节

10H

  起始地址

2字节

0000H到13FFH

寄存器个数

2字节

14000001-190H




 

下面这个例子是读从整形输出寄存器2开始读内容为00 0A01 02到寄存器:

 

请求       

响应

字段名称

Hex

字段名称

Hex

功能

10

功能

10

起始地址低位

01

起始地址低位

01

起始地址高位

00

起始地址高位

00

寄存器个数低位

02

寄存器个数低位

02

寄存器个数高位

00

寄存器个数高位

00

数据值VOD2低字节

数据值VOD2高字节

数据值VOD3低字节

数据值VOD3高字节

00

0A

01

02



 

2.3.9读实数输入寄存器(0x36

这个功能代码是用来读远程设备相邻实数(float,四字节,IEE754标准)输入寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为四个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。

 

请求协议数据单元          

功能代码

1字节

36H

起始地址

2字节

0000H到13FFH

数据字节个数

2字节

14000001-190H




 

响应协议数据单元

  功能代码

1字节

36H

  起始地址

2字节

0000H到13FFH

  数据字节个数

2字节

14000001-190H

  数据

N*字节


 

N*=数据字节个数*4

 

下面这个例子是读从整形寄存器2开始读内容为3.143.15到寄存器,:

请求       

响应

字段名称

Hex

字段名称

Hex

功能

36

功能

36

起始地址低位

01

起始地址低位

01

起始地址高位

00

起始地址高位

00

寄存器个数低位

02

寄存器个数低位

02

寄存器个数高位

00

寄存器个数高位

00



数据值ViF2字节1

数据值ViF2字节2

数据值ViF2字节3

数据值ViF2字节4

数据值ViF3字节1

数据值ViF3字节2

数据值ViF3字节3

数据值ViF3字节4

C3

F5

48

40

9A

99

49

40

 

2.3.10读实数输出寄存器(0x37

这个功能代码是用来读远程设备相邻实数(float,四字节,IEE754标准)输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和读出数量。每个寄存器为四个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。

 

请求协议数据单元          

功能代码

1字节

37H

起始地址

2字节

0000H到13FFH

数据字节个数

2字节

14000001-190H




 

响应协议数据单元

  功能代码

1字节

37H

  起始地址

2字节

0000H到13FFH

  数据字节个数

2字节

14000001-190H

  数据

N*字节


 

N*=数据字节个数*4

 

下面这个例子是读从整形寄存器2开始读内容为3.143.15到寄存器,:

请求       

响应

字段名称

Hex

字段名称

Hex

功能

37

功能

37

起始地址低位

01

起始地址低位

01

起始地址高位

00

起始地址高位

00

寄存器个数低位

02

寄存器个数低位

02

寄存器个数高位

00

寄存器个数高位

00



数据值VOF2字节1

数据值VOF2字节2

数据值VOF2字节3

数据值VOF2字节4

数据值VOF3字节1

数据值VOF3字节2

数据值VOF3字节3

数据值VOF3字节4

C3

F5

48

40

9A

99

49

40

 

2.3.11写实数输出寄存器(0x38

这个功能代码是用来写远程设备相邻实数(float,四字节,IEE754标准)输出寄存器块。请求协议数据单元详细说明了寄存器的起始地址和写的数量和内容。每个寄存器为四个字节。正常的的响应会返回功能代码,起始地址和读出的寄存器的数量及内容。

 

请求协议数据单元          

功能代码

1字节

38H

起始地址

2字节

0000H到13FFH

数据字节个数

2字节

14000001-190H

  数据

N*字节


N*=数据字节个数*4

 

响应协议数据单元

  功能代码

1字节

38H

  起始地址

2字节

0000H到13FFH

  数据字节个数

2字节

14000001-190H




 

N*=数据字节个数*4

 

下面这个例子是写从整形寄存器2开始内容为3.143.15到寄存器上,:

请求       

响应

字段名称

Hex

字段名称

Hex

功能

38

功能

38

起始地址低位

01

起始地址低位

01

起始地址高位

00

起始地址高位

00

寄存器个数低位

02

寄存器个数低位

02

寄存器个数高位

00

寄存器个数高位

00

数据值VOF2字节1

数据值VOF2字节2

数据值VOF2字节3

数据值VOF2字节4

数据值VOF3字节1

数据值VOF3字节2

数据值VOF3字节3

数据值VOF3字节4

C3

F5

48

40

9A

99

49

40



 

2.3.12 主动请求与响应(0x40+*

         各种类型码还有两个码+0x400x80的类型码(例如0x01码变成0x410x810x0F变成0x4F0x8F),他们的语法是一样处理的。只有一下不同:

         当发送出去的数据包是0x40码类型时,捷麦标示头自动变成4F 3F 2F 1F 5F 5F的主动上传标示头,包类型字段变成84的主动上传字段。(其他的处理逻辑跟普通的下至数据一样处理)。

         当收到的数据包类型是这种0x40码类型时,将数据内容解析出来,然后将内容更新到自身对应的0x80码类型的变量上,然后进行相应的响应,(标示头自动变成主动上传头,包类型字段变成04的主动上传响应字段)(其他的处理逻辑跟普通的采集数据包响应一样处理)。

         0x80码是采集变量(只读变量),采集周期为0

2.3.13 示例获取一个数据段

(假设分配的设备号为25 7D,包标示为5,中心站的地址为0,请求的分站为7,获得整形输入的数据)

主站完整的数据请求包为:

4F 3F 2F 1F 5F 6F 25 7D 05 00 09 00 00 EF FF F0 00 00 07 00 00 00 F6 08 01 01 04 00 00 02 00 FA B1

从站完整的数据响应包为:

4F 3F 2F 1F 5F 6F 25 7D 05 00 0D 00 80 EF FF F0 00 00 00 00 07 00 03 6B 01 01 04 13 00 02 00 12 34 56 78 1B CB

 

2.3.14 示例获取多个个数据段

(假设分配的设备号为25 7D,包标示为5,中心站的地址为0,分站为7,获得整形输入的数据和读离散输出)

主站完整的数据请求包为:

4F 3F 2F 1F 5F 6F 25 7D 05 00 0F 00 00 EF FF F0 00 00 07 00 00 00 FE 00 02 01 04 00 00 02 00 02 01 00 00 09 00 57 F1

从站完整的数据响应包为:

4F 3F 2F 1F 5F 6F 25 7D 05 00 15 00 80 EF FF F0 00 00 00 00 07 00 21 7B 02 01 04 00 00 02 00 12 34 56 78 02 01 00 00 09 00 D7 01 72 82  

 



  • 4G-PLC

  • 电台PLC

  • wiFi-PLC

  • 网口PLC
  • 点击这里直接在线沟通

    点击这里给我发QQ消息

    点击这里获得我的联系方式

    技术支持专线

    010-63331036

    联系我们

    网站地图 | 联系我们



    工业和信息化部备案管理系统网站 京ICP备10034286号-1

    Copyright ©北京捷麦顺驰科技有限公司,Inc.All rights reserved.