Díl 1 - Čtení segmentovaného SDO
Díl 2 - Mapování objektů do PDO
Díl 7 - Nodeguarding a Heartbeat
V této sérii článků si ukážeme práci se zařízením podporujícím protokol CANopen v prostředí programu PP2CAN. Nejprve začneme klasickou verzí CANopen protokolu a v dalších dílech se dostaneme až i k nové verzi CANopen FD. Jednotlivé dílly budou vycházet nepravidelně dle času který na ně vyšetřím. Některé základní pojmy tu nebudeme vysvětlovat, pro případné seznámení se s nimi lze využít naší starší série článků zde
Předpokladem pro práci je převodník USB2CAN nebo USB2CAN Triple společně se software PP2CAN. Díly ve kterých si ukážeme novinky ve standardu CANopen FD však budou vyžadovat použití převodníku USB2CAN Triple. Jako zařízení se kterým budeme pracovat lze použít cokoliv co CANopen podporuje avšak musí podporovat například mapování PDO. Některá zařízení nemusí změnu mapování podporovat a tak pro některé ukázky práce nejsou použitelná.
SW PP2CAN není určen přímo k návrhu celého řídícího systému nebo vlastnímu řízení. To se obvykle realizuje jinými nástroji komplexními nebo nebo přímo kódem pro PC, PLC a podobně. V prvním případě ovšem neuškodí vědět něco o pozadí jak CANopen funguje, ve druhém případě pak SW PP2CAN dobře poslouží pro "ohmatání si" zařízení a otestování postupu.
Prvním příkladem který si předvedeme bude vyčtení objektu CANopen slovníku s názvem zařízení, tedy položky ManufacturerDeviceName. Tato položka je popsána ve specifikaci CANopen takto:
|
|
Jak je vidět, datový typ je VISIBLE_STRING, proto je vhodné si program PP2CAN nastavit tak, aby kromě datových bajtů dekadicky nebo hexadecimálně zobrazoval i případné znaky či řetězce.
Jak je datový typ definován? Může obsahovat znaky hodnot 0 a nebo 20h až 7Eh. Při práci s daty je třeba pamatovat na to že není vyžadován v řetězci ukončovací znak s hodnotou 0. Vlastní data pak obsahují nejprve bajt který udává délku stringu a za ním pak vlastní string.
V programu PP2CAN si tedy otevřeme nástroj pro práci s CANopen protokolem a přepneme se na stránku SDO read. Také si nastavíme adresu zařízení se kterým pracujeme. Na obrázku je nastavena adresa Node ID 1.
Vybereme, že chceme vygenerovat na CAN bus zprávu Read Dictionary Object - tedy čtení objektu. Dle tabulky víme že objekt má hodnotu indexu 1008h. Hodnota indexu je tedy uvedena hexadecimálně, což je u CAN open protokolu standard. Chceme li v programu PP2CAN zadat hodnotu hexadecimálně, zapíšeme do pole text x1008. Hodnota je pak automaticky převedena na dekadickou hodnotu jakmile pole pro zápis ztratí focus. Hodnota subindexu tohoto objektu je 0. Zprávu s požadavkem na čtení tak máme vytvořenu a můžeme ji odeslat tlačítkem Send message. Pokud vše funguje správně, uvidíme v logu odeslaných zpráv vygenerovanou zprávu z nástroje CANopen - SDO read a v logu přijatých dat odpověď.
Na obrázku je červeně označený index 1008, modře pak subindex 0 a datová část odpovědi zeleně. Jelikož jsme si řekli, že první položkou datového typu VISIBLE_STRING je počet datových bajtů, je zřejmé že odpověď bude obsahovat 25h datových bajtů. V mém případě je program PP2CAN nastaven tak aby zobrazoval datové bajty hexadecimálně, jedná se tak o 37 bajtu (dekadicky) které následují za tímto bajtem s délkou stringu.
Abychom přečetli i zbytek dat, zasílat žádosti i o zbylé segmenty. To v tomto nástroji realizujeme tak, že aktivujeme volbu Read Dictionary Object - segment request. S každým odesláním žádosti nám zařízení odpoví další částí dat. Důležité je při každém segmentu změnit Toggle bit, jehož prostřednictvím se kontroluje, že nedošlo ke ztrátě některého segmentu. Při žádosti o první segment se používá hodnota toggle bitu 0 - nezatrženo.
Jelikož máme nastaveno zobrazení ASCII znaku, vidíme na pravé straně text který jsme vyčetli, tedy v tomto případě ManufacturerDeviceName. Protože v našem případě jsme odeslali jednu žádost navíc, zařízení odpovídá chybovou zprávou (Error/Abort) - označeno modře. Tu poznáme dle hodnoty DB0, má hexdecimální hodnotu 80h.
DB0 | DB1 | DB2 | DB3 | DB4 | DB5 | DB6 | DB7 |
Command | Index | Subindex | Additional Info | Error code | Error class | ||
80h | 08h | 10h | 00h | 01h | 00h | 04h | 05h |
Description | Error Class | Error Code | Additional Code |
---|---|---|---|
Toggle bit not alternated | 5 Service Error | 3 Parameter Inconsistent |
|
Command specifier not valid | 5 Service Error | 4 Illegal Parameter |
|
Object does not exist | 6 Access Error | 2 Object non-existent |
|
Attempt to read a write only Object | 6 Access Error | 1 Object access unsupported |
|
Attempt to write a read only Object | 6 Access Error | 1 Object access unsupported |
|
Index value is reserved for further use (00A0h-0FFFh and A000h-FFFFh) |
6 Access Error | 4 Invalid address |
|
Access failed due to hardware | 6 Access Error | 6 Hardware fault |
|
Sub-index does not exist | 6 Access Error | 9 Object attribute inconsistent |
|
Object length too high | 6 Access Error | 7 Type conflict |
|
Object length too low | 6 Access Error | 7 Type conflict |
|
Data cannot be transferred / Invalid signature | 8 Other Error | 0 |
|
Parameter value out of range | 6 Access Error | 9 Object attribute inconsistent |
|
Sub-parameter value out of range | 6 Access Error | 9 Object attribute inconsistent |
|
Maximum value < Minimum value | 6 Access Error | 9 Object attribute inconsistent |
|
Object cannot be mapped to PDO | 6 Access Error | 4 Invalid address |
|
PDO length exceeded | 6 Access Error | 4 Invalid address |
|
General internal incomptibility | 6 Access Error | 4 Invalid address |
|
Z uvedeného je zřejmé, že se jedná o chybu Command specifier not valid. V tabulce některých chybových kódů označeno červeným řádkem.
V příštím díle se podíváme jak upravit PDO mapování objektů.