CANopen通訊之PDO通訊
過程資料物件(Process Data Object,PDO)是用來傳輸實時資料的,提供對裝置應用物件的直接訪問通道,它用來傳輸實時短幀資料,具有較高的優先權。PDO 傳輸的資料必須少於或等於 8 個位元組,PDO 的 CAN 報文資料域中每個位元組都用作資料傳輸,因此,在應用層上不包含傳輸控制資訊,報文利用率極高。
PDO 通訊是基於生產者/消費者的通訊模式[13],如圖 3-3 所示,每個 PDO 有一個唯一的識別符號且可以通過一個節點發送,但有多個節點可以接收。由生產者傳送的 PDO稱為傳送 PDO(TPDO),同樣消費者接收的 PDO 稱為接收 PDO(即 RPDO)。PDO 的接收不需要消費者的確認。
生產者/消費者通訊模型
每個 PDO 在物件字典中由兩個物件描述:通訊引數和對映引數。PDO 通訊引數指明使用哪個 COB-ID,傳輸型別,禁用時間和定時時間;PDO 對映引數用於設定 PDO報文中的資料的對映關係,確定要傳輸的資料在 CAN 報文資料域中的定位。該引數允許 PDO 的生產者和消費者知道正在傳輸什麼資訊,而不需要在 CAN 報文中增加額外的協議控制資訊,使傳輸的效率達到最高。一個 PDO 最多可以對映 64 個物件[7]。
PDO 通訊具有三種觸發模式:內部事件驅動或內部定時器觸發、同步觸發、遠端請求觸發。
1) 內部事件驅動或內部定時器觸發。通訊由某一事件觸發。例如數字 I/O 口狀態改變,超過預先設定的值、定時器中斷等都會觸發節點發送一個 PDO。這種模式可使匯流排負載達到最小,在相對低的波特率下獲得比較高的通訊特性。
2)同步觸發。同步觸發 PDO 是指 CANopen 節點收到由管理節點發出的同步報文(同步物件 Sync)之後,根據觸發報文條件向匯流排發出 PDO 報文。同步傳輸又分為週期性和非週期性,週期性是指 CANopen 節點接收到一定數量的同步報文之後才開始傳送;非週期性 PDO 是指 PDO 觸發條件成立之後,當收到下一個同步物件後馬上傳送PDO。
3) 遠端請求觸發。PDO 消費者可以給 PDO 生產者傳送遠端 PDO 請求,相應 PDO 生產者將對遠端幀做出響應,向總線上傳送相應的 PDO 資料。
PDO 通訊時的觸發模式由 PDO 通訊引數中的傳輸型別來確定,傳輸型別是一個 8位無符號整數,這個傳輸型別值的大小與 PDO 觸發方式的對應關係如下表所示。
PDO 傳輸型別與 PDO 觸發模式對應表
上表中的 SYNC 代表接收到同步物件,RTR 代表接收到遠端幀,Event 代表事件發生,如數值改變或定時時間到了等。B 代表兩個觸發條件均滿足時觸發 PDO 傳輸,而 O代表一個或者兩個觸發條件滿足時均可觸發 PDO 傳輸。
作為一個例子,假定第二個 transmit-PDO 對映如下(在 CANopen 中用物件字典索引 0x1A01 描述):
在 CANopen I/O 模組的裝置子協議( CiA DSP-401) 定義中, 物件 0x6000 子索引 2 是節點的第 2 組 8位數字量輸入,物件 0x6401 子索引 0x01 是節點的第 1 組 16 位模擬量輸入。
這個 PDO 報文如果被髮送(可能由輸入改變,定時器中斷或者遠端請求幀等方式觸發,和 PDO 的傳輸型別相一致,可以在物件 0x1801 子索引 2 中查詢),則由 3 位元組資料組成,格式如下:
通過改變物件 0x1A01 的內容, PDO 的內容可被改變(如果節點支援(可變 PDO 對映))。
注意在 CANopen 中多位元組引數總是先發送 LSB( little endian)。
不允許超過 8 個位元組的資料對映到某一個 PDO 中。
在 CANopen Application Layer and Communication Profile ( CiA DS 301 V 4.02 ) 中 定 義 了MPDO(multiplexor PDO),允許一個 PDO 傳輸大量變數, 通過在報文資料位元組中包含源或目的節點 ID、 OD中的索引和子索引來實現。舉個例子:如果沒有這個機制,當一個節點有 64 個 16 位的模擬通道時,就需要 16 個不同的 Transmit-PDOs 來傳送資料。
以上是介紹PDO在通訊協議中的定義。下面介紹具體用PDO通訊的例子。
本次設計主站和從站使用的平臺是RSB-4210和softlink CANopen I/O模組,我們設計這個系統的目的是讀取 I/O模組輸入埠和寫輸出埠的資料。
Softlink的CANopen I/O模組遵守基於DS301通訊子協議之上的裝置子協議DS401協議。CanFestival開源協議棧中集成了DS301協議與各個裝置子協議之間通訊的開原始碼,故本次開發過程是基於CanFestival開源協議棧來完成的。
Canpen的通訊方式有PDO通訊、SDO通訊、NMT通訊等多種方式,在對CANopen I/O模組的輸入輸出埠進行操作時,主要採用的是PDO通訊方式。在介紹具體實現過程之前,先介紹一下PDO通訊的機制。
前面已經簡單介紹過PDO的基本概念。過程資料通訊物件 PDO 是基於生產者和消費者模式來交換資料的,其索引和子索引都儲存在各自的物件字典中,而不需要佔用 CAN 報文的資料域空間,同時觸發 PDO的方式非常多樣化,因此採用 PDO 來交換過程資料效率會更高。為了保證輸入輸出埠資料傳輸的準確性,採用 PDO 來傳輸控制命令和實時資料。下面將從 PDO 引數的定義、從站 PDO 物件字典資料定義、PDO 的傳送和接收等幾方面來講述 PDO 的整個通訊流程。
(1)PDO 通訊引數和對映引數的定義
由前面的介紹可知,PDO 分為 TPDO(傳送 PDO)和 RPDO (接收 PDO),每一個PDO 都在它的物件字典中通過“PDO 通訊引數”和“PDO 對映引數”的物件條目來描述。
PDO的通訊引數定義了PDO的COB- ID、傳輸型別、抑制時間和事件定時器。例如TPDO1的對映引數的物件字典索引為 1A00h,子索引為對映到該 PDO 中待傳輸的資料所在的索引和子索引及資料長度。
各個PDO物件在物件字典中索引如下圖所示:
(2)主站和從站PDO通訊的機制
由前面介紹的PDO的基本概念及其在物件字典中的索引,在主站和從站採用PDO通訊方式時,我們的思路是先配置主站的PDO的通訊引數(COB-ID、資料傳輸型別),再配置從站的通訊引數與主站一致,這樣就建立了主站與從站的PDO通訊的關係。然後再通過字典配置主站PDO對映引數,配置完成後主從站就可以通過PDO通訊傳輸資料。
這裡以預定義中的TPDO1 為例,其通訊引數的物件字典索引為 1800h,它有 5 個子索引,各個子索引含義如下圖所示,包括 COB-ID,傳輸型別,抑制時間和事件定時器等。對映引數的物件字典索引為 1A00h,子索引為對映到該 PDO 中待傳輸的資料所在的索引和子索引及資料長度。
POD2的傳送和對映引數描述地址及內容
PDO傳輸的“總指揮”就是物件字典。PDO傳送什麼資料,接收什麼資料,什麼時候傳送和接收,傳送和接收的資料都放在哪兒,都是有物件字典配置。從CAN控制器看來就是一串幀的互動。下面簡單的示意圖可以描述一對主從站PDO1的傳送和接收模型。
一對主從站的PDO1的同步通訊的模型
本次除錯的任務是向CANopen I/O模組的輸出埠寫入資料並輸出,能讀取I/O模組的輸入埠的值,並顯示在終端上。RSB-4210開發板上安裝的的是Ubuntu 14.02系統。CanFestival開源協議棧中整合的開發例程TestMasterMicroMod是基於DS401協議,我們就在此基礎上進行開發。
主站程式的設計流程:
1、 設定主站PDO1的通訊引數;
2、 在主站進入預處理階段,通過SDO配置從站PDO1的通訊引數,配置傳輸型別為同步傳輸,COBID為主站PDO1對應的COBID。
3、 關閉從站的PDO2,PDO3,PDO4.
4、 傳送START的NMT指令,讓從站開始執行。此時主從站的PDO1通訊已經建立起來。
5、 修改主站的物件字典,把PDO1的接收和傳送引數對映到廠家自定義的區域,方便程式的讀取和修改。
在主站和從站進行PDO通訊之前,我們要先修改主站的物件字典。
4.2.1修改物件字典
首先我們要根據DS401協議中,物件字典的中的定義和要求,檢查主站的物件字典的配置,其步驟如下:
1) 在PC機上開啟Ubuntu虛擬機器,開啟一個終端;
2) 輸入 cd CanFestival-3-7740ac6fdedc/examples/TestMasterMicroMod#,
3) 切換到TestMasterMicroMod目錄下;
4) 輸入ls命令,可以看到該目錄下有一個名為TestMaster.od的檔案,該檔案就是TestMasterMicroMod工程的物件字典;
5) 輸入 兩次cd ..命令,切換到CanFestival-3-7740ac6fdedc目錄下;
6) 輸入cd objdictgen/,切換到objdictgen目錄下,在該目錄下呼叫objdictedit.py工具來編輯物件字典;
7) 輸入./objdictedit.py ../examples/TestMasterMicroMod/TestMaster.od命令,呼叫objdictedit.py工具編輯上一級檔案中的TestMasterMicroMod的物件字典,彈出如下圖所示的介面:
TestMasterMicroMod的物件字典
8) 在物件字典編輯器中,點選不同的索引範圍,即可檢視相應區域定義的資料型別和通訊物件的結構。在本次設計中,根據DS401協議和CANOPEN I/O裝置手冊的要求,我們主要檢視TPDO1和RPDO1的通訊引數和對映引數的配置是否正確。
9) 由於本系統中CANOPEN I/O模組的輸入與輸出各有16位。根據閱讀從站CANOPEN I/O裝置的EDS檔案和使用者手冊可知,CANOPEN數字I/O模組對映區(6000h和6200h)的資料型別是UNSIGNED 8,所以我們在Manufacture Specific中定義輸出輸出各2個變數,如下圖所示。
輸入輸出變數定義
10) 閱讀從站CANOPEN I/O裝置的EDS檔案和使用者手冊可知,CANOPEN I/O裝置的IO口對應的對映引數中的資料型別是UNSIGNED 32的16進位制數,所以把物件字典的對映引數修改如下圖所示:
RPDO1對映引數
TPDO1對映引數
11) 在物件字典中檢查修改完PDO1的相關配置後,必須對SDO Parameter進行設定。如下圖所示。我們把SDO配置成Client SDO, Client SDO能對主站的物件字典進行修改(servicer SDO是修改從站的物件字典,而從站的物件並不需要修改)。理論上我們需要新增99個(從站節點ID的範圍)Client SDO,當從站的節點ID在00~99範圍內變化時,都可以與主站PDO建立聯絡(COB-ID變化)。這裡主要是新增Client SDO,並修改其對應的值(值的大小查閱物件字典)。
SDO引數配置
在主站物件字典配置完成後,主從站之間就可以實現PDO通訊了。
綜上所述,CANfestival很強大,開原始碼提供了SDO的操作方法,修改配置從站的物件字典是關鍵。同時它也具備了圖形介面修改編輯字典的優勢,使主站設計更加方便。在原始碼中提供的操作DS401的例程,極大的縮短了主從站建立CANopen通訊的開發週期。
4.2.2CANOPEN I/O裝置的通訊除錯
根據物件字典中定義的輸入輸出變數DI1、DI2、DO1、DO2,PDO同步傳輸資料如下:
void TestMaster_post_sync(CO_Data* d)
{
DO1++;// 低8位數字輸出埠
DO2++;// 高8位數字輸出埠
eprintf("MicroMod Digital In: %2.2x\n",DI1);//DI1表示低8位數字輸入埠
eprintf("MicroMod Digital In: %2.2x\n",DI2);//DI2表示高8位數字輸入埠
}
DO1表示低8位數字輸出埠值,unsigned char型別。
DO2表示高8位數字輸出埠值,unsigned char型別。
DI1表示低8位數字輸入埠,unsigned char型別。
DI2表示高8位數字輸入埠,unsigned char型別。
DI1和DI2會列印到串列埠終端上。
4.2.3編譯除錯結果分析
程式修改完成,儲存退出。基於RSB-4210 ARM開發板上Ubuntu14.02的系統,編譯除錯的過程如下:
1) 把SD卡插在電腦上,在Ubuntu終端視窗上切換到CanFestival-3-7740ac6fdedc目錄下,將修改好的canfestival原始碼工程(can_new.tar.gz)壓縮打包,並拷貝到SD卡上,拷貝完成後取出SD卡插入ARM板;
2) 開啟串列埠工具,在ARM板rivo下啟動系統後,輸入sudo su,切換到root使用者下執行;
3) 輸入fdisk –l命令,檢視儲存分割槽情況,如下圖所示:
4) 輸入mount –t vfat /dev/mmcblk1p1 mnt命令,將SD卡的檔案系統掛載到mnt(一個空目錄)下,現在我們就可以在mnt目錄下看見SD卡的檔案系統了;
5) 輸入cp can_new.tar.gz ~/命令,將canfestival原始碼工程(can_new.tar.gz)拷貝到Ubuntu系統根目錄下,這樣下次上電重啟後就不用重新掛載了。
6) 輸入cd 命令,檢視該目錄下的can_new.tar.gz檔案;
7) 輸入tar xzvfm can_new.tar.gz命令,解壓出資料夾CanFestival-3-7740ac6fdedc;
8) 輸入ip link set can0 type can bitrate 500000 命令,設定通訊波特率為500K;
9) 切換到CanFestival-3-7740ac6fdedc目錄下,輸入命令
10) ./configure --cc=arm-linux-gnueabihf-gcc --arch=arm --os=unix --kerneldir=/usr/src/linux-3.5.7 --prefix=$PWD/myinstall --target=unix --can=socket --timers=unix --debug=WAR,MSG 來配置編譯工具、編譯條件和環境等;
11) 輸入make clean命令,刪除原有的所有編譯過的殘餘檔案,只剩下原始碼;
12) 輸入make all命令,選擇滿足配置條件的檔案全部編譯;
13) 輸入 make install命令,將編譯好的檔案放在myinstall檔案目錄下;
14) 輸入cd ~/myinstall/bin 命令,切換到bin目錄下;
15) 輸入./TestMasterMicroMod –h 命令,檢視執行該檔案的格式如下圖所示:
16) 根據提示,輸入./TestMasterMicroMod -l ../lib/libcanfestival_can_socket.so -i 0x00 -m 0 -M 500K命令,執行TestMasterMicroMod,即可看見canopen I/O模組上輸出埠上資料的變化,串列埠工具上返回的輸入埠的資料和PDO、SDO通訊的資訊如下圖所示:
輸出的資訊可以看出PDO資料傳輸時的詳細資訊,輸入埠的返回值根據輸入埠的接線情況變化而不同。
相關推薦
CANopen通訊之PDO通訊
過程資料物件(Process Data Object,PDO)是用來傳輸實時資料的,提供對裝置應用物件的直接訪問通道,它用來傳輸實時短幀資料,具有較高的優先權。PDO 傳輸的資料必須少於
Linux:程序間通訊之管道通訊詳解
在學習程序的時候,我們瞭解到了程序的獨立性:程序之間是相互獨立的,每個程序有自己的虛擬地址空間,並且虛擬地址空間通過頁表的對映,對映到屬於自己的實體記憶體上。並且各個程序之間互相不影響,執行自己的程式碼。  
java網路通訊之Socket通訊:TCP/UDP
網路通訊三要素:協議,IP,埠。七層協議。 package com.qianfeng.test; /* * 網路程式設計基礎: * 網路的通訊:三要素:協議,IP,埠 * 1.IP:在網路上唯一的標記一臺主機 127.0.0.1 :保留地址/本地地址 java
Linux程序間通訊之訊號通訊
訊號通訊是Linux程序間通訊的一種方式。 1.什麼是訊號? 訊號是系統響應某些條件而產生的一個事件,接收到該訊號的程序會相應地採取一些措施。例如我們在windows系統中想強制結束一個程式我們需要用到的是工作管理員,而在Linux中,我們是通過訊號來實現的,執
程序間通訊之管道通訊(PIPE匿名管道)
#include<stdio.h> #include<errno.h> #include<fcntl.h> #include<unistd.h> #include<stdlib.h> #include<string.h> int
CANopen--PDO通訊
過程資料物件(Process Data Object,PDO)是用來傳輸實時資料的,提供對裝置應用物件的直接訪問通道,它用來傳輸實時短幀資料,具有較高的優先權。PDO 傳輸的資料必須少於或等於 8 個位元組,PDO 的 CAN 報文資料域中每個
【IPC進程間通訊之三】內存映射文件Mapping File
eas -h 大小 b2c iss ipc etl enter bject IPC進程間通信+共享內存Mapping IPC(Inter-Process Communication。進程間通信)。
Winform 串口通訊之讀卡器
logs catch orm txt 構造函數 如果 int ros .text 老板給我的第一個硬件就是一個讀卡器, 說讓我做一下試試,於是從網上查了查就寫了出來,相當的簡單。 但是後來還有一個地磅的串口通訊,我整整搞了一天。 在窗體類的構造函數中寫入 Fo
用戶空間和內核空間通訊之【proc文件系統】
page ext4 sha 依靠 全局變量 dmesg 設備 net url 今天我們介紹還有一種用戶內核空間通信的方法:proc文件系統。 proc文件系統作為linux提供的一種虛擬文件系統並不占用實際外圍存儲空間,它僅存在於內存中。系統斷電即消失。proc
Winform 串口通訊之地磅
端口 cto clear tar ons 是否 edev convert nth 繼上次的讀卡之後,要做一個地磅的讀取。 下面是我在讀卡Demo上改的讀取地磅的。 地磅是一直向串口發送數據的,所以需要截取數據來一直判斷數據是否合法,然後計算出結果。 其中遇到了一個小問
用戶空間和內核空間通訊之【Netlink 上】
提取 意思 數據報 multi 主動 聯合 興趣 ora 指示 原文地址:用戶空間和內核空間通訊之【Netlink 上】 作者:wjlkoorey258 引言 Alan Cox在內核1.3版本的開發階段最先引入了Netlink,剛開始時Netlink是以
多線程間的通訊之等待喚醒機制
run 出了 需求 stat 我們 out man http pre 線程間的通訊: 事實上就是多個線程在操作同一個資源。 可是操作動作不同 樣例: 需求:模擬簡單賣票系統(輸入一個人。緊接著輸出一個人) class Res { Stri
JavaScript之Web通訊
listener 建議 scrip 自身 嵌入 csdn stream work 計數 web通信,一個特別大的topic,涉及面也是很廣的。因最近學習了 javascript 中一些 web 通信知識,在這裏總結下。文中應該會有理解錯誤或者表述不清晰的地方,還望斧正!
JAVA之Socket通訊
bubuko client img serve 服務器 .com div 技術 讀取 Server.java: Client.java Server console:(先啟動服務器,再啟動客戶端) 服務器讀取了客戶端發來的hello server; Client
PHP開發APP介面之封裝通訊介面
PHP開發APP介面之封裝通訊介面 按json方式輸出通訊資料 /** * 按json方式輸出通訊資料 * @param integer $code 狀態碼 * @param string $message 提示資訊 * @p
分散式通訊之序列化
知識點: 1)序列化概念 2)實現序列化手段 3)序列化實現深克隆 4)主流序列化手段及操作 Java的序列化機制 Sericalize介面 存在的問題 1)序列化資料結果比較大 傳輸效率低 2)不能跨語言對接 後續xml編碼格式的物件序列化機制成為了主流。 1)多語言 2)便於理解 Json HTTP
14-HAL庫之I2C通訊
1.I2C協議介紹 I2C是一個支援多裝置的匯流排,可連線多個I2C通訊裝置,每個匯流排包括一條雙向序列資料線(SDA)和一條序列時鐘線(SCL)。資料線用來表示資料,時鐘線用來資料收發同步。通訊過程如下: S:主機的I2C介面產生的傳輸開始訊號,連線在I2C總線上的所有從機都會接收到
Vue元件通訊之二:事件監聽函式$emit/$on/$off
在vue2.x版本中自定義時間都需要通過$emit/$on/$off函式來進行觸發、監聽和取消監聽。 如果瞭解過JavaScript的設計模式-------觀察者模式,一定知道dispatchEvent和addEventListener這兩個方法。Vue元件中也有與之類似的模式,子元件用$emi
一、linux 系統程序通訊之記憶體對映
linux下程序間通訊方式一般有管道,訊息佇列,共享記憶體,訊號量,訊號,套接字以及有名管道,其中共享記憶體的效率最高,而記憶體對映mmap就是共享記憶體的一種。下面詳細介紹一種使用共享記憶體實現程序間通訊的方式。 在Android系統中屬性被大量的使用,用來記錄系統設定或程序之間的資訊交換。
C# FrameworkAPI之Socket通訊
服務端: 1:建立一個socket的物件 Socket socketserver=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 第一個引數是指定socket物件使用的定址方案,