본문으로 바로가기

파일로 출력하기 - TXT

category Programming/LabVIEW 2024. 6. 8. 21:58
반응형

FA 분야에서 HMI 역할을 수행하기 위해서는 사용자 인터페이스 환경의 제공이 필수적이라는 것은 두말할 필요도 없는 부분이겠지만, 이것 이외에도 많은 부수적인 기능들이 요구되는데요. 실시간으로 수집되는 데이터들을 하나의 파일에 기록해서 저장하는 것도 필요한 부수적인 기능 중 하나입니다. 가장 기본적인 파일 형태라고 한다면 일단 확장자가 TXT인 텍스트 파일을 떠올릴 수 있겠네요.

랩뷰에서도 이러한 파일의 입출력을 위해 여러 함수들을 제공하고 있는데요. 위 그림과 같이 함수 팔레트의 프로그래밍 → 파일 I/O에서 관련된 함수들을 찾으실 수 있습니다.

파일로부터 데이터를 읽어 들이거나 데이터를 파일에 기록할 때도, 반드시 열기 → 작업 → 닫기의 순서를 거쳐야 합니다. 여기서 열기라는 것을 통해 작업 대상이 되는 파일에 대한 접근 권한을 랩뷰 프로그램에서 취득하게 되는 것이구요. 열린 파일을 대상으로 데이터를 읽어오거나 기록하는 작업을 처리한 다음에, 메모장과 같은 다른 프로그램에서 같은 파일에 접근할 수 있도록 닫기를 통해 접근 권한을 해제하는 순서라고 이해하시면 됩니다.

위 그림의 파일의 열기와 닫기에 대한 함수를 보여드리고 있는데요. 앞에서 말씀드린 함수 팔레트의 파일 I/O에서 두 함수를 찾으실 수 있습니다. 일단 그림에서는 파일 열기 함수라고 설명하고 있지만, 함수의 정확한 명칭은 파일 열기/생성/대체 함수입니다. 그림에서 보시는 것처럼 작업 대상이 되는 파일의 경로와 동작, 그리고 접근에 대한 3가지 입력이 필수로 필요한데요. 경로는 작업 대상이 되는 파일의 위치를 전달하는 입력 터미널이고, 동작은 파일을 열어주는 과정에서의 옵션을 의미합니다.

파일 열기 함수의 동작에 대한 설명 (출처: 랩뷰 프로그래밍 참조 매뉴얼)

파일 열기 함수의 동작 입력으로 전달할 수 있는 데이터의 종류를 위 표에서 확인하실 수 있는데요. 어떤 옵션을 선택하는지에 따라 작업 대상이 되는 파일의 끝에 데이터를 연속해서 기록할 수도 있고, 아예 새로운 파일로 덮어쓸 수도 있습니다.

파일 열기 함수의 접근에 대한 설명 (출처: 랩뷰 프로그래밍 참조 매뉴얼)

접근 입력은 파일을 어떤 목적으로 여는지에 대한 선택 옵션입니다. 위 표와 같이 읽기나 쓰기에 대한 작업을 선택하면 되구요. 이렇게 경로와 동작, 그리고 접근에 대한 항목들을 전달한 상태로 함수를 실행하게 되면, 열린 파일에 대한 참조 번호가 출력으로 전달됩니다. 나중에 기회가 되면 다시 설명드리겠습니다만, 랩뷰에서 참조라는 것은 C# 프로그램에서의 Pointer, 혹은 Reference와 같은 개념이라고 보시면 됩니다. 즉, 와이어를 이용해서 파일 안에 들어 있는 모든 데이터를 실어서 보낼 수 없기 때문에 참조 번호를 이용해서 접근하는 것이라고 이해하시면 되구요. 파일 열기 함수를 통해 전달되는 참조 번호가 파일 I/O와 관련된 모든 함수들에게 전달되어야 한다는 의미이기도 합니다.

이 글에서는 일단 텍스트 파일로 데이터를 기록하는 방법에 대해서만 설명할 예정이므로, 위 그림과 같이 함수 팔레트에서 텍스트 파일에 쓰기 함수를 블록 다이어그램에 추가하겠습니다.

