常见MCU列表如下图。
确定CANopen源代码的来源:
1、购买商业版;2、选择开源的基础上修改;
需要注意的是几个基本区别:
1、费用:商业版代码收费,开源代码免费;商业版代码节省了很多研发人员和测试人员的时间,节省了很多人力成本。
2、技术支持和文档:遇到问题,商业版有人负责解答,有完整的 *** 作文档和手册(将近五百页的详细说明书),开源无人解答--问题解决的几率小、风险不确定性大。
3、代码质量和稳定性埋迟手:商业版本有质量保证,代码的质量、优化和效率;使用开源代码存在质量风险大大提高;
4、开发难度和时间:商业版有完整的多款不同硬件平台的demo提供,大大降低开发移植难度和时间。(研发人员的薪资也是成本,产品质量和推出市场的时间也是机遇与挑战)。开源代码的研发工作量增加、后期测试难度和时间也增加。
5、研发/测试工具:商业版有完整的工具链和测试方法提供,开源代码没有。完整的测试工具包括:网络组网和管理以及测试(导入EDS文件组网并修改对应的数据,快速图形化PDO mapping)、报文分析、快速创建对象字典 生成EDS文件、USB-CAN卡采集数据等等。
6、培训:提供一天在线培训,开源代码无任何培训和技术支持
7、后期延展性很好:比如SO-877-VP或者SO-1063-VP提供30多种不同MCU平台的demo,并且每年不断更新和增加,如果项目需要更换MCU,可以快速移植,不需要额外的开发工作量。而开源代码没有这方面的资源。
如果要做serious的产品,一般用商业版的代码更有保障。
确定好CANopen源代码之后,如果是开源代码,则需要先看看代码的完整性,多做几次测试(毕竟很多人上传开源代码的时候没有想着一定要负责任,所以可能会存在一定的安全和稳定性漏洞,代码效率不一定高)。如果是选择商业版代码:则在拿到的demo中找到与自己的MCU匹配的 ,直接移植,然后再边读demo的注释,边查说明书看函数应用,最终结合产品功能添加应用部分,即在“骨架”里面去添加“肉体”就可以。
注:如果采用商业版代码,则对工程师CANopen经验的要求会大大降低。
商业版代码的ccmmain函数部分的两个小截图如下:
对象字典的创建:比如401的IO设备,402的运动控制,不同规范里面的OD是不同的,如果有商业版代码,OD可以直接复制。
申请Vendor ID:加入CiA协会后直接获取免费的Vendor ID,这个Vendor ID需要写在EDS文件里面的,有利于后面的其他测试。
完成初步编译后,先做一下功能测试:用上述提到的第三个CANopen的测试工具。通过CAN卡将移植好的CANopen设备连上,如果有条件的话,最好再连上最终可能会配备的设备,比如IO模块,PLC等,组成一个简单的CANopen网络(CAN卡可以做主站,或者用其他PLC等做主站,如果自己开发的设备是主站则测试自己的主站功能)。然后通过CANopen分析软件发送PDO/SDO等数据来测试,所开发的设备是否可以按照预期的指令执行,其他所控制的设备是否有相应的动作,看接收和记录到的PDO/SDO等返回值是否符合预期。
还可以通过CANopen网络管理软件:完成PDO映射-看是否可以正确匹配,导入EDS文件,看是否可以正确读取以及相关定义,也可以直接修改;看波特率和节点地址的设置是否正确等等。
测试工具的一些截图如下:
CANopen一致性测试:这个步骤可以放在第六步之前,也可以在之后,如果为了更旦姿完整的话,一般是放在之后,先保证基本功能没有问题再生成EDS来测试。具体的步骤就看工程师自己的看法。
一致性测试简单分为两种:
1、自测试(强制性):通过入会CiA-CANopen协会后,免费获取CANopen一致性测试工具,把EDS文件导入工具并自动生成测试结果。但是这种测试一般是完成EDS语法错误的测试,比如是否按照CANopen规范来写的一些PDO通弯嫌讯段等。
这个测试不能完成功能测试,功能测试可以参考第六步。
或者可以拿到CiA做官方测试:
2、官方测试(可选):把所有代码和移植好的设备,拿到CiA实验室,CiA的工程师会把设备放到他们实验室的平台上,完成:互 *** 作性以及兼容性的测试,如果有完成的功能需求测试文档,还可以完成完整的功能需求测试。这个好处是:CiA可能比我们自己更有经验知道应该测试什么,知道完整的CANopen规范可以测试更全面,有完整的现成的试验台和设备。
一致性测试的工具如下:
1、CANopen简介1.1.CANopen定义了应用协议,应用层,通讯协议三部分
1.2.CANopen源代码整体架构
其中,CANopen的基本知识就不做详细介绍,如需要了解,关注公众号"虹科CANopen与EtherCAT知识平台“。
CAN driver layer:主要是CAN底层驱动相关的,不同硬件平台的CAN驱动也不一样,这里使用的是CAN driver for STM32F bxCAN-Controller
CANopen stack layer:这里是CANopen的具体实现
CCM layer:这里时由c写好的一些API函数,是中间调用层,实现各类报文和参数保存知汪雹等功能。
需要注意的是一些功能的实现,需要自己添加程序,比如对1010和1011保存和恢复默认参数这部分,需要自己写程序。是保存那部分参数?保存在Flash还是eeprom中?需要自己选择等
2、CANopen移植流程
一个CNAopen的应用程序一般都遵循下列流程图,
2.1、初始化硬件
2.2、创建数据结构(对象字典、结构体、变量、实例)等
2.3、初始化一些服务,包括通讯参数,穿件通讯对象
2.4、在程序中,处理CANopen协议中的内容
2.5、必要时关闭CANopen layer
注意:在进图主函数之前,程序会先进行初始化设置,比如对系统时钟的设置。本教程使用的系陵盯统时钟是168M,外部晶振是8M,PLL作为时钟源。这部分的配置主要跟F407系统时钟配置相关,这里就不详细说明。
CANopen源代码移植
2.1、初始化硬件
进入主函数后,
串口初始化:对串口进行初始化设置。当程序运行是,出现错误时,CANopen 层会调用一些标准函数,通过串口输出错误的一些说明,错误代码,方便调试错误,比如错误代码0x0013,查看错误代码表,搭帆发现是CAN初始化错误,这时候就需要检查CAN的初始化,经检查确认是CAN的Rx和Tx在程序移植时对应的引脚不同。这样减少了移植差错时间。比如0x0078,这时候就要检查PDO映射和对象字典了。
时钟初始化:F407配置407的滴答定时器为1ms产生一次中断
CAN设置:选择单CAN或者多CAN,对Rx和Tx相关引脚进行设置
2.2、CANopen Layer初始化
CcmInitCANopen这个函数初始化CANopen layer,创建数据结构,当执行完该函数时,对象字典创建成功,默认值被些人相关的索引条目中。但是对象字典的索引条目还没连接到应用程序中,也就是调用这些索引数据这部分程序还没完成。此时,NMT保持在初始化状态。
设置节点ID为0x41,波特率为125k
需要注意:
把参数分装在结构体tCcmInitParam中,需要注意的是这里的结构体中的成员是固定不变的,所以保存在ROM中,如果需要改变节点地址或者需要通过DIP改变节点,那么该结构体必须保存在RAM中
2.3、CANopen Layer初始化后,开始进入NMT状态机的切换。执行CcmConnectToNet()这个函数,从初始转态中切换到预 *** 作状态。
这一部分中,当不同的xxxNMTEvent发生时,都要调用AppCbNmtEvent这个回调函数,比如上电状态初始化,应用层复位(0x2000-0x5FFF和0x6000-0x9FFF),通讯参数复位(0x1000-0x1FFF)
注意:当使用LSS这个功能时,在进入NMT状态机的切换前,应该先执行LSS状态机。根据CiA DS-305协议,CcmProcessLssInitState 的返回值如果为0xFF,就标志无效的节点,因此一直执行循环,知道该返回值不为0xFF。当然,不需要LSS的话,这部分可以不要。
2.4、进入 *** 作状态,有两种方法:一是设备接收到进入 *** 作状态的报文(0x00, kNmtCommStartRemoteNode). 后者调用了CcmBootNetwork
在主函数里面模拟数字量输入,Ccmprocess()是CANopen协议的处理函数,包括 PDO module,LSS module,NMT master module,NMT slave module,EMCP module,HBC module,HBP module,SDOS module,SDOC module等等。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)