BODAS控制器函数字典:行走机械ECU开发实战指南

简介:本资源是力士乐(Bosch Rexroth)行走机械控制器BODAS平台的官方级编程指令集中文整理文档,专为初学者及现场工程师设计,用于快速掌握BODAS运行时系统(Runtime System)中各类核心函数的语法、参数约束与目标系统兼容性。文档覆盖MC6、RC2-1、RC6-9、RC12-18等主流控制器型号,详细说明注解规范、输入处理(如in_initAna/in_getPoti系列)、输出控制(out_initProp/out_setProp)、系统功能(sys_getSupply/sys_setCycle)等四大模块,并明确标注各函数在不同ECU上的适用性(如in_setVirtual不支持RC2-1),显著降低跨型号开发试错成本。资源为单文件Word文档(.doc),大小1.53MB,结构清晰、术语统一,便于查阅与嵌入开发流程。目前已有1523人学习下载,是理解BODAS底层逻辑、开展程序调试与功能验证不可或缺的实操型参考资料。

1. 这不是“英文说明书”——这是行走机械控制器开发现场的「函数字典」,能直接抄进BODAS工程里跑通IO、保存参数、查错误码

你手头刚拿到一台RC12-18控制器,接好电位器和比例阀,BODAS Studio里新建项目,编译通过了,但一下载就报SYS_ERROR_EEPROM_WRITE_FAILED;或者你在调试MC6伺服轴,stm_setSoll()写进去没反应,stm_getStat()却始终返回0x0000;又或者用in_getPoti()读电位器,值在0~100跳变,但实际行程只走了1/3——这些不是逻辑写错了,是根本没摸清运行时系统(Runtime System)这层黑匣子怎么调用。这份《力士乐行走机械控制器BODAS编程指令集(英文).doc》不是让你从头学C语言的教材,它是把BODAS底层运行时系统里所有可被PLC程序直接调用的C风格函数,按输入、输出、系统服务、EEPROM、CAN、STM、BODEM七大类,一条条拆开、标清适用型号、参数含义、返回值逻辑、典型陷阱,整理成工程师能直接粘贴进ST代码块里跑起来的实战手册。它覆盖MC6/E、RC2-1、RC6-9、RC12-18全系列目标系统,尤其关键的是:每条函数都明确标注“仅适用于XX”或“不适用于XX”,避免你在RC2-1上硬套in_initDig()导致初始化失败这种低级翻车。如果你正在做工程机械电控系统集成、行走泵闭环控制、多路比例阀协同动作,或者带CAN总线的分布式IO扩展,这份文档就是你打开BODAS底层能力的钥匙——不是理论,是能立刻验证、立刻排错、立刻上线的函数字典。


2. 输入函数:从电位器校准到频率停测,搞懂in_系列函数的型号适配与信号类型绑定

BODAS的输入处理不是“读个寄存器”那么简单。它把物理信号(模拟电压、开关通断、脉冲频率)的采集、滤波、校准、状态诊断全部封装进函数里,而不同ECU型号的硬件电路差异,直接决定了哪些函数能用、参数怎么设、通道号代表什么。新手最容易栽在“以为in()通用,结果RC2-1上in_initDig()根本不存在”这种坑里。下面按信号类型拆解,每条都带真实可复现的调用逻辑。

2.1 模拟输入初始化:in_initAna()的双模式配置(仅RC2-1)

RC2-1是唯一支持in_initAna()的型号,它负责配置ANA_A1和ANA_A2两个模拟通道。关键不在“能不能用”,而在**iMode1和iMode2如何组合决定信号类型**。比如你要接一个0–20mA电流型传感器,必须用分流电阻模式(SHUNT),否则读数永远是0:

// RC2-1专用:配置ANA_A1为0–20mA电流输入 // iChnl = 1 → ANA_A1;iMode1 = ANA_MODE1_SHUNT;iMode2 = ANA_MODE2_NORMAL(默认0–5V范围) in_initAna(1, ANA_MODE1_SHUNT, ANA_MODE2_NORMAL);