위 그림에서 보시는 것과 같이 워낙 사용하는 방법이 간단하기 때문에, 함수의 입출력 터미널에 대한 내용은 생략하구요. 일단 위 그림과 같이 프로그램을 작성하고 실행시켜 보면, 파일 경로 컨트롤에 지정한 위치대로 TXT 파일이 생성됩니다. 그리고 생성된 TXT 파일을 직접 열어 보면,

위 그림과 같이 텍스트 컨트롤에 입력한 텍스트가 그대로 기록되어 있는 것을 확인할 수 있습니다.

이렇게 문자열 데이터를 단순하게 기록하는 정도라면 지금까지 보여드린 내용만으로도 충분하겠지만, 프로그램에서 처리하고 있는 데이터를 파일로 기록할 때는 대체로 데이터에 대한 로그 파일일 가능성이 높습니다. 다시 말해서, 일반적인 TXT 파일이긴 하지만, 일정한 포맷에 따라 문자열로 기록된 데이터들을 여러 라인에 걸쳐서 반복적으로 출력해 줄 필요가 있다는 말인데요. 그러기 위해서는 앞에서 보여드린 텍스트 파일에 쓰기 함수보다, 파일로 포맷 함수가 오히려 유용할 수 있습니다.

파일로 포맷 함수도 함수 팔레트의 파일 I/O에서 찾을 수 있습니다.

파일로 포맷 함수의 입출력 터미널은 위 그림과 같습니다. 일단, 열린 파일에 대한 참조 번호와 에러 정보의 입출력 터미널은 다른 함수들과 동일하니 그냥 넘어가구요. 파일로 기록할 데이터들을 연결하는 입력 터미널은 함수의 왼쪽 하단에 위치합니다. 문자열 타입으로 변경할 필요 없이 기록할 데이터를 원래 타입 그대로 연결하면 되구요. 여러 개의 데이터가 기록되어야 할 때는 마우스 포인터를 함수 위에 올려놓았을 때 나타나는 파란색 사각형을 통해 아래로 함수를 늘려주시면 더 많은 연결 터미널들이 나타납니다. 이렇게 전달받은 데이터들을 함수 안에서 직접 하나의 문자열 데이터로 변환하는데요. 이때 필요한 양식을 함수의 제일 상단에 위치하는 문자열 포맷으로 연결해 주어야 합니다.

문자열 포맷에 대한 구체적인 내용은 블로그에 따로 정리하기에는 양이 방대한 관계로, 아래와 같이 링크를 달아둘 테니 필요하신 분들은 직접 확인해 주시기 바라구요.

https://www.ni.com/docs/ko-KR/bundle/labview/page/format-specifier-syntax.html

이런 내용에 따라 위 그림처럼 프로그램을 작성하고 실행시켜 보면,

와 같은 결과를 얻을 수 있습니다.

지금의 프로그램에서는 기록할 데이터들을 하나의 문자열 데이터로 변환해서 파일 안에 기록하므로, 탭이나 개행 문자 같은 이스케이프 문자들을 문자열 포맷 안에 포함시켰습니다. 쉽게 말해서, 위 그림과 같이 파일 안에 기록된 데이터들을 사용자가 보기 편하게 만들어주기 위해서, 문자열 포맷에 약간의 술수를 부렸다는 의미인데요. 일단은 작성된 파일을 열어 보았을 때, 날짜와 시간, 그리고 데이터가 보기 좋게 정렬되어 있어서 좋긴 합니다만, 다량의 데이를 반복해서 파일로 기록하는 과정에서 탭을 통해 파일을 정렬하는 것은 사실 그렇게 좋은 방법은 아닙니다. 그래서 실제 HMI 디바이스들도 TXT 포맷으로 로그 파일을 기록하기보다는 CSV 포맷을 더욱 선호하는 이유입니다.

CSV 파일로의 기록도 위 프로그램을 그대로 이용할 수 있는데요. 작업 대상이 되는 파일의 확장자를 CSV로 변경하고, 문자열 포맷에서 여러 개의 탭 문자를 콤마 기호로 변경하면 간단히 CSV 포맷으로도 만들 수 있습니다.

반응형