CANopen
CANopen是一種架構在控制器區域網路（Controller Area Network, CAN）上的高層通訊協定，包括通訊子協定及設備子協定常在嵌入式系統中使用，也是工業控制常用到的一種現場總線。
CANopen實作了OSI模型中的網路層以上（包括網路層）的協定。CANopen標準包括定址方案、數個小的通訊子協定及由設備子協定所定義的應用層。CANopen支援網路管理、設備監控及節點間的通訊，其中包括一個簡易的傳輸層，可處理資料的分段傳送及其組合。一般而言資料鏈結層及實體層會用CAN來實作。除了CANopen外，也有其他的通訊協定（如POWERLINK及EtherCAT）實作CANopen的設備子協定。
基本的CANopen設備及通訊子協定定義在CAN in Automation (CiA) draft standard 301.。針對個別設備的子協定以CiA 301為基礎再進行擴充。如針對I/O模組的CiA401及針對運動控制的CiA402。
以下是所有CANopen設備都要具備的功能：CANopen設備都需要具備物件字典，用來設定設備組態及進行非即時的通訊。物件字典的entry定義如下：
在CANopen標準中定義了物件字典中的基本資料型態，包括邏輯值、整數及浮點數。也定義了複合物件：如陣列、記錄及字串。複合物件用一個8位元的數值作為其子索引（subindex）。記錄或陣列中子索引0的位置記錄此資料結構的元素個數，資料型態為UNSIGNED8。
例如在CiA301標準中，設備通訊的參數放在索引範圍0x1000 - 0x1FFF（通訊行規區）。此區域的前幾項如下：
若配合適當的工具，可以用編輯電子資料表（electronic data sheet, EDS)檔案的方式規劃一個設備，並且將變數的數值上傳到設備中。EDS檔案的格式通常會是INI檔。
CANopen的物理層CANbus每次傳送的資料量不大，其中包括11位元的ID、遠端傳輸請求（RTR）位元及大小不超過8位元組的資料。CANopen將CANbus 11位元的ID分為4位元的功能碼及7位元的CANopen節點ID。7位元的ID共有128種不同的組合，其中ID 0不使用，因此一個CANopen網路上最多允許127台設備。CANbus在CAN 2.0 B規格中允許29位元的ID，因此若配合CAN 2.0 B使用，CANopen網路上可以超過127台設備，不過在實際運用中，大多數的CANopen網路上設備數量均低於此數值。
CANopen將CANbus的11位元ID稱為通訊物件ID（COB-ID）。當傳輸資料出現碰撞時，CANbus的仲裁機制會使COB-ID最小的訊息繼續傳送，不用等待或重傳。COB-ID的前4個位元是CANopen的功能碼，因此數值小的功能碼表示對應的功能重要，允許的延遲時間較短。
以下是一個標準的CANopen頁框（frame）：
在CANopen標準中，部份COB-ID被保留作網路管理及SDO通訊用。而在設備初始化後，有些功能碼和COB-ID會對映到標準的功能，不過後續仍可以規劃為其他用途。
CANopen設備間的通訊可分為以下三種通訊模型。
NMT（網路管理, Network management）协议是用来发布（設備內部）狀態機的狀態變更命令（如啟動設備或停止設備）、以及监测遠端設備启动及故障情形。
NMT master使用的模組控制協定可變更設備的狀態。其COB-ID為0，其功能碼及節點ID均為0，因此網路上的所有節點均會處理這個訊息。在此訊息的資料部份會有此訊息實際針對節點的ID，此ID也可為0，表示所有節點都要變更為指定的狀態。
心跳協定（Heartbeat protocol）是用心跳機制來監控網路中的節點及確認其正常工作。心跳訊息的生產者（一般是slave設備）週期性的送出功能碼1110、ID為本身節點ID的訊息，訊息的資料部份有一個表示節點狀態的位元。而心跳訊息的消費者負責接收上述資料，若在指定時間（於設備的物件字典中定義）內，消費者均未收到訊息，可採取相關行動（例如顯示錯誤或重置該設備）。
其格式為：
CANopen設備需要在bootup時自動從Initializing狀態切換至Pre-operational狀態，設備會在切換完成後送出一個心跳訊息，這就是心跳協定。
有一種pull model的NMT協定，稱作節點監控（Node guarding）協定，也可以作從機的監控。
服務資料物件（SDO）可用來存取遠端節點的物件字典，讀取或設定其中的資料。提供物件字典的節點稱為SDO server，存取物件字典的節點稱為SDO client。SDO通訊一定由SDO client開始，並提供初始化相關的參數。
在CANopen的術語中，上傳是指由SDO server中讀取資料，而下載是指設定SDO server的資料。
由於物件字典中的資料長度可能超過8個位元組，無法只用一個CAN頁框傳輸，SDO也支援長訊息的分割（segmentation）和合併（desegmentation）。這樣的物件有二種：SDO下載/上傳（SDO download/upload）及SDO區塊下載/上傳（SDO Block download/upload）。CANopen協定較新版本支援SDO區塊傳輸，可以允許傳輸大量的資料，且傳輸的overhead可以較低。
負責處理SDO資料傳輸的COB ID可在物件字典中設定。在物件字典的索引0x1200至0x127F可設定SDO server的COB ID，最多可設定到127個。而SDO client可以在物件字典的索引0x1280至0x12FF中設定。不過預定義連結（pre-defined connection set）定義在開機後（Pre-operational狀態）可用來設定設備組態的SDO。接收用的COB ID為0x600 +節點ID，而傳送用的COB為0x580 +節點ID。
以下用SDO下載來說明SDO的協定，SDO client在要啟始下載時，會送出CAN訊息，其ID為接收端SDO channel的COB ID，而CAN頁框的資料欄位內容如下：-{zh-hans:进程数据对象; zh-tw:程序資料物件}-（PDO）協定可用來在許多節點之間交換即時的資料。可透過一個PDO，傳送最多8位元組（64位元）資料給一設備，或由一設備接收最多8位元組（64位元）的資料。一個PDO可以由物件字典中幾個不同索引的資料組成，規劃方式則是透過物件字典中對應PDO mapping及PDO參數的索引。
PDO分為兩種：傳送用的TPDO及接收用的RPDO。一個節點的TPDO是將資料由此節點傳輸到其他節點，而RPDO則是接收由其他節點傳輸的資料。一個節點分別有4個TPDO及4個RPDO。
PDO可以用同步或非同步的方式傳送：同步的PDO是由SYNC訊息觸發，而非同步的PDO是由節點內部的條件或其他外部條件觸發。例如若一個節點規劃為允許接受其他節點產生的TPDO請求，則可以由其他節點送出一個沒有資料但有設定RTR位元的TPDO（TPDO請求），使該節點送出需求的資料。
藉由RPDO也可以使兩個或兩個以上的設備同時啟動。只要將其RPDO對應到相同的TPDO即可。
同步協定使用生產者/消費者模型。同步生產者（Sync-Producer）會定時產生同步訊號供同步消費者（Sync-Consumer）使用。當同步消費者收到訊號，即可進行已規劃好的同步工作。
同步訊號會定時產生，若有 PDO 是由同步訊號引發，透過 PDO 傳送時間及同步訊號傳送週期之間的調整，可以使感測器定期的取様，而致動器也可以根據最新的輸入訊號產生對應的輸出。
在物件字典中，同步物件的索引為0x1005，可透過編輯此物件啟動同步協定。
一般而言，時間標記物件的內容是從1984年1月1日午夜之後到現在之間經過的時間，單位為毫秒。為一個48位元（6位元組）的數值。
不過有些應用會要求時間要非常精確，這種情形會需要精準的同步，尤其是在大型網路，通訊速度受限時更是如此。此時需要將各設備的時鐘同步，精準度要到毫秒的等級。這個要求可透過高解析度的同步信號達成，在同步信號中也包括了另一種時間標記，可供各設備調整時鐘用。
同步信號中的時間標記型態為unsigned32，單位為1毫秒，因此時間標記會在每72分鐘歸零重新計數。
以下是在master初始化2個壓力感測器（ID分別為1和2）中，通訊的資料。