p-r-o-f-i-b-u-s-d-p 学习资料:S_P_C_3源_码_导_读
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中断,通过查询中断是否产生,获得新的可用的诊断缓冲区,并设置该缓冲区可用。以便用户下一次更新诊断数据。 SPC3源码导读(二)
单片机主要是通过中断在中断服务程序中查询SPC3中发生的事件,以作出相应的中断处理,所以这一部分主要剖析单片机如何来处理SPC3中发生的各种事件:
(一)进入或离开数据交换状态
单片机通过查询spc3中的状态寄存器以获取当前spc3是处于何种状态(wait_prm或者data_ex)
(二)新的全局命令
单片机通过读取r_gc_commmand寄存器获取全局命令
(三)参数报文
先判断参数报文的长度,如果小于7,则参数报文正确;
若长度大于7,则需要进一步判断:若第8、9字节不同时为0xAA,则将参数报文中7字节以后的数据保存到单片机中,并返回参数报文正确;并保存参数报文中的第四个字节mintsdr
如果8、9字节均为0xAA,则返回参数报文不正确
如果返回为PRM_CONFLICT ,则重复以上步骤
(四)配置报文
如果配置报文长度不等于2(初始化时候设置的),则配置失败
配置报文长度等于2,再判断接收到的配置参数与保存在SPC中的配置参数是否相等,相等则配置成功;
如果(cfg_ptr == 0x13) && (cfg_ptr) ==0x23或者(cfg_ptr == 0x11) && (cfg_ptr) ==0x21) ,则返回配置更新,并将新的配置参数保存在单片机中;
如果返回结果为更新配置参数,则根据新的配置参数计算输入输出缓冲区的长度和各个缓冲区指针;
假如最后得到的信息时 CFG_CONFLICT 则重复以上步骤。
(五)从站地址设置报文
将从站地址设置报文中的地址及地址允许修改参数保存到单片机内部定义的变量中,以便下一次重启或者复位后重新加载到SPC3中,
读取ssa_free_cmd寄存器,使得ssa-buffer有效,以便接受下一个地址参数报文。
(六)DP模式下 看门狗溢出:
读取看门狗的状态信息
将诊断报文长度设置为6,并且将诊断报文第一个字节低3位清0;
读取new_diag_buffer_cmd,并获取下一个可用的诊断缓冲区的指针。
(七)检测到波特率
如果SPC3处于wait_cfg 或者 data_ex 状态,设置mintsdr寄存器
最后,在中断程序最后需要设置模式寄存器中的EOI位,退出中断 最关键的就是几个时间 经过两周的自学,现在SPC3基本上已经入门了,知道了如何掌握这方面的知识,如何去寻找自己需要的资料了! “采用的ASIC是SPC3作为profibus-dp从站协议芯片”,还是有个中转芯片??。 SPC3协议芯片,已经包含了所有PROFIBUS-DP协议。 现在是vpc3+了 回复【6楼】lnskngdc
现在是vpc3+了
-----------------------------------------------------------------------
我知道,VPC3+比SPC3价格便宜,而且VPC3+支持DPV1,(SPC3只支持DPV0).。
主要是网上资料都是SPC3的,因此专注学习SPC3。实际使用时肯定考虑VPC3+。 vpc3+ mark mark yi xia mar..........k profibus dp总是搞不太清楚,苦恼啊。 ba_wang_mao 大侠真是厉害。大侠有关于VB与单片机的MODBUS通信的例子吗?我遇到一个问题:上位机用VB写界面上有很多按钮,不停地按,通过MODBUS快速置位、复位单片机的寄存器,通信会冲突,加DoEvents有时都不行,用调试工具就一点事都没有。谢了。
页:
[1]