参数说明:

  • iChnl: 通道号,RC2-1固定为1(ANA_A1)或2(ANA_A2);
  • iMode1: 决定参考电压和接线方式。ANA_MODE1_SHUNT表示启用内部250Ω分流电阻,将0–20mA转为0–5V;ANA_MODE1_PVR则用于0–10V电压输入,参考电压设为2.5V以提升精度;
  • iMode2: 仅对ANA_A2生效,ANA_MODE2_SPS启用±10V量程,适合高动态范围传感器。
    注意:ANA_MODE1_SHUNT模式下,iMode2被忽略,且该模式强制应用于ANA_A1和ANA_A2两个通道——这是RC2-1硬件设计决定的,不能单独配置。

2.2 数字输入配置:in_initDig()的上下拉逻辑(不适用于RC2-1)

RC2-1没有数字输入配置函数,但MC6、RC6-9、RC12-18都有in_initDig(),它不读值,只做一件事:设定数字输入引脚的默认电平。这直接影响in()读取开关信号时的“未触发”状态是0还是1:

// MC6上配置DI_1为“上拉”,即开关断开时读数为1,闭合时为0 in_initDig(1, DIG_MODE_PULLUP); // DIG_MODE_PULLUP = 1 // RC12-18上配置DI_3为“下拉”,开关断开时为0,闭合时为1 in_initDig(3, DIG_MODE_PULLDOWN); // DIG_MODE_PULLDOWN = 0

为什么必须配?
BODAS的数字输入是浮空引脚,不配置上下拉会导致in(1)返回随机值(常见现象:开关明明断开,PLC里却显示“ON”)。DIG_MODE_PULLUP对应内部5V上拉,DIG_MODE_PULLDOWN对应内部接地。RC2-1因硬件已固化上拉,故无此函数——这是型号差异最典型的体现。

2.3 频率输入与电位器校准:in_initFreq()和in_getPoti*()的联动逻辑

频率测量和电位器读取是行走机械最常用场景。但in_initFreq()只负责“开启通道”,真正读值靠in();而电位器校准值(Min/Max/Mid)必须先用in_getPotiMin()等函数读出,再传给in_getPoti()做线性换算:

// 步骤1:初始化频率通道(如RC12-18的FREQ_IN1) in_initFreq(1); // 步骤2:在主循环中读取频率(单位Hz) freq_value := in(101); // 101是RC12-18频率通道1的标准ID // 步骤3:电位器校准(需先在BODAS可视化界面或BODEM里完成校准操作) min_val := in_getPotiMin(); // 返回编码值,如0x0000 max_val := in_getPotiMax(); // 返回编码值,如0xFFFF mid_val := in_getPotiDir(); // 返回中点编码值 // 步骤4:读取实时电位器值(已自动校准为0–100%) poti_percent := in_getPoti(); // 直接返回0.0–100.0浮点数

关键逻辑:in_getPoti()的返回值是基于in_getPotiMin()/in_getPotiMax()计算出的百分比,不是原始AD值。若校准未执行,in_getPoti()会返回0或异常值。in_getPotiStatus()必须定期检查:返回POTI_STATUS_OK = 0才表示校准有效;若为POTI_STATUS_CALIB_MISSING = 1,说明BODEM里没做校准,此时所有in_getPoti*()函数均不可信。

2.4 通用输入读取:in()函数的型号分支与通道ID映射表

in()是万能读取函数,但它的参数iChnl在不同ECU上代表完全不同的物理资源。这不是软件约定,是硬件地址映射:

ECU型号in(iChnl)中iChnl含义典型值示例
MC61–8: DI开关量;101–104: FREQ频率通道;201–202: ANA模拟通道(需先in_initAna())in(1)读DI_1;in(101)读FREQ_IN1
RC2-11–4: DI开关量;101–102: FREQ频率通道;201–202: ANA模拟通道(需in_initAna())in(1)读DI_1;in(201)读ANA_A1
RC6-91–16: DI开关量;101–108: FREQ频率通道;201–208: ANA模拟通道(需in_initAna())in(1)读DI_1;in(101)读FREQ_1
RC12-181–32: DI开关量;101–108: FREQ频率通道;201–208: ANA模拟通道(需in_initAna());301–308: 虚拟通道(需in_setVirtual())in(1)读DI_1;in(301)读虚拟DI_1

血泪经验:RC12-18的虚拟通道ID从301开始,但in_setVirtual()必须在in()调用前执行,否则in(301)返回0。而RC2-1根本不支持虚拟通道——所以文档里那句“in_setVirtual() --- not RC2-1”不是废话,是保命提示。

2.5 频率测量终止:in_doFreqStop()的硬触发时机

in_doFreqStop()不是“关闭频率功能”,而是在特定事件发生时立即冻结当前计数值,常用于安全急停或行程限位:

// 当安全继电器断开(DI_1=FALSE)时,立即停止FREQ_IN1计数 IF NOT in(1) THEN in_doFreqStop(101); // 101对应FREQ_IN1 END_IF;

玄学点:该函数执行后,in(101)仍返回冻结值,直到下次in_initFreq(1)重新初始化。若忘记重初始化,后续所有频率读数都是旧值——这是现场调试中最难发现的“假死”现象。


3. 输出与系统函数:比例阀驱动、电源管理、错误LED控制的底层开关

输入搞定后,输出才是控制执行机构的核心。BODAS的输出函数分两类:一类是直接驱动比例阀/继电器的out_系列,另一类是管理系统级行为的sys_系列。它们共同特点是:参数设置错误不会报错,但执行效果完全失效——比如out_initPropFreq()配错PWM频率,阀芯抖动;sys_setPowOffExt()在非RC12-18上执行,电源毫无反应。下面直击关键函数的硬核参数。

3.1 比例阀初始化:out_initProp()与out_initPropFreq()的PWM选择

out_initProp()用于普通比例阀(0–10V或4–20mA),而out_initPropFreq()专为高频PWM比例阀设计。选错函数,阀芯要么不动作,要么啸叫:

// RC12-18上驱动0–10V比例阀(OUT_1) out_initProp(1, PROP_MODE_VOLTAGE, 0, 10); // 通道1,电压模式,0–10V // RC12-18上驱动20kHz PWM比例阀(OUT_2) out_initPropFreq(2, PROP_FREQ_20KHZ, 0, 100); // 通道2,20kHz,占空比0–100%

参数深挖:

  • PROP_MODE_VOLTAGE:输出0–10V模拟电压,min/max参数单位为V;
  • PROP_FREQ_20KHZ:输出20kHz PWM,min/max参数单位为占空比百分比(0–100);
  • 致命坑:RC2-1不支持out_initPropFreq(),其硬件无PWM发生器。若在RC2-1工程里调用,编译通过但运行时out_setProp(2,50)无效——必须用out_initProp()配电压模式。

3.2 输出值写入:out_setProp()的实时性与范围校验

out_setProp()是实际控制阀芯位置的函数,但它有隐含规则:写入值超出初始化时设定的min/max范围,会被自动钳位,且不报错:

// 初始化时设0–10V范围 out_initProp(1, PROP_MODE_VOLTAGE, 0, 10); // 下面两行效果相同:都输出10V out_setProp(1, 15.0); // 超出10V,自动钳位为10.0 out_setProp(1, 10.0); // 正常输出10V

验证技巧:用out_getProp(1)读回当前输出值,确认是否被钳位。若out_getProp(1)返回10.0但你期望12.0,说明初始化范围设窄了——必须改out_initProp()参数并重启ECU。

3.3 电源管理:sys_setPowOff()与sys_setPowOffExt()的硬件依赖

sys_setPowOff()是通用关机函数,但sys_setPowOffExt()是RC12-18专属的“深度断电”功能,它能切断备用电源(如超级电容供电):

