CANopen编程方案

合集下载

伺服电机的canopen协议例程

伺服电机的canopen协议例程

伺服电机的CANopen协议例程一、什么是CANopen协议1.1 CAN总线介绍CAN(Controller Area Network)总线是一种串行通信协议,最初由德国Bosch公司开发,用于汽车电子系统之间的通信。

CAN总线具有高可靠性、实时性和抗干扰能力强的特点,因此在工业控制、航空航天、机器人等领域得到了广泛应用。

1.2 CANopen协议概述CANopen是基于CAN总线的一种高层通信协议,它定义了在CAN总线上进行设备之间通信的规范。

CANopen协议提供了一套标准的通信对象和服务,使得不同厂家的设备能够方便地进行通信和集成。

CANopen协议广泛应用于工业自动化领域,特别是伺服电机控制系统中。

二、伺服电机的CANopen协议应用2.1 伺服电机控制系统简介伺服电机是一种能够精确控制位置、速度和力矩的电机。

伺服电机控制系统通常由伺服电机、驱动器和控制器组成。

控制器通过发送控制指令给驱动器,驱动器再将指令转换为电机的运动控制信号,从而实现对电机的精确控制。

2.2 CANopen在伺服电机控制系统中的应用CANopen协议在伺服电机控制系统中扮演着重要的角色。

它定义了伺服电机控制系统中各个设备之间的通信方式和数据格式,使得不同厂家的伺服电机、驱动器和控制器能够进行互联互通。

通过CANopen协议,控制器可以向驱动器发送位置、速度、力矩等控制指令,驱动器则将实际的运动状态反馈给控制器,实现闭环控制。

三、CANopen协议的基本原理3.1 CANopen通信对象CANopen协议定义了一系列通信对象,用于描述设备之间的数据交换。

这些通信对象包括字典对象、PDO(Process Data Object)和SDO(Service Data Object)等。

字典对象用于存储设备的配置参数和状态信息,而PDO和SDO则用于实时数据的传输。

3.2 字典对象字典对象是CANopen协议中最基本的通信对象,它用于存储设备的配置参数和状态信息。

canopen参数

canopen参数

canopen参数摘要:一、CanOpen协议简介二、CanOpen参数的分类与作用1.通信参数2.节点识别参数3.报文传输参数4.错误处理与诊断参数5.电源管理参数三、CanOpen参数的配置方法四、CanOpen参数在实际应用中的案例分析五、总结与展望正文:一、CanOpen协议简介CanOpen是一种基于CAN总线的通信协议,主要用于工业自动化和嵌入式系统中。

它是一种高性能、高可靠性的通信协议,能够实现设备间的高效、稳定、安全的数据传输。

CanOpen协议在全球范围内得到了广泛的应用,已经成为工业自动化领域的通信标准之一。

二、CanOpen参数的分类与作用1.通信参数:主要包括波特率、数据位、停止位、校验位等,这些参数决定了通信的速率、数据格式以及是否进行奇偶校验等。

2.节点识别参数:包括设备ID、子地址等,用于标识不同的设备节点,实现设备间的差异化。

3.报文传输参数:包括报文长度、发送间隔、发送次数等,用于控制报文的传输速率、传输次数等。

4.错误处理与诊断参数:包括错误检测与处理方式、诊断报文周期等,用于实现故障诊断与处理。

5.电源管理参数:包括电源模式、电源电压范围等,用于确保设备在不同电源环境下的稳定运行。

三、CanOpen参数的配置方法配置CanOpen参数时,需要根据实际应用需求,合理设置各个参数。

配置过程主要包括以下几个步骤:1.确定通信参数:根据通信速率、波特率等需求,设置相应的通信参数。

2.设置节点识别参数:根据设备ID、子地址等需求,设置相应的节点识别参数。

3.设置报文传输参数:根据通信需求,设置报文长度、发送间隔、发送次数等。

4.设置错误处理与诊断参数:根据故障诊断需求,设置错误检测与处理方式、诊断报文周期等。

