跳到主要内容
版本:1.10.20_build_2025.9.9.9.1

JBUS协议

本系统自定义一种数据结构:变量,它是控件的数据来源和控件之间数据联系的桥梁。每个变量有诸多属性,与通信有关的属性:读写类型和寄存器编号。读写类型即与外界通信时,是否可以外部读或者写。寄存器编号则是在MODBUS协议与自定义协议中的寄存器地址编号。对于外部通信对象来说,变量的不可视,对于变量数值操作,都是通过操作对应寄存器来实现的。变量在创建时,可以被分配一个独一无二的寄存器地址,这个步骤是用户在IDE开发时编辑变量实现的。


1、JBUS协议整体设计

整个系统的通信工作主要为了实现对于变量的读写操作,从而将数据传送给对应控件。通信协议根据寄存器编号对于变量进行索引,找到与其寄存器地址一致的变量,再根据变量读写类型属性以及通信需求,实现对其的读写操作。整个通信架构如下:

两种通信协议的原理十分相似,架构基本一致,区别在于自定义协议在不存在主从模式,是一种平等的通信方式,去除了MODBUS通信协议上的主机控制从机控制观念。自定义通信协议基本结构上可以分为三层,分别是物理层和数据链路层,协议层,用户层。

(1)物理层和数据链路层:用于完成对于通信载体的配置,使用串口通信时,则需要对于串口的波特率,校验,中断等进行配置,还需要配置用于计时的定时器,包含配置定时器的定时时间,定时中断。数据链路层实现对于数据帧缓存和组帧。

(2)协议层:用于进行,数据帧校验,功能解析等,并将有效数据传递给用户层。

(3)用户层:用户将协议层传来的数据进行实际的处理。

这样分层结构使得通信协议的可移植性好,可以根据不同硬件环境来来完成底层功能配置,同时可以根据设计功能需求修改用户层代码。


2、 数据帧结构设计

2.1寄存器传输数据结构

功能需求:由于变量采用32位数值,在传输时自定义协议采用传输的单个寄存器也是32位,保持匹配。

寄存器通信数据帧结构见下表:

数据帧采用1个字节作为帧头校验,采用2个字节CRC校验码结尾,来保证整个数据帧的有效性。

功能码为1个字节,当功能码为0x01时表示传输自身数据给外部,0x02表示向外部请求数据。

起始寄存器地址表示该地址开始,往后获取或者传送多个寄存器。

寄存器数目表示通讯数据量。若功能码为请求数据时则数据字节数为0,此时数据域没有内容,若是传送数据给外部,则数据域为起始地址寄存器数据先发送,每个寄存器为4个字节数据,高字节先发送,低字节后发送。

2.2虚拟按键传输数据帧结构

功能需求:对于没有触摸屏的产品,需要通过按键来操作。按键信息可以通过通信传输到系统中,这时就需要建立单独的格式来识别虚拟按键信息。

数据帧结构见下表:

键值传输功能码为0x03。键值数据占用数据帧中的两个字节。其余结构同2.1寄存器传输数据结构。

键值表如下:


3、校验码生成

本通信协议使用16位的循环冗余校验(CRC),通过对通信数据进行或运算并移位运算。校验码生成运算起来较为复杂,但是这样生成校验码能保证数据通信有效性,当发送设备产生的校验码,接收端计算以后与收到的校验码不符,则判断当前数据帧无效。

校验生成主要针对于通信数据,不包含串口通信数据包中的起始位、终止位和校验位。步骤如下:

(1)初始校验码16位全为1,即为0xFFFF。

(2)将数据帧的1个字节与校验码进行异或运算。

(3)右移一位,高位补0。若低位右移出来数据为1,则校验码与0xA001进行异或操作。

(4)重复第(3)步操作,直到向右移位8次,则该字节处理结束。

(5)重复第(2)步操作,直到整个数据包全部运算结束,产生16位校验。

发送数据者将需要发送数据放入数据帧以后,根据数据帧中数据计算校验,并将校验位加入数据帧末尾。


4、 数据帧缓存

帧结束采用超时判断方式,来确定当前数据帧是否结束。整个数据帧必须以的连续流进行发送。字符在数据帧缓存过程中有两个时间参数非常重要,分别是帧数据字节间接收间隔时间和数据帧之间的间隔时间。其中帧数据字节间接收间隔时间,不能超过1.5个字符传输时间;数据帧之间的间隔时间不小于3.5个字符传输时间。

如图所示,表示数据帧缓存时间间隔:

需要注意:对于这两个参数,由于采用定时器中断的形式来实现,在高速通信时会导致MCU定时中断时间较短,且过于频繁。所以当波特率高于19200bps时,就采用两个固定时间值,这里采用19200bps时对应的两个参数时间。根据计算可以得到:3.5个字符传输时间约为2ms,1.5个字符传输时间约为885us。当波特率小于19200bps时请根据3.5个字符以及1.5个字符传输时间进行计算,来设置两个时间参数。

数据帧缓存流程图如下所示:


5、 状态机设计

在这里对于状态机简单说明。空闲状态属于起始状态,表示该状态可以接受数据,也可以请求发送数据。接收到数据时,就开始进数据帧缓存,在数据帧缓存结束时,将数据进行校验码检测,若校验码检测不通过,则当前数据无效,若校验码通过,则表示数据是正常的,将根据用户设定数据进行处理,并发送正确应答。


6、用户函数接口

AHMI_READ(USHORT usRegAddr,USHORT usNReg)

功能说明:请求外部通信对象发送数据

参数说明: usRegAddr:寄存器起始地址; usNReg:寄存器数目

AHMI_WRITE(USHORT usRegAddr , USHORT usNReg , u32* pusDataBuffer)

功能说明:将自身数据传送给外部通信对象

参数说明: usRegAddr:寄存器起始地址; usNReg:寄存器数目; pusDataBuffer:数据缓存指针

AHMIPoll()

功能说明:状态机函数,需要定时运行。

参数说明:无

AHMIInit(UCHAR ucPort , ULONG ulBaudRate , eMBParity eParity)

功能说明:通信串口初始化

参数说明: usPort:串口编号; ulBaudRate:串口波特率; eParity:串口校验方式