首页 / 专利库 / 控制系统 / 信道选择器 / 一种基于工业喷码机控制系统的远程化实现方法

一种基于工业喷码机控制系统的远程化实现方法

阅读:648发布:2024-02-08

专利汇可以提供一种基于工业喷码机控制系统的远程化实现方法专利检索,专利查询,专利分析的服务。并且一种基于传统工业喷码机本地控制系统的远程化方法,包括如下步骤:本地控制设备 硬件 远程化,重新组成上、下位机的远端控制系统硬件组成结构;远程通信协议设计,添加通信信道协议栈模 块 ;传输数据的打包、解包协议设计,添加发送与接收协议栈模块;远端打包信息发送、接收程序设计,依托所设计的协议模块,补全控制数据与显示数据的I/O模块;本 发明 实现了远端操作工业喷码机,有效保护现场操作人员远离对人体有害的操作现场;同时,本发明基于传统的喷码 打印机 本地控制系统,成本低廉,实现简单;完成后的远端控制系统与原有本地控制系统方式、方法保持一致,无需对现场操作人员进行重新培训,且利于集中控制,进一步降低人 力 成本。,下面是一种基于工业喷码机控制系统的远程化实现方法专利的具体信息内容。

1.一种基于工业喷码机控制系统的远程化实现方法,其特征在于包括如下步骤:
(1)增加与本地下位机相同硬件结构的上位机,并使用通用串口连接上位机、下位机,两者保持通信信道连通;
(2)定制上位机中的功能模,其中包括:修改上位机控制信号输入模块和上位机显示信号输出模块,添加上位机控制信号协议栈模块和上位机通信协议栈模块;
(3)定制下位机中的功能模块包括:修改下位机显示模块,增添下位机控制信号协议栈模块和下位机通信协议栈模块;
所述步骤(2)中,首先,用户在上位机按下键盘,所得的键值信号传入上位机控制信号输入模块,上位机控制信号输入模块通过查找键值表,生成对应喷码机控制信号,然后再将所述喷码机控制信号重定向到上位机控制信号协议栈模块,为控制信号增添包头、包尾、属性和长度数据,完成打包过程,生成控制数据包;再将控制数据包传递给通信信道协议栈模块进行打包,生成符合串口通信协议的上行输出数据包;最后,上行输出数据包经由通信信道发送到下位机接收进程;上述流程为信号传输上行,即上位机至下位机路径的发送过程;
所述步骤(3)中,当下位机查询到上位机发送的上行输出数据包到来时,首先,将该数据包传入通信信道协议栈模块进行解包,还原成控制数据包;然后,将该数据包传入控制信号协议栈模块进行解包,根据包头、包尾来确定信号位置,根据属性、长度将数据还原成原喷码机控制信号;最后,该控制信号传递到下位机控制模块;下位机控制模块首先会根据控制信号调节喷码机的工作状态,同时还会发送显示信号到下位机显示模块;上述流程为信号传输上行,即上位机至下位机路径的接收过程;
信号传输上行流程实现了远端键盘操作喷码机的功能,并将对应信息显示到喷码机本地显示屏上,供需要时使用;
所述步骤(3)中,当下位机显示模块接收到显示信号时,首先,会根据显示信号的点阵信息在下位机即喷码机现场屏幕上显示对应信息;同时会将该显示信号转发到显示信号协议栈模块进行打包,为显示信号添加包头、包尾、字体或图形属性和信号长度信息,生成显示数据包;再将显示数据包传递给通信信道协议栈模块进行打包,生成符合串口协议的下行输出数据包;最后,经由通信信道发送到上位机接收进程;上述流程为信号传输下行即下位机至上位机路径的发送过程;
所述步骤(2)中,当上位机接收进程查询到下位机发送的下行输出数据包到来时,首先,将该数据包传入通信信道协议栈模块进行解包,还原成显示信号数据包;然后将该数据包传入显示信号协议栈模块进行解包,根据包头、尾来确定信号位置,根据图形属性选择ASCII码或图形库,根据长度来确定信号长度;最后将还原出的显示信号传给显示信号输出模块,根据信息内容在上位机LCD屏幕上绘制信息;上述流程为信号传输下行,即下位机至上位机路径的接收过程;
信号传输下行流程实现了对显示信号的回显,远端的操作人员能够观察到操作对应的显示信息,实现对远端喷码机显示信息的同屏传输,使远程控制变得完整。
2.根据权利要求1所述的基于工业喷码机控制系统的远程化实现方法,其特征在于:
所述上位机控制信号输入模块及上位机显示信号输出模块修改步骤如下:
(1)为完成控制信号的重定向,需完成上位机与喷码机的隔离,使之只与下位机通信,实现方法为将上位机控制信号输入模块中的寄存器设置相关语句注释;
(2)为将控制信号传输到协议栈进行打包进而与下位机通信,需将上述步骤(1)中的控制信号存储起来。实现方法为在主函数main中动态开辟堆栈区内存,利用ping pang buffer原理,将控制信号依次填入缓存区以供读取;
(3)与上位机控制信号相同,为完成上位机显示信号的重定向,将上位机显示信号输出模块的输入参数由控制信号函数输出的数据块头指针,改为经过协议栈解包函数处理后所得的显示信号数据块头指针。
3.根据权利要求1所述的基于工业喷码机控制系统的远程化实现方法,其特征在于:
所述下位机显示模块的修改方法为:在下位机主函数main中开辟新的堆区,在显示信号输出函数中增加将显示信号存入堆区的拷贝操作。
4.根据权利要求1所述的基于工业喷码机控制系统的远程化实现方法,其特征在于:
所述添加上位机控制信号协议栈与下位机控制信号协议栈模块,即各信号协议栈模块的添加步骤为:
(1)协议打包流程为:
依照传输协议设计为原有信号增添冗余位,其协议的基本格式如下:
Header:包头,占用两个字节,是连续两个无符号整型数据Header1、Header2;Type:包类型,占用一个字节,是一个字节的无符号整型数据,每一个函数都分配了一个标识代码,为该函数设计的数据包中,Type域中就保存着这个标识代码;Length:包长度,占用两个字节,是一个短整型数据的两个字节,包长度是指以字节为单位的包的数据部分的长度,即包的长度不包括Header、Type、Length、Tail部分占用的字节;Data:包的数据部分,即协议栈打包前接收到的原始控制、显示信号的有用信息;Tail:包尾,占用两个字节,是连续两个无符号整型Tail1、Tail2;
其中Header、Type、Length三个数据段顺序连接到Data数据段前,Tail连接到Data数据段尾部,按照上述格式,处理每一个输入的信号完成打包;
(2)协议解包流程为:
(21)得到当前数据包,即将全局当前缓存块首地址指向包头首地址;
(22)从包头首地址开始,向后遍历两个字节,同时移动缓存指针指向数据包下一个字节;
(23)读取当前字节即第3个字节,即Type字节,判断本数据包类型,根据不同的case选择不同的处理分支,再依据不同的分支,调用相关信息数据包协议处理函数;
(24)最后,回到主流程,并将协议处理函数得到的原信号内存首地址作为协议栈解包函数的返回值返回。
5.根据权利要求1所述的基于工业喷码机控制系统的远程化实现方法,其特征在于:
所述上位机通信协议栈模块的添加步骤为:
(1)使能串口硬件与定时器Timer中断:设置芯片标准输入输出接口PIO的串口UART管脚使能,启动一个Timer,并打开定时器中断;
(2)开辟信号缓存空间:在通信主程序的堆区中增添2个环形缓存队列,分别编号为1、
2,其中,每一个队列list的首地址固定,每块缓存buffer的大小为信号最长值以1024为基底圆整后的大小;
(3)中断接收主函数流程:将前述1、2号缓存队列地址分别提供给DMA的2个通道,等待接收数据;然后,设置相关寄存器,打开DMA中断,最终,main进入无限循环等待中断信号;
(4)中断处理函数流程:利用中断处理函数将UART与Timer的中断当作ping pong buffer的两个计数器,当接收到定时器Timer中断时,对队列List1的当前缓存块buffer内容进行查询,如果无数据,返回无限循环;如果有数据则将当前buffer的内容使用完,即发送到对端,同时将当前buffer指针指向下一个备用buffer,此时使用完的buffer则还原为备用buffer,实现了一次操作;同理,当接收到UART中断时,对队列List2的当前缓存块buffer内容进行查询,如果无数据,则返回无限循环;如果有数据,则将当前buffer使用完,即发送到对端,同时将当前buffer指针指向下一个备用buffer,此时使用完的buffer则还原为备用buffer,实现一次操作,由于使用环形队列,在队列足够长的情况下,不会存在buffer不够用的情况。

