CANopen之SDO,PDO


一、簡述

  CAN 總線是一種串行通信協議,具有較高的通信速率的和較強的抗干擾能力,可以作為現場總線應用於電磁噪聲較大的場合。由於

CAN 總線本身只定義ISO/OSI 型中的一層(物理層)和第二層(數據鏈路層),通常情況下 CAN 總線網絡都是獨立的網絡,所以

沒有網絡層。在實際使用中,用戶還需要自己定義應用層的協議,因此在 CAN總線的發展過程中出現了各種版本的CAN應用層協議,

現階段最流行的CAN應用層協議CANopen協議。

二、服務數據對象(SDO)

  SDO提供了直接訪問CANopen設備對象字典的入口,入口條件包括數據類型及大小;任何類型的SDO傳輸都由客戶端發起,數據

字典持有者是服務器,客戶端和服務器都可以主動中止傳輸。

  請求讀或寫的節點是客戶端節點;讀取或寫入數據的節點是服務器節點;

  讀或寫一個4字節或少於的數據,最簡單的方法是使用SDO upload/download expedited protocol 。

1、SDO Upload expedited protocol 

  在服務器節點對象字典去讀數據0xd0d1d2d3 。

  客戶端請求:

 

 

 

 

 

 例1:數據 0xFE ,對象字典節點5 ,  索引 index 0x1400, 子索引 subindex 2 

客戶端請求   : 605 40 00 14 02 00 00 00 00 

若成功,應答: 585 4F 00 14 02 FE 00 00 00

例2:數據 0x60120208 ,對象字典節點5 ,  索引 index 0x1802, 子索引 subindex 1

客戶端請求   :605 40 02 18 01 00 00 00 00 

若成功,應答:585 60 02 18 01 08 02 12 60

2、SDO Download expedited protocol

  在服務器節點對象字典去寫數據0xd0d1d2d3,(注意數據是最低有效位先寫)。

  客戶端發送:

 

 

 例1:數據 0xFE ,對象字典節點5 ,  索引 index 0x1400, 子索引 subindex 2 

客戶端請求   : 605 2F 00 14 02 FE 00 00 00

若成功,應答: 585 60 00 14 02 00 00 00 00

 例2:數據 0x60120208 ,對象字典節點5 ,  索引 index 0x1802, 子索引 subindex 1

客戶端請求   :605 23 02 18 01 08 02 12 60

若成功,應答:585 60 02 18 01 00 00 00 00

3、SDO 中止信息(SDO abort protocol )

  SDO 中止信息是主機在從機進行 SDO 通訊時,從機收到 SDO 后, 如果判斷為 SDO 需要中止,就會返回中止信息給主機。

三、過程數據對象(PDO) 

  由對象字典提供PDO數據和配置的接口,數據字典中對應的映射結構決定了一個PDO的數據類型和映射關系。如果CANopen設備

支持可變映射PDO,可通過SDO實現對PDO在數據字典中對應的配置進行修改。  

1、Transmit - PDO (TPDO)

 i :Index 1800 + n,subindex 01 ,COB_ID(通訊對象的標識符):包含CAN-ID和附加控制位的標識符

對於TPDO來說,其通信參數中的COB-ID是自身的COB-ID,當發送TPDO時用來表明這個TPDO是誰發出的。

ii :Index 1800 + n,subindex 02, 寫傳輸類型 t,

               t = 1 -- 0xF0:同步,時間觸發模式 ,每 t 一周期

               t = FD    :收到PDO請求后

               t = FE    :事件驅動(制造商指定)

               t = FF    :事件傳輸,節點自發傳輸PDO

iii:Index 1800 + n, subindex 03,抑制時間。

  如果傳輸類型設置為FE和FF,它是最小的PDO傳輸間隔,單位100us,值為0禁用抑制時間。PDO 報文需要延時 t × 100us

時間才發出,以此避免在多PDO 報文同時發出時,引起的時間沖突 。

iiii:Index 1800 + n, subindex 05,時間定時器。

  如果傳輸類型設置為FE和FF,它是PDO傳輸間隔,單位ms,值為0禁用。t =0xCB,200ms。

iiiii:Index 1A00 + n,定義映射

  subindex 0 :定義映射數量(1 byte)。值 0,映射禁用;值 01,子索引01有效;值 02,子索引01--02有效......

  subindex 1 :映射第一個參數。格式,index (2 bytes) – subindex (1 byte) – size (1 byte)

  subindex 2 :映射第二個參數。格式,index (2 bytes) – subindex (1 byte) – size (1 byte) 

 

一個例子:

605 2F 00 18 02 FF 00 00 00   --設置索引Index 1800,事件傳輸

605 2F 00 18 05 CB 00 00 00  --設置索引Index 1800,時間間隔200ms

605 2F 00 1A 00 00 00 00 00  --設置子索引禁用

605 23 00 1A 01 10 00 30 40  --0x40300010,設置映射索引0x4030,子索引00,大小0x10(16位)

605 23 00 1A 02 20 00 10 20  --0x20100020,設置映射索引0x2010,子索引00,大小0x20(32位)

605 2F 00 1A 00 02 00 00 00  --設置映射數量,用多少設多少,這里用了01--02

注意:定義映射時,先設置子索引禁用;再設置相應映射;然后設置映射數量

2、Receive - PDO (RPDO)

 i :Index 1400 + n, subindex 01 ,COB_ID(通訊對象的標識符)

對於RPDO來說,其通信參數的COB-ID是發送方的COB-ID,用來表示自己只接受某個CAN節點發過來的TPDO。

 ii :Index 1400 + n, subindex 02,寫傳輸類型 t,              

               t = 1 -- 0xF0:同步,時間觸發模式 ,每 t 一周期

               t = FD    :收到PDO請求后

               t = FE    :事件驅動(制造商指定)

               t = FF    :事件傳輸,節點自發傳輸PDO

iii:Index 1600 + n,定義映射

  subindex 0 :定義映射數量(1 byte)。值 0,映射禁用;值 01,子索引01有效;值 02,子索引01--02有效......

  subindex 1 :映射第一個參數。格式,index (2 bytes) – subindex (1 byte) – size (1 byte)

  subindex 2 :映射第二個參數。格式,index (2 bytes) – subindex (1 byte) – size (1 byte) 

 

一個例子:

605 2F 00 14 02 FF 00 00 00    --設置索引Index 1400,事件傳輸

605 2F 00 16 00 00 00 00 00  --設置子索引禁用

605 23 00 16 01 10 00 30 40  --設置映射索引0x4030,子索引00,大小0x10(16位)

605 2F 00 16 00 01 00 00 00  --設置映射數量,用多少設多少,這里用了01

注意:定義映射時,先設置子索引禁用;再設置相應映射;然后設置映射數量

 

本文鏈接:https://www.cnblogs.com/listxue/p/12826714.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM