Q&A

라이브러리 초기화 실패

  • 여재호
  • 2024-10-01
  • 21

현재 사용하고 있는 모델은

모션 : MADLN05BE

DIO : N3ECAT-DB32T

 

사용하고 있는 라이브러리는

EzSoftwareUC_V2.1.4.5073_HW_20230420 입니다.

 

문제점이 하나 있는데

초기에 Motion과 DIO를 이더켓으로 연결한 상태로 자체 프로그램을 실행할때는 정상적으로 실행이 됩니다.

그런데, 여기서 DIO 이더켓 연결을 해제한 상태로 다시 자체 프로그램을 실행시키면

라이브러리 초기화시에 DIO가 끊긴게 인식이 안됩니다.

 

반대로 연결이 안되어있는 상태로 자체프로그램을 실행시키다가 

DIO를 연결하면 라이브러리 초기화시에 DIO가 끊긴게 인식이 안됩니다

 

여기서 인식이 안된다는 의미는 AXL Open은 정상적으로 실행이 된다고 나오지만

실제 AxdInfoIsDIOModule 매서드에서 받아오는 참조값(ref)을 받아오면 모듈이 없다 ( return 0 ) 고 나옵니다.

 

그리고 실제 AxlOpenNoReset을 사용할 때 우측 하단에 나타나는 라이브러리 초기화 상태창도

평소보다 오래 보입니다.

 

그런데 여기서 EzConfig를 한번 실행시키고 종료시키면 모든게 정상적으로 돌아옵니다.

EzConfig도 분명 같은 API를 쓸텐데 혹시 저희가 빠뜨린 부분이 있는지 싶어 문의 남깁니다.

( 라이브러리 초기화 소스코드도 첨부합니다 )

 

1. 어떤 부분을 저희가 빠뜨렸기에 EzConfig를 한번 실행해야 정상적으로 돌아오는걸까요?

2. 라이브러리 종료 실패할 때가 있던데 이런 경우는 어떤 경우인가요?

 

[ Motion 라이브러리 초기화, 종료 ]

public static void InitLib()
{
    // 라이브러리 선택
    nMtrKind = SelectMachineKind();

    if (nMtrKind == (int)MtrKind.Ajin && AxlControl.AxlIsOpened() != 1)
    {
        if (AxlControl.AxlOpenNoReset() != (int)AXT_FUNC_RESULT.AXT_RT_SUCCESS)
        {
            MessageBox.Show("Motor Lib Init Fail");
            LogManager.Instance.LogSystem("Motion Initialize Fail");
            bIsLibInit = false;
            return;
        }

        string strFilePath = Path.Combine(Application.StartupPath, "Ajin.mot");
        if (AxmControl.AxmMotLoadParaAll(strFilePath) != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS)
        {
            bIsLibInit = false;
            return;
        }
        
        // 축 개수 가져오기
        nAxisCount = AxisCount();
    }

    if (nAxisCount == 0)
    {
        MessageBox.Show("No Axis");
        bIsLibInit = false;
        return;
    }

    // 라이브러리 정상 초기화 시
    for (int i = 0; i < nAxisCount; ++i)
    {
        MtrThread[i] = new MtrThread(i);
        MtrSetter.MtrSetAbsRel(i, 0);
    }
    
    // 스레드 만든 후 속성 값 넣기
    MtrSetter.InitSetMtrProperty();

    // SW Limit 설정하기
    MtrSetter.SetSoftLimitAll(true);

    bIsLibInit = true;
    LogManager.Instance.LogSystem("Initializing Motor Complete");

    return;
}

 

public static void CloseLib()
{
    if (bIsLibInit == false) return;

    // 전부 종료하기
    if (MtrGroup.nMtrKind == (int)MtrKind.Ajin)
    {
        if (AxlControl.AxlClose() == 1) { bIsLibInit = false; }
    }

    // Init 할때 기동시킨 쓰레드 종료
    if (MtrThread != null)
    {
        for (int i = 0; i < nAxisCount; ++i)
        {
            MtrThread[i].Stop();
        }
        MtrThread = null;
    }

}

 

[ Dio 라이브러리 초기화, 종료 ]

public static void InitLib()
{
    // 라이브러리 선택
    nMtrKind = SelectKind();

    if (nMtrKind == (int)MtrKind.Ajin)
    {
        if (AxlControl.AxlIsOpened() != 1)
        {
            if (AxlControl.AxlOpen() != (int)AXT_FUNC_RESULT.AXT_RT_SUCCESS)
            {
                // 이 부분은 초기화 실패 시 함수 중단하는 부분
                MessageBox.Show("DIO Lib Init Fail");
                LogManager.Instance.LogSystem("Dio Initialize Fail");
                bIsLibInit = false;
                return;
            }
        }
        else
        {
            uint nIsDioExist = 0; 
            AxdControl.GetInfoIsDioModule(ref nIsDioExist);

            if (nIsDioExist == 0)
            {
                bIsLibInit = false;
                return;
            }
            else bIsLibInit = true;

        }

        nDioModuleCount = DioGetter.IOModuleCount();

        if (nDioModuleCount < 1)
        {
            MessageBox.Show("Axd 모듈 수량이 인식되지 않았습니다.");
            return;
        }

        int tempDi = -1; int tempDo = -1;
        uint uResult = DioGetter.IOCount(ref tempDi, ref tempDo);
        if (uResult != 0)
        {
            MessageBox.Show("Axd IO 접점이 인식되지 않았습니다.");
            return;
        }
        nDiCount = tempDi;
        nDoCount = tempDo;

        DioTread = new CIOThread();
        DioTread.Init(nDiCount, nDoCount);
    }

    // 라이브러리 정상 초기화 시

    
    LogManager.Instance.LogSystem("Initializing Dio Complete");

    InitializeVariable(); // 변수 초기화
    return;
}

 

public static void DioCloseLib()
{
    if (bIsLibInit == false) return;

    if (nMtrKind == (int)MtrKind.Ajin)
    {
        if (DioTread is not null)
            DioTread.Close();

        if (AxlControl.AxlClose() == 1)
            bIsLibInit = false;
        else
            bIsLibInit = true;
    }  
}

안녕하십니까 아진엑스텍입니다.

안녕하십니까 아진엑스텍입니다.
문의주신 Q&A는 메일로 답변드렸습니다. 확인부탁드립니다.