工控应用中,常常会遇到一些设备:电机或者其他传感器需要通过Can 这个硬件接口来通信,而且往往通信协议都是走的都是Canopen协议。自己当初搞的时候对协议也是云里雾里,为了大家不走歪路,早日走上人生巅峰,这里通过一个比较的例子(直接抓取Can总线上的报文)来理解canopen协议.
canopen协议 的话,文档方便大家可以去看CIA 301的文档,电机控制类的同学还需要看一下cia402 和厂家的canopen协议文档。
设备上电/复位后 ,完成自身硬件初始化后,会发出bootup报文
从而进入 图片中的Pre-operational状态,主机接收到这个报文,他就知道,喔,总线上有一个设备上线了,于是它就会通过SDO(Service data object)去配置一些东西,例如配置一下设备的PDO,然后才会通过NMT报文去切换设备的状态
我们这边先了解一下canopen的NMT 网络管理,下面这张图就是从cia301文档上面截下来的。
canopen的设备会有这几种状态,主机有权利根据实际情况去控制设备的状态。那怎么控制了?
答案就是通过NMT 协议。
可能有小伙伴要问了,这个网络管理(NMT)在canoepn里面有啥用呢?
用一句通俗易懂的话来解释:
就是NMT网络管理控制着设备的状态,从而决定了该设备能使用网络的功能。可以看下CIA301文档的这图
这张图很清晰的解释了这种情况。像有时候面试的时候,面试官可能会问,PDO在那个状态能通信啊 ,SDO在是不是所有状态下都能通信啊?
看了这张图就能明白,PDO只能在设备处于Operational的状态下才能通信,SDO只有stoped状态下不能通信。
这也解释了上文提到的,设备发出bootup报文后进入Pre_operation状态后,我们主机需要用SDO去配置一些东西。
这边给一张can总线上的报文抓取图。设备为某个品牌的伺服电机
0 00000 01->06 8 2B 40 60 00 06 00 00 00 15.746900 R
0 00000 80->00 0 15.746900 R
0 00000 81->05 8 60 40 60 00 00 00 00 00 15.749880 R
0 00000 01->06 8 2B 40 60 00 07 00 00 00 15.751080 R
0 00000 81->05 8 60 40 60 00 00 00 00 00 15.752700 R
0 00000 01->06 8 2B 40 60 00 0F 01 00 00 15.753980 R
0 00000 81->05 8 60 40 60 00 00 00 00 00 15.755770 R
0 00000 80->00 0 15.756620 R
0 00000 01->06 8 2F 60 60 00 03 00 00 00 15.756970 R
0 00000 81->05 8 60 60 60 00 00 00 00 00 15.759780 R
0 00000 01->06 8 23 FF 60 00 00 00 00 00 15.760980 R
0 00000 81->05 8 60 FF 60 00 00 00 00 00 15.763540 R
0 00000 01->06 8 23 83 60 00 50 02 00 00 15.764730 R
0 00000 80->00 0 15.766610 R
0 00000 81->05 8 60 83 60 00 00 00 00 00 15.767550 R
0 00000 01->06 8 23 84 60 00 50 02 00 00 15.768740 R
0 00000 81->05 8 60 84 60 00 00 00 00 00 15.771560 R
0 00000 01->06 8 2B 40 60 00 0F 01 00 00 15.772750 R
0 00000 81->05 8 60 40 60 00 00 00 00 00 15.774890 R
0 00000 01->06 8 23 00 18 01 80 01 00 80 15.776080 R
0 00000 80->00 0 15.776680 R
0 00000 81->05 8 60 00 18 01 00 00 00 00 15.779920 R
0 00000 01->06 8 2F 00 18 02 0A 00 00 00 15.781120 R
0 00000 81->05 8 60 00 18 02 00 00 00 00 15.783250 R
0 00000 01->06 8 2F 00 1A 00 00 00 00 00 15.784530 R
0 00000 81->05 8 60 00 1A 00 00 00 00 00 15.786580 R
0 00000 80->00 0 15.786660 R
0 00000 01->06 8 23 00 1A 01 10 00 3F 60 15.787940 R
0 00000 81->05 8 60 00 1A 01 00 00 00 00 15.789900 R
0 00000 01->06 8 23 00 1A 02 10 00 41 60 15.791270 R
0 00000 81->05 8 60 00 1A 02 00 00 00 00 15.793230 R
0 00000 01->06 8 23 00 1A 03 10 00 0B 70 15.794600 R
0 00000 81->05 8 60 00 1A 03 00 00 00 00 15.796560 R
0 00000 80->00 0 15.796650 R
0 00000 01->06 8 23 00 1A 04 08 00 61 60 15.797930 R
0 00000 81->05 8 60 00 1A 04 00 00 00 00 15.799890 R
0 00000 01->06 8 2F 00 1A 00 04 00 00 00 15.801250 R
0 00000 81->05 8 60 00 1A 00 00 00 00 00 15.803300 R
0 00000 01->06 8 23 00 18 01 80 01 00 00 15.804580 R
0 00000 81->05 8 60 00 18 01 00 00 00 00 15.806630 R
0 00000 80->00 0 15.806720 R
0 00000 01->06 8 23 01 18 01 80 02 00 80 15.808000 R
0 00000 81->05 8 60 01 18 01 00 00 00 00 15.809960 R
0 00000 01->06 8 2F 01 18 02 01 00 00 00 15.811320 R
0 00000 81->05 8 60 01 18 02 00 00 00 00 15.813290 R
0 00000 01->06 8 2F 01 1A 00 00 00 00 00 15.814650 R
0 00000 81->05 8 60 01 1A 00 00 00 00 00 15.816610 R
0 00000 80->00 0 15.816700 R
0 00000 01->06 8 23 01 1A 01 10 00 09 70 15.817980 R
0 00000 81->05 8 60 01 1A 01 00 00 00 00 15.820030 R
0 00000 01->06 8 23 01 1A 02 20 00 0A 70 15.821310 R
0 00000 81->05 8 60 01 1A 02 00 00 00 00 15.823360 R
0 00000 01->06 8 2F 01 1A 00 02 00 00 00 15.824640 R
0 00000 81->05 8 60 01 1A 00 00 00 00 00 15.826680 R
0 00000 80->00 0 15.826770 R
0 00000 01->06 8 23 01 18 01 80 02 00 00 15.827960 R
0 00000 81->05 8 60 01 18 01 00 00 00 00 15.830010 R
0 00000 01->06 8 23 02 18 01 80 03 00 80 15.831290 R
0 00000 81->05 8 60 02 18 01 00 00 00 00 15.833340 R
0 00000 01->06 8 2F 02 18 02 02 00 00 00 15.834620 R
0 00000 81->05 8 60 02 18 02 00 00 00 00 15.836670 R
0 00000 80->00 0 15.836670 R
0 00000 01->06 8 2F 02 1A 00 00 00 00 00 15.837950 R
0 00000 81->05 8 60 02 1A 00 00 00 00 00 15.840000 R
0 00000 01->06 8 23 02 1A 01 10 00 78 60 15.841280 R
0 00000 81->05 8 60 02 1A 01 00 00 00 00 15.843320 R
0 00000 01->06 8 23 02 1A 02 10 00 03 70 15.844600 R
0 00000 81->05 8 60 02 1A 02 00 00 00 00 15.846650 R
0 00000 80->00 0 15.846740 R
0 00000 01->06 8 23 02 1A 03 10 00 0F 70 15.848020 R
0 00000 81->05 8 60 02 1A 03 00 00 00 00 15.849980 R
0 00000 01->06 8 2F 02 1A 00 03 00 00 00 15.851340 R
0 00000 81->05 8 60 02 1A 00 00 00 00 00 15.853390 R
0 00000 01->06 8 23 02 18 01 80 03 00 00 15.854670 R
0 00000 80->00 0 15.856640 R
0 00000 81->05 8 60 02 18 01 00 00 00 00 15.856720 R
0 00000 01->06 8 23 03 18 01 80 04 00 80 15.858090 R
0 00000 81->05 8 60 03 18 01 00 00 00 00 15.860050 R
0 00000 01->06 8 2F 03 18 02 FE 00 00 00 15.861410 R
0 00000 81->05 8 60 03 18 02 00 00 00 00 15.863380 R
0 00000 01->06 8 23 03 18 01 80 04 00 00 15.864740 R
0 00000 80->00 0 15.866620 R
0 00000 81->05 8 60 03 18 01 00 00 00 00 15.866790 R
0 00000 01->06 8 23 00 14 01 00 02 00 80 15.868070 R
0 00000 81->05 8 60 00 14 01 00 00 00 00 15.870120 R
0 00000 01->06 8 2F 00 14 02 64 00 00 00 15.871400 R
0 00000 81->05 8 60 00 14 02 00 00 00 00 15.873450 R
0 00000 01->06 8 2F 00 16 00 00 00 00 00 15.874730 R
0 00000 80->00 0 15.876600 R
0 00000 81->05 8 60 00 16 00 00 00 00 00 15.876770 R
0 00000 01->06 8 23 00 16 01 20 00 83 60 15.878050 R
0 00000 81->05 8 60 00 16 01 00 00 00 00 15.880100 R
0 00000 01->06 8 23 00 16 02 20 00 84 60 15.881380 R
0 00000 81->05 8 60 00 16 02 00 00 00 00 15.883430 R
0 00000 01->06 8 2F 00 16 00 02 00 00 00 15.884710 R
0 00000 80->00 0 15.886670 R
0 00000 81->05 8 60 00 16 00 00 00 00 00 15.886760 R
0 00000 01->06 8 23 00 14 01 00 02 00 00 15.888120 R
0 00000 81->05 8 60 00 14 01 00 00 00 00 15.890090 R
0 00000 01->06 8 23 01 14 01 00 03 00 80 15.891370 R
0 00000 81->05 8 60 01 14 01 00 00 00 00 15.893410 R
0 00000 01->06 8 2F 01 14 02 01 00 00 00 15.894690 R
0 00000 80->00 0 15.896660 R
0 00000 81->05 8 60 01 14 02 00 00 00 00 15.896740 R
0 00000 01->06 8 2F 01 16 00 00 00 00 00 15.898110 R
0 00000 81->05 8 60 01 16 00 00 00 00 00 15.900070 R
0 00000 01->06 8 23 01 16 01 20 00 FF 60 15.901350 R
0 00000 81->05 8 60 01 16 01 00 00 00 00 15.903400 R
0 00000 01->06 8 2F 01 16 00 01 00 00 00 15.904760 R
0 00000 80->00 0 15.906640 R
0 00000 81->05 8 60 01 16 00 00 00 00 00 15.906730 R
0 00000 01->06 8 23 01 14 01 00 03 00 00 15.908090 R
0 00000 81->05 8 60 01 14 01 00 00 00 00 15.910050 R
0 00000 01->06 8 23 02 14 01 00 04 00 80 15.911420 R
0 00000 81->05 8 60 02 14 01 00 00 00 00 15.913380 R
0 00000 01->06 8 2F 02 14 02 01 00 00 00 15.914750 R
0 00000 80->00 0 15.916620 R
0 00000 81->05 8 60 02 14 02 00 00 00 00 15.916800 R
0 00000 01->06 8 2F 02 16 00 00 00 00 00 15.918080 R
0 00000 81->05 8 60 02 16 00 00 00 00 00 15.920040 R
0 00000 01->06 8 23 02 16 01 10 00 40 60 15.921400 R
0 00000 81->05 8 60 02 16 01 00 00 00 00 15.923450 R
0 00000 01->06 8 2F 02 16 00 01 00 00 00 15.924730 R
0 00000 80->00 0 15.926610 R
0 00000 81->05 8 60 02 16 00 00 00 00 00 15.926780 R
0 00000 01->06 8 23 02 14 01 00 04 00 00 15.928060 R
0 00000 81->05 8 60 02 14 01 00 00 00 00 15.930110 R
0 00000 01->06 8 2B 00 23 03 96 00 00 00 15.931390 R
0 00000 81->05 8 60 00 23 03 00 00 00 00 15.933440 R
0 00000 01->06 8 2F 00 23 04 06 00 00 00 15.934720 R
0 00000 80->00 0 15.936680 R
0 00000 81->05 8 60 00 23 04 00 00 00 00 15.936760 R
0 00000 01->06 8 2F 00 23 02 01 00 00 00 15.938040 R
0 00000 81->05 8 60 00 23 02 00 00 00 00 15.940090 R
主机通过SDO开始去配置一些我们想要设置的东西。这部分涉及SDO下回讲吧