// 所有型号都支持:软关机(保留RAM数据) sys_setPowOff(); // 仅RC12-18支持:彻底断电(RAM数据丢失,需EEPROM保存) sys_setPowOffExt();

为什么需要Ext版本?
工程机械长时间停放时,为防电池耗尽,需彻底断电。但sys_setPowOffExt()执行后,ECU无法自唤醒,必须外部按键或CAN唤醒信号触发——这是硬件设计决定的,不是软件bug。

3.4 错误LED控制:sys_setErrorLed()的型号锁死与状态映射

RC6-9和RC12-18的前面板有红色ERROR LED,sys_setErrorLed()可手动点亮/熄灭,但参数bOn为TRUE时点亮,FALSE时熄灭,且仅对这两个型号有效:

// RC12-18上:故障时点亮LED IF fault_condition THEN sys_setErrorLed(TRUE); ELSE sys_setErrorLed(FALSE); END_IF;

避坑提示:MC6和RC2-1无ERROR LED硬件,调用此函数无任何效果,也不会报错。若在MC6工程里误用,你会以为“故障没触发”,其实是函数压根没执行。

3.5 系统时间与运行时长:sys_getTime()与sys_getAge()的精度差异

sys_getTime()返回自ECU上电以来的毫秒数(32位,约49天溢出),sys_getAge()返回自固件启动以来的秒数(32位,约136年):

// 获取高精度时间戳(用于周期测量) start_ms := sys_getTime(); // 做一些操作... delay_ms := sys_getTime() - start_ms; // 获取长期运行时间(用于维护提醒) uptime_sec := sys_getAge(); IF uptime_sec > (30 * 24 * 3600) THEN // 运行超30天 maintenance_flag := TRUE; END_IF;

精度警告:sys_getTime()在RC2-1上精度为10ms,其他型号为1ms。若用RC2-1做1ms级定时,delay_ms永远是10的倍数——这是硬件定时器限制,非函数缺陷。


4. 避坑:BODAS Runtime System开发中5个高频翻车点与硬核排查法

BODAS的函数设计追求“静默失败”——调用不存在的函数、传错型号参数、越界访问,往往不报错,只返回0或无效值。这导致问题隐藏极深。以下是我在某跨平台工程机械控制系统集成中踩过的5个真实坑,附带现象、根因和可立即执行的排查步骤。

4.1 现象:in_getPoti()始终返回0,in_getPotiStatus()却显示POTI_STATUS_OK

  • 原因:电位器校准值(Min/Max)存储在EEPROM中,但RC2-1的EEPROM页分配与MC6不同。若用MC6的校准数据刷入RC2-1,in_getPotiMin()读出乱码,导致in_getPoti()计算崩溃。
  • 解决:
    1. 在BODAS Studio中打开“Hardware Configuration” → “Analog Inputs” → 对电位器通道右键“Calibrate”;
    2. 执行三点校准(0%、50%、100%行程),确保in_getPotiMin()/in_getPotiMax()返回合理值(如0x0000/0xFFFF);
    3. 强制重刷EEPROM:调用ee_doSavePage(EE_PAGE_ANALOG),而非依赖自动保存。

4.2 现象:out_setProp(1, 5.0)后,用万用表测OUT_1电压为0V,但out_getProp(1)返回5.0

  • 原因:out_initProp()未执行,或执行时iChnl通道号错误。out_setProp()只写寄存器,不初始化硬件。
  • 解决:
    1. 在PLC主程序起始处添加out_initProp(1, PROP_MODE_VOLTAGE, 0, 10);
    2. 用out_getStatus(1)检查返回值:OUT_STATUS_OK = 0表示初始化成功,OUT_STATUS_NOT_INIT = 2表示未初始化;
    3. 若返回OUT_STATUS_NOT_INIT,确认out_initProp()调用在out_setProp()之前,且无条件跳过。

