• CanOpen协议的伺服驱动控制


    一、CanOpen的基本介绍
    1、基本介绍
            CanOpen在CAN网络7层协议中,处于 应用层。CANopen协议是在20世纪90年代末,由CIA组织CAN-in-Automation,( http://www.can-cia.org )在CAL(CAN Application Layer)的基础上发展而来。并且CiA在CANopen基础协议—— CiA 301之上,对各个行业不断推出设备 子协议,使CANopen协议在各个行业得到更快的发展与推广。 所谓的子协议,就是针对不同行业的应用对象,对 CANopen 内部的数据含义进行重新定义,或者添加新的控制逻辑( 伺服电机控制子协议:CIA402
            CANopen通信协议中 最核心的就是对象字典CANopen 通信是本文关键部分,其定义了CANopen协议通信规则以及与CAN控制器驱动之间对应关系,熟悉这部分对全面掌握CANopen协议至关重要。
           
    ///
    2、CANopen定义的报文ID分类
            在CANopen创立之初,即使在CAN总线应用最广泛的汽车电子行业,网络中的CAN节点数量和需要通讯的信息都是比较少的。 人们使用 CAN 取代 RS485 ,主要是看重其可以突发发送的实时性优势,而在多节点、长距离应用中, CAN 总线和 RS485 比起来并无优势,比如同样的波特率下,CAN的通信距离只能达到RS485的0.6-0.8倍,而多节点通信CAN无法进行任意的突发发送,不得不遵循RS485那样的轮询通信机制,否则会导致拥堵。
            CANopen的创始人是非常了解CAN总线这个特征,所以 在设计 CANopen 时,对其定义为小网络、控制信号的实时通讯
    报文传输采用 CAN标准数据帧 格式,即11Bit的ID域,尽量减少传输时间
    网络控制 报文均采用数据最小字节数。比如心跳报文,只有一个字节数据;
    实时更新的 过程数据 无需接收方应答。即采用 生产消费 模型,降低总线负载;
    ④  需要接收方确认的配置参数一般都是采用快速单字传输。即1个报文最多传送1个32字节的参数变量,避免了分帧引起的实时性降低;
    ⑤  CANopen 定义了强制性的缺省标识符( CAN ID )分配表,以减少使用者与维护者的学习时间,快速上手;
    ///
    3、可以参考的资料
    ///
    二、CANopen的对象字典
    1、常规结构
           
           表格中的索引是 主索引号;对象字典 容量65536个,通过 16位的主索引 来寻址;每个主索引对象可包含 最多256个子项,通过 8位子索引号 寻址。
    ① 0001H~001FH:定义静态数据类型,包含标准的数据类型定义,如BOOLEAN、INTEGE、UNSIGNED、浮点、字符串等。
    ② 0020H~003FH:定义复合数据类型,相对标准数据类型而言的普适所有CANopen设备的预定义结构。
    ③ 0040H~005FH:定义制造商指定的复合数据类型,相对于标准数据类型而言的特定CANopen设备所定义的结构。
    ④ 0060H~025FH:定义设备协议指定的数据类型,设备协议可以定义附加的静态数据类型和复合数据类型在这个索引区域。
    ⑤ 1000H~1FFFH:包含了通信相关的参数,这些对象适用于所有的CANopen设备。
    ⑥ 2000H~5FFFH:制造商提供设备扩展功能,对象字典在概念上迎合了可选功能,制造商可以为其CANopen设备扩展功能参数在此区域。
    ⑦ 6000H~9FFFH:设备标准化协议区,包含了可用网络读写的某类CANopen设备的所有数据对象;设备协议可以使用此区域来描述功能和参数。
    ///
    2、索引和子索引的使用
            16位 主索引 可寻址对象字典的所有对象;简单的对象可由 主索引 直接引用。定义 8位子索引 用于访问 数据结构 的具体元素,对于单一的字典对象( 如UNSIGNED8、BOOLEAN、INTERER32等值),其子索引始终是 00H;对于复合的字典对象( 如带有多个数据字段数组或记录),子索引 的引用域为主索引所指向的 数据结构。 伺服电机的对象字典例子
    ///
    3、对象代码的说明
          对象代码 表示字典对象的类型,使用到 以下定义
    伺服电机书册上的例子
    ///
    三、网络管理协议报文NMT
    1、简介
            CANopen设备网络管理(NMT)是 主-从结构模型 的。通过NMT服务,CANopen设备才 可以执行初始化、启动、监控、复位和停止运行等行为所有的CANopen设备都被视为从站,NMT从站 使用node-ID来表明其身份[1...127]。网络中需要一个具备NMT管理功能的主站。
            通过节点控制服务,NMT主站控制NMT从站的运行状态。NMT状态值(停止、配置、操作、初始化);节点控制服务可以 操作单个CANopen 或 同时针对所有的CANopen设备。
    ///
    2、NMT设备状态切换
            主站设备通过发送此NMT报文来控制指定从站的通信状态,可以分别控制设备进入  启动、停止、配置、节点复位和通信复位 状态。 报文的基本格式
    注意 :其中Data数据域第1个字节为0时,表示广播消息,网络中所有的CANopen设备都有效
            NMT设备控制支持状态命令如下表
    ///
    3、NMT节点错误控制
            错误控制服务用于检查CAN网络内出现的故障。错误控制服务主要 是CANopen设备 定期发送消息 实现的;有两种错误控制方式可用, 节点保护 和 心跳机制
            节点监护服务:NMT主站发送监护请求,如果 NMT从站没有在规定时间跨度内回应主站 或 NMT从站通信状态发生改变,NMT主站会向应用程序报告此事件。如果 从站支持生存监护( NMT从站保护主站 ,NMT从站由 对象字典 中的 监护周期(guard time)和 生存周期因子(life time factor)决定自身节点生存周期;如果在生存周期内没有收到 主站的监护请求 ,NMT从站会将此事件报告给 本地内部应用程序。从站接收到 第一帧带有COB-ID的RTR,意味着NMT从站的监护的开始;此时可能 出现在启动阶段或稍后如下图所示
            心跳机制:主要内容是 CANopen设备的 心跳生产者周期性的 发送心跳消息,一个或多个CANopen 网络中的消费者设备 接收这个心跳消息,如果心跳生产者停跳,则消费者会上报该事件。 心跳事件立即启动,所以需要在配置状态或初始化时,就开始产生心跳如下图所示
             注意:boot-up状态被视为第一个心跳; 不允许在 NMT从站中 同时使用 保护协议和心跳协议
    ///
    4、NMT标准状态机
            CANopen设备在初始化后直接进入配置态(预操作态);在这个状态下,可以对设备配置参数以及通过SDO服务进行CAN-ID-allocation;然后CANopen设备就可以进入运行态。 下图描述的CANopen设备的状态切换图
            NMT初始化状态:NMT初始化状态分为三个子态: 如下图所示
    1、初始化:CANopen上电或硬件复位后的第一个NMT子状态。执行基本的CANopen设备初始化后自动进入 复位应用 子状态;
    2、复位应用:该子状态下,CANopen设备的制造商协议区和标准设备协议区参数被赋上电值,之后自动进入 复位通信 子状态;
    3、复位通信:该子状态下,通信协议区参数被赋上电值,然后CANopen设备执行 boot-up写服务 并 进入配置态 。
    上电值:最近一次存储的参数。如果设备不支持保存、保存操作未执行或复位前执行了恢复默认指令,则 上电值 就是 默认值。
            NMT配置态(预操作态):在配置态 允许SDO通信,不允许PDO通信;此状态通常用于配置PDO的参数和映射对象等。CANopen设备通过NMT启动远程节点服务 或 通过本地控制 由此状态切换到 运行态。
            NMT运行态(操作态):此状态下将 允许所有通信服务;传输PDOs,通过SDO访问对象字典等。
            NMT停止态:CANopen设备进入停止态 将终止所有通信( 除了节点保护和心跳 ;设备在这种状态下,可以实现自定义的其他应用行为;此状态下触发的 EMCY(紧急错误)消息 将被 挂起,待切换到其他状态后,最近的EMCY 才被激活。

    ///
    四、服务数据对象SDO
    1、简介
            SDO数据传输遵循 客户端--服务器 模型,即 一应一答 模式;由CAN总线网络中的SDO客户端发起,SDO服务器做出应答。客户端通过 寻址的方式(服务器对象字典的主索引和子索引) 来控制传输哪个数据集。客户端与服务器都可以主动终止传输。
             SDO一共定义了 六种应答 服务来进行 分段传输 和 快速传输;分别是  SDO下载、SDO上传、SDO上传启动、SDO下载启动、SDO分段下载、SDO分段上传 和 SDO终止服务( 无需应答)。定义了 8种应答 服务来进行 块传输;分别是 块下载、块上传、块下载启动、块上传启动、子块下载、子块上传、块上传结束、块下载结束 以及 SDO终止传输服务( 无需应答)。
    //
    2、SDO快速传输服务
            对于传输数据 小于或等于4个字节 的SDO传输,通常采用 加速SDO传输 方式;这个也是 最常用的。SDO传输报文由COB-ID和数据段组成,数据段采用 小端模式SDO快速报文格式如下
              SDO快速下载传输报文:这里的下载是指 客户端将数据下载到服务器具体报文格式如下
            SDO快速上传传输报文:这里的上传是指 客户端从服务器读取数据具体报文格式如下
            数据传输的基本流程:无论是 数据上传还是下载,都是 由客户端先发起请求,服务器处理后回复 来完成一次传输过程; 如下图
    //
    3、SDO多段数据传输
    //
    4、SDO块数据传输
    //
    5、SDO传输的错误终止代码
           无论采取何种SDO数据传输方式,其错误终止代码格式都是一样的;根据反馈的错误码,可以了解到可能发生的错误。 具体终止代码如下表
    //
    五、过程数据对象PDO
    1、简述
            PDO过程数据传输用于 实现数据的实时传输,此数据传输方式无协议开销。PDO传输数据 需要事先 通过对象字典 配置具体映射的参数索引与COB-ID值,CANopen设备支持的PDO数量和数据长度 由应用规范、设备子协议和应用协议 指定;PDO数据传输属于 生产--消费 模型, 无需回复确认消息;PDO传输分为 发送Transmit-PDO(TPDO) 和 接收Receive-PDO(RPDO)这里的发送与接收是针对CANope设备节点而言的,对于PLC这样的主站来说,其传输方向相反。单个设备可以支持的PDO数量 最多有512个
    //
    2、PDO的传输映射配置
            PDO在进行数据传输时,必须事先配置号CANopen设备节点的PDO参数映射关系;即通过对象字典的 通信协议区的规定地址 配置映射到 2000H之后的参数地址。PDO映射参数包含了 一个对象字典中的对象列表,这些对象映射到相应的PDO,其中包括数据的长度;PDO消息的 生产者和消费者 需要事先约定好这个映射参数表,才能在通信过程中 准确的打包和解析报文数据的实际含义。
            RPDO通信参数  1400H~15FFH 对应映射参数 1600H~17FFH1600H~17FFH 所可以映射的具体参数存放在 2000H之后的所有设备制造商自定义参数区TPDO通信参数 1800H~19FFH 对应映射参数 1A00H~1BFFH1A00H~1BFFH 所可以映射的具体参数存放在 2000H之后的所有设备制造商自定义参数区具体例子如下表
              PDO映射配置例子:我们 以RPDO0为例(即1400H-->1600H-->2000H)配置需要在设备处于 预操作态 下才可以进行,标准配置步骤为: 开始-->无效PDO映射-->清除原有映射内容-->写入新的映射内容-->有效该PDO-->结束详见下图
    注意:1、以上配置采用SDO快速通信写给CANopen服务器;
                2、1400H的01H 同时决定了通信的 COB-ID格式,其中 RPDO0~3 和 TPDO0~3 是由协议预定义好的,也可以修改,其他的通道可以自定义( 由设备制造商定义)。
                3、PDO单个通道可以 同时映射8个数据,但 数据总长度 不可 超过8个字节。
                4、PDO的传输需要在设备 进入 可操作态 后,才可以进行。
                5、映射数据的长度编码:08H=8位 10H=16位 20H=32位。
    //
    3、PDO数据报文的格式
          无论是RPDO还是TPDO,PDO报文的基本格式都是: COB_ID+数据。其中的 数据 包含 该通道映射的所有 有效数据
    //
    4、PDO的几种通讯方式
            CANopen设备的PDO通信支持 异步传输 和 同步传输异步传输 的触发方式 分为两种,一种是 由设备子协议 中规定的 对象特定事件 来触发( 比如:event-time事件或数据改变事件);另一种是通过发送 与对应PDO的COB-ID一样远程帧 来触发;最常用的是 第一种。 同步传输 就是 通过发送 全局同步报文(SYNC 08H)来让所有设备节点在 同一个时刻 进行数据的上传与下载,一般的,客户端负责 发送SYNC同步报文;同步传输的触发方式也分为两种,一种是 周期循环 的方式,一种是 非周期循环方式。
            异步传输基本时序:通常为 服务器从站 通过 特定事件触发发送TPDO报文 给 客户端主站 ; 主站收到TPDO报文后,才可以发送RPDO。
            非周期同步传输时序:CANopen设备( 从站)在 特定事件触发且收到SYNC同步报文 后,才发送TPDO; 主站 在发送RPDO后,紧接着发送SYNC同步报文。
            周期循环同步传输时序:CANopen设备( 从站)在收到 若干个SYNC同步指令 后,将发送TPDO,同时将收到的RPDO同步到应用层;主站则需要 先发送RPDO,再发送若干SYNC同步报文
            对应的PDO参数配置
                同步广播报文SYNC:该报文为 生产--消费 模型,且生产者 在网络中 只能有一个。 报文格式COB-ID=80H+DLC=0
    //
    六、应急对象服务(EMCY)
    1、简述
            应急对象由CANopen设备的 内部错误 触发并且由CANopen设备 应急生产者 负责发起;应急对象适合 中断类型 的错误报警。 一个“错误事件” 仅触发 一次应急对象 通信,CANopen设备 无新错误 不会再发送 应急对象。
            应急对象报文的基本格式
    ///
    2、应急对象错误码
            本章节定义了CANopen规范的 应急错误码分类 和 具体的应急错误代码。由 具体应用定义的附加错误信息( 低字节错误码 ) 和 应急条件 不在本文范围。附加错误码 由其他其他协议规范定义。
    ///
    3、CANopen相关对象字典配置
            CANopens设备应急处理的基本流程
          CANopen设备应急错误功能开关1014H的00H 最高位 写1关闭紧急报文; 写0开启紧急报文。
    ///
    七、伺服电机设备协议CIA402:( 自己的理解!!)
    1、简述
            CIA402设备协议 是CANopen的 标准协议CIA301 下的 子协议。该子协议 主要规定了 遵循CANopen标准通信协议的 伺服电机控制的 设备协议 对象字典内容;其次,也规定了伺服电机的几种 标准控制运动方式与控制流程
    ///
    2、设备子协议的对象字典( 不完整
          
    ///
    3、CIA402状态机
            想要通过CANopen协议控制伺服驱动,就需要按照 协议规定的流程来初始化并使能 电机;其流程切换就是 CIA402状态机,通过 NMT管理和6040H对象 来实现对CANopen设备的 状态控制6041H用于 监控其状态状态机如下图
             如上图所示,状态机可以分成三部分: “Power Disabled”( 主电关闭 ) “Power Enabled” (主电打开)和 “Fault”。所有状态在发生报警后均进入“Fault”。在上电后,驱动器完成初始化,然后进入SWITCH_ON_DISABLED状态。在该状态,可以进行CAN通讯,可以对驱动器进行配置(例如,将驱动器的工作模式设置成“PP”模式)。此时,主电仍然关闭,电机没有被励磁。经过State Transition(状态传输)2、3、4后,进入OPERATION ENABLE。此时,主电已开启,驱动器根据配置的工作模式控制电机。因此,在该状态之前必须先确认已经正确配置了驱动器的参数和相应的输入值为零。State Transition(状态传输)9完成关闭电路主电。一旦驱动器发生报警,驱动器的状态都进入FAULT。
            控制字6040H:伺服电机的状态切换,要通过 对象6040H的00H 来控制;通常需要在 配置好控制模式等参数 之后,在 设备进入操作态 之前,按照 状态机切换流程 使能电机。 具体配置寄存器描述如下
            状态监控字6041H:通过此对象,可以监控当前设备的状态, 具体的寄存器定义如下
    ///
    4、速度控制模式
            这里指 轮廓速度控制。此模式下,上位机将 目标速度、加速度 发送给驱动器,运行速度、扭矩调节 由伺服内部执行; 轮廓加速度应用于速度模式的加减速,加速度和减速度统一由轮廓加速度设置。
            建议的 PDO映射 配置 6060H的00H 通过SDO快速写 配置为3(轮廓速度模式) 60FFH的00H 给定 目标速度 (单位查看伺服手册); 6083H的00H 给定 轮廓加速度 (单位查看伺服手册)。
          简单的例子(基于linux的CAN应用socket编程) https://download.csdn.net/download/weixin_40639467/87088235
    ///
    5、扭矩控制模式
            这里指的是 轮廓扭矩控制 模式。在此模式下,上位机将 目标输出扭矩、转矩斜坡常数 发送给伺服驱动器;输出转矩调节由伺服内部执行;当速度达到限幅值时,进入调速阶段。
            建议的 PDO映射 配置6060H的00H 需要通过SDO快速写请求 配置为4(轮廓转矩控制模式)6071H的00H 给定目标转矩, 6087H的00H给定扭矩斜坡。
            简单的例子(基于Linux的CAN应用socket编程)https://download.csdn.net/download/weixin_40639467/87088235
    ///
    6、轮廓位置模式
            此模式主要应用于 点对点的定位运动。上位机给定 目标位置(相对或绝对位置)、位置曲线的速度、加速度与减速度,伺服内部的轨迹发生器将根据设置生成目标位置曲线指令,伺服驱动器内部完成 位置控制、速度控制、转矩控制。轮廓位置控制,按照6040H上的组合,可以 有以下几种控制方式非立即连续绝对位置、立即单次绝对位置、非立即连续相对位置、立即单次相对位置
            6040H与6041H 在此模式下的功能
             单次运动的控制流程:电机到达目标位置后,驱动器通知主机“目标位置到达”,然后获取新的目标位置并开始运动。 在获取新的目标位置前,电机速度通常为零
    ① 首先 配置 6060H的00H模式1(轮廓位置模式),然后 配置6040H的00H 使能伺服电机,并通过NMT指令切换设备进入操作态;
    ② 根据需要,给定伺服 目标位置(607AH的00H)目标最大速度(6081H的00H)目标加减速(6083H和6084H);
    ③ 将 控制字6040H的bit4(new_set_point)设为“1”;bit5(change_set_immediately)设为“0”;bit6(绝对/相对)则由目标位置类型(绝对或相对)而定;
    ④ 当 状态字6041H 的bit12为“1”时,伺服电机开始执行位置控制;
    ⑤ 到达目标位置后, 状态字6041H的 bit10将变为“1”,然后伺服电机开始接收新的位置命令。
            连续运动的控制流程:电机到达目标位置后, 立即继续朝下一个事先设置好的目标位置运动。这样可达到 无停顿的连续运动效果,在两个目标位置之间,电机可以 无需减速到零。
    ① 首先 配置 6060H的00H模式1(轮廓位置模式),然后 配置6040H的00H 使能伺服电机,并通过NMT指令切换设备进入操作态;
    ② 根据需要,给定伺服 目标位置(607AH的00H)目标最大速度(6081H的00H)目标加减速(6083H和6084H);
    ③ 将 控制字6040H的bit4(new_set_point)设为“1”;bit5(change_set_immediately)设为“1”;bit6(绝对/相对)则由目标位置类型(绝对或相对)而定;
    ④ 当 状态字6041H 的bit12为“1”时,伺服电机开始执行位置控制;
    ⑤ 此时设置给定 第2个目标位置、目标速度、目标加减速等参数, 先恢复6040H的bit4为“0”
    ⑥ 将 控制字6040H的bit4(new_set_point)设为“1”;bit5(change_set_immediately)设为“1”;bit6(绝对/相对)则由目标位置类型(绝对或相对)而定;
    ⑦ 到达第1个目标位置后,驱动器不停机继续走第2个目标位置控制;当到达第2个目标位置后,驱动器通过状态字statusword的bit10(target_reached)应答。然后依照程序继续运动或接受新的目标位置。
            简单的例子(基于Linux的CAN应用socket编程)https://download.csdn.net/download/weixin_40639467/87088235
    ///
    7、位置插补控制模式
            插补模式可实现 多轴或单轴 的伺服驱动的 同步动作。上位机在伺服 未使能状态下 设置插补周期时间后,根据实际的应用需要,预先规划好插补位置曲线;然后在伺服电机 使能的状态下 ,将位移曲线上不同的 绝对位置周期性 的发送给伺服驱动器;伺服驱动器同步接收到给位置指令,将位置指令按 位置环控制周期 进行细分,均匀发送。伺服驱动器内部完成位置、速度和转矩的控制。
            功能描述
    ① 为了达到同步效果,上位机需要 先发送位置更新数据然后使用同步信号( SYNC 使所有驱动器接收同步,驱动器接收到同步信息后同步内部时钟。注意, 同步周期应小于或等于插补周期,以保证插补数据的更新。
    ② 在位置插补方式下,上位机首先需要设置 下位机 PDO 接收方式为同步模式(使用 SYNC 帧进行接收和发送同步),由于同步信号(SYNC)是广播形式的,每个驱动器在接收到此信号后才更新PDO的数据;
    ③ 在同步信号(SYNC帧)发送前,需要上位机先发送给定位置数据Xi和控制字Controlword;
    ④ 当数据出现延迟时,驱动器将以上一次同步数据进行插值运行;
    ⑤ 当插补周期完成后,数据未更新,驱动器将出现插补周期超时报警,并停止运行。
            PDO映射 建议配置6040Hbit4=1可以 启动插补60C2H的00H 设置 插补周期时间(实时生效); 60C2H的01H 设置 插补周期时间的单位60C1H的01H 给定插补下一个 目标绝对位置60C2H的00H也可以映射到RPDO中,实现插补周期的动态修改
            基本配置流程
    ① 6060H配置为7,进入插补控制模式;
    ② 配置PDO(RPDO1配置为index:6040h,subindex:0h, RPDO2配置为index:60C1h,subindex:1h);
    ③ 设置插补周期(60C2-01h),默认单位为毫秒(us);
    ④ 设置PDO为同步模式(设置对象字典(index:1400h,subindex:02h)为1,设置对象字典(index:1401h,subindex:02h)为1),如果发送PDO也需要为同步模式,则需设置对象字典(index:1800h,subindex:02h)为1,设置对象字典(index:1801h,subindex:02h)为1;
    ⑤ NMT启动节点;
            简单的例子(基于Linux的CAN应用socket编程)https://download.csdn.net/download/weixin_40639467/87088235
    ///
    八、其他关键技术细节
    1、
  • 相关阅读:
    新零售项目及离线数仓核心面试,,220807,,
    关于rc.local 自启动多个应用问题
    【Python】OpenCV-图片差异检测与标注
    C语言之qsort()函数的模拟实现
    使用 `open-uri.with_proxy` 方法打开网页
    「PAT乙级真题解析」Basic Level 1005 继续(3n+1)猜想 (问题分析+完整步骤+伪代码描述+提交通过代码)
    05-React Antd UI库
    spring学习第一天_Spring简介概览
    C/C++内存对齐
    node.js 快速入门
  • 原文地址:https://blog.csdn.net/weixin_40639467/article/details/127940559