说明书全文

一种基于工业喷码机控制系统的远程化实现方法

技术领域

[0001] 本发明涉及一种基于工业喷码机控制系统的远程化实现方法,属于工业控制技术领域。

背景技术

[0002] 喷码机是一种通过软件控制,使用非接触方式在产品上进行标识的设备。其原理是利用油墨带电偏转的方式将油墨偏移出正常的飞行路线,射向工作物的表面,利用给墨滴充电的电量控制每一个墨滴的位置,形成想要打印的资料。在工业上使用喷码机对产品进行标示,具有非接触、速度快、应用范围广和易编辑修改等优点。而随着标识技术在工业领域的逐步深入,喷码机在食品,饮料,建材,电线电缆,医药,化工,电子等众多行业都有广泛应用。
[0003] 喷码机在为工业标识领域带来便利的同时,也带来许多新的问题:首先,喷码机使用的墨大多含有基或酒精基成分,这些化学试剂都是易燃易爆品,所以在使用过程当中,要注意防火;其次,喷码机墨水和溶剂都是有腐蚀性的,对现场工作人员的皮肤、眼和鼻等身体器官有害,长期在该环境中工作,影响身体健康;最后,由于喷码机采用静电偏转原理来控制墨滴,因此要注意现场的静电防护。
[0004] 在传统的工厂环境中,要么没有重视以上问题,要么采取对现场人员进行安全培训的方式。人成本高,且无法有效消除隐患,容易为工厂带来损失。采取远端操作,减少甚至实现消除人与喷码机工作环境的交互,即保护了工作人员的身体健康,又排除了由于人为因素导致的不安全隐患,是一种行之有效的解决方案。但更换现有传统喷码机为远端操作类喷码机成本过高,不符合企业盈利目的。并且,远端操作的方法不统一,不具有普适性,难以大范围推广。

发明内容

