|
SPC3源码导读(一)
信息技术的飞速发展导致了自动化领域的深刻变革,并逐步形成了网络化的、全开放式的自动控制体系结构,而现场总线正是这场深刻变革中最核心的技术。
现场总线是综合运用微处理技术、网络技术、通信技术和自动控制技术的产物。它把专用微处理器置入现场自控设备和测量仪表,使他们具有了数字计算和数字通信的能力,成为能独立承担某些控制、通信任务的网络节点。这一方面提高了信号的测量、控制和传输精度,同时为丰富控制信息的内容、实现其远程传送创造了条件。
现场总线技术始于1984年,美国仪表协会(ISA)下属的标准与实施工作组中的ISA/SP50开始制定现场总线标准;1985年,国际电工委员会决定由 Proway Working Group负责现场总线体系结构与标准的研究制定工作;1986年,德国开始制定过程现场总线(Process Fieldbus)标准,简称Profibus,由此拉开了现场总线标准制定及其产品开发的序幕。目前,国际上影响较大的现场总线有40多种,其中被IEC61158国际标准认可的有8种,其中比较典型的几种总线为 CAN、LonWorks、FF、DeviceNet、Profibus。
profibus作为工业界最具代表性的现场总线技术,应用领域非常广泛,它既用于工业自动化中离散加工过程的应用,也适用于流程自动化中连续和批处理过程的应用,而且随着技术的不断进步,其应用领域呈现出进一步扩大之势。
因此本文探讨了profibus总线中的一个重要环节——从站的实现。profibus是开放的、与制造商无关的、无知识产权保护的标准,因此,世界上任何人都可以获得这个标准并设计各自的软硬件解决方案。原则上,profibus协议在任何微处理器上都可以实现,在微处理器内部或者外部安装通用异步串口通信接口(UART)即可完成。基于上述特点,在开发profibus-dp从站时有两种方案:
1.单片机+软件
在这种方案中,profibus-dp的数据链路层协议通过软件在单片机上实现,同时单片机还实现一些用户程序,物理层通信由异步串行通信接口完成。这种方案的优点是开发成本较低,缺点是需要开发人员透彻了解profibus技术细节,因此,开发周期长,而且波特率不能做到1.5Mb/s以上。
2.单片机+profibus通信ASIC
在这种方案中,profibus-dp协议完全有profibus通信ASIC来实现,单片机主要处理用户程序。利用这种方案实现profibus-dp从站的开发,只要开发者了解profibus协议相关内容,特别是基本概念、基本术语,以及ASIC芯片的技术内容即可,因此,采用这种方案开发所需的时间要比第一种方案少很多。
鉴于上述两种方案的比较,综合考虑到开发周期及成本,这里主要介绍单片机+profibus通信ASIC来实现profibus-dp从站的实现。
西门子提供了完整的协议芯片及开发包,这里采用的ASIC是SPC3作为profibus-dp从站协议芯片,微处理器选用的是STC-89C52,硬件电路已经比较成素,参考SPC3的技术手册即可,用户可以根据需要扩展其他的功能,关键是硬件电路板的设计。
在这里主要讨论软件的设计流程,本文所参考的程序是西门子公司提供的源码包。
下面就程序中的关键部分作出详细的说明:
(一)初始化
1、系统上电复位;
2、设置中断优先级,关闭中断;
3、将spc3双口RAM区域15H后的单元清0;
4、设置SPC3的 IMR 寄存器,屏蔽相关的中断;
5、设置SPC3看门狗初始值;
6、将从站地址、从站Ident_number存入变量中供spc3初始化的时候使用,本次设计为不允许修改从站地址;
7、调用spc3初始化函数,设置各个寄存器;
8、初始化完成后启动spc3,并打开中断,spc3开始工作;
(二)执行for()循环,在循环中轮询处理输入数据、输出数据及设置诊断参数
1、读取spc3看门狗和 DP 状态;
2、喂狗;
3、查询是否有输出数据,如果有的话则读取next_dout_buffer_cmd寄存器交换N和U,并取得交换后U缓冲区的指针,然后将输出数据写入规定的地方,源码中是一篇I/O区域;
4、将I/O区域的数据写入到 输入-U 中,并读取new_din_buffer_cmd寄存器交换N和U,并获取交换后U的指针,加入输入数据有更新的话,则SPC3交换N和D并将数据发送出去,否则不作任何处理;
5、处理外部诊断和其他操作:源码中将输入数据的第一个字节作为诊断的服务字节,
首先判断诊断缓冲区是否可用;
若可用,则判断新旧服务字节是否相同,相同则不进行任何处理,否则表示诊断数据有变化;
然后比较新旧服务字节的低三位,如果不同,则依据此修改诊断报文的第一个字节的低三位并根据诊断报文第一字节的最低位确定诊断报文的长度,并更新诊断报文6字节以后的数据;
读取new_diag_buffer_cmd,并获取新的诊断缓冲区的指针;
设置没有可用的诊断缓冲区;
用心的诊断数据覆盖旧的诊断数据;
如果spc3将诊断数据读走了,则会产生diag_buffer_change中断,通过查询中断是否产生,获得新的可用的诊断缓冲区,并设置该缓冲区可用。以便用户下一次更新诊断数据。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|