我正在尝试读取从 LIN 从节点发送的 linFrame,以识别特定位何时从零变为一。
我正在向从属伺服系统发送一条 LIN 消息,命令它移动到物理终点之外。
一旦它物理地到达终点,它的状态消息就会将一个位从零设置为一。该位标识伺服电机何时停止。我的目标是让 CAPL 脚本检测到电机已经停转。
我的命令消息是由我的 CAPL 脚本使用“output()”函数发送的。我不确定哪个函数可以读取响应,但我认为我必须发送响应消息的标头,然后读取响应帧。
variables
{
linFrame 0x03 ACT_CTRL_MT3 = {msgChannel=1}; // actuator control command
linFrame 0x21 ACT_STA_MT3 = {msgChannel=1}; // actuator status response
mstimer timer1;
}
on key 'c'
{
// command large angular position from servo at node 3
ACT_CTRL_MT3.RTR = 0;
ACT_CTRL_MT3.byte(0)=0x12; // section 4.5.9 of manual
ACT_CTRL_MT3.byte(1)=0xE4;
ACT_CTRL_MT3.byte(2)=0x14;
ACT_CTRL_MT3.byte(3)=0xFE; // max angle
ACT_CTRL_MT3.byte(4)=0xFF; // max angle
ACT_CTRL_MT3.byte(5)=0x00;
ACT_CTRL_MT3.byte(6)=0x00;
ACT_CTRL_MT3.byte(7)=0x40;
output(ACT_CTRL_MT3); // update command payload
// Send the frame header
ACT_CTRL_MT3.RTR = 1;
output(ACT_CTRL_MT3);
settimer(timer1,5000); // wait 5 seconds for motor to move
}
on timer timer1{
//send header of status message
ACT_STA_MT3.RTR = 1;
output(ACT_STA_MT3);
write("Reading message...");
//output message context
writelineex(1,1,"FrameId=%d Length=%d, 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X;", ACT_STA_MT3.ID, ACT_STA_MT3.DLC,
ACT_STA_MT3.byte(0), ACT_STA_MT3.byte(1), ACT_STA_MT3.byte(2), ACT_STA_MT3.byte(3), ACT_STA_MT3.byte(4), ACT_STA_MT3.byte(5), ACT_STA_MT3.byte(6), ACT_STA_MT3.byte(7));
}
“writelinee”函数写入的数据与我在 CANalyzer 的 LIN 跟踪窗口中看到的值非常不同。
我觉得特别奇怪的是,写出的 ID 字段与代码开头变量部分中设置的 ID 不同。在代码中,我将该状态消息的帧 ID 定义为 0x21,但写入命令给出了不同的值(我相信是 0x35,尽管我目前不在我的设置中。