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.mzph.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;汽车已加满油(油箱中的…