4.3 现象:can_sendData()返回TRUE,但接收端收不到报文,can_getStatus()显示CAN_STATUS_OK

  • 原因:can_init()后未调用can_doEnableInterrupt(),导致CAN中断被屏蔽,发送缓冲区满后阻塞。
  • 解决:
    1. 在CAN初始化后立即调用can_doEnableInterrupt();
    2. 检查can_getStatus()的tx_buffer_full标志位;
    3. 若为TRUE,降低发送频率或增大can_init()的TX缓冲区参数(需查硬件手册)。

4.4 现象:sys_setPassword()设置密码后,BODAS Studio仍能无密码下载程序

  • 原因:sys_setPassword()设置的是“运行时密码”,用于保护sys_setAccessMask()等敏感函数调用,不影响Studio的工程下载权限。下载权限由ECU的Bootloader密码控制。
  • 解决:
    1. 在BODAS Studio中,进入“Target” → “Security Settings” → 设置Bootloader密码;
    2. sys_setPassword()仅在PLC程序内生效,例如:
      IF password_correct THEN sys_setAccessMask(ACCESS_MASK_ALL); // 解锁所有系统函数 END_IF;

4.5 现象:stm_setSoll(1, 1000)后,stm_getIst(1)始终为0,stm_getStat(1)返回STM_STAT_NOT_READY

  • 原因:伺服电机未使能(Enable信号未置高),或stm_init(1)未执行。STM_STAT_NOT_READY明确表示驱动器未就绪。
  • 解决:
    1. 用万用表确认MC6的EN引脚电压为24V;
    2. 在stm_setSoll()前确保stm_init(1)已执行;
    3. 检查stm_getStat(1)的位定义:bit0=Ready,bit1=Enabled,bit2=Moving。若bit0=0,检查伺服驱动器Fault灯是否亮起。

5. EEPROM与CAN通信:参数持久化与多节点协同的底层实现细节

行走机械控制器必须在断电后记住关键参数(如PID增益、行程限位),同时常需与显示器、遥控器、上位机通过CAN交换数据。这两类功能高度依赖ee_*和can_*函数的正确使用,但文档里参数含义模糊,容易配错导致数据损坏或通信死锁。

5.1 EEPROM页管理:ee_getPageStatus()与ee_doSavePage()的原子性保障

BODAS的EEPROM按页(Page)操作,每页256字节。ee_doSavePage()是唯一能写入的函数,但它不保证原子性——若写入中途断电,该页数据可能损坏。因此必须用ee_getPageStatus()确认页状态:

// 步骤1:检查页状态(0=空闲,1=已使用,2=损坏) page_status := ee_getPageStatus(EE_PAGE_USER1); // 步骤2:仅当页完好时才写入 IF page_status = EE_PAGE_STATUS_OK THEN // 将结构体写入用户页 ee_doSavePage(EE_PAGE_USER1, ADR(my_params), SIZEOF(my_params)); END_IF;

关键参数:ee_doSavePage()第三个参数是字节数,不是元素个数。若my_params是ARRAY[1..10] OF REAL,SIZEOF返回40(每个REAL 4字节),而非10。传错会导致部分数据写入错误地址。

5.2 CAN初始化:can_initTraDatabox()与can_initRecDatabox()的ID映射陷阱

can_initTraDatabox()配置发送Databox(Tx),can_initRecDatabox()配置接收Databox(Rx)。但Databox ID与CAN报文ID无关,它是BODAS内部缓冲区索引:

// 配置发送Databox 1,对应CAN ID 0x100 can_initTraDatabox(1, 16#100, 8); // ID=0x100,长度8字节 // 配置接收Databox 2,监听CAN ID 0x200 can_initRecDatabox(2, 16#200, 8); // ID=0x200,长度8字节 // 发送:将data_array写入Databox 1 can_sendDatabox(1, ADR(data_array)); // 接收:从Databox 2读取 can_receiveDatabox(2, ADR(rx_buffer));

