王珍珠,刘 伟,刘占清
(1.中国科学院研究生院,北京 100039;2.中国科学院 沈阳计算技术研究所,沈阳 110168;3.沈阳高精数控技术有限公司,沈阳 110168)
目前,ARM(Advanced RISC Machine)凭借其开放性、高可靠性、低功耗、低成本和操作系统的易移植普遍应用于汽车、消费电子、工业控制等各领域[1-2]。CAN(Controller Area Network)总线是一种有效支持分布式控制和实时控制的串行通信网络,它凭借高可靠性和灵活性等优势广泛应用于多种领域。文献[3]采用SJA1000作为CAN控制器使PC机成为CAN总线上的一个节点从而实现PC机和PLC之间的通信。文献[4]实现了一种在CAN open协议上实现主从模块进行通信的协议。Jung-Ki Choi等提出了一种在CAN网络中进行重新组织数据来提高传输效率的算法[5]。D.I.Orekhov等设计了一种基于CAN总线的请求和分析数据系统[6]。高档数控工程研究中心研发的PLC的主CPU采用LPC2368,而I/O板采用 LPC2119,都内置2个 CAN控制器。本文设计了LPC2368和LPC2119之间的CAN通信协议,正确有效了实现了数据的采集与输出。并通过I/O测试台有效地验证了通信的正确性。
CAN总线支持多主机通信方式。多主机是指总线空闲时,任何单元都可以开始传送报文。具有较高优先权报文的单元可以获得总线访问权[5]。主CPU向I/O板请求位置信息,I/O板收到请求后同时发送信息到CAN总线上采用的多主机方式。
CAN已成为国际标准 ISO11898和ISO11519。CAN技术规范包括A和B两部分。2.0A给出了CAN技术规范版本定义的CAN报文格式,而2.0B给出了标准帧和扩展帧两种报文格式[7-9]。标准帧的ID占11位,扩展帧的ID占29位,我们这里采用的是11位的标准帧。标准帧11位ID的每一位的含义如图1所示。
图1 帧ID格式图
Bit10位:表示发送该帧的芯片类型,0代表该帧是LPC2368发送的,1代表该帧是LPC2119发送的。
Bit 98位:表示底板编号,我们现在做的第一版的PLC只有两块底板,一块底板上有6个插槽。分别是底板0和底板1。01代表底板0,10代表底板1,00代表底板0和底板1。
底板的左端有 4 个开关 1、2、3、4,分别对应LPC2368 中的管脚 P1.22,P1.23,P1.24,P1.25 和LPC2119 中的 P1.23,P1.22,P1.21,P1.20,可以控制调节底板的编号。
Bit76位:表示板子类型。10代表输入板;01代表输出板。
Bit5~0位:表示底板上的六个插座编号,一个底板上有6个插槽。
因为多主机发送必须为节点分配不同的优先级,而CAN总线上的节点的优先级是按照ID的大小来判断的,ID越小优先级越大;ID越大优先级越小。我们这样设计ID,不仅可以为I/O板设置不同的优先级,而且也为输出板有选择地接受来自主CPU的数据奠定了基础。输出板的截取数据算法将在第四章讲述。
CAN控制器相对于微控制器来说是基于事件触发的。CAN控制器在状态发生变化时,将变化结果通知微控制器。微控制器可以采用中断或者查询的方式对CAN控制器作相应处理。鉴于功能的需要,我们设计的CAN通信程序,在发送帧信息时采用查询方式,接收帧信息时采用中断方式。CAN驱动层的设计是通过对CAN控制器进行配置和操作、实现收发程序等工作来实现的。主要有以下三部分。
CAN通信工作需要CAN控制器和验收滤波器协调工作。CAN控制器初始化包括使能CAN外设,CAN管脚初始化,CAN中断接收初始化和波特率初始化设置等。
当CAN控制器的接收端接收到一个完整的标识符时,它将通知验收滤波器。验收滤波器响应这个信号,并读出控制器编号、标识符格式(标准帧格式或扩展帧格式),然后验收滤波器搜索AF RAM中的表格进行匹配,根据是否匹配来决定是接受还是丢弃这一帧信息[10]。通过设置验收滤波器寄存器可以进行有选择的接收发送到CAN总线上帧。将需要接收到的ID写入验收滤波器的相应地址即可。此通信协议中使用的是明确的标准帧格式标识符。验收滤波器的工作模式随着通信的时序不同而不同。系统初始上电时,验收滤波器处于旁路模式。
3.3.1 CAN发送
CAN控制器的发送缓冲区包括三部分,一是存放发送帧信息的寄存器CANTFI。二是存放发送帧的ID的发送标识符寄存器CANTID。三是存放发送数据信息的发送数据寄存器A(CANTDA)和发送寄存器B(CANTDB)。CANTDA用来存放将要发送报文的前1-4个数据字节,CANTDB用于存放将要发送报文的第5-8个字节。
CAN发送报文时,首先要将发送相关的寄存器值清零,然后将相应寄存器中填写帧信息,帧信息填写好之后,选择发送缓冲区启动发送命令。通过查看状态寄存器CANSR或者全局状态寄存器CANGSR能够得知发送报文是否成功。
3.3.2 CAN接收
CAN控制器具有双重缓冲区。CAN报文接收到的帧信息也包括三部分,分别是接收到的帧状态、接收标识符和接收到的数据。
CAN报文的接收我们采用的是中断接收方式。当CAN总线的节点使能中断接收后,验收滤波器或者处于旁路模式,或者接收到的帧ID在验收滤波器的RAM中存放,就会触发接收中断。CAN控制器可以从接收帧状态寄存器、接收标识符寄存器和接收数据寄存器中读取接收到的报文。接收成功以后释放缓冲区,用于存放下次接收到的报文。
主CPU和I/O板之间的CAN通信流程如下。
(1)主CPU向全部I/O板发送标准远程幀。为了通信方便,当验收滤波器处于旁路模式时主CPU发送的ID是0x00000000。初始上电之后,主CPU向所有I/O板发送一个远程幀,要求所有的I/O板回送一个字节的数据,标识自己的位置信息及所接物理量的线数。位置信息包括芯片类型、所在底板号、板子类型、所在插槽号。物理量线数代表I/O板所接的物理量的个数。
(2)I/O板在验收滤波器处于旁路模式时,都能接收到主CPU发来的请求I/O板位置信息的远程帧(该远程帧的ID为0x00000000),并触发接收中断。当I/O板收到ID为0X00000000的远程帧后,就立即将自己的位置信息发送给主CPU。
(3)当主CPU接收所有I/O板发来的一个字节的数据幀后,将进行一系列的处理。
①建立一个输出板位置码表和一个输入板位置码表,分别保存各输出板发来的ID和各输入板发来的ID,并且将所有的ID按照从小到大的顺序排列。
②发送ID为0x13F的数据帧,此帧的发送数据寄存器里存放着底板0上所有输出板的位置码相与后的配置码0和底板1上所有输出板位置码相与后的配置码1(如果有底板1的话)。此帧有同步信号的作用。
③将ID按从小到大的顺序存放到验收滤波器的RAM中,并设置验收滤波器的模式为工作模式。
(4)输出板在接到ID为0X13F的数据幀之后,设置滤波码并将滤波的旁路模式改为工作模式。输出板建立滤波码的方法是:
①建立接受主CPU发到同一底板的所有输出板的滤波码.根据接到ID为0X13F的数据幀的数据字节数来首先建立1项或者2项滤波码,如果接到的是1个字节,则首先建立1项 ID,该 ID高 5位为00101,低六位为上面生成的底板0的输出板配置码0。如果接到的是2个字节,则首先建立2项,第1项与上述相同,第2项ID的高5位01001,低6位为上面生成的底板1的输出板配置码1。
②建立接收主CPU发到该输出板的数据幀的滤波码,该ID高5位0010,低 6位为本板在底板上的位置编码。
③建立某输出板发到该输出板的数据幀的滤波码10101,低六位为本板在底板上的位置编码。
④将这三种滤波器进行排序,并按照从小到大的顺序存放到输出板的验收滤波器的RAM中。
输入板在接到ID为0X13F的数据幀之后,设置滤波码并将验收滤波器的旁路模式改为工作模式。输入板建立滤波码标的方法是:
①接收主CPU发送到所有输入板的标准幀的滤波码,该帧的ID为0X80。
②接收主CPU发送到本输入板的标准幀的滤波码,此ID的高5为00110或01010,低6位为本板在底板上的位置码。
③输入板对两个滤波码按照从小到大的顺序存放到输入板验收滤波器的RAM中。
(5)主CPU向全部输入板发送标准远程幀要求回送2个字节的数据,该发送帧的ID为0X80。用于PLC梯形图的解释执行。
(6)输入板收到来自主CPU板发来的 ID为0X80的请求数据的帧后,填写发送帧状态寄存器、发送帧标识符寄存器,发送数据寄存器,然后启动发送。
(7)主CPU收到输入板的采集的数据后,用于SIPROM编码的解释执行,刷新输出结果,并向输出板发送数据幀,该数据帧的数据寄存器中存放着刷新的输出结果。
(8)输出板收到来自主CPU发送的数据进行截取数据,来选择自己对应的2个数据字节。并行截取数据的算法如下:
根据j值来确定截取哪些字节。
如果j==0截取第2和第1字节
如果j==1截取第4和第3字节
如果j==2截取第6和第5字节
如果j==3截取第8和第7字节
通信协议流程图如图2所示。
图2 通信协议流程图
利用串口调试助手和I/O测试台对该PLC通信模块进行测试。当主CPU接收到一帧时,就将该帧的ID发到串口调试助手,用I/O测试台可以模拟数据的采集和输出。观察串口调试助手,可以清晰地看到主CPU收到了所有输入板和输出板的信息,有效地验证主CPU和I/O板之间的通信的正确性和可靠性。
本文针对PLC系统的主CPU和I/O板之间数据传输的需要,设计并实现了进行数据采集和输出的CAN通信协议。该通信协议在充分考虑PLC系统需要的基础上进行了ID设计和通信机制的设计。通过验证,该通信机制可以准确可靠地运用到PLC通信模块中。
[1]唐明军.基于ARM的可编程控制器的研制[D].南京:南京信息工程大学,2007.
[2]马然,马耀卿,包金明.基于ARM的交流电量数据采集系统的研制[J].电气传动,2010,40(10):61-65.
[3]陈鲁华.基于CAN总线的网络化PLC技术研究与实现[D].南京:南京航空航天大学,2003.
[4]赵博.基于CAN总线的PLC模块通信协议[D].西安:西安石油大学,2009.
[5]Jung-Ki Choi,Sungyun Jung,and Kwang-Ryul Baek.A Data Reorganization Algorithm to Improve Transmission Efficiency in CAN Networks.Intelligent Control and Automation.2006,344:438 -443.
[6]D.I.Orekhov,A.S.Chepurnov,A.A.Sabel’nikov.A Distributed Data Acquisition and Analysis System Based on a CAN Bus.Instruments and Experimental Techniques.2007,50(4):487-493.
[7]程力.CAN总线与DeviceNet现场总线分析[J].电站设备自动化,2006(2):4 -13,31.
[8]佟为明.工业控制网络[M].哈尔滨:哈尔滨工业大学出版社,2005.
[9]Bosch.CAN Specification Version 2.0.Robert GmbH,Stuttgart(1991).
[10]谢斌,毛恩荣.基于CAN总线的拖拉机电液悬挂系统控制器研制[J].机床与液压,2006(8):185-187.