一种应用于工业控制系统的数据缓存处理机制
技术领域
本发明涉及一种数据缓存机制,更具体的说涉及一种应用于工业控制系统的数据缓存处理机制。
背景技术
PC机通过CAN总线可与总线上接入的各个模块之间进行通信,且它们之间只需要通过两根具有差分信号的电缆线即可完成通讯,由于在CAN协议里,报文的标志符不代表节点的地址,而是跟报文的内容相关,因此,当CAN总线上的一个节点发送数据时,它是以报文形式广播给网络中所有节点,而对每个节点来说,无论数据是否是发给自己的,都对其进行接收处理,即根据标志符(CAN ID)的值决定软件是否需要该报文,如果需要,就进行拷贝,如果不需要,报文将被丢弃。当PC机通过CAN总线同时发送多个命令时,子模块需对接收到的每一条命令执行相关电子机械部件的运动,而命令接收时间一般很短,因此,当同时接收到多个命令时,在处理这些数据的过程中可能由于存在延时或者不确定的情形,使得数据的产生与处理之间的速率不匹配,从而可能导致数据的丢失。
发明内容
本发明的目的在于克服现有技术的缺点,提供一种应用于工业控制系统的数据缓存处理机制,能够对工业控制系统实时产生的多条数据命令进行高速缓存,当处理这些数据的过程存在延时或者不确定情况时,能够暂时保存数据,解决数据的产生与处理之间的速率不匹配的问题,另外,当遇到运行中的不可预期事件和错误,甚至系统的停止和间断出现时,也能以最大程度保证数据的可靠、有效、不丢失,极大地提高了系统的容错性,并确保设备稳定有序的运行。
为达到上述目的,本发明通过以下的技术方案来实现:
一种应用于工业控制系统的数据缓存处理机制,包括工业控制系统的实时数据缓存步骤和工业控制系统的数据读取步骤,在工业控制系统的实时数据缓存步骤和工业控制系统的数据读取步骤中均采用内存数据库,所述内存数据库通过建立一缓存区来实现,所述缓存区的大小设置为2048个字节,能够满足PC机与子模块之间的命令缓存使用,并且设置写指针(WriteIndex)和读指针(ReadIndex),写指针表示接收到PC机发送过来的命令将从此位置开始存储,读指针表示接受到命令的子模块将要执行的命令的起始位置。
本发明技术方案的进一步限定为,围绕所述缓存区建立命令缓存方法(AddReceivedCanCmd)和命令读取方法(GetReceivedCmd),AddReceivedCanCmd方法用于将从CAN总线上接收到的命令添加到命令缓存区,GetReceivedCmd方法用于读取缓存区里的控制命令。
进一步地,当CAN总线接收到符合本模块ID的命令数据时,系统调用AddRecevedCanCmd方法,将接收到的命令添加到命令缓存区,所述命令添加到缓存区包括命令数据长度的写入和命令数据内容的写入步骤,具体步骤内容为:
(1)获取缓存区当前的写指针和读指针的位置;
(2)比较命令缓存区中写指针和读指针的大小,计算缓存区当前空闲空间FreeCnt大小,由于缓存区中被执行过的命令可以被新接收的的命令数据覆盖,通过两者相对位置的判断,可以得知缓存区当前空闲空间。
(3)判断缓存区当前空闲空间大小是否可容纳当前需要写入的命令数据,如果FreeCnt<Len,说明此时接收到的新命令长度大于缓存区当前空闲空间大小,则返回步骤1(即发送错误信息给上位机检查确认没有错误之后,执行步骤4;若确认存在错误,则通过ErrorCode记录该错误),否则,直接执行步骤4,其中,FreeCnt为缓存区当前空闲空间大小,Len为将要加入到缓存区的新命令长度。
(4)获取指针WriteIndex所指向的地址值,将此地址值加一,并将所接收到的命令数据的长度写入该地址,然后紧跟在后面写入命令数据内容。
(5)判断尾指针到缓存区的末尾是否够数据长度,如果写入数据的过程中到达了缓存区域末尾,之后将剩余待写入数据从缓存区起始端写入,最新的WriteIndex将指向新命令的末尾地址,并在数据末尾增加结束符,最终WriteIndex指针将指向此结束符。
所述工业控制系统在进行数据读取时,调用GetReceivedCmd方法,具体步骤内容为:
(1)获取缓存区当前的写指针和读指针的位置;
(2)如果*Len>0&&DstSize>=*Len,说明读指针未到达接收到的缓存命令数据的末尾,且目标复制区域的存储空间大于将要读取的命令长度,则执行步骤3,否则,执行步骤4,其中,*Len为所要读取的有效数据长度,DstSize为目标复制区域的数据的最大长度;
(3)将缓存区新增的命令依次提取复制到目标复制区域,如果读指针到达缓存区间末尾,则将读指针移到缓存区间的起始位置。
(4)如果读指针已到接收到的达缓存命令数据的末尾,则说明没有接收到新的命令数据需要读取,程序将返回false值,如果所要读取的命令长度已超出目标复制区域的长度,同样程序将返回false值,其中,false值表示从缓冲队列取出数据失败。
附图说明
图1为本发明所述的工业控制系统的实时数据缓存步骤的流程示意图。
图2为本发明所述的工业控制系统的实时数据读取步骤的流程示意图。
具体实施方式
为详细说明本发明的技术特征和所实现的目的和效果,以下结合附图做进一步的描述:
如图1-2所示,一种应用于工业控制系统的数据缓存处理机制,包括工业控制系统的实时数据缓存步骤和工业控制系统的数据读取步骤,在工业控制系统的实时数据缓存步骤和工业控制系统的数据读取步骤中均采用内存数据库,所述内存数据库通过建立一缓存区来实现,所述缓存区的大小设置为2048个字节,能够满足PC机与子模块之间的命令缓存使用,并且设置写指针(WriteIndex)和读指针(ReadIndex),写指针表示接收到PC机发送过来的命令将从此位置开始存储,读指针表示接受到命令的子模块将要执行的命令的起始位置:
#define MAX_REC_BUFF_SIZE 2048
typedef struct_REC_BUFF
{
unsigned char Buff[MAX_REC_BUFF_SIZE];
u16WriteIndex;
u16ReadIndex;
}
RecvBuff,*pRecvBuff,SendBuff;
本发明技术方案的进一步限定为,围绕所述缓存区建立命令缓存方法(AddReceivedCanCmd)和命令读取方法(GetReceivedCmd),AddReceivedCanCmd方法用于将从CAN总线上接收到的命令添加到命令缓存区,GetReceivedCmd方法用于读取缓存区里的控制命令。
进一步地,当CAN总线接收到符合本模块ID的命令数据时,系统调用AddRecevedCanCmd方法,将接收到的命令添加到命令缓存区,所述命令添加到缓存区包括命令数据长度的写入和命令数据内容的写入步骤,具体步骤内容为:
(1)获取缓存区当前的写指针和读指针的位置;
(2)比较命令缓存区中写指针和读指针的大小,计算缓存区当前空闲空间FreeCnt大小,由于缓存区中被执行过的命令可以被新接收的的命令数据覆盖,通过两者相对位置的判断,可以得知缓存区当前空闲空间:
(3)判断缓存区当前空闲空间大小是否可容纳当前需要写入的命令数据,如果FreeCnt<Len,说明此时接收到的新命令长度大于缓存区当前空闲空间大小,则返回步骤1(即发送错误信息给上位机检查确认没有错误之后,执行步骤4;若确认存在错误,则通过ErrorCode记录该错误),否则,直接执行步骤4,其中,FreeCnt为缓存区当前空闲空间大小,Len为将要加入到缓存区的新命令长度:
(4)获取指针WriteIndex所指向的地址值,将此地址值加一,并将所接收到的命令数据的长度写入该地址,然后紧跟在后面写入命令数据内容:
Index=pBuff->WriteIndex;
pBuff->Buff[Index++]=Len;
(5)判断尾指针到缓存区的末尾是否够数据长度,如果写入数据的过程中到达了缓存区域末尾,之后将剩余待写入数据从缓存区起始端写入,最新的WriteIndex将指向新命令的末尾地址,并在数据末尾增加结束符,最终WriteIndex指针将指向此结束符:
所述工业控制系统在进行数据读取时,调用GetReceivedCmd方法,具体步骤内容为:
(1)获取缓存区当前的写指针和读指针的位置;
(2)如果*Len>0&&DstSize>=*Len,说明读指针未到达接收到的缓存命令数据的末尾,且目标复制区域的存储空间大于将要读取的命令长度,则执行步骤3,否则,执行步骤4,其中,*Len为所要读取的有效数据长度,DstSize为目标复制区域的数据的最大长度;
(3)将缓存区新增的命令依次提取复制到目标复制区域,如果读指针到达缓存区间末尾,则将读指针移到缓存区间的起始位置:
其中,pBuff为存放缓冲数据帧数组,pDstBuff为取出最后要发送的一帧数据,将pBuff中存放的缓存数据复制到pDstBuff中;
(4)如果读指针已到接收到的达缓存命令数据的末尾,则说明没有接收到新的命令数据需要读取,程序将返回false值,如果所要读取的命令长度已超出目标复制区域的长度,同样程序将返回false值,其中,false值表示从缓冲队列取出数据失败。
以下为本发明所述的工业控制系统的数据缓存处理机制的具体工作方法程序:
(1)定义缓存区:
#define MAX_REC_BUFF_SIZE 2048//定义最大的CAN接收/发送缓冲区
typedef struct_REC_BUFF
{
unsigned char Buff[MAX_REC_BUFF_SIZE];/*前面标识有效长度,后面紧跟数据*/
u16WriteIndex;//0起始
u16ReadIndex;//0起始
}
RecvBuff,*pRecvBuff,SendBuff;
(2)建立命令缓存方法AddReceivedCanCmd,将CAN接收的数据写入队列,其中,*Cmd为接收到的数据帧,Len为接收到的数据的有效长度,pBuff为存储数据帧的数组,返回值TURE表示为数据写入队列成功,FLASE表示为数据溢出队列,写入队列失败:
(3)建立命令读取方法GetReceivedCmd,判断是否从队列取得数据帧及读取数据,其中,*Len为有效数据长度,pBuff为存放缓冲数据帧数组,*pDstBuff为取出最后要发送的一帧数据,DstSize为数据的最大长度,返回值TURE表示为成功从缓冲队列中取出数据,FLASE表示为从缓冲队列取出数据失败:
与现有技术相比,本发明提供的一种应用于工业控制系统的数据缓存处理机制,其有益效果是:
能够对工业控制系统实时产生的多条数据命令进行高速缓存,当处理这些数据的过程存在延时或者不确定情况时,能够暂时保存数据,解决数据的产生与处理之间的速率不匹配的问题,另外,当遇到运行中的不可预期事件和错误,甚至系统的停止和间断出现时,也能以最大程度保证数据的可靠、有效、不丢失,极大地提高了系统的容错性,并确保设备稳定有序的运行。
上述实施例和说明书中描述的只是本发明的原理、主要特征及优点,对于本行业的普通技术人员来说,在不脱离本发明构思和范围的前提下,还可以做出各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。因此,本发明的专利的保护范围应以所附权利要求为准。