CANopen伺服控制-服務(wù)數(shù)據(jù)對象(SDO)詳細(xì)解析
CANopen服務(wù)數(shù)據(jù)對象(SDO)詳細(xì)解析
SDO“服務(wù)數(shù)據(jù)對象”允許對對象字典進(jìn)行讀或?qū)懺L問。數(shù)據(jù)服務(wù)對象,以下簡稱SDO
在下文中,對象字典的所有者稱為“服務(wù)器/主機(jī)”; 想要請求或?qū)懭霐?shù)據(jù)的CAN節(jié)點(diǎn)稱為“客戶端/從機(jī)”。 “上載”是指從對象字典中讀取對象的值。 “下載”是指在對象字典中寫入值。 此外,圖中使用以下縮寫:
- <IDX>:要在對象字典中讀取或?qū)懭氲膶ο蟮乃饕?;索引的LSB在這里的字節(jié)1中。示例:控制器的statusword有索引6041h;然后用41h寫入字節(jié)1,用60h寫入字節(jié)2。通過快速傳輸,SDO應(yīng)答包含與請求相同的索引
?
- <SUBIDX>:對象字典中從00h到FFh的對象的子索引。對于快速傳輸,控制器的SDO消息的應(yīng)答也包含請求的子索引。
用于配置控制器。如果在運(yùn)行過程中需要周期性地交換數(shù)據(jù),使用PDO類型的CANopen消息更有意義(參見Process Data Object小節(jié))。
SDO傳輸分為三種類型的訪問:
- “快速傳輸”用于傳輸最多四個字節(jié)的對象。
- “正常傳輸”用于傳輸任意數(shù)量的字節(jié),從而確認(rèn)每個CAN消息
- 個別地。
- “塊傳輸”也適用于任何字節(jié)數(shù);這里,一個給定的CAN票據(jù)塊被立即確認(rèn)。
向CAN-ID 600h+節(jié)點(diǎn)ID發(fā)送SDO消息,答案來自CAN-ID 580h+節(jié)點(diǎn)ID。
Expedited Transfer 快速轉(zhuǎn)移
此方法用于在對象字典中寫入(下載)或讀?。ㄉ陷d)類型為(UN)SIGNED8、INTEGER16或INTEGER32的對象中的值。此服務(wù)已確認(rèn),即每個訪問都用數(shù)據(jù)、確認(rèn)或錯誤消息進(jìn)行應(yīng)答。
?SDO下載(SDO寫)
用于在服務(wù)器的對象字典中寫入數(shù)據(jù)的快速SDO消息的結(jié)構(gòu)如下:
在此,<CMD>字節(jié)取決于要寫入的數(shù)據(jù)的長度。 <CMD>可以是以下值之一:
■1字節(jié)數(shù)據(jù)長度:2Fh
■2字節(jié)數(shù)據(jù)長度:2Bh
■3字節(jié)數(shù)據(jù)長度:27h
■4字節(jié)數(shù)據(jù)長度:23h
<Data>字段是用要寫入的數(shù)據(jù)寫入的;數(shù)據(jù)的LSB是在字節(jié)4中輸入的。服務(wù)器的回答是確認(rèn)寫入操作或錯誤消息(消息結(jié)構(gòu):參見下圖)。在后一種情況下,錯誤原因也會隨數(shù)據(jù)一起發(fā)送(請參見SDO錯誤消息一節(jié)中的SDO錯誤消息列表)。
示例:使用以下命令將控制器的對象607Ah:00h(目標(biāo)位置,SIGNED32)設(shè)置為值3E8h(= 1000d)
節(jié)點(diǎn)ID 3:
603 | 23 7A 60 00 E8 03 00 00
哪里
■字節(jié)1(23h):SDO加速下載,4字節(jié)數(shù)據(jù)(SIGNED32)
■字節(jié)2和3(7Ah 60h):對象的索引為607Ah
■字節(jié)4(00h):對象的子索引為00h
■字節(jié)5至8(E8h 03h 00h 00h):對象的值:000003E8h
如果成功,則控制器以以下消息響應(yīng):
583 | 60 7A 60 00 00 00 00 00
SDO upload(SDO讀)
用于從對象字典中讀取對象的CAN消息具有以下結(jié)構(gòu):
服務(wù)器用以下消息之一響應(yīng):
數(shù)據(jù)的長度在返回的<CMD>中:
■1字節(jié)數(shù)據(jù)長度:4Fh
■2字節(jié)數(shù)據(jù)長度:4Bh
■3字節(jié)數(shù)據(jù)長度:47h
■4字節(jié)數(shù)據(jù)長度:43h
數(shù)據(jù)的LSB再次位于此處的字節(jié)4中。
發(fā)生錯誤時,還會在數(shù)據(jù)中指定錯誤原因(請參見SDO錯誤消息中的SDO錯誤消息列表)。
示例:要從對象字典中讀取“狀態(tài)字”對象(6041h:00),只需發(fā)送以下消息(始終為8個字節(jié))即可:
603 | 40 41 60 00 00 00 00 00
控制器通常會響應(yīng)以下消息:
583 | 4B 41 60 00 40 02 00 00
?
解析?
字節(jié)1(4Bh):SDO加速上傳,2字節(jié)數(shù)據(jù)(無符號16)
字節(jié)2和3(41h 60h):對象索引為6041h
字節(jié)4(00h):對象的子索引為00h
字節(jié)5到6(40h 02h):對象值:0240h
字節(jié)7至8(00h 2h h h):空。SDO消息總是由8個字節(jié)組成。
?正常傳輸
CANopen“快速”傳輸限制為最多4個字節(jié);若要超過此限制,必須支持所謂的“正常傳輸”。在這種類型的傳輸中,多個消息的內(nèi)容根據(jù)內(nèi)容分組在一起;這樣的消息塊在下文中稱為“傳輸”。傳輸中的每個消息都在這里單獨(dú)確認(rèn)。
在生成文檔時,這僅對“String”類型的對象是必需的。由于字符串具有“只讀”訪問限制,因此不需要下載SDO;因此本文檔僅討論SDO上載。
缺乏對主機(jī)的“正常調(diào)動”的支持
如果控制器由不支持“正常傳送”的主站操作,則使用
String數(shù)據(jù)類型也可以用另一種方式處理:每個字符串可以一個字符一個字符地讀出
將SDO上傳到子索引1和后續(xù)的子索引。
示例:要讀取對象6505h(http驅(qū)動器目錄地址)。如果主機(jī)支持“正常傳輸”,那么就可以開始上傳子索引為00的對象;控制器會自動切換轉(zhuǎn)到“正常傳輸”。如果主機(jī)只支持“快速傳輸”,則可以使用對象6505h:01、6505h:02、6505h:03等逐字符讀取字符串
?
SDO上傳
下圖顯示了“SDO上載”的過程(客戶機(jī)請求將對象的內(nèi)容發(fā)送給它)。傳輸分為兩個階段:初始化階段和傳輸階段。
與“快速傳輸”一樣,上傳從客戶端向服務(wù)器發(fā)送“ Init SDO Update”開始
(請參見下圖)。
正常傳輸”的答案不包含以<CMD>編碼的要接收的字節(jié)數(shù)。 而是在數(shù)據(jù)范圍中輸入它,如下圖在<DATA LENGTH>區(qū)域中所示。
初始化由此結(jié)束。 剩下的就是數(shù)據(jù)的上傳。 使用以下SDO請求來請求數(shù)據(jù)包:
?命令<CMD>的字節(jié)0的結(jié)構(gòu)如下:
名稱為t的位與每個請求交替(“切換位”)。 即使先前的傳輸已中止,它也會從0開始每次傳輸。 控制器用數(shù)據(jù)響應(yīng)上述消息,消息結(jié)構(gòu)如下:
?
這些位在這里具有以下含義:
t(切換位)
該位與每個消息序列交替; 它在“請求”和“響應(yīng)”之間的順序內(nèi)不變。
n(字節(jié)數(shù))
這三個位指定不包含數(shù)據(jù)的字節(jié)數(shù)。 示例:如果位2和1設(shè)置為0,位3設(shè)置為1,則011b = 03d字節(jié)無效。 反過來,這意味著字節(jié)1到字節(jié)4包含
允許的值和字節(jié)5至字節(jié)7應(yīng)該被忽略。
c(更多細(xì)分)
如果沒有進(jìn)一步的SDO段發(fā)送,并且這是最后一個段,則該位設(shè)置為1。
示例:在本示例中,將讀取“制造商軟件版本”對象(100Ah)。 在此示例中,該節(jié)點(diǎn)的節(jié)點(diǎn)ID為3。下表列出了相應(yīng)的SDO消息序列。 待讀取的字符串因控制器而異。
46 49 52 2D 76 31 37 34 38 2D 42 35 33 38 36 36 32
這對應(yīng)于字符串:“ FIR-v1748-B538662
服務(wù)器和客戶端都有權(quán)隨時中止當(dāng)前傳輸。為此,必須發(fā)送“Abort SDO Transfer”;如下所示。
收到消息后,SDO傳輸被視為結(jié)束; 服務(wù)未確認(rèn)。 然后必須從頭開始新的SDO傳輸。 <ERROR CODE>的傳送是可選的; 控制器不評估代碼。
SDO錯誤消息
如果出現(xiàn)錯誤,則還會在數(shù)據(jù)區(qū)中發(fā)送一個指定錯誤原因的錯誤編號。
?
?
錯誤代碼說明
05030000h切換位未更改:僅對“正常傳輸”或“塊傳輸”有效。每次傳輸后將交替顯示的位未更改其狀態(tài)。
05040001h命令說明符未知:數(shù)據(jù)塊的字節(jié)0包含不允許的命令。
06010000h不支持的訪問:如果通過EtherCAT(CoE)上的CAN請求“完全訪問”(不支持。)
06010002h只讀條目:試圖寫入常量或只讀對象。
06020000h對象不存在:試圖訪問不存在的對象(索引不正確)。
06040041h無法對pdo進(jìn)行對象映射:試圖在PDO中映射不允許的對象。
06040042h映射的pdo超出pdo:如果將所需對象附加到PDO映射,則將超出PDO映射的8個字節(jié)。
06070012h參數(shù)長度太長:試圖寫入數(shù)據(jù)過多的對象;例如,對于類型為Unsigned8的對象,<CMD> = 23h(4個字節(jié)),
<CMD> = 2Fh將是正確的。
06070013h參數(shù)長度太短:試圖寫入數(shù)據(jù)太少的對象;例如,對于類型為Unsigned32的對象,<CMD> = 2Fh(1個字節(jié)),
<CMD> = 23h是正確的。
06090011h子索引不存在:試圖訪問對象的無效子索引;另一方面,索引將存在。
06090031h值太大:某些對象的值大小受到限制;在這種情況下,嘗試將一個太大的值寫入該對象。
例如,1003h:00的“預(yù)定義錯誤字段:錯誤數(shù)量”對象只能設(shè)置為值“ 0”;所有其他數(shù)值都會導(dǎo)致此錯誤。
06090032h值太?。耗承ο蟮闹荡笮∈艿较拗啤T谶@種情況下,試圖寫一個對對象來說太小的值。
08000000h一般錯誤:不屬于任何其他類別的一般錯誤。
08000022h在這種狀態(tài)下不能讀取或存儲數(shù)據(jù):PDO的參數(shù)只能在“已停止”或“運(yùn)行前”狀態(tài)下更改。寫入權(quán)限
在“運(yùn)行”狀態(tài)下,不允許對象1400h至1407h,1600h至1607h,1800h至1807h和1A00h至1A07h。
?
*譯文可能有部分出入,建議直接閱讀以下英文原版