취소
다음에 대한 결과 표시 
다음에 대한 검색 
다음을 의미합니까? 

실시간으로 측정데이터를 받으면서 측정값에 따라 모터 움직임을 제어 하려고 합니다.

압력센서 측정용 셋업을 제작 중입니다.

 

Force gauge로 압력 측정값을 읽고 그 값에 따라 모터를 구동하여 센서에 가해지는 압력을 제어하고자 합니다.

 

현재 Force gauge 를 통해 압력 데이터를 받는 부분과 모터를 원하는 속도와 방향에 따라 움직이는 소스는 각각 짜 놓은 상태 입니다.

 

제가 구현하고자 하는 프로그램은 다음과 같습니다.

 

1. 타겟하는 압력이 측정될 때까지 모터를 통해 Force gauge 를 이동

2. 모터 일정시간 정지(Force gauge는 계속 real-time으로 압력측정)

3. 타겟하는 압력을 증가시키고 모터를 통해 다시 Force gauge 이동

4. 마지막 압력에 도달하면 측정 종료

 

이렇게 측정을 하여 계단식 모양의 시간에 따른 압력 데이터를 얻고자 합니다.

 

먼저 Force gauge 측정용 프로그램과 모터 제어용 프로그램을 하나의 while 루프안으로 묶고 실행을 했습니다.

 

여기서 문제가 발생하였는데 모터가 일정시간동안 멈출 때 Force gauge 의 데이터 수집도 멈추어 버리는 현상이 발생하였습니다.

 

이 문제의 해결책으로 Queue를 사용하여 각각의 프로그램을 다른 while 루프에서 구현하도록 하였습니다. 하지만 두 루프 간의 데이터 처리 속도가 달라 문제가 발생하였습니다.

 측정된 압력 데이터가 모터 움직임을 담당하는 루프에 느리게 전달되어 압력에 따른 모터의 움직임이 바로 이루어질 수 없었습니다. 결과적으로 타겟하는 압력에 도달하였음에도 모터가 정지하지 않고 계속 작동했습니다.

 

찾고자 하는 해결책에 대해 요약드리자면 다음과 같습니다.

- 압력 데이터가 실시간으로 모터 구동 쪽으로 전달 되면서 모터의 움직임이 압력 데이터 수집에 영향을 주지 않도록 두 프로그램을 합치는 방법

 

이후에 마땅한 해결책을 찾고 있지 못하는 상황입니다.

 

첨부된 파일은 190208 (하나의 루프로 돌렸을 때 모터가 정지하면 압력데이터 수집도 정지되는 문제), 190208_v2(Queue를 사용했을 때 데이터가 느리게 전달되어 모터를 원하는 대로 제어 할 수 없는 문제) 에 대한 파일입니다.

 

조언 부탁드리겠습니다.

 

감사합니다.

모두 다운로드
0 포인트
1/6 메시지
2,349 조회수

기존 파일이 버전이 높아 2012버전으로 내렸습니다.

모두 다운로드
0 포인트
2/6 메시지
2,326 조회수

디자인 패턴에 대해서 조금 알아보시면 도움이 될 것 같습니다.

 

해당 VI를 확인한 결과, 상태머신구조로 프로그램을 수정해보심은 어떨련지요.

 

질문내용을 토대로 예를들어,

- 초기화(시리얼오픈이나 모터 오픈, 기타 변수 초기화)

- 데이터 수집 및 가공(시리얼을 통해 받은 센서데이터를 통해 모터 구동 조건 결정)

- 데이터 출력(모터 출력)

- 종료(시리얼종료, 모터 종료구문)

 

제가 답변드리는 내용은 결코 정답이 아니고 참고만 하셔서 작성해보시면 답을 찾으실 수 있으실 것 같네요

0 포인트
3/6 메시지
2,318 조회수

코드 주석이 없어 이해하기가 힘드네요. 

첫번째 vi 기준으로 말씀드릴게요. 

 

1. 기다림 함수는 하나면 충분할 것 같습니다. 케이스 안에 있는 것 삭제하셔도 될 것 같아요.

 

2. 비자 닫기 함수가 왜 루프 안에 있는지 모르겠네요. 루프 오른쪽에 놓으셔야 할 것 같아요. 

 

3. 모터 일시 정지를 할 때 왜 압력 측정을 멈추는지 원인을 파악하셨나요? 모터 일시정지 시 루프가 정지하면 안됩니다. 

즉 루프는 일정 시간 간격으로 무조건 동작하게 하신 상태에서 일시정지 시 케이스 구문을 이용하여 모터에 내리는 명령을 변경하면 될 것 같습니다. 

 

 

0 포인트
4/6 메시지
2,316 조회수

친절한 답변 감사드립니다.

 

상태머신에 대해 공부해야겠어요.

 

현재 가지고 있던 문제는 모터 구동과 압력 측정 루프를 병렬로 구동하고 측정되는 압력값을 로컬 변수로 하여 모터 구동 루프에 전달하여 해결하였습니다.

 

상태머신을 통해서는 좀 더 보기 편하고 간단한 프로그램 구성이 가능할 것 같습니다. 맞나요?

 

다시 한번 감사드립니다.

0 포인트
5/6 메시지
2,306 조회수

첫번째 VI에서 보시면 압력값이 목표치에 가면 루프가 정지하게 코딩을 하셨어요.

 

루프가 정지하면 압력값을 읽는 코드도 같이 정지하기때문에 압력값이 실시간으로 들어오질 못하는거구요

 

이런 현상때문에 두번째 Vi를 만드신거 같습니다.

 

제가 보기엔 첫번쨰 VI 를 수정하셔서 코딩하는게 좋을듯 합니다.

 

상태머신 또는 생산자소비자구조등 지금당장 공부하시기 힘드시면 첫번째 VI에서 와일루프를 정지시키는 부분만 모터제어 코드랑  압력값 읽어오는 코드를 분리하여 만들어 주시면 될거 같네요

0 포인트
6/6 메시지
2,296 조회수