基于Kinco触摸屏与DanFoss控制器之间的自定义CAN通讯*
2021-07-12陈永辉郝长峰
陈永辉,郝长峰,张 峰,刘 栓
(1.河南省高远公路养护技术有限公司,河南 新乡 453000;2.公路养护技术装备国家工程实验室,河南 新乡 453000;3.河南省高等级公路检测与养护技术重点实验室,河南 新乡 453000)
0 引言
随着信息技术的不断发展,工业触摸屏的价格在不断降低。触摸屏与CAN总线的集成使得触摸屏在工程机械中的应用更加普及。尤其是通用组态型工业触摸屏不仅具有成本优势,而且在图形界面的设计上更加方便。比如采用IFM控制器与IFM触摸屏配合使用,虽然有成熟的基于Can Open的EDS可以应用,但是图形界面却要技术人员自己编程实现[2]。同样如DanFoss控制器虽然可以与DanFoss触摸屏直接进行硬件组态而不必考虑具体通讯问题,但是同样图形界面也是需要技术人员通过编程而不是通过组态的方式来实现。而采用通用组态型触摸屏则很好地解决了其中比较繁琐的图形界面设计问题,但是与控制器之间的通讯问题则往往需要技术人员通过自行编程来实现。由于通用触摸屏厂商通常并不对用户开放通讯代码,因此使其应用受到相应的限制。本文采用重新生成底层驱动的方式实现自定义CAN通讯协议并成功实现了通用触摸屏与控制器之间的CAN通讯。
1 主要功能及实现
本文采用Kinco MT4414T触摸屏和DanFoss MC050控制器进行通讯。Kinco MT4414TE触摸屏具有7英寸有效显示面积,带有两个串行口,一个CAN总线接口和一个以太网接口,采用HMIWare软件进行组态和编程。DanFoss MC050控制器具有两个CAN总线接口,采用PLUS+1 GUIDE软件进行编程。首先对触摸屏进行组态并设置CAN总线。如图1所示在通讯连接选项中选择现场总线。
图1 触摸屏设置CAN总线示意图
在现场总线设置中选择 CAN CUSTOM PROTOCOL波特率根据MC050控制器的CAN参数做相同设置,如图2。
图2 CAN总线的波特率设置
对触摸屏进行图形组态后在Kinco软件安装目录里找到builddriver文件夹并打开fbserver文件,自定义CAN通讯协议驱动代码需要在该文件内进行编程实现。如图3。
图3 选择CAN通讯协议驱动代码
1.1 触摸屏发送数据
触摸屏作为一款在工业以及工程机械中常用的人机交互装置通常用来显示设备信息和输入相关控制数据。在输入数据的时候输入一个数据大约需要3~5 s,因此从触摸屏向控制器发送数据的实时性要求并不是特别高[3]。但是由于CAN总线是典型的多主总线,通常要联接多个控制器进行实时数据共享,为了提高系统的实时性和总线带载能力,通讯协议要尽量节约总线负载。同时考虑到触摸屏要实时显示大量控制器信息,那么向控制器发送数据报文要尽量简洁。
发送数据工作原理是在触摸屏通电启动后首先设定CAN通讯程序循环周期,并读取所有待发送数据的初值。在后续的每个循环周期中读取每个待发数据的实时值,并与上次循环所读取的数值进行比较,如果本次循环所读取的待发数据实时值与上次循环所读取的实时值不同,则认为该值是通过触摸屏被输入或修改的数据。通过代码对该数据进行打包并发送到控制器。
程序框图4如下:
图4 程序框图
代码如下:
void Init(CAN_PORT CanPort) //程序初始化
{
Set_Cycle(50); //设置循环处理时间50ms
pCANPort = CanPort;
CopyFromLW(8400,Buf,70); //复制触摸屏内存LW8400开始的70个字节数据到缓冲区Buf
memcpy(ReadBuf1,Buf,70); //通过内存复制把字节数据转换成16位数据
}
void main_process(CO_Data* d,UNS32 id)//循环处理程序
{
unsigned short i;
Message Msg;
CopyFromLW(8400,Buf,70); //重新读取触摸屏内存数据
memcpy(ReadBuf2,Buf,70);
for(i=0;i<36;i++)
{
if(ReadBuf1[i]!=ReadBuf2[i]) //与上次读取的内存数据进行比较当数据发生改变后打包发送
{
ReadBuf1[i]=ReadBuf2[i];//更新原数据以备下次循环对比使用
Msg.cob_id.w=0x182; //触摸屏发送数据采用固定节点号
Msg.rtr=0;
Msg.len=3; //数据长度固定为三个字节
Msg.data[0]=i;
Msg.data[1]= Buf[i*2];
Msg.data[2]= Buf[i*2+1];
Send_Msg( pCANPort,&Msg,0);
}
}
}
1.2 控制器接收数据
DanFoss MC050控制器循环接收触摸屏发送过来的CAN数据帧,该数据帧是以固定节点号发送。包含3个字节数据,第一个字节数据作为索引字节表示后续的两个数据字节所对应的控制器参数,后续两个字节代表所对应的参数数值。程序流程图如图5。
图5 控制器接收数据流程图
PLUS+1GUIDE是一款图形化编程软件,具有简洁易懂等特点。针对上述流程图编程如图6。
图6 控制器接收数据编程示意图
在程序中设置MC050控制器始终接收触摸屏发送的以0X182为节点号的CAN总线数据帧,数据长度为3个字节。并把数据帧中最后两个字节数据封装成16位无符号整型数据。
如图7所示,设置所接受的数据索引号为9。当接收到索引号为9的数据时,首先读取控制器内部相应存储器数值与接收到的数值进行比较。当所接受的数据与控制器中所存储的数据数值不相等时,将所接收的数据存储到相应的存储器中,同时输出到MC050数据总线供后续程序使用。
图7 设置接受数据的索引号
1.3 控制器发送数据
鉴于MC050控制器所发送到触摸屏的数据量比较多,为了尽量节约总线带宽、降低总线负载并充分利用每个所要发送的数据帧,对每个待发数据帧单独分配一个节点号,并尽量使每个待发数据帧的8个数据字节保持填满状态。
针对图8编程如图9图10,设置每个数据帧循环发送周期为400 ms,每帧8个数据字节。
图8 控制器发送数据编程框图
图9 控制器发送数据流程图
图10 设置发送数据的索引号
发送数据,设置该帧CAN ID为0X203和非扩展帧并把每个待发的16位数据分解为字节数据输入到帧数组中,使每个帧数据包含8个字节数据。
1.4 触摸屏接收数据
Kinco MT4414T触摸屏接收MC050控制器发送过来的所有以0X200为起始CAN ID的数据帧,并以CAN ID为地址索引把数据写入到对应的内部存储器中。程序代码如下:
void MsgDispatch(CO_Data* d,Message *m)
{
unsigned short Temp;
Message msg;
memcpy(&msg,m,sizeof(Message));
Temp=8000+(msg.cob_id.w-0x200)*4;//以接收到数据帧的节点号作为索引存放接收到的数据
CopyToLW(Temp,msg.data,8);
}
2 编译触摸屏程序并生成驱动文件
fbserver程序编写并保存后重新打开图3文件夹,并运行该文件夹内的build批处理程序。build程序运行后将对fbserver文件进行编译并生成CAN CUSTOM.so 和Can custom.ge两个驱动文件,并自动保存在Kinco组态软件安装目录lib文件夹下的fieldbus driver目录中。对触摸屏组态程序进行全部编译并下载到触摸屏中进行通电测试。MC050程序通过PLUS+1GUIDE软件编译后采用PLUS+1Server Tool软件下载并监控。在MC050控制器以250 k波特率400 ms周期发送70个16位数据情况下采用PLUS+1Server Tool软件监控测试总线负载率达到9%。为后续加载其他CAN通讯装置预留了足够的通讯阈度。
3 结论
本文以Kinco MT4414TE触摸屏和DanFoss MC050控制器为研究对象,分析了该触摸屏和控制器的CAN通讯特点,并通过重新生成底层驱动的方式设计了自定义CAN通讯协议。该通讯协议充分利用了CAN总线的多主特性对通讯带宽进行了充分的压缩,有效地降低了总线负载[4]。并在MOH半柔性摊铺机上经过实际应用,取得了较好的使用效果和经济效益。