안녕하세요.
이 현상을 지칭하는 게 위 제목이 맞을지 모르겠습니다만, 조언을 구합니다.
해당 Labview 프로그램은 HMI 목적의 프로그램입니다.
RS485로 Autonics의 VX4온도 컨트롤러 여러 개와 통신하고 있고,
추가로 JEIO-Tech 사의 RW3-3025라는 제품(Circulator)과 통신하고 있습니다.
이 Circulator는 RS-232로 Modbus RTU방식을 사용하며, 그 중 CIRCULATOR의 내부 온도를 읽어올 수 있는데, 이 외의 몇몇 소수점 형태로 읽어올 수 있는 파라미터들은 모두 IEEE754 부동소수점방식, 64bit로 처리하고 있습니다.
그래서 8byte 텍스트를 받고 부동소수점으로 출력하는 Subvi를 작성하여 데이터를 처리했는데, 한 개만 사용할 때는 정상적으로 출력값이 나왔으나 여러 개의 Subvi를 사용하면 데이터가 밀려서 나오는 현상이 발생하였습니다.
그래서 플랫 시퀀스구조를 써 봤는데 여전히 동일한 증상이 발생되어 밀린대로 바꿔서 쓰고 있긴 한데 근본적인 해결책을 찾지 못했습니다.
원래 데이터의 순서는 CIRCULATOR#1 PV, CIRCULATOR#1 High Temp lmt, CIRCULATOR#1 Low Temp lmt인데 위와 같이 위치를 바꿔 쓰고 있습니다.
이 경우는 처음 겪는데다가 이 사례를 어떻게 검색해봐야 할지도 막막하네요.
읽어주셔서 감사합니다.
좋은 하루 되세요!
해결되었습니다! 솔루션으로 이동.
09-01-2023 03:30 AM - 편집 09-01-2023 03:34 AM
일단 Modbus-RTU 라고 해서 같은 프로토콜을 사용 할 것이란 생각은 버려야 합니다.
Modbus-RTU 프레임에 임의의 접점을 연속 쓰거나 읽게 하는 기능을 임의로 사용하기 때문에, 회사마다, 제품마다 프로토콜이 다를 수 있습니다.
서로 다른 프로토콜을 한 포트에 묶어 일방적으로 보내면, 아무리 Address 가 달라도 프레임 오류가 납니다.
응답을 Address 별로 확인 할 수 있다면 구분해서 처리하면 되겠습니다만, 그게 아니라면 명령 하나 보내고 응답 처리하기를 포트별로 반복하시는걸 추천 드립니다. 응답이 섞여 들어오기도 하거든요.
저도 485 포트 5개에 36대 통신하는 코드 만들고 있는 중이라... 몇자 적어 봅니다.
답변 감사합니다.
헌데 제 질문이 서두없어 약간 혼동이 있는 것 같습니다.
Modbus로 엮인 기기들은 모두 이상 없이 데이터가 들어옵니다.
다만 그 데이터를 파싱하고 후처리하는 과정에서 오류가 있었습니다.
약 80바이트가량 들어 온 데이터 중, 8바이트씩 파싱한 데이터는 프로브를 찍어봐도 이상이 없었는데, 그 바이트를 각각 IEEE 754 부동소수처리하는 Subvi에 연산을 수행하여 그 결괏값을 받아오려 하는 과정에서 데이터 출력이 다른 VI쪽으로 밀려 들어오는 것을 보았던 것입니다.
이틀간 지켜봐도 알 수가 없네요.
머리좀 비우고 다시 들여다봐야겠습니다.
즐거운 주말 되세요!
네, IEEE 754 계산의 소수부에 For Loop 로 계산하는 부분이 있습니다.
그럼 이 부분을 고쳐보고 말씀드릴께요
09-03-2023 09:00 PM - 편집 09-03-2023 09:02 PM
피드백 감사합니다.
FOR Loop 제거하고 해결되었습니다.
사족을 달자면,
IEEE754를 Binary로 변환하는 과정에 For Loop를 썼었는데요
IEEE754 변환 과정중 지수부를 Binary 배열로 하나하나 찍어내는 부분에 사용했습니다
결과적으로는 몇 개의 타입캐스트와 바이트 배열, 배열전치정도만 있으면 되는 것을 어렵게 작성해서 예상치 못한 결과가 나왔네요.
해결하셨다니 다행입니다.
답변 보고 IEEE754 찾아봤는데 머리 좀 아프셨겠네요.