5.设置电源管理参数:根据电源需求,设置电源模式、电源电压范围等。

四、CanOpen参数在实际应用中的案例分析以一个智能工厂为例,生产线上的设备通过CanOpen协议进行通信。

canopen builder逻辑控制编程

canopen builder逻辑控制编程

canopen builder逻辑控制编程CanOpen Builder 是一种常见的逻辑控制编程软件,专门用于CanOpen 协议设备的编程。

它的主要作用是以图形化编程方式,对CanOpen 设备进行程序设计和调试。

下面,将从以下几个方面详细阐述 CanOpen Builder 的逻辑控制编程过程。

1.安装 CanOpen Builder 软件首先,需要安装 CanOpen Builder 软件,然后打开软件,在菜单中选中“New Project”,并输入项目名称、选中设备类型、通信端口等信息,创建一个新的控制项目。

在软件左边的项目树中,可以看到主页面、配置、对象字典、软件版本等选项。

2.编辑对象字典在 CanOpen 协议中,对象字典是由许多不同类型和参数的对象组成。

首先,需要在 CanOpen Builder 软件中创建对象字典。

在“对象字典”选项中,选中“新建”按钮,然后设置对象的属性,包括它的ID、子 ID、类型和数据等。

在编辑对象字典时,需要确保对象的ID和子 ID 唯一,并正确设置其数据类型和参数。

3.创建模块CanOpen 设备通常包含多个模块,例如 I/O 模块、数据采集模块、控制模块等。

在 CanOpen Builder 中,需要创建一个新的模块来包含这些对象。

选择“新建模块”按钮,设置模块的名称、参数、数据类型等信息。

然后,在模块的属性中,可以添加/删除对象,修改变量值、参数等。

4.编写控制逻辑使用 CanOpen Builder 来编写控制逻辑是非常简单的。

在软件中单击“逻辑控制”选项,并选择“新建程序”按钮。

在编写程序过程中,需要设置输入/输出变量、控制语句、循环等。

控制语句可使用常见的命令,如 if/else, while, for 等等。

然后,将完成的程序上传至 CanOpen 设备中,以实现控制。

5. 调试程序编写完成后,需要对程序进行调试。

CanOpen Builder 软件可以实现快速的程序调试,比如检查程序的变量值、观察实际设备状态以及检查通信错误等。

怎么做CANopen开发

怎么做CANopen开发

怎么做canopen开发我现在要做DSP2812与驱动器的通信,使用CANopen协议?应该怎么着手,没有基础。

谢谢!1.先看看协议介绍,周立功网站上有些;对CANopen有个大致了解,分析一下是否适合自己的方案应用。

2.去cia下载301协议看看3.下载个简单的协议栈代码(论坛上有),结合协议文件仔细分析,并把它移植到你的DSP上。

4.根据功能要求编写和完善自己的协议栈。

、、我可以提供F2812 CANopen源代码301 + 402联系bluestar_nj@SDO访问对象字典的问题SDO的帧格式中,先是命令字,然后是Index和Sub-index,那如果我要访问一个没有子索引的入口,例如当我要修改SYNC的COB-ID,SDO的帧格式是怎样的?刚在DS301里找到这句话:For single Object Dictionary entries such as an UNSIGNED8, BOOLEAN, INTEGER32 etc.the value for the sub-index is always zero.那是不是子索引的值为0就可以了?由于分析仪还没买回来,没试过。

没有子索引的,子索引号就是0请问远方,EDS文件是如何导入的?谢谢是不是在记事本中写好EDS文件后,将后缀txt改为eds就可以导入了?是的,按EDS文件規范編寫好文件,擴展名為EDS,然後就可以使用支持EDS文件的組態配置軟件來導入。

