void wpQfReadAlarm(unsigned char id) { DEFINE_CAN_WP_FRAME(frame); frame.funcode = CAN_WP_FUNCODE_QF_READALARM; frame.desid = QIFA_ID(id); frame.dlc = 0; CANSend_noblock(MODULE_ID_DCAN0, (CAN_FRAME *)&frame); }
void Can_Cmd_Lockcurrent_Set(CAN_WP *wp) { if (wp->dlc % 2 != 0) { return; } unsigned int num = wp->dlc / 2; uint8_t Current_value; for (int i = 0; i < num; i++) { uint32 imotor = wp->data[i * 2]; if (imotor >= MIDUMOTOBEGINHZ) { continue; } Current_value = MAX(wp->data[i * 2 + 1], Max_Current_Num); if (Current_value > 0) { HalfPulseNum[imotor] = Current_value - 1; //若当前是半流锁定强制改变锁定电流 if (MiduMotoCtrPra[imotor].MotoRunState == MOTOSTOPHALF) { MiduMotoRefCtr(imotor, ENABLE); } } } DEFINE_CAN_WP_FRAME(twp); twp.funcode = CANCMD_LOCKCURRENT_SET; twp.desid = wp->srcid; twp.dlc = 0; wpSend(&twp); }
void wpQfSetDuty(unsigned char id, unsigned char duty) { DEFINE_CAN_WP_FRAME(frame); frame.funcode = CAN_WP_FUNCODE_QF_SETDUTY; frame.desid = QIFA_ID(id); frame.data[0] = (unsigned char)duty; frame.dlc = 1; CANSend_noblock(MODULE_ID_DCAN0, (CAN_FRAME *)&frame); }
void wpQfRst(unsigned char id, bool rst) { DEFINE_CAN_WP_FRAME(frame); frame.funcode = CAN_WP_FUNCODE_QF_RESET; frame.desid = QIFA_ID(id); frame.data[0] = (unsigned char)(!!rst); frame.dlc = 1; CANSend_noblock(MODULE_ID_DCAN0, (CAN_FRAME *)&frame); }
void wpQfEn(unsigned char id, bool on) { DEFINE_CAN_WP_FRAME(frame); frame.funcode = CAN_WP_FUNCODE_QF_EN; frame.desid = QIFA_ID(id); frame.data[0] = (unsigned char)on; frame.dlc = 1; CANSend_noblock(MODULE_ID_DCAN0, (CAN_FRAME *)&frame); }
void wpQfSetAlarmMask(unsigned char id, unsigned char mask) { DEFINE_CAN_WP_FRAME(frame); frame.funcode = CAN_WP_FUNCODE_QF_SETALARMMASK; frame.desid = QIFA_ID(id); frame.data[0] = mask; frame.dlc = 1; CANSend_noblock(MODULE_ID_DCAN0, (CAN_FRAME *)&frame); }
void CanCmd_ReadAlarm(CAN_WP *wp) { uint8 val = Scan_Input_state(); DEFINE_CAN_WP_FRAME(twp); twp.funcode = wp->funcode; twp.desid = wp->srcid; twp.dlc = 1; twp.data[0] = val; wpSend(&twp); }
void wpQfWrite(unsigned char id, unsigned char *val, unsigned char count) { ASSERT(count < 9); DEFINE_CAN_WP_FRAME(frame); frame.funcode = CAN_WP_FUNCODE_QF_WRITE; frame.desid = QIFA_ID(id); memcpy(frame.data, val, count); frame.dlc = count; CANSend_noblock(MODULE_ID_DCAN0, (CAN_FRAME *)&frame); }
//向主板发送气阀的阻值 void CanCmd_ReturnQIfa_Res_value(uint8_t num, uint16_t res_value) { DEFINE_CAN_WP_FRAME(twp); twp.funcode = CANCMD_SINGAL_QIFA; twp.desid = 0; //todo twp.dlc = 3; twp.data[0] = num; twp.data[1] = res_value & 0xff; twp.data[2] = (res_value / 256) & 0xff; wpSend(&twp); }
// 读取气阀1~16号 当前状态 void CanCmd_ReadQifa1to16(CAN_WP *wp) { DEFINE_CAN_WP_FRAME(twp); twp.funcode = wp->funcode; twp.desid = wp->srcid; twp.dlc = 2; twp.data[0] = Qifa_state.fg_qifa_out & 0xff; twp.data[1] = (Qifa_state.fg_qifa_out / 256) & 0xff; wpSend(&twp); }
void ScanAlarm(void) { if (DeviceCanAddr==0) { return; } uint32 val = Scan_Input_state(); if (val != (1UL << Max_Input_Single)-1) { DEFINE_CAN_WP_FRAME(twp); twp.funcode = CANCMD_SENDALARM; twp.desid = CAN_WP_ID_GROUP_BROADCAST(CAN_WP_DEV_TYPE_MAIN); twp.dlc = 1; twp.data[0] = val; wpSend(&twp); } }
bool wpQfRead(unsigned char id, unsigned int timeout, unsigned int *status) { DEFINE_CAN_WP_FRAME(frame); frame.funcode = CAN_WP_FUNCODE_QF_READ; frame.desid = QIFA_ID(id); frame.dlc = 0; CANSend_noblock(MODULE_ID_DCAN0, (CAN_FRAME *)&frame); atomicClear(&wp_read_qf_flag); withintimedo(timeout) { if (atomicTestClear(&wp_read_qf_flag)) { *status = Sw_Qf_Status; return true; } } return false; }
void scanMotorCmd(void) { MOTOR_CMD *cmd; for (int i = 0; i < MiDuMotoNum; i++) { if (ringBufRead(&motorcmdbuf[i], (void **)&cmd)) { switch (cmd->stat) { case MOTOR_CMD_STAT_WAITE: if ((cmd->speedHz >= DUMUMOTOSTOPHZ) && (cmd->puls <= 15000)) { cmd->stat = MOTOR_CMD_STAT_BUSY; cmd->flag |= 0x10; //force return MotoDumuRun(i, cmd->flag | 0x80, cmd->puls, cmd->speedHz, cmd->stopData); cmd->timertick = timerTick1ms; } else { ringBufPop_noread(&motorcmdbuf[i]); } break; case MOTOR_CMD_STAT_BUSY: if (MiduMotoCtrPra[i].MotoRunState == MOTOSTOPHALF || MiduMotoCtrPra[i].MotoRunState == MOTOSTOPFREE) { ringBufPop_noread(&motorcmdbuf[i]); if (cmd->flag & MOTOR_CMDGO_RETURN_FLAG_RETURN) { //unsigned char stopflag = MiduMotoCtrPra[i].MotoStopData; uint16_t timedif = timerTick1ms - cmd->timertick; DEFINE_CAN_WP_FRAME(wpt); wpt.funcode = CANCMD_DUMUMOTOGO_LOW; wpt.dlc = 8; wpt.data[0] = i; wpt.data[1] = (uint8_t)MiduMotoCtrPra[i].MotoDumuDangqian; wpt.data[2] = (uint8_t)(MiduMotoCtrPra[i].MotoDumuDangqian >> 8); wpt.data[3] = (uint8_t)timedif; wpt.data[4] = (uint8_t)(timedif >> 8); uint8_t flag = 0; flag |= MiduMotoCtrPra[i].MotoRunState << MOTOR_CMDGO_RETURN_FLAG_STAT_SHIFT; flag |= MiduMotoCtrPra[i].MotoRunDir << MOTOR_CMDGO_RETURN_FLAG_DIR_SHIFT; flag |= GetMiduMotoZero(i) << MOTOR_CMDGO_RETURN_FLAG_PROBE_SHIFT; flag |= MiduMotoCtrPra[i].clearPosFlag << MOTOR_CMDGO_FLAG_CLEAR_POS_SHIFT; flag |= MiduMotoCtrPra[i].stopFlag; wpt.data[5] = flag; wpt.data[6] = cmd->stopData; wpt.data[7] = cmd->cmdcode; wpSend(&wpt); } } break; default: break; } }
void Can_Cmd_Workcurrent_Set(CAN_WP *wp) { uint8_t val; for (int i = 0; i < MIN(4, wp->dlc); i++) { val = wp->data[i]; //电机号 1~4 电流档位1~25 才为有效数据 if ((val > 0) && (val < (Max_Current_Num + 1))) { ChannelNum[i] = val - 1; } } DEFINE_CAN_WP_FRAME(twp); twp.funcode = CANCMD_WORKCURRENT_SET; twp.desid = wp->srcid; twp.dlc = 0; wpSend(&twp); }
//读取度目马达状态 void CanCmd_GetDumuMotoState(CAN_WP *wp) { uint32 moto = wp->data[0]; if (moto >= MiDuMotoNum) { return; } //MiduMotoCtrPra[moto].shiji_zero_zhuangtai = GetMiduMotoZero(moto); DEFINE_CAN_WP_FRAME(twp); twp.funcode = CANCMD_GETDUMUMOTOSTATE; twp.desid = wp->srcid; twp.dlc = 4; twp.data[0] = moto; twp.data[1] = MiduMotoCtrPra[moto].MotoDumuDangqian & 0xff; twp.data[2] = MiduMotoCtrPra[moto].MotoDumuDangqian >> 8; uint8_t stat = MiduMotoCtrPra[moto].MotoRunState << 6 | MiduMotoCtrPra[moto].MotoRunDir << 5 | GetMiduMotoZero(moto) << 3; twp.data[3] = stat; wpSend(&twp); }
bool wpQfReadOhm(unsigned char id, unsigned char qifaId, unsigned short timeout, unsigned short *Ohm) { QIFA *qifa = qifaSys.QiFa_Reg_Table[id - 1][qifaId]; if (qifa == NULL) { return false; } DEFINE_CAN_WP_FRAME(frame); frame.funcode = CAN_WP_FUNCODE_QF_READOHM; frame.desid = QIFA_ID(id); frame.data[0] = qifaId | (1 << 7); frame.dlc = 1; CANSend_noblock(MODULE_ID_DCAN0, (CAN_FRAME *)&frame); atomicClear(&wp_qf_resdata); withintimedo(timeout) { if (atomicTestClear(&wp_qf_resdata)) { *Ohm = qifa->Ohm; return true; } } return false; }