直流伺服CANopen控制监控在线功能的使用" alt="MOTEC智能直流伺服CANopen控制监控在线功能的使用" width="659" height="280" style="width: 659px; height: 280px;"/>
本文旨在介绍 MOTEC 智能直流伺服如何使用, CANopen DS301 当中规定了三种模式用来实现主从之间相互监控对方是否在线,分别是消费者心跳保护报文consumer heartbeat、生产者心跳保护报文 Producer Heartbeat、以及节点寿命保护报文 life guard。本文将分别介绍通过 SDO 的配置,怎么简单的使用这三种功能。
一、 简介
在 CANopen 系统中,由于存在总线掉线的可能,规定了consumer heartbeat,Producer Heartbeat 以及life guard 三种方式来实现,在 CANopen 系统中,MOTEC智能直流伺服作为 CANopen 的从站,同时也叫做信息的生产者。控制器作为 CANopen的主站,同时也是信息的消费者。其中 Producer heartbeat 是指驱动器向 CAN 总线上定期发送自身的生产的心跳报文,主站在收到心跳报文之后,刷新驱动器是否在线的状态。consumer heartbeat 是指主站向 CAN 总线上定期发送自身的生产的心跳报文,驱动器在收到心跳报文之后,刷新主站是否在线的状态。life guard 是指驱动器在收到主站发给自身的 life guard 请求报文之后,向 CAN 总线上发送 life guard 回应报文,驱动器和主站都可以刷新双方的在线状态。其中,life guard 可以单独使用,Producer heartbeat 和 consumer heartbeat 可以单独使用或者两者组合一起使用。
二、 Producer Heartbeat
对象描述:
Index | 0x1017 |
Name | Producer Heartbeat Time |
Object Code | VAR |
Data Type | UINT16 |
Access | RW |
PDO Mapping | NO |
Units | ms |
Value Range | 0 |
使用的流程如下:
使用 SDO 向 1017 索引中发送驱动器产生心跳报文的时间,例如设置为 1000ms,需要发送的 SDO 数据如下
向索引 1017h 子索引 00h(INT16)中写入数据 03E8h(1000)
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | |
命令 | 2Bh | 17h | 10h | 00h | E8h | 03h |
回答 | 60h | 17h | 10h | 00h |
驱动器的 1017h 索引之内为非 0 的数据之后,会向 CAN 总线上发送 Producer
Heartbeat 报文,具体格式如下。
Slave→Master
COB-ID | Byte |
0x700+Node_ID(从站ID) | Bit7:toggle;bit6-0:状态 |
位 0 到位 6(bit0~bit6)表示节点状态,可为下表中数值。
Value | 状态 |
0 | Boot-up:(节点首次启动) |
4 | Stopped:(节点停止) |
5 | Operational:(节点处于操作状态) |
127 | Pre-operational:(节点处于预操作状态) |
本例中,驱动器会在小于 1000ms 的时间窗口内,发送 CAN_ID 为 700+驱动器 ID 的心跳报文,主站在收到该报文之后,将驱动器更新状态为在线,如果在 1000ms 的时间窗口内,收到的该驱动器的心跳报文少于 1 条,则认为驱动器掉线。
注意:该功能主要是用于主站对于从站的监控。如需双向监控,需要与 consumer heartbeat 功能配合使用。
consumer Heartbeat 功能使用驱动器对象字典中的 1016h 索引,具体定义如下对象 0x1016: consumer Heartbeat Time(生产者心跳报文时间)。
这个对象定义了设备心跳报文发出的时间间隔,将根据“消费者心跳时间间隔”参数(索引 1016h)中所设置的周期和 ID 来监控网络中其余站点产生的心跳报文,一般是主站产生的心跳报文,用来确定主站的状态,该周期以 ms 为单位,如果超过该周期,驱动器将会产生通信系统故障报警。
Bits | 31-24 | 23-16 | 15-0 |
Value | reserved (value: 00h) | Node-ID | heartbeat time |
对象描述:
Index | 0x1016 |
Name | consumer_heartbeat |
Object Code | VAR |
目录描述:
Sub-Index | 0 |
Description | Number of entries(条目数量) |
Access | RO |
Data Type | UINT8 |
PDO Mapping | NO |
Units | -- |
Value Range | 1 |
Default | 1 |
Sub-Index | 1 |
Name | consumer_heartbeat |
Data Type | UINT32 |
Category | Mandatory |
Access | RW |
PDO Mapping | NO |
Units | -- |
Value Range | 0~4294967295 |
Default Value | 0 |
使用的流程如下:
在使用 consumer_heartbeat 功能时,主站必须要有一个非 0 的 ID,例如,在本例中,认为主站的 ID 为 127,主站产生的心跳报文的时间为 1000ms。使用 SDO 向 1016索引的 01 子索引中发送主站的 ID 和主站心跳报文的生产时间
向索引 1016h 子索引 01h(UINT32)中写入数据 03E8h(1000)
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte65 | Byte7 | |
命令 | 23h | 16h | 10h | 01h | E8h | 03h | 7Fh | 00h |
回答 | 60h | 16h | 10h | 01h |
驱动器会在收到 CAN_ID 为 700h+7Fh 的报文后,将主站刷新为在线状态,在 1000ms之内,如果没有收到新的主站的心跳报文的情况下,则认为掉线,并发出”系统故障”的报警,同时释放电机。
注意:该功能主要是用于从对于主站的监控。如需双向监控,需要与 Producer Heartbeat 功能配合使用。
四、 life guard
通过使用 life guard 功能,主节点可以检查每个节点当前的状态,当这些节点没有数据传送时尤其有意义。
Master 主节点发送远程帧(无数据)如下:
Master→Slave
COB-ID |
0x700+Node_ID(从站 ID) |
Slave 从节点发送如下报文应答
COB-ID | Byte |
0x700+Node_ID(从站 ID) | Bit7:toggle;bit6-0:状态 |
数据部分包括一个触发位(bit7),触发位必须在每次节点保护应答中交替清“0”或者置“1”。触发位在第一次节点保护请求时设置为“0”。位 0 到位 6(bit0~bit6)表示节点状态,可为下表中数值。
Value | 状态 |
0 | Boot-up:(节点首次启动) |
4 | Stopped:(节点停止) |
5 | Operational:(节点处于操作状态) |
127 | Pre-operational:(节点处于预操作状态) |
对象 0x100C: Guard Time(保护时间)
这个对象描述了主节点发送远程帧(无数据)的周期值。
Index | 0x100C |
Name | Guard Time |
Object Code | VAR |
Data Type | UINT16 |
Access | RW |
PDO Mapping | NO |
Units | ms |
Value Range | 0 |
对象 0x100D: Life Time Factor (生命因子)
这个对象描述了从节点应答主节点发送远程帧的最大时间,如果在Guard Time*Life Time Factor 这段时间内,从节点没有应答,则认为设备掉线。
Index | 0x100D |
Name | Life Time Factor |
Object Code | VAR |
Data Type | UINT8 |
Access | RW |
PDO Mapping | NO |
Units | —— |
Value Rang |
使用的流程如下:
使用 SDO 向 100Ch 索引中发送节点保护寿命时间,例如为 200ms,驱动器从站地址为 1。
向索引 100Ch 子索引 00h(INT16)中写入数据 00C8h(200)
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | |
命令 | 2Bh | 0Ch | 10h | 00h | C8h | 00h |
回答 | 60h | 0Ch | 10h | 00h |
使用 SDO 向 100Dh 索引中发送节点保护寿命时间因子,例如为5,向索引 100Dh 子索引 00h(INT16)中写入数据 5h(5)
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | |
命令 | 2Fh | 0Dh | 10h | 00h | 05h |
回答 | 60h | 0Dh | 10h | 00h |
整个寿命保护周期为200ms*5 = 1000ms。
设置完成后,主站向驱动器发送 ID 为 701 的远程帧,驱动器会回复主站一个 ID 为701的本地帧,数据内容为 Bit7:toggle;bit6-0:NMT 状态。
主站在收到驱动器的回复信息后,将该 ID 的驱动器刷新成在线的状态,主站发送了 life guard 远程帧之后,如果收不到驱动器的回复的本地帧,则可以认为驱动器掉线。同样,驱动器在整个生命周期以内,如果收不到主站发送过来的 ID 为0x700+驱动器 ID 的远程帧,则认为 CAN 总线以掉线,驱动器报“系统故障”报警,同时释放电机。
注意:life guard 为双向的,主站可以根据驱动器有无回复 life guard 问询帧来判定驱动器是否在线,驱动器也可以根据主站在生命周期时间内是否收到主站的 life guard 问询帧来判定是否与主站通信成功。
在启动了 life guard 之后,只有在驱动器接收到第一帧 life guard 问询帧之后,才会触发生命周期保护,如果在上电以后主站一直没有发送 life guard 问询帧,那么驱动器不会进入生命周期保护模式,并且不会触发报警。
消费者心跳保护报文 consumer Heartbeat 只是针对于从站查询主站是否在线,
而主站不能知道从站是否在线。并且,在使用消费者心跳保护报文 consumer Heartbeat 的时候,主站的 ID 不能为 0.(在很多 CANopen 系统中主站的 ID 为 0)。所以消费者心跳保护报文 consumer heartbeat 和生产者心跳保护报文Producer Heartbeat 可以同时使用,并且该种使用为非回复式,程序实现简单,但是实时性不高,并且需要主站一定要拥有与从站不同的 ID。另外,使用消费者心跳保护模式的时候,驱动器可以监控另外一台驱动器的状态,例如,1 号驱动器监控 2 号驱动器的心跳报文,并且,一个驱动器只能设置监控一个其余的站。
life guard 报文同时有针对主站和从站的查询机制,但是由于主站发送给从站的 life guard 问询帧为远程帧,优先级比较低,在系统通信量很大的时候可能会被滞后发送或者丢弃,只能在总线不存拥堵或者完全占满的情况下使用(负载率小于 70%)。
MOTEC依托超过十几年的运动控制设计和研发领域的专业经验,致力于为广大客户提供更加优秀的产品。我们的产品范围涵盖标准组件、模块和子系统可以为您量身定制高品质的创新产品与解决方案。MOTEC伺服驱动器及电机优秀的性能与丰富的功能是您构建自动控制不可缺少的伙伴。
以上就是本篇文章的全部内容了,感谢您的关注。