对象字典的值的问题对象字典中的参数是不是要赋予一个实际的值啊,这个值是用户设定还是设备已经定好的?比如第二个TPDO(索引0x1801,子索引3)的禁止时间如果在对象字典中的值是0x3FE,那在初始化第二个TPDO 时也要为0x3FE?要是想改变这个禁止时间,是不是对象字典中的值也要变?是啊那请问对象字典的参数是不是由设备厂商已经定好了,用户根据相应的参数来初始化,但也可以更改参数?谢谢如果要更改应该是通过默认的SDO对对象字典的访问来更改的,如果不更改就使用制造商默认的参数或者上次保存的参数,在系统启动的时候加载的。

CANopen综合开发方案

CANopen综合开发方案

CANopen协议综合开发方案(V3.1)中国单片机公共实验室2006年7月关于CANopenCANopen协议集定义了基于CAN的分布式工业自动化系统的应用标准以及CAN应用层通信标准。

CANopen是CAN-in-Automation(CiA)定义的标准之一,并且在发布后不久就获得了广泛的承认。

尤其是在欧洲,CANopen被认为是在基于CAN的工业系统中占领导地位的标准。

CANopen协议集基于所谓的“通信子集”,该子集规定了基本的通信机制及其特性。

大多数重要的设备类型,例如数字和模拟的输入输出模块,驱动设备,操作设备,控制器,可编程控制器或编码器,都在称为“设备子集”的协议中进行描述。

设备子集定义了不同类型的标准设备及其相应的功能。

依靠CANopen协议集的支持,可以对不同厂商的设备通过总线进行配置和系统重构。

CANopen标准最核心的部分是通过对象字典(Object Dictionary)对设备功能进行描述。

对象字典分为两部分,第一部分包括基本的设备信息,例如设备ID,制造商,通信参数等等。

第二部分描述了特殊的设备功能。

一个16位的索引和一个8位的子索引唯一确定了对象字典的入口。

通过对象字典的入口可以对设备的“应用对象”进行基本网络访问,设备的“应用对象”可以是输入输出信号,设备参数,设备功能和网络变量等等。

CANopen设备的功能及特性以电子数据单(EDS)的形式描述,EDS采用ASCII格式,可以将EDS理解成某种形式的表格。

实际的设备设置通过所谓的设备配置文件(DCF)进行描述。

EDS和DCF都可以从Internet上下载,并可以存储在设备之中。

象其他知名的现场总线系统一样,CANopen也分为两种基本的数据传输机制:通过进程数据对象(PDO)对小型的数据进行高速数据交换以及通过服务数据对象(SDO)对对象字典进行访问。

后者主要用于在设备配置过程中传输参数以及传输大数据块。

进程数据对象通常采用事件触发、循环或请求方式发送,作为广播对象,它的上层并没有附加协议。

python canopen例子

python canopen例子

python canopen例子标题:Python Canopen示例1. Canopen简介Canopen是一种用于工业自动化领域的通信协议,它基于CAN总线技术,用于在不同设备之间进行数据交换和控制。

Python Canopen 是一个用于处理Canopen协议的Python库,它提供了一套简单易用的API,使开发人员能够轻松地与Canopen设备进行通信。

2. 安装Python Canopen库要使用Python Canopen库,首先需要安装它。

可以通过以下命令使用pip进行安装:```pip install canopen```3. 创建Canopen网络在Python中,可以使用Canopen库来创建一个Canopen网络。

首先,我们需要导入必要的模块并创建一个Canopen网络对象:```pythonimport canopennetwork = work()```4. 连接到Canopen设备要连接到Canopen设备,我们需要指定设备的接口和波特率。

可以使用`connect()`方法来连接到设备:```pythonnetwork.connect(channel='can0', bustype='socketcan')```这里的`channel`参数指定了设备的接口,而`bustype`参数指定了使用的通信类型。

5. 扫描Canopen网络在连接到Canopen设备后,我们可以使用`scan()`方法来扫描整个网络,以获取所有已连接设备的节点ID:```pythonnodes = network.scan()```这将返回一个包含所有节点ID的列表。

6. 获取Canopen设备对象要与特定的Canopen设备进行通信,我们需要获取它的设备对象。

可以使用`get_node()`方法来获取设备对象:```pythonnode = network.get_node(1)```这里的参数1是设备的节点ID。

canopen阿克曼控制代码

canopen阿克曼控制代码标题:CanOpen阿克曼控制代码的应用引言:CanOpen阿克曼控制代码是一种常用于车辆控制系统中的控制算法。

它基于CanOpen协议,通过对车辆的转向和速度进行精确控制,实现了车辆的稳定行驶和精准转弯。

本文将介绍CanOpen阿克曼控制代码的应用及其重要性,以人类的视角进行叙述。

一、CanOpen阿克曼控制代码的原理CanOpen阿克曼控制代码是基于阿克曼转向原理而设计的。

阿克曼转向原理是一种根据车辆前后轮的转向角度和车辆的轴距来计算转向半径的方法。

CanOpen阿克曼控制代码通过读取车辆的转向角度和速度,利用阿克曼转向原理计算出车辆的转向半径,并生成相应的控制信号,从而实现对车辆的精确控制。

二、CanOpen阿克曼控制代码的应用场景CanOpen阿克曼控制代码广泛应用于各种车辆控制系统中,如自动驾驶系统、工业车辆控制系统等。

它能够实现车辆的精确转向和稳定行驶,提高了车辆的安全性和行驶效率。

例如,在自动驾驶系统中,CanOpen阿克曼控制代码可以根据车辆的当前位置和目标位置,通过计算转向半径和速度,生成相应的控制信号,从而实现车辆的自动导航和路径规划。

三、CanOpen阿克曼控制代码的优势CanOpen阿克曼控制代码具有以下优势:1. 精确控制:CanOpen阿克曼控制代码通过精确计算转向半径和速度,能够实现对车辆的精确控制,使车辆能够稳定行驶和精准转弯。

2. 可靠性高:CanOpen阿克曼控制代码基于CanOpen协议,具有较高的可靠性和稳定性,能够保证车辆的安全行驶。

3. 适用性广:CanOpen阿克曼控制代码适用于各种车辆控制系统,可灵活应用于不同场景和需求。

结论:CanOpen阿克曼控制代码是一种重要的车辆控制算法,通过精确计算转向半径和速度,实现了对车辆的稳定行驶和精准转弯。

它在自动驾驶系统、工业车辆控制系统等领域具有广泛的应用。

CanOpen 阿克曼控制代码的优势在于精确控制、高可靠性和适用性广。

sick gcan canopen协议模块编程实例

在Sick的GCan系列中,GCan-PDO-Modbus模块可用于将S7-300 PLC连接到CANopen网络。

以下是一个简单的编程实例,演示如何使用GCan-PDO-Modbus模块在S7-300 PLC中实现CANopen协议的编程。

首先,需要安装GCan-PDO-Modbus模块的驱动程序,并将其添加到PLC项目中。

然后,可以按照以下步骤进行编程:1. 创建一个新的PDO对象,并设置其通信参数。

这些参数包括CAN通道、波特率、数据位、停止位等。

2. 创建一个PDO映射表,用于将S7-300 PLC中的数据字节映射到CANopen协议中的数据字段。

例如,如果要将PLC中的DB1.DBX0.0字节映射到CANopen协议中的“速度”字段,则可以在映射表中添加一条记录,将DB1.DBX0.0的地址和位设置为速度字段的值。

3. 在S7-300 PLC中编写程序,以将数据写入映射表中。

例如,如果要将速度字段的值设置为100,则可以使用MOVE指令将DB1.DBX0.0字节的值设置为100。

4. 在GCan-PDO-Modbus模块中编写程序,以从映射表中读取数据并将其发送到CANopen网络中。

例如,可以使用GET指令从映射表中读取速度字段的值,并将其发送到CANopen网络中。

5. 在CANopen网络中,其他节点可以使用相同的方法从映射表中读取数据,并将其用于控制或监视应用程序中。

