基于MVB 与以太网冗余通信的司机显示单元数据同步设计
2022-09-07饶天贵
饶天贵,王 雨,张 义
(株洲中车时代电气股份有限公司,湖南 株洲 412001)
0 引言
当前机车网络通信多采用多功能车辆总线(multifunction vehicle bus,MVB)与以太网冗余设计模式[1‐4],在整车控制网络中,网络控制模块与输入输出单元、司机显示单元(driver display unit,DDU)及事件记录单元等均采用MVB 与以太网冗余连接。任意时刻,在MVB与以太网中传送的数据均保持一致。一旦有网络通信线路发生故障,可进行通信线路自动切换。
动力集中列车中,网络控制系统中两个司机显示单元的软硬件完全一致,差别仅在于默认显示主界面不同,因此两个显示单元在网络控制系统中的地位完全一样。行车过程中,一个显示单元被默认为牵引显示,其主界面显示牵引状态数据;另一显示单元被默认为制动显示,其主界面显示制动状态数据。因为两个司机显示单元完全冗余,所以要求两个显示单元任意时刻发送给网络控制单元的数据(包括脉冲信号、电平信号)完全一致。因此,司机在任一显示单元中进行数据设置操作后,该显示单元利用现有的通信方式通知另一显示单元进行数据同步,从而保证两显示单元数据时刻保持一致。
由于MVB 与以太网通信采用冗余设计且数据发送时存在各类繁杂要求(如各类型脉冲信号、电平信号数据交换),这增加了两司机显示单元数据同步发送的复杂性。由于设计方法采用MVB与以太网数据独立处理的方式,且目前同步处理方法不完善,导致经常出现以太网数据解析处理错误及脉冲信号同步成电平信号的情况。为此,本文提出一种新的MVB与以太网数据通信冗余设计方法(包括数据的接收与发送的冗余处理),其将MVB与以太网数据进行归一化处理,有效防范数据解析错误;同时提出在数据发送时针对脉冲与电平信号采用不同的处理方法,以实现数据同步,该处理方法降低了数据同步难度,提升了数据同步的正确率。
1 MVB与以太网数据冗余处理
1.1 原设计方法
MVB 数据交换与以太网数据交换是各自独立处理的。MVB通信直接调用底层封装函数实现数据交换,整个过程较为简单。以太网数据处理方法如图1所示。在获取以太网数据后,根据协议定义数据在以太网数组中的偏移结构体,然后根据具体偏移进行数据解析。既往机车整车控制网络中,由于没有建立MVB端口与以太网数据的一一映射关系,所以经常会出现偏移计算错误的情况。
图1 以太网数据独立处理方法Fig. 1 Independent processing method of Ethernet data
1.2 新设计方法
新的通信系统冗余设计方法,保证了MVB 与以太网中传输的数据完全一致。MVB 通信采用端口形式进行定义,端口根据其配置的F_CODE 值决定存储区域大小。F_CODE 值一般配置为4,一个端口号对应一个32 字节的存储区域。在数据接收和发送时,只须知道当前数据变量所在的端口号及其在32 字节中的偏移(字节变量采用字节偏移、位变量需采用字节偏移与在该字节中的位偏移),便可访问该变量。
以太网通信数据的接收与发送一般采用char型数组,并且一帧包含多个端口数据。建立端口与以太网通信数据的一一映射(图2)后,只需将MVB通信函数重载,就可保证以太网数据的接收与发送方式与MVB的完全相同,从而防止以太网数据解析因烦琐而产生错误。在函数调用时,只存在端口号的差异,其他参数(如偏移)则完全一样,这样可有效防止因以太网数据获取方式与MVB 的不一致而导致的错误,也可为后续MVB与以太网数据同步做好前期预处理。
图2 以太网与MVB 数据映射关系图Fig. 2 Mapping diagram of Ethernet data and MVB data
将以太网接收的数据直接拷贝到对应以太网映射端口数组指针所指向的地址中去,即可建立以太网与MVB 的数据映射关系,其示例代码如图3 所示。
图3 映射建立的示例代码Fig. 3 Sample code by map building
建立映射关系之后,MVB通信与以太网通信采用的通信函数示例如下:
(1)MVB通信函数,包括字节获取函数和字节写入函数。
get_uchar(int port_num,int ofs_byte)//字节获取函数,其中,port_num为端口号,ofs_byte为变量在32字节中的偏移。
put_uchar(int port_num,int ofs_byte,unsigned char value)//字节写入函数,其中,port_num 为端口号,ofs_byte 为变量在32 字节中的偏移,value 为写入的数值。
(2)以太网通信函数,包括字节获取函数和字节写入函数。
get_uchar(char *rdp_port,int ofs_byte)//字 节 获取函数,其中,rdp_port 为端口映射指针,ofs_byte 为变量在32字节中的偏移。
put_uchar(char *rdp_port,int ofs_byte,unsigned char value)//字节写入函数,rdp_port 为端口映射指针,其中,ofs_byte 为变量在32 字节中的偏移,value为写入的数值。
为进一步优化MVB与以太网数据交换函数,在通信冗余时,根据网络通信优先信号进行数据选择,对MVB函数与以太网函数进一步封装。将以太网映射端口与MVB 端口用结构体数组存储,并采用宏定义为MVB与以太网的映射端口建立唯一的宏索引(图4)。因此,传递端口信息只传递其宏索引,不必考虑当前的通信方式,也无须同时调用MVB与以太网数据交换函数,使函数调用更加简便。
图4 端口映射与宏索引的对应关系Fig. 4 Correspondence between port mapping and macro index
端口索引配置数组结构信息如下:
配置宏索引的数据交换函数示例如下:
(1)getUchar(int index,int ofs_byte,int commType)//字节获取函数,其中,index为端口索引序号,ofs_byte为变量在32 字节中的偏移,commType 为通信冗余筛选信号(MVB或以太网)。
(2)putUchar(int index,int ofs_byte,unsigned char value,int commType)//字节写入函数,index为端口索引序号,ofs_byte为变量在32字节中的偏移,commType 为通信冗余筛选信号(MVB或以太网)。
将MVB与以太网通信进行归一化处理,在进行数据交换时,所需解析或者发送的数据在以太网接收数组中的具体偏移只需参考MVB 协议,保持与MVB 通信一致即可。
新的设计方法在函数内部通过通信冗余筛选信号方式自动完成对当前信赖的通信方式的筛选(即当前是信赖MVB还是以太网数据),有效避免了由于以太网数据数组较大而出现偏移计算错误所导致的数据解析错误。在新项目的应用中,只需修改MVB与以太网映射关系所建立的部分代码,即可完成MVB与以太网的一一映射配置,而其他通信部分代码则无须更改即可直接重用,这样提升了开发效率。
2 脉冲信号、电平信号发送
2.1 原设计方法
原设计方法中,脉冲信号发送[5‐8]未进行统一处理。若发送脉冲信号,则定义该脉冲信号的周期计数变量,在该脉冲信号发送后(即在MVB对应位写入数据后)开始脉冲周期计数。当周期计数达到该脉冲信号的周期后,再在MVB 对应的位写入0,自此完成脉冲信号的发送。由于对每个脉冲信号均须被单独处理,因此,存在大量类似的代码编写工作,且无法直接兼容以太网通信条件下脉冲信号的发送。
2.2 新设计方法
当司机在司机显示单元设置数据后,所设置的数据将以脉冲或者电平形式发给网络控制单元。脉冲信号类型包括位脉冲、字节脉冲和字脉冲。由于脉冲信号可能存在脉冲宽度差异,为方便后续脉冲信号发送数据的同步处理,将脉冲信号进行统一管理,建立相应的脉冲发送结构数组,并为每个脉冲建立唯一的索引号。脉冲信号发送流程如图5所示。
图5 脉冲信号处理流程Fig. 5 Flow chart of pulse signal processing
脉冲结构信息如下:
脉冲信号发送时采用脉冲链表(图6)进行处理。每发送一个脉冲,在脉冲链表中加入该脉冲发送信号;一旦脉冲信号发送周期到期,则从脉冲队列中清除该脉冲信号。采用脉冲链表处理脉冲,可以实时获取本地脉冲信息,对脉冲信号进行统一管理。
图6 脉冲链表Fig. 6 Pulse linked list
脉冲链表关键函数如下:
电平信号发送比较简单,直接调用先前定义的putUchar等相关函数,即可完成数据的发送。
脉冲发送统一管理方式在后续项目中可以直接应用,对脉冲信号进行简单配置,无须重复编码,这样可节省开发工作量。
3 脉冲信号、电平信号发送同步
3.1 原设计方法
原设计方法中[8‐14],由于MVB与以太网数据交换未采用归一化处理,将MVB与以太网数据同步进行独立处理,并采用不同的处理方法,这增加了问题的复杂性。在数据同步时,原设计未将脉冲信号与电平信号同步分开处理,导致每次数据发送均须执行一次同步操作,读取对方端口所有信息,然后将读取到的数据同步发送出去。由于端口所有数据是统一进行处理的,因此无法处理周期变化的脉冲信号发送。另外,当有脉冲信号发送时,若再发送其他脉冲信号,则须等待直至前面脉冲信号发送结束,无法连续发送脉冲信号。若两个显示单元不断读取对方的发送数据,程序则会陷入死循环,造成自身无法正常进行数据发送,也无法区分脉冲信号与电平信号。可见,原设计方法无法满足当前应用场景的需求。
3.2 新设计方法
为有效处理数据发送信息同步问题,新设计方法采用主动触发方式。在两个显示单元分别配置信号同步端口,当本地有数据同步发送的需求时,通过该端口发送脉冲信号通知对方读取本显示单元信息,另一端收到信号后读取对方信息,完成数据发送,如图7 所示。同步方式改为通知方式,区分处理脉冲与电平信号同步,有效解决了同步死循环问题。
图7 数据同步示意Fig. 7 Schematic diagram of data synchronization
以DDU1 为例进行同步设计说明。假设DDU1 中的源端口分别为0x30,0x31,0x32(以下简称1、2、3 号源端口),在DDU1 中配置源端口0x33 作为同步信号发送端口,该端口的第1和第2个字节用于电平信息同步,后面30 个字节用于脉冲信号同步,每位对应一个脉冲发送标识,该标识与脉冲索引一一对应。同步端口信息结构如图8所示。
图8 同步端口信息结构Fig.8 Structure of synchronization port information
当DDU1 通过源端口0x30 发送常量数据时,在0x33端口的第1个字节发送脉冲信号1,通知DDU2此时DDU1中1号源端口存在电平信号需要同步。DDU2在收到此脉冲信号变化的检测后,算法逻辑如下:
(1)从DDU1读取1号源端口所有数据。
(2)根据脉冲配置信息,清除该端口中包含的所有脉冲信号,即脉冲对应位置清零。
(3)若DDU2 中与DDU1 对应的1 号源端口有脉冲信号正在发送(即在脉冲队列中存在脉冲信息),则将脉冲队列值填入DDU2中的该端口中。
(4)DDU2完成数据同步发送。
电平信号同步算法流程如图9所示。
图9 电平信号同步算法流程Fig. 9 Flow chart of level signal synchronization algorithm
若DDU1 发送脉冲索引为1 的脉冲,则在0x33端口bit 0 位发送脉冲信号,通知DDU2 此时DDU1发送了1 号脉冲,依次类推。此时DDU2 端算法逻辑如下:
(1)读取0x33 脉冲发送标志,检测脉冲发送标志位确定是否有脉冲信号发送。
(2)若检测到有脉冲信号发送,则根据脉冲标识与脉冲索引的对应关系在脉冲配置数组中获取脉冲信息,并根据脉冲的类型(位脉冲、字节脉冲、字脉冲)进行区分处理。
(3)若为位脉冲,则直接发送脉冲信息;若为字节脉冲或字脉冲,则根据脉冲配置信息,首先获取在DDU1 对应的脉冲信息发送源端口中发送的值,然后填入DDU2 的脉冲配置信息中,再将脉冲信息发送出去。
脉冲信号同步算法流程如图10所示。
图10 脉冲信号同步算法流程Fig.10 Pulse signal synchronization algorithm flow
4 结语
动力集中列车中,两司机显示单元数据同步发送时,常出现以太网数据解析错误及数据同步错误情况。对此,文章提出一种基于MVB与以太网冗余通信的司机显示单元数据同步设计方法。其将MVB与以太网通信进行归一化处理,针对现有的数据发送方法进行改进,适用于多种复杂的脉冲发送要求;同时,在改进数据交换的方法基础之上,实现了多司机显示单元的数据同步。该设计方法已于2022年初开始在动力集中双源项目中进行应用,完成了厂内及环铁的各种试验调试与验证;目前,采用该方法的司机显示单元已随车投入试运行。整个验证及试运行环节中,各功能模块无异常情况发生。结果表明,其有效地解决了网络系统中司机显示单元在MVB 与以太网冗余通信情况下的数据交互同步问题。
后续,该设计方法将被应用到其他具备类似应用场景的应用项目中,且无须重复编码,只进行简单配置即可。