Cool Muscle(마쓰루) 모터제어 클래스 C#

Software/C#|2023. 3. 22. 10:22
반응형

마쓰루 사의 Cool Muscle 제품의 통신 제어를 위한 클래스 코드 입니다. 

시리얼을 통해 모터를 제어하는 제품 입니다. 

public class CCoolMuscle
{
    public enum MOTOR_DIRECT { CW, CCW }

    private SerialPort m_ComPort;
    private int m_uiSpeed;
    private int m_uiAcceleration;

    public CCoolMuscle(SerialPort ComPort)
    {
        m_ComPort = ComPort;
        Timeout = 60;
    }

    public int Speed
    {
        set
        {
            m_uiSpeed = value;
            string message = string.Format("S.1={0}\r", m_uiSpeed);
            m_ComPort.Write(message);
        }
    }

    public int Acceleration
    {
        set
        {
            m_uiAcceleration = value;
            string message = string.Format("A.1={0}\r", m_uiAcceleration);
            m_ComPort.Write(message);
        }
    }

    public uint Timeout { set; get; } = 60;     // 60 sec

    public void A_Move(int Position)
    {
        string message = string.Format("P.1={0},^\r", Position);
        m_ComPort.Write(message);
    }

    public void R_Move(int Distance, MOTOR_DIRECT Direct)
    {
        string message;

        if (Direct == MOTOR_DIRECT.CW) message = string.Format("P+.1={0},^\r", Distance);
        else message = string.Format("P-.1={0},^\r", Distance);

        m_ComPort.Write(message);
    }

    public void Set_Zero_Position()
    {
        m_ComPort.Write("|2\r");
    }

    public int Get_Position(out int Position)
    {
        int result = 0;
        Position = 0;

        m_ComPort.Write("?96\r");
        Thread.Sleep(100);

        try
        {
            string str = m_ComPort.ReadLine(); 

            if (str.Length == 0) result = -1;
            else
            {
                Position = int.Parse(str.Remove(0, str.IndexOf('=') + 1));
            }
        }
        catch
        {
            Position = 0;
            result = -2;
        }

        return result;
    }

    public int Check_Motor_Stop()
    {
        int result;

        m_ComPort.Write("?99\r");

        try
        {
            string str = m_ComPort.ReadLine();

            if (str.Contains("Ux.1=8") == true) result = 0;    // Motor is Stop
            else result = 1;    // Motor is moving
        }
        catch
        {
            result = -1;
        }

        return result;
    }

    public void Motor_Stop()
    {
        m_ComPort.Write("]\r");
        m_ComPort.Write("]\r");
    }

    public void Move_Zero_Position()
    {
        m_ComPort.Write("|1\r");
    }

    public void Return_Origin_Position()
    {
        // 원점 복귀, 원점의 위치를 새로 갱신 
        m_ComPort.Write("|\r");
    }
}
반응형

댓글()