以上是一个简单的编程实例,演示了如何使用GCan-PDO-Modbus模块在S7-300 PLC中实现CANopen协议的编程。

需要注意的是,具体的实现方式可能会因不同的PLC 型号和不同的应用程序而有所不同。

canopen 字典 使用方法

canopen 字典使用方法(原创实用版5篇)《canopen 字典使用方法》篇1CanOpen 字典是一种用于描述CanOpen 设备及其属性的数据结构。

以下是一个CanOpen 字典的使用示例:```pythonimport can# 创建一个CanOpen 字典canopen_dict = {"device_id": "0x1234","mode": "OPMODE1","master_clock": 10000,"driver_reset": 1,"enable": 1,"select": "slot 0","secondary_reset": 0,"power_supply": "6V","output_status": 0,"load_status": 0,"command": "TEST_PATTERN","command_value": 0x5A,"master_clear": 0,"position": 0,"limit": [0, 0, 0],"home": [0, 0, 0],"target": [0, 0, 0],"run_state": 0,"tacho_count": 0,"temperature": -45,"velocity": 0,"actual_velocity": 0,"distance": 0,"actual_distance": 0,}# 发送CanOpen 数据帧data = can.Message(canopen_dict)data.arbitration_id = 0x55data.dlc = len(canopen_dict) - 1data.data = canopen_dict.values()send_can(data)```在上面的示例中,我们首先创建了一个名为`canopen_dict` 的CanOpen 字典,其中包含了设备的属性信息。

CANOpen编码器说明指导书

CANOpen编码器说明指导书1、CANopen介绍 (3)2、通信对象 (3)3、CANopen预定义连接集 (5)4、编码器 (7)4.1 编码器说明 (7)4.2 接线说明 (7)5、Object directory(对象字典) (10)5.1 Detailed description of thecommunication parameters(通讯子协议区域) (10)5.1.1 Object 1000h: Device type(设备类型) (10)5.1.2 Object 1001h: Error register(错误寄存器) (10)5.1.3 Object 1003h: Predefined errorfield(预定义错误区域) (10)5.1.4 Object 1005h: COB-ID forSYNC(SYNC标志符) (11)5.1.5 Object 1008h: Manufacturer devicename(制造商设备名) (11)5.1.6 Object 1009h: Hardwareversion(硬件版本) (11)5.1.7 Object 100Ah: Software version(软件版本) (11)5.1.8 Object 100Ch und 100Dh: GuardTime and life time factor(节点保护参数) (12)5.1.9 Object 1010h: Save parameters(保存参数) (12)5.1.10 Object 1011h: restore defaultparameters(恢复默认参数值) (12)5.1.11 Object 1014h: COB-ID emergencymessages(EMCY标志符) (13)5.1.12 Object 1017h: ProducerHeartbeat Time(Heartbeat报文周期). 135.1.13 Object 1018h: Identity Object(设备ID) (13)5.1.14 Object 1800h: 1.transmit PDOparameter (TXPDO1 异步) (13)5.1.15 Object 1801h: 2.transmit PDOparameter (TXPDO2 同步) (14)5.2 Detailed Description of the Manufacturer(制造商特定子协议区域) (14)5.2.1 Object 2000h: Mode(工作模式) (14)5.2.2 Object 2001h: LocalAddress(编码器通讯地址) (15)5.2.3 Object 2002h: Max_LoopValue(循环测量时的最大值) (15)5.2.4 Object 2003h:Min_BackForthValue(往复测量时的最1小值) (16)5.2.5 Object 2004h:Max_BackForthValue(往复测量时的最大值) (16)5.3 Detailed Description of the GeneralEncoder Parameters(标准的设备子协议区域) (17)5.3.1 Object 6000h: Operatingparameters(操作参数) (17)5.3.2 Object 6003h: Preset value(外部置位的设定值) (17)5.3.3 Object 6004h: Value of position(编码器当前位置值) (17)5.2.6 Object 6200h: Cyclic timer(发送测量值间隔时间) (17)5.3.4 Object 6500h: Operating status(操作状态) (18)5.3.5 Object 6501h: SingleTurnresolution(每圈对应的测量值) (18)5.3.6 Object 650Bh: Serial number(出厂序号) (18)6、RS232通讯参数 (18)7、Layer-Setting-Service (LSS) (20)附:CANopen报文分析 (23)21、CANopen介绍从OSI网络模型的角度来看同,现场总线网络一般只实现了第1层(物理层)、第2层(数据链路层)、第7层(应用层)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