致命陷阱:can_initRecDatabox()的第二个参数是CAN标准帧ID,但若ECU工作在扩展帧模式,必须用can_init()的mode参数指定CAN_MODE_EXT,否则can_initRecDatabox(2, 16#12345678, 8)会被截断为0x5678——这是硬件协议栈限制,非函数bug。

5.3 CAN数据收发:can_sendData()的阻塞与非阻塞模式切换

can_sendData()默认为阻塞模式:若TX缓冲区满,则等待直至有空位。但在高速控制循环中,这会导致周期超时。必须用can_doDisableInterrupt()切为非阻塞:

// 关闭CAN中断(进入轮询模式) can_doDisableInterrupt(); // 发送数据,立即返回,不等待 send_result := can_sendData(16#100, ADR(tx_data), 8); // 检查返回值:0=成功,1=缓冲区满,2=ID非法 IF send_result = 1 THEN // 缓冲区满,丢弃本次发送或降频 drop_count := drop_count + 1; END_IF;

性能权衡:关闭中断后,can_getStatus()的rx_pending标志需手动轮询检查,否则接收数据会丢失。建议仅在确定发送频率可控时使用。

5.4 EEPROM参数加载:ree_getMem()与ree_setMem()的地址对齐要求

ree_getMem()从EEPROM读取任意地址数据,但地址必须4字节对齐(即地址%4==0),否则返回0:

// 正确:地址0x1000对齐 ree_getMem(16#1000, ADR(buffer), 12); // 读12字节 // 错误:地址0x1001未对齐,buffer全为0 ree_getMem(16#1001, ADR(buffer), 12);

解决方案:定义参数结构体时,用__attribute__((aligned(4)))(GCC)或在BODAS中手动填充字节,确保首地址对齐。例如:

TYPE my_param_t : STRUCT padding : ARRAY[1..3] OF BYTE; // 强制4字节对齐 gain_p : REAL; gain_i : REAL; END_STRUCT END_TYPE

5.5 CAN错误处理:can_getStatus()的位域解析与恢复策略

can_getStatus()返回32位状态字,需按位解析。常见错误位及恢复方法:

位位置名称含义恢复操作
bit0tx_ok最近发送成功无需操作
bit1rx_ok最近接收成功无需操作
bit8bus_offCAN总线关闭(严重错误)调用can_doReset()复位CAN控制器
bit9error_passive错误被动状态(可恢复)等待总线空闲,自动恢复
bit10tx_buffer_full发送缓冲区满降低发送频率或调用can_doFlushTx()清空
status := can_getStatus(); IF (status AND 16#00000100) <> 0 THEN // bit8 = bus_off can_doReset(); // 硬复位CAN控制器 // 复位后需重新init can_init(CAN_MODE_STD, 500); can_initTraDatabox(1, 16#100, 8); END_IF;

实测结论:bus_off通常由短路、终端电阻缺失或节点干扰引起。can_doReset()后必须重新初始化,否则can_sendData()返回失败。


6. STM伺服控制与BODEM集成:从电机使能到错误清除的闭环调试技巧

MC6控制器的STM(Servo Motor)函数是行走机械实现精准速度/位置控制的核心,但文档里stm_init()的参数含义模糊,bb3_setError()的错误码映射缺失,导致调试周期漫长。这里给出一套经某工程机械厂产线验证的闭环调试流程,聚焦“让电机转起来”和“让错误清干净”两个刚需。

6.1 STM初始化:stm_init()的四步参数与使能链路

stm_init(1)不是单次调用就能激活电机,它需配合硬件使能信号形成闭环:

// 步骤1:配置STM通道1(MC6专用) stm_init(1, STM_MODE_SPEED, // 控制模式:速度模式 16#0000, // 保留参数,填0 1000, // 最大速度rpm(用于限幅) 500 // 加速时间ms(用于S曲线) ); // 步骤2:硬件使能(MC6的EN引脚必须为24V) // 步骤3:软件使能(调用stm_setSoll前必须) stm_setSoll(1, 0); // 设定值0,但触发使能 // 步骤4:检查stm_getStat(1)的bit0(Ready)和bit1(Enabled)

参数真相:第四个参数1000是最大允许速度(rpm),不是电机额定转速。若设为100,stm_setSoll(1, 200)会被钳位为100。第五个参数500是加速时间(ms),影响S曲线斜率,设为0则无加减速。

6.2 伺服状态监控:stm_getStat()的位域解码与故障定位

stm_getStat()返回16位状态字,关键位如下:

位名称含义故障指示
0READY驱动器就绪0=未就绪,检查驱动器Fault灯
1ENABLED电机已使能0=未使能,检查EN引脚电压
2MOVING电机正在运动0=静止,检查stm_setSoll()是否调用
3FAULT驱动器故障1=故障,查驱动器LED或bb3_getActiveErrors()
stat := stm_getStat(1); IF (stat AND 16#0008) <> 0 THEN // bit3 = FAULT // 获取BODEM错误码 error_code := bb3_getActiveErrors(); // 根据error_code查BODAS错误码表(文档第94页) CASE error_code OF 16#0001: fault_msg := 'Overcurrent'; 16#0002: fault_msg := 'Overtemperature'; ELSE fault_msg := 'Unknown'; END_CASE; END_IF;

6.3 BODEM错误管理:bb3_getActiveErrors()与bb3_delActiveError()的清除逻辑

BODEM(Bosch Rexroth Diagnostic and Error Management)是BODAS的错误诊断核心。bb3_getActiveErrors()返回16位错误码,但清除错误必须用bb3_delActiveError(),且每次只能清一个错误码:

// 读取当前活动错误 active_err := bb3_getActiveErrors(); // 清除错误码0x0001(过流) IF (active_err AND 16#0001) <> 0 THEN bb3_delActiveError(16#0001); END_IF; // 清除错误码0x0002(过温) IF (active_err AND 16#0002) <> 0 THEN bb3_delActiveError(16#0002); END_IF;

重要规则:bb3_delActiveError()只清除BODEM中的错误标记,不解除驱动器硬件故障。若驱动器Fault灯仍亮,需先排除物理故障(如散热风扇停转、电缆短路),再调用清除函数。

6.4 BODEM参数访问:bb3_getVar()的变量路径与数据类型转换

bb3_getVar()可读取BODEM中任意变量,但路径格式严格:'Object.Subobject.Variable',且返回值为DWORD,需按实际类型转换:

// 读取BODEM中电机温度(变量路径在BODEM配置工具中查看) temp_raw := bb3_getVar('Drive.Temperature.Actual'); // 温度变量为INT16,需符号扩展 temp_int := DWORD_TO_INT(temp_raw); // 或用位运算提取低16位 // 读取PID增益(REAL类型,BODEM中存为4字节IEEE754) gain_raw := bb3_getVar('Axis.PID.Gain_P'); // 将DWORD转REAL(需BODAS内置函数或自定义转换) gain_real := DWORD_TO_REAL(gain_raw);

路径获取法:在BODEM配置工具中右键变量 → “Copy Path”,粘贴到代码中。路径错误时bb3_getVar()返回0。

6.5 实战技巧:从“电机不转”到“稳定运行”的五步排查清单

这是我带某高校学生调试MC6伺服轴时总结的 checklist,每步5秒内可验证:

  1. 查硬件:万用表测MC6 EN引脚是否24V,Fault灯是否熄灭;
  2. 查初始化:stm_init(1)是否在主循环外执行,stm_getStat(1)bit0=1?
  3. 查使能:stm_setSoll(1,0)后,stm_getStat(1)bit1=1?
  4. 查设定值:stm_setSoll(1,100)后,stm_getIst(1)是否缓慢上升至100?若否,检查stm_getStat(1)bit2=1(MOVING);
  5. 查错误

本文还有配套的精品资源,点击获取