CANopen協議【SDO】

SDO:

SDO是讀寫單個寄存器。主要用于配置伺服驅動器參數。

1? 收發功能:?

       //public unsafe struct VCI_CAN_OBJ  //CAN數據幀 【單幀對象】//{//    public uint ID;// 幀ID。      【11bit】數據右對齊。 詳情請參照: 《8.附件1: ID對齊方式.pdf》說明文檔。//    public uint TimeStamp;        //設備接收到某一幀的時間標識。 時間標示從CAN卡上電開始計時,計時單位為0.1ms。//    public byte TimeFlag;         //時間標識,為1時TimeStamp有效//    public byte SendType;         //發送幀類型。=0時為正常發送(發送失敗會自動重發,重發超時時間為4秒, 4秒內沒有發出則取消);=1時為單次發送//    public byte RemoteFlag;       //是否是遠程幀【RTR】。 =0時為數據幀, =1時為遠程幀(數據段空)。//    public byte ExternFlag;       //是否是擴展幀。 =0時為標準幀(11位ID), =1時為擴展幀(29位ID)。//    public byte DataLen;          //數據長度 DLC (<=8),即CAN幀Data有幾個字節。約束了后面Data[8]中的有效字節。//    public fixed byte Data[8];    //如DataLen定義為3,即Data[0]、 Data[1]、 Data[2]是有效的。//    public fixed byte Reserved[3];//系統保留。//}
  unsafe public int Get_Receive(ref VCI_CAN_OBJ[] obj){//===1 等待加載=================DelaySecond(0.005);//5ms   // USB速度3~5ms//===2 接口接收=================object obj2 = new object();//對象int num = Help_rtx.RXs(ref obj2);//  can.get_Receive(CAN_DeviceType, CAN_ind, CAN1, ref obj[0], 2000, 50);if (num < 1) return 0;// 空退//===3 取出幀,并且分發=========obj = (VCI_CAN_OBJ[])obj2;//====3界面顯示=================// 分發數據幀,UI層顯示if (Wt_get != null){// 數組是引用類型VCI_CAN_OBJ[] uiObj = new VCI_CAN_OBJ[num];uiObj = obj;UIshow(num, uiObj);//    //COB - ID              Byte 0:1        Byte 2              Byte 3:7//    //0x080 + Node - ID     應急錯誤代碼   錯誤寄存器(1001H)    廠商指定區域//    //byte0~1:  8120  【0x603F】//    //        應急錯誤代碼//    //        0000H 無錯誤//    //        8110H CAN 溢出//    //        8120H 錯誤被動模式(0411)//    //        8130H 壽命保護/ 心跳錯誤//    //        8140H 被迫離線恢復故障//    //        8141H 被迫離線//    //        8150H 發送 COB - ID 沖突//    //        8210H PDO 長度錯誤未處理//    //        8220H PDO 超過長度//    //byte2:   11//    //        (1001H)位定義//    //         Bit0:generic error 一般錯誤//    //        Bit1:current 電流//    //        Bit2:voltage 電壓 (04)//    //        Bit3:temperature 溫度//    //         Bit4:通訊//    //        Bit5:協議402錯誤//    //        Bit6:保留//    //        Bit7:伺服廠家//    //————————————————//    //版權聲明:本文為CSDN博主「cfqq1989」的原創文章,遵循CC 4.0 BY - SA版權協議,轉載請附上原文出處鏈接及本聲明。//    //原文鏈接:https://blog.csdn.net/cfqq1989/article/details/128308808//}// EMCY:故障(從站故障)80h + 從站//if (item.ID > 0x700 && item.ID < (0x700 + 127)) //從站狀態//{//    if (Wt_get!=null)//    {//        NMTslave slave=(NMTslave)p[0];//        string sta = Enum.GetName(typeof(NMTslave), slave);//        //string str = $"從站:{item.ID - 0x700}狀態{p[0].ToString("X2")}; ";//        string str = $"從站:{item.ID - 0x700}_{sta}; ";//        Wt_get(null, str);//    }//}}return num;}/// <summary>/// 【1 4 8】DLC長度,幀id,數據包64bit【小端】/// </summary>/// <param name="DLC"></param>/// <param name="CANid"></param>/// <param name="byte8"></param>/// <returns></returns>/// <exception cref="Exception"></exception>public bool Set_Send(Byte DLC, UInt32 CANid, Int64 byte8)//  1  4  8{//int hand = 0x88;// 設備:USR-CANET200//int cobid = 0x12345678;// 11bit或29bit//Int64 byte8 = 0x0011223344556677;//wait_dataRX數據池();//can.send(hand8, cobid, byte8);//wait_dataRX數據池();if (DLC > 8) DLC = 8;// <=8string cmd = madeCode((byte)DLC, (UInt32)CANid, byte8);// Code編碼  "08   00000602    2B 5021 00 00000000"if (Help_rtx.TXs(cmd)==1)// 接口功能  "08000006022B50210000000000" // 單幀 13字節( 1 4 8 在接口解碼發送){return true;}else throw new Exception("發送失敗。檢查主站硬件狀態(是否開啟?)!");//return false;}

2? SDO功能碼:

     void SDO(Region_Type regtype, UInt16 reg, Byte son, Int32 value)// 1操作類型,2寄存器編號,3子索引,4參數值{// SDO操作  600h+//========================================================// 準備發送Byte by0 = (Byte)regtype;//1 操作碼【u8】UInt16 by1 = (UInt16)reg;//2 寄存器【u16】Byte by2 = (Byte)son;//3 子索引【u8】Int64 by3 = (Int32)value;//4設定值【u32】// b0  b1b2  b3   b4b5b6b7Byte8 = by0 + (by1 << 8) + (by2 << 24) + (by3 << 32); // 23 2000 00 11223344     Set_Send(0x08, 0x600 + Address, Byte8);//  40  2000  00  11223344}

3? SDO讀:

讀的數據幀發出后,伺服回幀包含【寄存器數據類型】【寄存器值

這里? 寄存器數據類型? 需要標記,因為寫寄存器時需要用到? 【寄存器數據類型

      public enum Region_Type : byte{讀 = 0x40, // 回幀0x60成功成功 = 0x60,失敗 = 0x80,寫b8 = 0x2F,寫b16 = 0x2B,寫b24 = 0x27,寫b32 = 0x23,//寄存器bitb8 = 0x4F,//回幀:4F 寄存器有效長度 8bitb16 = 0x4B,b24 = 0x47,b32 = 0x43}
 /// <summary>/// 【讀】寄存器/// </summary>/// <param name="reg"></param>/// <param name="son"></param>/// <returns></returns>unsafe public Int32 SDO(UInt16 reg, Byte son)// 【讀】寄存器,子索引【0x0000~0xFFFF】{// 讀busy = true;//===1 get_數據類型=============//===2 get_Value===================SDO(Region_Type.讀, reg, son, 0);//讀//===2 get_幀===================#region get_ValueVCI_CAN_OBJ[] obj = new VCI_CAN_OBJ[2000];// 創芯科技CAN分析儀最大支持2000幀接收,廣成10239幀Rx13 = new byte[13];// 提取數據幀DelaySecond(0.010);//10ms   // USB速度3~5msint num = Get_Receive(ref obj);busy = false;if (num > 0)// 數據幀{for (int i = num - 1; i >= 0; i--){if (obj[i].ID == 0x580 + Address && obj[i].Data[0] != 0x60)//  SDO 600h+的回信【580h+】{// 580h+從站地址   回幀//=====580h  寄存器類型====================Rx13[5] = obj[i].Data[0];// 2001.00=50000; // 4B,01 20,00, 50 C3 00 00  // // u16寄存器Rx13[6] = obj[i].Data[1];// 寄存器4B(b16位)  2001-00= 0x 0000C350Rx13[7] = obj[i].Data[2];// u8子索引Rx13[8] = obj[i].Data[3];// int32數據值Rx13[9] = obj[i].Data[4];// 小端Rx13[10] = obj[i].Data[5];Rx13[11] = obj[i].Data[6];Rx13[12] = obj[i].Data[7];//=====2======================//VCI_CAN_OBJ one = obj[i]; //break;}// SDO應答幀(580h+)}}else{Region_Obj = 0x80;// 故障return -1;}// 回幀結果Region_Obj = Rx13[5];// 標記: b8 = 0x4F,   b16 = 0x4B,    b24 = 0x47,    b32 = 0x43    //0x6040是16bitint value = get_Value_U32(Rx13);// 解析   43,4060,00,0000 0000//  日志====================================if (Region_Obj < 0x43 | Region_Obj > 0x4F)// u8~32 讀取失敗 // 參考 enum region_Type  //| Region_Type>(int)region_Type.b32{//  0x05030000  80 string error = getError(value, reg, son, -1); // 故障碼,寄存器,子,值if (Wt_get != null){Wt_get(new byte[] { 0x00 }, "讀取寄存器錯誤:" + error);}// throw new Exception("讀取錯誤:" + error);// 提前終止}//錯誤else{//成功return value;}//正確#endregionreturn -1;}

4? SDO寫:

    unsafe public bool SDO(UInt16 reg, Byte son, Int32 value)//【寫】{// 寫busy = true;//===1 get寄存器數據類型=============Int32 data = SDO(reg, son);//讀//===2 set_Value=====================if (Region_Obj >= 0x43 || Region_Obj <= 0x4F){SDO((Region_Type)Region_Obj - 0x20, reg, son, value);}else { return false; }//===2 get_幀===================#region get_ValueVCI_CAN_OBJ[] obj = new VCI_CAN_OBJ[2000];// 創芯科技CAN分析儀最大支持2000幀接收,廣成10239幀Rx13 = new byte[13];// 提取數據幀DelaySecond(0.010);//10ms   // USB速度3~5msint num = Get_Receive(ref obj);busy = false;if (num > 0)// 數據幀{for (int i = num - 1; i >= 0; i--){if (obj[i].ID == 0x580 + Address && obj[i].Data[0] == 0x60)//  SDO 600h+的回信【580h+】{// 580h+從站地址   回幀return true;}// SDO應答幀(580h+)}}#endregionRegion_Obj = 0x80;// 故障return false;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/168088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/168088.shtml
英文地址,請注明出處:http://en.pswp.cn/news/168088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 模塊

目錄 模塊 6.1. 模塊詳解 6.1.1. 以腳本方式執行模塊 6.1.2. 模塊搜索路徑 6.1.3. “已編譯的” Python 文件 6.2. 標準模塊 6.3. dir() 函數 6.4. 包 6.4.1. 從包中導入 * 6.4.2. 相對導入 6.4.3. 多目錄中的包 模塊 退出 Python 解釋器后&#xff0c;再次進入時&a…

手把手教你安裝 Visual Studio 2022 及其簡單使用

軟件下載 打開 Visual Studio 官網&#xff0c;個人選擇免費的Community社區版就夠用了。 軟件安裝 雙擊運行安裝程序&#xff1a; 點擊繼續 即可&#xff1a; 等待加載完成&#xff1a; 可以看到 Visual Studio 2022 對應不同的開發需求提供了若干工作負載&#xff0c;這里以…

?3ds Max插件CG MAGIC圖形板塊為您提升線條效率!

?通過3ds Max軟件進行繪圖操作時&#xff0c;大多絆住各位設計師們作圖速度的往往都是一些細微的瑣事&#xff0c;重復一變一變的調整修改等問題。 今天說到這個繪圖線條來回調整解決方法就是3ds Max插件CG MAGIC。 Max插件CG MAGIC作為一款智能化的輔助插件&#xff0c;致力于…

flutter編譯和構建鴻蒙應用程序(windows環境)

flutter編譯和構建鴻蒙應用程序&#xff08;windows環境&#xff09; 問題背景 針對 OpenHarmony 的 Flutter 版本已經開源&#xff0c;參考 https://gitee.com/openharmony-sig/flutter_flutter。 本文為實踐該流程&#xff0c;實現flutter打包鴻蒙hap包的流程。目前流程已經…

flink的java.lang.IllegalStateException: Buffer pool is destroyed 異常

背景 最近flink的在線應用出現錯誤java.lang.IllegalStateException: Buffer pool is destroyed&#xff0c;本文記錄下這個錯誤的原因 錯誤原因 詳細的日志堆棧如下: Caused by: java.lang.IllegalStateException: Buffer pool is destroyed. at org.apache.flink.runtime…

Ps:畫筆工具的基本操作

畫筆工具 Brush Tool是 Ps 中最常用的工具&#xff0c;廣泛地用于繪畫與修飾工作。 雖然多數操作可在畫筆工具的工具選項欄中選擇執行&#xff0c;但是如果能記住相應的快捷鍵可大大提高工作效率。 熟練掌握畫筆工具的操作對于使用其他工具也非常有益&#xff0c;因為 Ps 中許多…

CSS-長度單位篇

px&#xff1a;像素em&#xff1a;相對元素font-size的倍數rem&#xff1a;相對根字體大小&#xff0c;html標簽就是根%&#xff1a;相對父元素計算 注意&#xff1a;CSS中設置長度&#xff0c;必須加單位&#xff0c;否則樣式無效&#xff01;

Maven - 打包之爭:Jar vs. Shade vs. Assembly

文章目錄 Pre概述Jar 打包方式_maven-jar-pluginOverview使用官方文檔 Shade 打包方式_maven-shade-pluginOverview使用將部分jar包添加或排除將依賴jar包內部資源添加或排除自動將所有不使用的類排除將依賴的類重命名并打包進來 &#xff08;隔離方案&#xff09;修改包的后綴…

ElasticSearch之cat component templates API

命令樣例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/component_templates?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下&#xff1a; name …

Qt/QML編程學習之心得:一個QML工程的學習筆記(十)

前言: 到底什么是Qt Quick呢?因為Qt Quick是Qt新引入的,Qt Quick由Qt Quick模塊提供,它是一個編寫QML應用的標準庫。Qt Quick模塊提供了兩種接口:使用QML語言創建應用的QML接口和使用C++語言擴展QML的C++接口。使用Qt Quick模塊,設計人員和開發人員可以輕松地構建流暢的…

【自主探索】基于 frontier_exploration 的單個機器人自主探索建圖

文章目錄 一、概述1、功能2、要求 二、使用方法1、用于運行演示2、用于開發人員2.1. 探索無/地圖數據2.2. 使用 /map 數據進行探索 三、提供的組件1、explore_client1.1. 調用的操作1.2. 訂閱主題1.3. 發布主題 2、explore_server2.1. 提供的操作2.2. 調用的操作2.3. 調用的服務…

【科技素養】藍橋杯STEMA 科技素養組模擬練習試卷6

1、將一個空塑料袋與一個裝滿空氣的塑料袋放到秤上稱重。在兩個塑料袋本身完全一樣的情況下&#xff0c;得出的結果會是 A、空塑料袋更重 B、裝滿空氣的塑料袋更重 C、兩個塑料袋一樣重 D、無法判斷 答案&#xff1a;C 2、全球變暖帶來的一個主要影響就是海平面的上升。造…

web前端開發基礎----標準流布局和非標準流布局

1&#xff0c;標準流布局 標準流&#xff0c;也稱文檔流或普通流&#xff0c;是所有元素默認的布局方式。 在標準流中&#xff0c;元素按照其在 HTML 中出現的順序&#xff0c;自上而下依次排列&#xff0c;并占據其父容器內的可用空間。 標準流中的元素按照其自然尺寸和位置進…

uniapp實現多時間段設置

功能說明&#xff1a; 1 點擊新增時間&#xff0c;出現一個默認時間段模板&#xff0c;不能提交 2 點擊“新增時間文本”&#xff0c;彈出彈窗&#xff0c;選擇時間&#xff0c;不允許開始時間和結束時間同時為00:00&#xff0c; <view class"item_cont"> …

TCP/IP協議:最流行的電子郵件協議SMTP(簡單郵件傳輸協議)詳解

SMTP 是一種電子郵件協議&#xff0c;用于通過互聯網從一個電子郵件帳戶向另一個電子郵件帳戶發送電子郵件。它是TCP/IP協議應用層的一部分。作為一種電子郵件協議&#xff0c;它建立了不同電子郵件客戶端和帳戶之間輕松信息交換的規則。這樣&#xff0c;簡單郵件傳輸協議就可以…

求最小的起始正整數

題目描述 給你一個整數數組 nums 。你可以選定任意的 正數 startValue 作為初始值。 你需要從左到右遍歷 nums 數組&#xff0c;并將 startValue 依次累加上 nums 數組中的值。 請你在確保累加和始終大于等于 1 的前提下&#xff0c;選出一個最小的 正數 作為 startValue 。…

【Rust 日報】2023-11-23 - egui 0.24 發布

項目 - egui 0.24 發布 egui 是一個易于使用的 Rust GUI 庫&#xff0c;支持在本地環境和瀏覽器中運行。 egui 0.24 的重要新特性是多視窗功能。在支持的后端上&#xff08;如eframe&#xff09;&#xff0c;用戶可以利用全新的 viewport API 同時生成多個本機窗口。 此外&…

Git 的基本概念和使用方式。

Git 是一個開源的分布式版本控制系統&#xff0c;它可以記錄代碼的修改歷史&#xff0c;跟蹤文件的版本變化&#xff0c;并支持多人協同開發。Git 的基本概念包括&#xff1a; 1. 倉庫&#xff08;Repository&#xff09;&#xff1a;存放代碼和版本歷史記錄的地方。 2. 分支…

ArkUI開發進階—@Builder函數@BuilderParam裝飾器的妙用與場景應用

ArkUI開發進階—@Builder函數@BuilderParam裝飾器的妙用與場景應用 HarmonyOS,作為一款全場景分布式操作系統,為了推動更廣泛的應用開發,采用了一種先進而靈活的編程語言——ArkTS。ArkTS是在TypeScript(TS)的基礎上發展而來,為HarmonyOS提供了豐富的應用開發工具,使開…

Educational Codeforces Round 158 (Rated for Div. 2)(A~E)(貪心,樹形DP)

A - Line Trip 題意&#xff1a;有一條路&#xff0c;可以用一條數線來表示。你位于數線上的點 0 &#xff0c;你想從點 0 到點 x &#xff0c;再回到點 0。你乘汽車旅行&#xff0c;每行駛 1個單位的距離要花費 1 升汽油。當您從點 0出發時&#xff0c;汽車已加滿油(油箱中的…