Kapitola 5
Stručný popis protokolu CANopen
CANopen definuje objekty, které jsou přístupné nadřízené vrstvě (obvykle cílové aplikaci). Objekty se adresují čísly 0 až 65535(0xFFFF). Jednotlivé objekty mohou být logická hodnota, celé i desetiné číslo, text nebo obecné pole bajtů (tzv. DOMAIN). Dále objekt může být pole nebo struktura výše uvedených typů. K jednotlivým prvkům se potom přistupuje pomocí subindexu, přičemž subindex 0 udává počet prvků. Tato struktura se nazývá Object Dictionary a platí následující pravidla:
0x0000 ... 0x0FFF | Reservováno pro definici typů; při komunikaci se nepoužívá |
0x1000 ... 0x1FFF | Mají přesně daný význam a definují zejména, jak se data (hodnoty objektů v Object Dictionary) předávají po sběrnici CAN mezi jednotlivými stanicemi. |
0x2000 ... 0x5FFF | mohou se libovolně použít aplikací |
0x6000 ... 0xFFFF | jsou definovány aplikačním profilem; pokud například zařízení podporuje profil DS402(servozesilovače, řízení motorů) pak je 0x6040 řídící slovo(s přesně daným významem jednotlivých bitů), 0x6063 aktuální poloha, atd. |
Povinná část obsahuje následující objekty(jde je o základní sadu; pozdější rozšíření specifikace doplňuje například objekty pro multiplexed-PDO nebo konzoli operačního systému):
Index (hex) | Object type | Name | Data type | Acc | M/O |
1000 | VAR | device type | UNSIGNED32 | ro | M |
1001 | VAR | error register | UNSIGNED8 | ro | M |
1002 | VAR | manufacturer status register | UNSIGNED32 | ro | O |
1003 | ARRAY | pre-defined error field | UNSIGNED32 | ro | O |
1004 | - | reserved for compatibility reasons | - | - | - |
1005 | VAR | MESSAGE-ID SYNC | UNSIGNED32 | rw | O |
1006 | VAR | communication cycle period | UNSIGNED32 | rw | O |
1007 | VAR | synchronous window length | UNSIGNED32 | rw | O |
1008 | VAR | manufacturer device name | Vis-String | const | O |
1009 | VAR | manufacturer hardware version | Vis-String | const | O |
100A | VAR | manufacturer software version | Vis-String | const | O |
100B | - | reserved for compatibility reasons | - | - | - |
100C | VAR | guard time | UNSIGNED16 | rw | O |
100D | VAR | life time factor | UNSIGNED8 | rw | O |
100E | - | reserved for compatibility reasons | - | - | - |
100F | - | reserved for compatibility reasons | - | - | - |
1010 | ARRAY | store parameters | UNSIGNED32 | rw | O |
1011 | ARRAY | restore default parameters | UNSIGNED32 | rw | O |
1012 | VAR | MESSAGE-ID TIME | UNSIGNED32 | rw | O |
1013 | VAR | high resolution time stamp | UNSIGNED32 | rw | O |
1014 | VAR | MESSAGE-ID EMCY | UNSIGNED32 | rw | O |
1015 | VAR | Inhibit Time EMCY | UNSIGNED16 | rw | O |
1016 | ARRAY | Consumer heartbeat time | UNSIGNED32 | rw | O |
1017 | VAR | Producer heartbeat time | UNSIGNED16 | rw | O |
1018 | RECORD | Identity Object | Identity(23h) | ro | M |
1019 .. 11FF | - | reserved for future extension | - | - | - |
1200 .. 127F | RECORD | 1st to 128th Server SDO parameter | SDO Parameter(22h) | ro | O |
1280 .. 12FF | RECORD | 1st to 128th Client SDO parameter | SDO Parameter(22h) | ro | O |
1300 .. 13FF | - | reserved for future extension | - | - | - |
1400 .. 15FF | RECORD | 1st to 512th receive PDO Parameter | PDO CommPar(20h) | rw | M/O |
1600 .. 17FF | RECORD | 1st to 512th receive PDO mapping | PDO Mapping(21h) | rw | M/O |
1800 .. 19FF | RECORD | 1st to 512th transmit PDO Parameter | PDO CommPar(20h) | rw | M/O |
1A00 .. 1BFF | RECORD | 1st to 512th transmit PDO mapping | PDO Mapping(21h) | rw | M/O |
- PDO CommPar(20h)
1 UNSIGNED32 MessageID pokud je nahozen bit29 jde o 29bitové MessageID, pokud je nahozen bit31, MessageID je neplatné
2 UNSIGNED8 transmision type 1 až 240 posílá se cyklicky a synchroně se SYNC packetem, číslo značí po kolika SYNC packetech jdou data, ostatní jsou necyklické režimy (v CanDrv některé nefungují)
3 UNSIGNED16 inhibit time doba ve 100us po kterou je zablokováno vyslání PDO od jeho předchozího vyslání (tj. minimální perioda v necyklickém režimu)
4 UNSIGNED8 reserved -
5 UNSIGNED16 event timer v CanDrv se nepoužívá
- PDO Mapping(21h)
1 .. 40 UNSIGNED32 1st to 64th object to be mapped po řadě index(U16), subindex(U8), počet bitů v PDO(U8)
- PDO Parameter(22h)
1 UNSIGNED32 MessageID client->server -
2 UNSIGNED32 MessageID server->client -
3 UNSIGNED8 NodeID číslo stanice (NodeID), se kterou se komunikuje
6-255 SIGNED64 SDOmapping rozšíření REX - po rade perioda v milisekundách(U16), místní index(U16), vzdálený index(U16), místní subindex(U8), vzdálený index(U8)
Data mezi jednotlivými stanicemi se vyměňují buď mechanismem SDO(Service Data Object) nebo mechanismem PDO(Process Data Object). Mechanismus SDO funguje tak, že jedna strana (tzv. client) pošle dotaz, ve kterém je index a subindex objektu a pokud je to zápis, tak i zapisovaná hodnota. Druhá strana (tzv. server) přijme požadavek a odpoví požadovanou hodnotu (resp. zapíše hodnotu a pošle potvrzení) nebo chybový kód. Pokud se data nevejdou do jednoho packetu/zprávy (tj. pokud jsou delší než 4byte), rozdělí se na více zpráv. Message ID pro SDO zprávy definují objekty 0x1200 až 0x127F (každý objekt pro jednu stanici, tj. tímto způsobem lze komunikovat s až 128 stanicemi) pro server a 0x1280 až 0x12FF pro klienta.
Mechanismus PDO funguje tak, že data (opravdu jen vlastní data bez dalších údajů) z několika objektů jsou poskládána do jedné zprávy a odeslána. Přijímací strana pozná podle Message ID co je to za data a nastaví je do příslušných objektů (obecně i obvykle jsou to jiné objekty než na vysílací straně). Takovýchto PDO přenosů (vysílacích i přijímaných) může být definováno na každé stanici více (až 512 - viz popis object dictionary, ale některá zařízení podporují méně nebo je mají nastaveny napevno). Pro nastavení Message ID ,periody a dalších parametrů vysílaných PDO slouží objekty/parametry 0x1800 až 0x19FF, přičemž pořadí hodnot ve zprávě (tj. hodnoty kterých objektů z object dictionary se posílají) určují objekty/parametry 0x1A00 až 0x1BFF, tj. 1.PDO má parametry v objektu 0x1800 a přiřazení hodnot v objektu 0x1A00, 2.PDO má parametry v objektu 0x1801 a přiřazení hodnot v objektu 0x1A01, atd. Pro přijímaná PDO se totéž definuje v objektech 0x1400 až 0x15FF a 0x1600 až 0x17FF.
V předchozím textu bylo ukázáno, jak se v CANopen definují různé zprávy. V zásadě lze pro každý typ zprávy definovat Message ID libovolně, jen je potřeba dodržet pravidlo, že dvě stanice nesmí vysílat stejné Message ID. Aby se toto usnadnilo, jsou některé hodnoty pro daný účel dopručené/implicitní a některé zakázané. Situaci shrnuje následující tabulka:
Typ zprávy | MessageID | poznámka |
NMT | 0 | nelze změnit |
- | 1 | rezervováno pro pozdější použití |
SYNC | 128(0x80) | lze změnit v objektu 0x1005 |
EMERGENCY | 128(0x80)+<NodeID> | lze změnit v objektech 0x1014, 0x1015 |
TIMESTAMP | 256(0x100) | lze změnit v objektech 0x1012, 0x1013 |
- | 256(0x100)+<NodeID> | rezervováno pro pozdější použití |
PDO1(tx) | 384(0x180)+<NodeID> | nastavení viz text |
PDO1(rx) | 512(0x200)+<NodeID> | nastavení viz text |
PDO2(tx) | 640(0x280)+<NodeID> | nastavení viz text |
PDO2(rx) | 768(0x300)+<NodeID> | nastavení viz text |
PDO3(tx) | 896(0x380)+<NodeID> | nastavení viz text |
PDO3(rx) | 1024(0x400)+<NodeID> | nastavení viz text |
PDO4(tx) | 1152(0x480)+<NodeID> | nastavení viz text |
PDO4(rx) | 1280(0x500)+<NodeID> | nastavení viz text |
SDO(tx) | 1408(0x580)+<NodeID> | rezervováno; nesmí se používat k jiným účelům |
SDO(rx) | 1537(0x600)+<NodeID> | rezervováno; nesmí se používat k jiným účelům |
- | 1760(0x6E0) | rezervováno pro pozdější použití |
NMT Error | 1793(0x700)+<NodeID> | rezervováno; nesmí se používat k jiným účelům; |
Control | lze změnit v objektech 0x1016, 0x1017 | |
- | 2020(0x780) | reservováno pro pozdější použití |
- | 2020(0x780)+<NodeID> | reservováno pro pozdější použití |
Detailní popis všech objektů, formát SDO packetů a pod. je ve specifikaci CANopen (v souboru 301_v04000201.pdf).
[Předchozí] [Na začátek] [Výše] [Další]