default: /*未知命令*/ printf(" Error: Unknown command!\r\n"); break; } return 0; }
其中用到了CANopen_SDOC_Exp_Write程序,用来给服务器发送写快速 SDO数据的请求 uint8_t CANopen_SDOC_Exp_Write(uint8_t node_id, uint16_t index, uint8_t subindex, uint8_t* data, uint8_t length) { CAN_MSG_OBJ msg_SDO_Seg_TX; uint8_t i, i2; if(CANopen_SDOC_State == CANopen_SDOC_Succes || CANopen_SDOC_State == CANopen_SDOC_Fail) { CANopen_SDOC_State = CANopen_SDOC_Exp_Write_Busy; if(length == 0 || length > 4) { CANopen_SDOC_State = CANopen_SDOC_Fail; /* min for exp write id 0, max is 4 */ return 0; }
void CANopen_Init_SDO(void) { uint32_t i; for(i=0; i<WatchListLength; i++) { WatchList[i].value = 0; /*消费者心跳初始化*/ WatchList[i].counter = 0; /*消费者心跳计数器初始化*/ } CANopen_Heartbeat_Producer_Value = HEARTBEAT_PRODUCER_TIME; /*生产者心跳赋初值*/ CANopen_Heartbeat_Producer_Counter = 0;/* 生产者心跳计数器初始化*/ }
case 2:
/*读从节点1*/
printf(" Read SDO slave node 1.\r\n"); printf("Node ID\tIndex\tSubindex\tEXP/SEG\tSize\tData\r\n"); Print_SDO_EXP_Entry(CAN_SLAVE1_NODE, 0x1000, 0x00); Print_SDO_EXP_Entry(CAN_SLAVE1_NODE, 0x1001, 0x00); Print_SDO_EXP_Entry(CAN_SLAVE1_NODE, 0x1016, 0x00); Print_SDO_EXP_Entry(CAN_SLAVE1_NODE, 0x1016, 0x01); Print_SDO_EXP_Entry(CAN_SLAVE1_NODE, 0x1017, 0x00); Print_SDO_EXP_Entry(CAN_SLAVE1_NODE, 0x1018, 0x00); Print_SDO_EXP_Entry(CAN_SLAVE1_NODE, 0x1018, 0x01); Print_SDO_EXP_Entry(CAN_SLAVE1_NODE, 0x2000, 0x00); Print_SDO_SEG_Entry(CAN_SLAVE1_NODE, 0x2200, 0x00); break;
CANopen编程方案
杨濛 胡浩 韦张勇 2013.10.28
程序流程图
初始化
增加从站节点 Y
系统首次运行 N 创建PDO
创建SDO
SDO方式读取对象 字典设置从站参数
启动PDO PDO方式实现主从 站数据交换
程序伪代码
int main(void) { SystemInit(); CANopenInit(); UART_Init(115200); ...... while(1) { do { fgets(buffer, sizeof(buffer), stdin); i = sscanf(buffer,"%d", &CMD); } while(i != 1 && (!StopReadingUART)); //判断系统是否为首次运行 switch(CMD) { case 1: Configure slave node 1;
/* 心跳消费者值*/ /* 心跳计数器*/ /* 观测节点状态. */ /* 心跳没有及时接受到时置位*/ /* HBF后收到Bootup报文置位*/ /* != NULL时,软件会自动重新配置节点,该节点ID由心跳 失败后节点的NodeID指定 */ /* != NULL &&NodeID != NULL心跳生产者时间会在心跳失 后自动恢复*/ /* != NULL &&NodeID != NULL心跳消费者时间会在心跳失 败后自动恢复*/
switch(CMD)
{ case 1:
/*配置节点1*/ printf(" Configure slave node 1.\r\n"); WatchList[0].value = 0x00; /* 配置节点1时禁用心跳检查*/ buffer[0] = (WatchList[0].ProducerTime >> 8) & 0xFF; buffer[1] = (WatchList[0].ProducerTime >> 0) & 0xFF; CANopen_SDOC_Exp_Write(CAN_SLAVE1_NODE, 0x1017, 0x00, (uint8_t*)buffer, 2); while(!(CANopen_SDOC_State == CANopen_SDOC_Succes || CANopen_SDOC_State == CANopen_SDOC_Fail)) ; if(CANopen_SDOC_State == CANopen_SDOC_Succes) WatchList[0].value = (WatchList[0].NodeID)<<16 | WatchList[0].ConsumerTime; /* node 1 */ else printf("Error: Failed while executing command!\r\n");
msg_SDO_Seg_TX.mode_id = 0x600 + node_id; msg_SDO_Seg_TX.mask = 0x00; msg_SDO_Seg_TX.dlc = 8; msg_SDO_Seg_TX.msgobj = 8; msg_SDO_Seg_TX.data[0] = 1<<5 | (4-length)<<2 | 0x02 | 0x01; msg_SDO_Seg_TX.data[1] = index & 0xFF; msg_SDO_Seg_TX.data[2] = (index >> 8) & 0xFF; msg_SDO_Seg_TX.data[3] = subindex; msg_SDO_Seg_TX.data[4] = 0x00; msg_SDO_Seg_TX.data[5] = 0x00; msg_SDO_Seg_TX.data[6] = 0x00; msg_SDO_Seg_TX.data[7] = 0x00; i2 = 0; for(i=length; i!=0; i--) msg_SDO_Seg_TX.data[i+3] = data[i2++]; (*rom)->pCAND->can_transmit(&msg_SDO_Seg_TX); CANopen_Timeout = CANOPEN_TIMEOUT_VAL; return 1; } CANopen_SDOC_State = CANopen_SDOC_Fail; return 0; }
Байду номын сангаас
typedef struct _WatchNode_t { uint32_t value; uint32_t counter; uint8_t status; uint8_t heartbeatFail; uint8_t BootupAfterHBF; uint8_t NodeID; uint16_t ProducerTime; uint16_t ConsumerTime; }WatchNode_t;
buffer[0] = 0x00; buffer[1] = CAN_NODE_ID; buffer[2] = (WatchList[0].ConsumerTime >> 8) & 0xFF; buffer[3] = (WatchList[0].ConsumerTime >> 0) & 0xFF; CANopen_SDOC_Exp_Write(CAN_SLAVE1_NODE, 0x1016, 0x01, (uint8_t*)buffer, 4); while(!(CANopen_SDOC_State == CANopen_SDOC_Succes || CANopen_SDOC_State == CANopen_SDOC_Fail)) ; if(CANopen_SDOC_State == CANopen_SDOC_Fail) printf("Error: Failed while executing command!\r\n"); break;
case 3:
/*数据写入从节点的SDO入口2200h*/
printf(" Write to SDO entry 2200h of slave node 1.\r\n"); printf("Enter string to write to SDO entry 2200h of slave node 1:\r\n"); fgets(buffer, sizeof(buffer), stdin); i = 0; while(buffer[i]) i++; CANopen_SDOC_Seg_Write(CAN_SLAVE1_NODE, 0x2200, 0x00, buffer, i-1); while(!(CANopen_SDOC_State == CANopen_SDOC_Succes || CANopen_SDOC_State == CANopen_SDOC_Fail)) ; if(CANopen_SDOC_State == CANopen_SDOC_Fail) printf("\r\nError: Failed while executing command!\r\n"); break;
相关文档
最新文档