[0005] 本发明技术解决问题:克服现有技术的不足,本发明提供一种基于工业喷码机控制系统的远程化方法,在实现远端控制喷码机功能的同时,具有成本低廉、实现简单、控制集中且利于工作人员身体健康等优点。
[0006] 本发明技术解决方案:一种基于工业喷码机控制系统的远程化方法,包括如下步骤:
[0007] (1)增加与本地下位机相同硬件结构的上位机,并将上、下位机相连;
[0008] (2)定制上位机中的功能模,其中包括:修改上位机控制信号输入模块和上位机显示信号输出模块,添加上位机控制信号协议栈和上位机通信协议栈模块;
[0009] (3)定制下位机中的功能模块包括:修改下位机显示模块,增添下位机控制信号协议栈模块和下位机通信协议栈模块;
[0010] 优选地,所述步骤(1)中,使用通用串口连接上、下位机器,保持通信信道连通;
[0011] 优选地,所述步骤(2)中,首先,用户在上位机按下键盘,所得的键值信号传入控制信号输入模块,通过查找键值表,生成对应喷码机控制信号。然后,将该信号重定向到控制信号协议栈模块,为控制信号增添包头、包尾、属性和长度等数据,完成打包过程,生成控制数据包。再将控制数据包传递给通信信道协议栈模块进行打包,生成符合串口通信协议的上行输出数据包。最后,上行输出数据包经由通信信道发送到下位机接收进程。上述流程为信号传输上行(上位机至下位机路径)的发送过程。
[0012] 优选地,所述步骤(3)中,当下位机查询到上位机发送的上行输出数据包到来时,首先,将该数据包传入通信信道协议栈模块进行解包,还原成控制数据包。然后,将该数据包传入控制信号协议栈模块进行解包,根据包头、包尾确定信号位置,根据属性、长度将数据还原成原喷码机控制信号。最后,该控制信号传递到下位机控制模块。该模块首先会根据控制信号调节喷码机的工作状态;同时,控制模块会发送显示信号到下位机显示模块。上述流程为信号传输上行(上位机至下位机路径)的接收过程。
[0013] 信号传输上行流程实现了远端键盘操作喷码机的功能,并将对应信息显示到喷码机本地显示屏上,供需要时使用。
[0014] 优选地,所述步骤(3)中,当下位机显示模块接收到显示信号时,首先,会根据显示信号的点阵信息在下位机(喷码机现场)屏幕上显示对应信息。同时,会将该显示信号转发到显示信号协议栈模块进行打包,为显示信号添加包头、包尾、字体或图形属性和信号长度等信息,生成显示数据包。再将显示数据包传递给通信信道协议栈模块进行打包,生成符合串口协议的下行输出数据包。最后,经由通信信道发送到上位机接收进程。上述流程为信号传输下行(下位机至上位机路径)的发送过程。
[0015] 优选地,所述步骤(2)中,当上位机接收进程查询到下位机发送的下行输出数据包到来时,首先,将该数据包传入通信信道协议栈模块进行解包,还原成显示信号数据包。然后将该数据包传入显示信号协议栈模块进行解包,根据包头、尾来确定信号位置,根据图形属性选择ASCII码或图形库,根据长度来确定信号长度。最后将还原出的显示信号传给显示信号输出模块,根据信息内容在上位机LCD屏幕上绘制信息。上述流程为信号传输下行(下位机至上位机路径)的接收过程。
[0016] 信号传输下行流程实现了对显示信号的回显,使得远端的操作人员可观察到操作对应的显示信息,实现对远端喷码机显示信息的同屏传输,使远程控制变得完整。
[0017] 所述上位机控制信号输入模块及显示信号输出模块修改步骤如下:
[0018] (1)为完成控制信号的重定向,需完成上位机与喷码机的隔离,使之只与下位机通信。实现方法为将上位机控制信号输入模块中的寄存器设置相关语句注释;
[0019] (2)为将控制信号传输到协议栈进行打包进而与下位机通信,需将上述步骤(1)中的控制信号存储起来。实现方法为在main函数中动态开辟堆栈区内存,利用ping pang buffer原理,将控制信号依次填入缓存区以供读取;
[0020] (3)与上位机控制信号相同,为完成上位机显示信号的重定向,将上位机显示信号输出模块的输入参数由控制信号函数输出的数据块头指针,改为经过协议栈解包函数处理后所得的显示信号数据块头指针。
[0021] 所述下位机显示模块的修改方法为:在下位机main函数中开辟新的堆区,在显示信号输出函数中增加将显示信号存入堆区的拷贝操作。
[0022] 所述各信号协议栈的添加步骤为:
[0023] (1)协议栈打包流程即为依据设计添加冗余位。根据传输要求进行协议设计,其协议的基本格式如下:
[0024] (11)Header:包头,占用两个字节,是连续两个无符号整型数据Header1、Header2,本实施例中Header1=0xEB,Header2=0x90;
[0025] (12)Type:包类型,占用一个字节,是一个字节的无符号整型数据,每一个函数都分配了一个标识代码,为该函数设计的数据包中,Type域中就保存着这个标识代码;
[0026] (13)Length:包长度,占用两个字节,是一个短整型数据的两个字节,包长度是指以字节为单位的包的数据部分的长度,即包的长度不包括Header、Type、Length、Tail等部分占用的字节;
[0027] (14)Data:包的数据部分,即协议栈打包前接收到的原始控制、显示信号的有用信息;
[0028] (15)Tail:包尾,占用两个字节,是连续两个无符号整型Tail1、Tail2。
[0029] 其中Header、Type、Length三个数据段顺序连接到Data数据段前,Tail连接到Data数据段尾部,按照上述格式,处理每一个输入的信号完成打包。
[0030] (2)协议解包流程为:
[0031] (21)得到当前数据包,即将全局当前缓存块首地址指向包头首地址;
[0032] (22)从包头首地址开始,向后遍历两个字节,同时移动缓存指针指向数据包下一个字节;
[0033] (23)读取当前字节(第3个字节),即Type字节,判断本数据包类型,根据不同的case,如ASCII、汉字点阵、蜂鸣器数据包等选择不同的处理分支,再依据不同的分支,调用相关信息数据包协议处理函数;
[0034] (24)最后,回到主流程,并将协议处理函数得到的原信号内存首地址作为协议栈解包函数的返回值返回。
[0035] 所述通信协议栈模块的添加步骤为:
[0036] (1)使能串口硬件与Timer中断:设置芯片PIO的UART管脚使能。启动一个定时器Timer,并打开定时器中断;
[0037] (2)开辟信号缓存空间:在通信主程序的堆区中增添2个环形缓存队列,分别编号为1、2。其中,每一个list的地址固定,每块buffer的大小为信号最长值圆整后的大小(以1024为圆整基准);
[0038] (3)中断接收主函数流程:将前述1、2号缓存队列地址分别提供给DMA的2个通道,等待接收数据。然后,设置相关寄存器,打开DMA中断。最终,main进入无限循环等待中断信号;
[0039] (4)中断处理函数流程:利用中断处理函数将UART与Timer的中断当作ping pongbuffer的两个计数器。当接收到Timer中断时,对List1的当前buffer内容进行查询,如果无数据,返回无限循环;如果有数据则将当前buffer的内容使用完(发送到对端),同时将当前buffer指针指向下一个备用buffer,此时使用完的buffer则还原为备用buffer,实现了一次操作;同理,当接收到UART中断时,对List2的当前buffer内容进行查询,如果无数据,则返回无限循环;如果有数据,则将当前buffer使用完(发送到对端),同时将当前buffer指针指向下一个备用buffer,此时使用完的buffer则还原为备用buffer,实现一次操作。由于使用环形队列,在队列足够长的情况下,不会存在buffer不够用的情况。
[0040] 本发明与现有技术相比的优点在于:本发明实现了远端操作人员对现场喷码机稳定控制、实时显示,并可以完全替代相关操作人员的现场工作;实现控制端与喷码机的隔离,保证了现场操作人员的人身安全,并降低了人力成本;实现了对原有传统喷码机控制系统的二次开发,厂商不需要对喷码机的软、硬件做出摒弃,只需添加与下位机相同的一套嵌入式控制系统,并对输入输出进行重定向即可完成控制系统的远端化,节约了生产成本,并且实现简单;更新的远端控制系统,其操作模式与显示方式与原有本地控制系统完全一致,对原工作人员而言,上手简单,进一步降低人力成本;该喷码机远端控制系统的控制端可以实现一对多模式,有利于机器的集中控制。附图说明
[0041] 图1是现有技术的组成框图
[0042] 图2是本发明系统的组成框图;
[0043] 图3是本发明一种实施例的上位机键盘处理函数流程图
[0044] 图4是本发明一种实施例的上位机GUI显示函数流程图;
[0045] 图5是本发明一种实施例的串口通信源程序流程图;
[0046] 图6是本发明一种实施例中各个缓存块及其指针的结构示意图;
[0047] 图7a是本发明一种实施例的segusage数组存储结构及内容示意图;
[0048] 图7b是本发明一种实施例的segusage数组存储结构内部使用示意图;
[0049] 图8是本发明设计的基础通信协议结构图;
[0050] 图9是本发明设计的发送端流程图;
[0051] 图10是本发明设计的上位机接收端处理流程图;
[0052] 图11是本发明设计的包检测过程流程图;
[0053] 图12是本发明设计的包处理过程流程图;
[0054] 图13是本发明设计的具体协议结构框图;
[0055] 图14是本发明一种实施例的下位机串口数据解析函数流程图;
[0056] 图15是本发明一种实施例的下位机显示控制函数流程图;
[0057] 图16是本发明设计的下位机接收端处理流程图。

