optical/EMBOS/Users/EmbFunc/busmotos/ruanyictrl.c
2025-09-04 09:45:08 +08:00

195 lines
3.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ruanyictrl.h"
#if (BUSCTRL_MOTO == RUANYI)
#include "modbus_m.h"
#include "workctrl.h"
typedef struct
{
u16 motoreturndat; //电机回包数据
u16 motoparaval; //参数设置值
u16 zerocodeval; //零位编码值
int curtozeroval; //当前位置与零位编码值
u32 curtozeroabs;
u8 zeroflag;
s16 motocurpuspos;
}RYDriverCtrl;
RYDriverCtrl g_rydriverctrl;
void InitRuanyiCom(void) //初始化
{
memset(&g_rydriverctrl, 0, sizeof(RYDriverCtrl));
}
/*移动电机到某位置 (绝对位置)
* decIdx:电机设备地址1-127
* pos:目标位置(脉冲数)
* spd:速度 0不改变速度
* */
int MoveRyiToAbsolutePos(u8 devIdx, s16 pos, u16 spd)
{
int err = 0;
static u16 oldRyspd = 500;
if(spd != oldRyspd)
{
oldRyspd = spd;
err = ModbusComm16(0,devIdx, MODBUS_WR, 8256, (u16)spd, &g_rydriverctrl.motoreturndat); //更改最高速度
DelayRef(300);
}
if(err >= 0 &&
pos != 0)
{
err = ModbusComm16(0,devIdx, MODBUS_WR, 9473, (u16)pos, &g_rydriverctrl.motoreturndat);
if(g_rydriverctrl.motoreturndat != (u16)pos)
{
err = -10;
}
}
return err;
}
/*移动电机到某位置(相对位置)
* decIdx:电机设备地址1-127
* pos:目标位置(脉冲数)
* spd:速度 0不改变速度
* */
int MoveRyiToRelativePos(u8 devIdx, s16 pos, u16 spd)
{
int err = 0;
static u16 oldRyspd = 1500;
if(spd != oldRyspd)
{
oldRyspd = spd;
err = ModbusComm16(0,devIdx, MODBUS_WR, 8256, (u16)spd, &g_rydriverctrl.motoreturndat); //更改最高速度
DelayRef(300);
}
if(err >= 0 &&
pos != 0)
{
err = ModbusComm16(0,devIdx, MODBUS_WR, 9475, (u16)pos, &g_rydriverctrl.motoreturndat);
if(g_rydriverctrl.motoreturndat != (u16)pos)
{
err = -10;
}
}
return err;
}
/*电机JOG+ 运行
* decIdx:电机设备地址1-127
* spd:速度 0不改变速度
* */
int MoveRyiJOGP(u8 devIdx, u16 spd)
{
int err = 0;
if(spd != 0)
{
err = ModbusComm16(0,devIdx, MODBUS_WR, 8241, (u16)spd, &g_rydriverctrl.motoreturndat); //点动速度
}
if(err >= 0)
{
err = ModbusComm16(0,devIdx, MODBUS_WR, BITMOVEADDR, BITJOGPCMD, &g_rydriverctrl.motoreturndat);
}
return err;
}
int MoveRyiJOGN(u8 devIdx, u16 spd)
{
int err = 0;
if(spd != 0)
{
err = ModbusComm16(0,devIdx, MODBUS_WR, 8241, (u16)spd, &g_rydriverctrl.motoreturndat); //点动速度
}
if(err >= 0)
{
err = ModbusComm16(0,devIdx, MODBUS_WR, BITMOVEADDR, BITJOGNCMD, &g_rydriverctrl.motoreturndat);
}
return err;
}
//电机停止
int RyiMotoStop(u8 devIdx)
{
int err = 0;
err = ModbusComm16(0,devIdx, MODBUS_WR, BITMOVEADDR, BITSTOPCMD, &g_rydriverctrl.motoreturndat);
return err;
}
//当前位置给定
int SetRyiCurPos(u8 devIdx, s16 pos)
{
int err = 0;
err = ModbusComm16(0,devIdx, MODBUS_WR, 9472, pos, &g_rydriverctrl.motoreturndat);
return err;
}
//当前位置清零
int RyiMotoSetCurPosZero(u8 devIdx)
{
int err = 0;
err = ModbusComm16(0,devIdx, MODBUS_WR, BITMOVEADDR, BITSETCPOSZEROCMD, &g_rydriverctrl.motoreturndat);
return err;
}
//到对应位置
int RyiMotoToPos(u8 devIdx, u16 pos)
{
int err = 0;
err = ModbusComm16(0,devIdx, MODBUS_WR, BITTOPOSADDR, pos, &g_rydriverctrl.motoreturndat);
return err;
}
//读取电机位置 单位:脉冲
int GetCurPusPos(u8 devIdx, s16 * puspos)
{
int err = 0;
u16 upuspos = 0;
err = ModbusComm16(0,devIdx, MODBUS_RD, 9729, 0, &upuspos);
*puspos = (s16)upuspos;
return err;
}
//读取电机状态 当前指令是否完成0未完成1完成 2堵转 3错误
int GetCurStatus(u8 devIdx, int * statuflg)
{
int err = 0;
u16 sta = 0;
err = ModbusComm16(0,devIdx, MODBUS_RD, 9728, 0, &sta);
if(err < 0)
{
return err;
}
else
{
if(sta == 1)
{
*statuflg = 1;
}
else if(sta == 0)
{
*statuflg = 0;
}
else
{
*statuflg = -1;
}
}
return err;
}
#endif