具体实施方式

[0058] 如图2所示,本发明实现基于工业喷码机的远端控制方法是:添加与下位机相同的上位机硬件,根据需要选择远程控制线路;将接口通信协议分别移植到上、下位机,并保持下位机程序上层接口不变;根据设计的数据包协议与数据传输、接收程序流程实现双端的发送、接收程序。
[0059] 以下将结合附图,对本发明的具体实施例作进一步详细说明。
[0060] 在嵌入式控制系统中,其主芯片都能支持通用的接口芯片扩展。因此在本实施例中,硬件均采用CPU主板加外设母板的结构,远程通信信道介质则选择最常用的串口通信;而软件分别以喷码机控制源程序与调试串口源程序作为基础,进行修改、移植。
[0061] 为了更清晰地阐明本发明的具体实施方法,在此给出该方法所采用的软件环境,如下表所示:
[0062]
[0063]
[0064] 传统工业喷码机的控制系统结构如图1所示,分为控制输入模块,控制模块,显示模块与显示输出模块。本地控制信号输入模块接收从键盘上传输过来的Key值,对其进行解析后将控制信号输入到控制模块。控制模块对该信号进行处理,产生响应的喷码机动作;同时,将控制信号传输到显示模块进行处理。显示模块生成显示信号,作为显示信号输出模块的输入,经过该模块解析后,产生响应的点阵信息,显示在液晶屏上。
[0065] 基于传统工业喷码机的远端控制系统结构如图2所示,对传统的控制系统进行远程化修改。在硬件方面,添加完全一致的嵌入式硬件作为远端控制的上位机,原控制系统作为下位机,上、下位机使用串口相连;在软件方面将I/O与控制分别放置于上、下位机,最终上位机包含控制信号输入模块,控制信号协议栈,通信信道协议栈,显示信号协议栈与显示信号输出模块五部分。下位机包含控制模块,控制信号协议栈,通信信道协议栈,显示信号协议栈与显示模块五部分。
[0066] 本发明在传统控制系统的基础上,分别在硬、软件两方面进行远程化修改。在硬件上,为原有的本地嵌入式系统增加外设母板,组成新的控制系统,并在远端增加相同的嵌入式系统,实现了键盘、LCD屏幕的远程化;在软件部分,主要修改与硬件相关的部分,实现一个重定向过程。对上位机而言,将LCD信息的来源重定向到串口,并将键盘的输出方向重定向为串口;对下位机而言,将生成的LCD信息重定向到串口,并将键盘的输入来源重定向为串口。同时,为保证远程通信的安全性与实时性,在上、下位机增添对应的信息处理协议栈,完成对原始信号的打包、解包。
[0067] 步骤一:增加硬件模块,选择数据通路。
[0068] 在本实施例中选择串口通信作为数据通路,有利于系统的快速开发和方法的迅速理解。喷码机硬件(下位机)和上位机的外设母板完全相同,两者的CPU主板均采用某种Atmel的AT91SAM7SE32/256/512系列的ARM7芯片,上述系列芯片的外设接口兼容,只是内部Flash的大小不同。由于下位机和上位机的外设相同,两者的串口资源和电路连接方式也相同,因此以下位机为例说明其串口硬件。
[0069] AT91SAM7SE系列芯片共有3个串口,分别是Debug Unit(简称DBGU)的UART单元,USART0以及USART1。Debug Unit的UART单元为异步串口,使用芯片I/O口的PA9,PA10管脚,USART0和USART1为同步/异步串口,占用PA5-8、PA21-28等管脚。
[0070] 下位机硬件上只把DBGU的UART单元的PA9、PA10引出来,并通过MAX3232进行电平转换之后连接出来,USART0和USART1管脚并未引出到电路板上,因此只能使用DBGU的UART单元进行串口通信。DBGU同时也是程序调试信息的打印输出端口,即当程序中的printf语句打印调试信息时,上述信息将被重定向到DBGU的UART端口输出。
[0071] 由于串口通信过程中,需要对收发数据的正确性、时序等属性进行查看,上、下位机直连的方式不适用于软件系统的调试,因此采用上、下位机均与PC机相连的方式对传输数据包进行调试。在PC端使用串口调试工具进行接、发包,进而显示的对整个数据传输过程进行调试。
[0072] 步骤二:上位机功能模块定制
[0073] 1)上位机I/O模块修改:
[0074] 上位机I/O模块中的控制输入模块主要负责检测按键中断得到键值,并将键值打包下传,其主要工作即是对上位机源程序的键盘中断处理函数pioIntProc进行改写。
[0075] pioIntProc函数是上位机中处理键盘中断和其它两种中断的函数,只需要对其中与键盘中断有关的部分进行改写即可,在原函数读到键值的语句后面紧接着调用key2uart函数将键值打包发送给下位机,上位机键盘处理函数改写后的流程如图3所示,其中灰色部分为添加流程。
[0076] 上位机I/O模块中的显示信号输出模块主要负责将接收到的显示信号进行算法解析,之后依照点阵输出到LCD屏幕上。即上位机检测到下位机发来的LCD控制指令协议数据包后,调用协议处理函数进行处理。其主要工作是将GUI显示函数GUI_UART_LCDCommand的输入数据源进行重定向。函数根据接收到的数据包中第6字节的指令代码调用与之对应的LCD控制函数或者GUI控制函数。函数流程如图4所示。
[0077] 2)上位机串口通信协议模块添加:
[0078] 以一个串口例程“串口调试源程序”为基础进行移植,该程序的预期功能是实现板子上的物理串口和USB模拟的串口之间的互相通信,即将物理串口接收到的数据转发到USB模拟串口上,或反过来将USB模拟串口上接到的数据转发到物理串口上。利用该程序源码,将串口协议移植到上位机的功能软件中。由于上、下位机当前的软、硬件相同,并且对于串口的使用要求(发送、接受)也相同,因此只以上位机为例来分析串口协议的软件移植。
[0079] (1)串口调试源程序分析:
[0080] 首先对该源程序的串口通信方式进行分析,分析的重点是串口的接收部分。串口原程序的串口接收部分设定的接收缓存是只有两个缓存块的缓存区,而不是象本方法中将要使用的多缓存块的缓存区,无需全局指针g_curbuftop和g_curbupos,以及用于记录缓存块内部使用状况的数组。并且串口原程序的数据是以两种方式被主程序检测接收的,即同时使用了中断方式和轮询方式。其具体的接收流程如图5所示。
[0081] 源程序中与接收相关的函数为:
[0082] A.USART_ReadBuffer:
[0083] 设置USART0DMA的两个缓存,任何时候AT91C_BASE_US0->US_RPR是DMA的第一缓存,用于等待接收数据,而AT91C_BASE_US0->US_RNPR是DMA的第二缓存,当第一缓存被填满或虽未填满但已被主程序检测到有数据时,第二缓存自动替补为第一缓存,而原来的第一缓存将被主程序处理完后再做为第二缓存使用,实现了ping pong buffer的数据结构,可以保证接收到的数据不会丢失。
[0084] B.static void ISR_Timer0:
[0085] Timer0的中断响应函数。
[0086] C.static void ISR_Usart0:
[0087] USART0中断响应函数,与串口接收的中断是ENDRX(End of Receive Transfer Interrupt)中断,在程序中的定义为AT91C_US_ENDRX。
[0088] (2)基于现有硬件设计,修改串口源程序:
[0089] 分析源程序的运行流程后,基于现有的硬件设计,调整软件相关部分。串口原程序使用的是USART0串口,即PA5,PA6管脚,因此将串口源程序中有关USART0的语句替换为针对DBGU UART的语句。
[0090] 首先,完成串口初始化。包括串口占用的PIO口的设定、中断设置、启用发送/接收功能、波特率设置等。
[0091] (21)配置DBGU UART管脚,实现初始化:
[0092] 使用源文件pio.c包含的函数PIO_Configure配置DBGU UART管脚,函数定义如下:
[0093] unsigned char PIO_Configure(const Pin*list,unsigned int size)使用该函数是由于DBGU的UART管脚与通用的输入输出端口是复用的,因此通过相应的PIO控制器将其功能设定为DBGU UART管脚。
[0094] 第一个参数被赋值为PINS_DBGU,而定义为PINS_DBGU,其宏定义代码如下:
[0095] #define PINS_DBGU{0x00000600,AT91C_BASE_PIOA,AT91C_ID_PIOA,PIO_PERIPH_A,PIO_DEFAULT}
[0096] 其中0x00000600是DBGU UART所用到的两个管脚在PIO_PERIPH_A的32个通用输入输出管脚PA0-PA31中的对应位置,即PA9,PA10两个管脚。
[0097] (22)设置DBGU UART工作模式:
[0098] 设置DBGU模块的寄存器组设置DBGU的UART的模式、波特率等参数。在设置之前首先要关闭所有DBGU的中断,相关代码如下所示:
[0099] AT91C_BASE_DBGU->DBGU_IDR=0xFFFFFFFF;
[0100] 通过usart.c源文件包含的USART_DBGU_Configure函数设置DBGU的UART的模式、波特率等,函数定义如下:
[0101]
[0102] 由于USART_DBGU_Configure函数中关闭了UART的发射和接收功能,需要重新打开上述功能
[0103] 通过同文件内的USART_DBGU_SetTransmitterEnabled函数打开发射功能,通过同文件内的USART_DBGU_SetReceiverEnabled函数打开接收功能。
[0104] (23)设置DBGU的UART DMA缓存:
[0105] 本发明使用直接写寄存器的方式发送数据,因此串口发送实现简单。而接收部分采用DMA方式接收串口数据主程序通过轮询方式访问DMA中的数据,主程序为DMA提供的缓存是一组连续的相同大小的缓存块,利用AT91SAM7SE32/256/512系列ARM7芯片的PDC两组控制寄存器交替作用下,依次将组内各内存块地址提供给串口DMA通道使用,整个缓存区是循环使用的。
[0106] 串口接收允许不采用DMA方式,这时主程序持续检测串口状态,每次检测到串口上已成功接收到一个字符之后,将该字节读入接收缓存中。这种方式不需要采用DMA方式所用的分块缓存,只需要用一整块缓存存放接收到的字节即可,整个缓存区仍然需要循环使用。但由于主程序要进行LCD显示、键盘处理等操作,使用这种逐字节轮询的接收方式将占用大量CPU时间,更重要的是LCD显示、键盘处理等主程序的操作,可能会延误对串口的读取,由于这种方式下串口本身不缓存接收到的数据,如果有新的数据到达,旧的数据将被丢弃,这样就会造成数据的漏读,因此不能采用这种轮询读取的接收方式。
[0107] AT91SAM7SE系列芯片的UART DMA控制器,主要包括一个接收缓存地址寄存器(PDC Receive Pointer Register)PERIPH_RPR、一个Next接收缓存地址寄存器(PDC Receive Next Pointer Register)PERIPH_RNPR、一个接收计数器寄存器(PDC Receive Counter Register)PERIPH_RCR、一个Next接收计数器寄存器(PDC Receive Next Counter Register)PERIPH_RNCR。上述PERIPH_RPR、PERIPH_RNPR、PERIPH_RCR、PERIPH_RNCR是相应的寄存器在数据手册中的名称,PERIPH是一个变量,代表不同的外设的名称,例如对于DBGU的UART,上述寄存器的名称就应该为DBGU_RPR、DBGU_RNPR、DBGU_RCR、DBGU_RNCR,在编程中也遵循了上述命名规则。
[0108] 为配合DMA方式实现数据接收,本方法设计了一种由若干连续的相同大小的接收缓存块组成的接收缓存结构,为了描述上述各个缓存块的使用情况,定义了与本缓存结构相配合的缓存块使用情况记录结构:
[0109] a.整个缓存区用如下全局数组定义:
[0110] unsigned char rcvbuf[NUMSEGMENT][DATABUFFERSIZE];
[0111] 缓存区数组是一个二维数组,第一个下标代表缓存块的序号,第二个下标指向某个缓存块中的各个存储单元。
[0112] NUMSEGMENT:定义缓存区中缓存块的个数
[0113] DATABUFFERSIZE:定义每个缓存区的大小,以字节为单位
[0114] 整个缓存被分为三个部分,如图6所示,灰色部分是有效缓存区,阴影部分为DMA,当前使用的两个缓存块,而空白部分则为空缓存区,这三个区域的大小和位置均会随着接收到新的数据以及已接收数据被使用完而不断变化,三个缓存区都是在模NUMSEGMENT循环意义上连续的。
[0115] b.缓存区中各个缓存块的使用情况记录由如下全局数组定义:
[0116] int segusage[NUMSEGMENT][2];
[0117] NUMSEGMENT:定义缓存区中缓存块的个数segusage数组结构如图7a所示,该数组也是一个二维数组,是配合上述接收缓存结构相对应的,其中第一个下标代表缓存块的序号,第二个下标指向两个整数,用来表示某个缓存块的使用情况,第二个下标只有0和1,为了使用方便,分别用宏定义语句定义为SegmentBottom和SegmentTop:
[0118] #define SegmentTop1
[0119] #define SegmentBottom0
[0120] 如图7b所示某缓存块内部的使用情况描述,任意一个缓存块内部被分为三个部分,阴影部分为空闲区下段,灰色部分为数据区,而空白部分则为空闲区上段,其中任何一个或两个区域的大小有可能为零,但不会出现三者大小均为零的情况,三者大小之和总是等于缓存块的大小。图7b所示情况是缓存块中的数据都还没有被使用完,需要继续使用,因此没有空闲区下段。
[0121] c.接收缓存指针及接收缓存操作:
[0122] 访问上述缓存结构时的指针移动分为两个层次,第一个以缓存块为单位进行移动的块指针,另外一个是在任意缓存块内以字节为单位移动的块内指针。每个层次都有配套的全局变量表明内存的使用情况。
[0123] 块指针用两个全局整数变量来定义,其作用和工作原理如下所示:
[0124] g_curbuftop指向当前正在被使用的缓存区的最顶端的块的序号,当前正在被使用的缓存区由当前有效缓存区的缓存块和DMA当前正在使用的两个缓存块组成。其中当前有效缓存区是指被接收下来但还没有被处理完的数据所占用的那些缓存块。任何时候DMA都被分配了两个连续的缓存块,g_curbuftop总是指向DMA中两个缓存块中的第二个缓存块,DMA中的第一个缓存块的序号=(g_curbuftop-1+NUMSEGMENT)%NUMSEGMENT。g_curbuftop的移动有两种驱动方式,一种是中断方式,另外一种是轮询方式。
[0125] 在中断方式下,DMA通道的接收缓存块满中断被打开,当有新的数据进入到串口DMA缓存,导致DMA当前的两个缓存块中的第一个缓存块被填充满,这将引发一个中断,程序可以响应这个中断,将g_curbuftop移动指向序号更高的一个缓存块,即做如下更新:
[0126] <第一个缓存块的序号>=g_curbuftop
[0127] g_curbuftop=(g_curbuftop+1)%NUMSEGMENT
[0128] 这时刚才被填满的缓存块就被计入当前有效缓存区,而DMA中使用的两个缓存块则分别更新为序号比其更高的下一个缓存块。程序初始化阶段设g_curbuftop=2。
[0129] 在轮询方式下,DMA通道的接收缓存块满中断被关闭,主程序定时检测DMA中的第一个缓存块,如果检测到该缓存块中有数据,则无论这个缓存块是否被填满,都将g_curbuftop移动指向序号更高的一个缓存块,即做如下更新:
[0130] <第一个缓存块的序号>=g_curbuftop
[0131] g_curbuftop=(g_curbuftop+1)%NUMSEGMENT
[0132] 此时,刚被填满的缓存块就被计入当前有效缓存区,而DMA中使用的两个缓存块则分别更新为序号比其更高的下一个缓存块。
[0133] 上述两种方式也可以在一个程序中并存,即通过中断方式通知主程序一个DMA接收缓存块已满,从而将该缓存块挪到有效缓存区中;同时主程序也通过主动定时巡检的方式,检测DMA的接收缓存块,一旦检测到缓存块中有数据则将其挪到有效缓存区中。
[0134] g_curbufpos指向当前有效缓存区的最底端的块的序号,序号低于此块的内存块是空块,可以用于接收新的数据。如果g_curbufpos所指的内存块中的数据已经被使用完了,则这个缓存块将被请零并释放到空缓存区中,同时g_curbufpos指向有效缓存区中序号更高的下一块缓存。程序初始化阶段g_curbufpos=0。
[0135] 块序号高低关系:g_curbuftop和g_curbufpos都是模N循环移动的(前者随接收到新的数据而移动,而后者则是随缓存中数据被使用完导致相应数据块不再有用而移动),块序号的高低关系与序号整数的数值大小关系并不一定完全一致(因此用块序号高低以区别与块序号大小),不一致的情况开始出现在当g_curbuftop到达序号整数值最大的内存块即内存块N之后,又开始重复使用序号为0的内存块的时候,此时利用算法补齐该缓存区。
[0136] 块内指针是用来说明整个缓存中的各个缓存块的使用情况的,对缓存区中的任何一个缓存块,用两个整数表示其使用情况。假设缓存块的序号为nSegment,则该缓存区的使用情况分别用两个整数,即数组中的两个元素segusage[nSegment][SegmentTop]、segusage[nSegment][SegmentBottom]来 表 示,如 前 文 所 述,其 中SegmentTop 和SegmentBottom分别为两个宏定义,为了论述方便分别令segTop=segusage[nSegment][SegmentTop]、segBottom=segusage[nSegment][SegmentBottom]。
[0137] segTop指向序号为nSegment的缓存块中数据区的顶端数据单元。对于空缓存区中的缓存块,其segTop=-1,表明该缓存块全部为空,只有一个空闲区,而没有数据区。对于有效缓存区中的缓存块,如果DMA是以中断方式工作,则这块缓存是被填满之后才计入有效缓存区的,因此SegTop=DATABUFFERSIZE;如果DMA是以轮询方式工作,则这块缓存可能是被填满之后计入有效缓存区也有可能是没有填满就被计入有效缓存中的,设该缓存在DMA中被填入的数据大小为size,则SegTop=size。有效数据区中的缓存块的SegTop保持不变,直到该数据块被使用完毕,通过将SegTop置为-1,将这个数据块放入空缓存区中。DMA中的两个缓存块,不考虑其segTop的问题,即直到将数据块从DMA中挪到有效缓存区之前,segTop保持为-1。
[0138] segBottom指向序号为nSegment的缓存块中数据区的低端数据单元。对于空缓存区中的缓存块,segBottom=0。对于有效数据区中的缓存块,其segBottom随着该缓存块中数据被使用完并释放相应缓存单元而移动,即如果缓存块中的全部数据都还要继续使用则segBottom=0,如果序号等于segBottom的缓存单元中的数据已经被使用完而不再需要的时候就可以将segBottom指向序号更高的一个缓存单元,即做如下更新:
[0139] segBottom=segBottom+1
[0140] 如果整个缓存块中的数据都被使用完,则将这个数据块清零,并将这个数据块挪到空缓存区中,以便等待接收新的数据。数据块清零是通过将块内各个内存单元复位为0,并且将segTop设为-1,并将segBottom设为0而实现的。
[0141] (24)指定DBGU UART管脚:
[0142] 串口原程序使用的是USART0串口,即PA5,PA6管脚,因此将串口原程序中有关USART0的语句替换为针对DBGU UART的语句,将上文所述的内容添加到源程序中,并进一步精简去掉USB相关内容后得到“调试串口源程序USART0-DBGU-USONLY”。从宏定义上区分硬件管脚,如下所示:
[0143]
[0144] (25)移植USART0-DBGU-USONLY到喷码机控制源代码:
[0145] 将“调试串口源程序USART0-DBGU”中的串口设置相关代码、定时器设置代码、串口中断服务函数代码、定时器中断服务程序代码等移植到“喷码机控制源代码”中。打断“控制源代码”中所有对喷码机功能代码的调用,这只需要在main()函数中去掉调用喷码机功能的代码即可。将main()函数改为一个无限循环。在上述过程中,保留了“控制源代码”的工程框架,一些板级相关的设置都保持不变,这样可以保证在后面需要的时候能够调用其LCD显示功能代码和其他一些必要的初始化设置等。在移植过程中主要遇到是DBGU UART的中断与“控制源代码”程序中的PIT时钟中断冲突问题。
[0146] 这个冲突产生的原因是“控制源代码”程序中调用了systime_init()函数来启动PIT时钟,这个时钟对蜂鸣器和LCD显示都有意义,然而这个函数将启用系统的PIT实时时钟,这个实时时钟将定时产生中断,而该中断的中断源号与DBGU所使用的中断源号,DBGUUART即为本软件要使用的串口,这两者均使用了AIC的1号中断源,这个是不能更改的。PIT时钟的中断服务函数是systime_isr(),而DBGU也需要自己的串口中断服务函数ISR_DBGU_Usart0(),如果分别为PIT时钟和DBGU UART设置上述两个不同的中断服务函数,应该只有其中一个有效。因此两者必须共享中断服务函数。为此将DBGU UART的中断处理代码也放到PIT的中断服务函数systime_isr()中,这样就可以解决两者冲突的问题。具体代码如下所示:
[0147]
[0148] 至此,串口通信成功的移植到上位机上。
[0149] 3)上位机信号协议栈添加
[0150] 上、下位机之间需要交换的信息主要包括上位机发给下位机的键盘值和其他控制信息,下位机给上位机发送的点阵和其他需要显示的信息,为保证数据准确、实时的传输,需要设计合理的数据包协议栈。
[0151] 本发明对每一种显示或键盘处理函数都按上述方法分解为两个部分,并为其设计一个相应的协议数据包。这种方案可以保证下位机中对上述各函数的调用接口不变,同时将下位机的输出或者输入重定向到上位机的LCD或键盘上。
[0152] 此外,对部分数据包需要设计握手协议,以保证关键信息能够被正确接收。
[0153] (1)协议数据包基本格式:
[0154] 本发明设计的协议为不同函数设计不同的数据包,但各数据包都是基于基本数据包格式,其具体组成如图8所示。
[0155] 本发明实施例设计的数据包类型及响应的标识代码如下表所示:
[0156]
[0157]
[0158] (2)协议处理基本流程:
[0159] 本发明的协议处理流程分为发送端流程和接收端流程。发送协议流程较为简单,只需要在相应的改写部位,按照协议数据包的组成,顺次将数据包的各个字节发送出去即可。一个协议实现的发送端函数中就包含着该协议的发送流程。
[0160] 接收协议流程略为复杂,在上位机平台,主要利用无限循环不断地检测并遍历数据缓存区,一旦检测到数据包,就根据数据包的类型调用其相应的处理函数。协议的接收检测集中实现,而各个类别的协议的处理在其各自的处理函数中实现。
[0161] 发送协议数据包的流程实现存在于各个协议实现的各个发端函数中,各个发送端流程都可概括为图9所示的框架流程。
[0162] 接收端协议处理的主流程是一个在无限循环中连续检测数据包,并调用其处理函数的过程,在上位机软件中,这个无限循环也是上位机主程序的主体上位机的接收端协议处理流程如图10所示。
[0163] 在上位机的接收端协议处理流程中,最重要的两个功能是遍历接收缓存检测数据包,以及检测到数据包后调用其处理函数,这对应着两个函数即detectpacket(),packetproc()。
[0164] A.包检测函数detectpacket():
[0165] 依次遍历接收缓存区中的各个缓存块,检测是否有一个完整的数据包,检测分为两步,第一步是检测包头,检测到包头后同时也将全局当前缓存指针g_curbufpos移动到包头所在的数据块。第二步是检测包尾,以包头所在数据块为起点遍历其余缓存块,知道发现包尾为止。具体的包检测函数的流程如图11所示。
[0166] B.包处理函数packetproc():
[0167] 上、下位机的包处理函数结构类似,根据协议所设计的结构,顺序解析。读取其首比特,type比特,并确认其长度。根据包类型的不同,依照不同的协议进行解析。具体的包处理函数流程如图12所示。
[0168] (3)具体协议数据包设计:
[0169] 根据系统通信的功能需要,对相关的每一种服务,都设计出符合框架的数据包结构。其中包括汉字字符串点阵协议、ASCII字符串点阵协议、键盘值数据协议、蜂鸣器指令协议、LCD控制指令协议和矩形绘制指令协议等。其具体的结构见图13。根据其传输数据的特点,设计出携带简单、可靠信息的协议结构。
[0170] 步骤三:下位机功能模块定制
[0171] 1)下位机I/O模块修改:
[0172] 下位机I/O模块中的控制模块需要接收上位机通过串口发来的键值,并且一旦接收到串口数据就进行提取键值、把键值赋给keyCode、将keyValid状态位置1等操作,相当于需要用串口来触发一个中断。由于本方案目前采用的是轮询方式,因此无法利用串口的中断来进行这种触发,但是由于轮询的速度很快,即在系统定时器每次产生中断的时候都检查是否接收到数据包,而一旦检测到数据包就调用上述的提取键值等操作,因此也形成了一种触发机制,可以称为同步触发。需要修改的函数为串口数据解析函数GUI_UART_KEY_Proc,此函数的流程如图14所示。
[0173] 下位机I/O模块中的显示模块主要负责处理上位机发送过来的控制信号,产生对应的显示信号。在两种信号的转化过程中主要使用LCD控制函数与GUI控制函数,由于两者各是一族函数,将这些函数从其本地版本改写称为上、下位机版本的时候,接收方只需要得到发送方发过来的函数的代号即指令码,同时得到发送方传来的所需参数后,即可在接收方直接调用原来的函数完成其功能。由于这些函数都采用这种方式实现,因此就用一个统一的协议形式来支持这些函数,而用不同的指令码来区分具体的函数。下表所示为控制指令的代码表。
[0174] 控制指令代号表
[0175]序号指令码 宏定义 支持的函数
10x0 LCDOFF LCDOff
20x1 LCDON LCDOn
30x2 LCDCLS LCDcls
40x3 LCDIOINIT
5~160x4~0xF 保留给其他LCD控制指令
170x10 GUI_SETCOLOR GUI_SetColor
180x11 GUI_GETBACKCOLOR
190x12 GUI_GETDISPCOLOR
200x13 GUI_EXCHANGECOLOR
21-320x14~0x1F 保留给其他GUI控制指令
33-2560x20~0xFF 保留
[0176] 给若干LCD控制函数和GUI控制函数分配代号,通过这种编码方式只用一个字节就可保存多达256个函数的代号,下位机程序把对应这些函数的协议组合成一个协议,即通过给GUI_UART_LCDCommand函数传递不同的指令代码来实现不同的LCD控制函数协议或GUI控制函数协议。通过参数表将控制指令的代码和控制指令函数所需的参数收集起来,将这些信息打包后发送给上位机。函数流程如图15所示。
[0177] 2)下位机串口通信协议模块添加:
[0178] 由于上、下位机当前的硬件相同,软件上对于串口的使用要求(发送、接受)也相同,下位机串口通信协议模块的添加步骤与前文上位机完全一致。
[0179] 3)下位机信号协议栈模块添加
[0180] 下位机协议栈模块所使用的协议格式与上位机协议栈模块完全一致,发送流程也完全相同,只在协议接收流程上略有不同。下位机是在每个PIT中断期间进行数据包的检测和分派处理的,虽然PIT也是无限循环的,但是周期性的,下位机采用上述处理方式是由键盘操作的需求决定的。接收端协议处理的主流程是一个在无限循环中连续检测数据包,在下位机软件中,这个循环属于PIT中断服务程序的一部分,是一种周期性的循环,可以达到同步中断的效果。下位机的接收端协议处理流程如图16所示。
[0181] 下位机把接收端协议处理流程放在PIT中断中实现,主要原因是由于下位机主要接收的是上位机发送来的键盘数据包,下位机受到键盘数据包的时候希望能同时引发一个中断,这样就能较好的模拟本地键盘的工作方式,因为本地键盘就是以中断方式工作的。由于本软件的串口通信采用的是轮询方式,不能产生异步中断,但由于PIT的频率为1KHz,相对键盘响应速度而言较快,因此在PIT的周期性中断服务函数中检测键盘数据包,并立即更新键盘值的状态位全局变量keyValid,可以看成是一种键盘中断,只不过这种键盘中断是在1ms为周期的那些时钟脉冲上产生的,这样就形成了由时钟驱动的一种同步键盘中断工作方式,只要时钟频率足够快就可以较好的模拟本地键盘的中断工作方式,满足现有的工程要求。
[0182] 完成以上步骤后,工作人员通过远端的按键即可设置传统工业喷码机的工作参数,并可以在上位机的LCD屏上查看喷码机当前状态,实现了在远端操作工业喷码机。
[0183] 至此,实现了传统工业喷码机控制系统的远程化。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