티스토리 뷰

728x90

모드버스 슬레이브(Slave) 시뮬레이터 mod_RSsim 사용하기를 간단하게 메모해 두고자 한다. 모드버스 프로토콜에 대한 소개와 mod_RSsim 다운로드는 "모드버스(Modbus) 응용 개발을 위한 준비"를 참조하면 된다. 모드버스 슬레이브(Slave)라는 것은 모드버스 마스터의 요청에 따라 데이터를 전달하거나 저장하는 서버의 역할을 하는 노드로 PLC와 같은 장비들이 주로 모드버스 슬레이브의 역할을 수행한다. 이러한 장비가 없는 경우 또는 실제 장비에 영향을 주지 않는 안전한 테스트가 필요한 경우에 모드버스 슬레이브 시뮬레이터를 사용할 수 있다.

 

■ MODBUS TCP로 가동하기

모드버스 TCP 모드로 시뮬레이터를 가동하려면 우측 상단 "Prot:" 항목의 콤보 박스를 "MODBUS TCP/IP"로 선택하면 된다.

 

기본 TCP 포트는 502이지만 시뮬레이터를 여러 개 동작시키거나 하는 이유로 포트를 바꾸고 싶다면 상단의 "Setup port" 버튼을 눌러서 포트 번호나 노드 아이디(Station ID)를 변경할 수 있다. 

 

■ MODBUS RTU로 가동하기

시리얼 포트를 활용한 모드버스 통신을 수행하려면 "Prot:" 항목의 콤보 박스를 "MODBUS RS-232"로 선택하면 된다. 프로토콜을 변경하는 경우에는 기존에 접속했던 것이 있다면 모두 끊어지므로 위의 그림처럼 경고창으로 변경 여부를 확인한다. [예]로 프로토콜 변경을 진행한다.

 

시리얼 통신을 위한 세부 설정은 위의 그림처럼 상단의 포트 설정 아이콘을 클릭하여 수행한다. 시리얼 통신으로 수행할 수 있는 MODBUS ASCII 프로토콜도 있지만 MOSBUS RTU 프로토콜만 지원한다. 

 

■ 연결 관리와 동작 상태 확인하기

mod_RSsim 프로그램의 제목줄에서는 현재의 프로토콜 선택 사항과 상세 포트 설정 정보를 확인할 수 있다. 위의 그림에서는 COM1포트를 38,400 BPS로 연결하여 MODBUS RTU 슬레이브가 동작하고 있음을 볼 수 있다. 제목줄 바로 아래로는 현재의 동작 상태를 확인할 수 있다. 시리얼 포트의 경우는 연결이 하나일 수밖에 없지만 TCP의 경우에는 지정한 범위(기본값 10개) 내에서 동시 접속 서비스도 가능하므로 연결 개수와 패킷 서비스 개수로 정상적으로 서비스되고 있는지, 얼마나 요청이 있었는지를 확인할 수 있다. 동작 중 일 때는 빨간 램프가 깜박인다. 서버 동작을 중단 시키거나 다시 가동하고 싶다면 상단 맨 우측의 연결/끊기(open/close) 버튼을 사용하면 된다.

 

기본적으로 mod_RSsim 프로그램은 좌측의 레지스터 값보기 모드로 동작하지만 우측 하단의 [Comms] 버튼을 누르면 위의 그림처럼 세부 통신 내역과 동작 과정을 살펴볼 수 있다. 모드버스 마스터 프로그램을 개발하고 있다면 통신 트래킹 과정을 유용하게 활용할 수 있다. 다시 레지스터 값 보기 모드로 돌아가려면 우측 하단의 [Register] 버튼을 누르면 된다.

 

■ 레지스터 값 확인 및 변경하기

테이블 이름 주소 범위 유형 동작 방식
discrete_output_coils 1-9999 디지털 입출력
discrete_input_contacts 10001-19999 디지털 입력
analog_input_registers 30001-39999 아날로그 입력
analog_output_holding_registers 40001-49999 아날로그 입출력

모드버스 프로토콜에서는 주소 영역을 위의 표와 같이 크게 네 가지 영역으로 분류하여 테이블(Table)이라 지칭한다.

 

어떤 테이블의 레지스터 값을 볼지를 선택하려면 위의 그림처럼 상단 "I/O" 항목의 콤보 박스를 클릭하면 된다. 주의할 것은 우측의 그림과 같은 디지털 테이블들은 한 주소에 1비트로 0 또는 1만 표시하면서 1인 경우에는 배경을 반전시켜서 구분시켜 주지만 아날로그는 한 주소에 2바이트로 "Fmt"로 지정하는 표시 방식에 따라 다른 값이 표시될 수 있음을 기억해야 한다. hex, decimal, word16은 모두 한 주소 영역 2바이트를 각각 16진수, 16 비트 부호정수, 16비트 비부호 정수로 인식하여 출력하지만 dword32, long 32, float32는 현재 주소와 다음 주소를 합쳐서 하나의 값으로 인식하는 방식으로 값을 보여 주므로 기준 주소에 대해서 값을 확인해야 한다.

 

예를 들어 위의 그림처럼 "hex"로 각 주소 값을 보면 40001과 40003 주소는 1이지만 이것을 dword32 인식하면 아래의 그림과 같다.

 

40001 주소를 dword32로 해석하면 0x00010000 이므로 65535이고, 40002 주소를 dword32로 해석하면 0x00000001이 된다. 만약 40001과 40003에 32비트 정수나 실수값을 저장하기로 했다면 40002나 40004 주소는 변경하지 말아야 하고 해당 주소 값을 읽는 것도 의미가 없음을 주의해야 한다.

 

디지털 테이블의 값은 원하는 레지스터 위치를 더블클릭하여 0에서 1, 1에서 0으로 토글 할 수 있다. 반면에 아날로그 테이블은 레지스터 위치를 더블클릭하면 위의 그림과 같이 현재 표시 형태로 값을 입력하여 레지스터의 값을 변경할 수 있다.

 

■ 고급 기능 사용하기

실제 장비가 아닌 시뮬레이터를 사용하는 이유로는 장비를 구하는 것 자체가 어렵거나 곤란한 상황 때문에 그럴 수도 있지만 많은 경우는 프로그램 개발 및 디버깅의 용이성에 사용 이유가 있다고 하겠다. 중요한 것은 실제과 유사한 상황을 만들기 위하여 여러 레지스터의 값을 조정해 놓았는데, 해당 상황이 필요할 때마다 다시 개별 레지스터를 설정하는 것은 너무 비효율이다. 이럴 때는 특정 상태에서 "모든 레지스터 값 저장하기" 버튼을 눌러 해당 시점의 모든 레지스터 값을 파일로 저장해 놓았다가 "모든 레지스터 값 로드하기"로 파일에 있는 내용을 현 상태로 반영하면 편리하게 작업할 수 있다.

 

레지스터 값을 저장하면 위의 그림과 같이 프로그램 실행 폴더에 MODDATA.DAT라는 파일이름에 현시점의 모든 레지스터 값이 저장된다. 그런데, "모든 레지스터 값 저장하기"를 다시 수행하면 앞선 자료는 모든 없어지므로 특정 상황을 보관하고 싶다면 "모든 레지스터 값 저장하기" 수행 이후에 위의 그림처럼 파일 이름을 변경하여 저장해 놓으면 유용하다. 특정 상황이 필요할 때면 해당 파일을 복사하여 이름을 MODDATA.DAT로 변경하고 "모든 레지스터 값 로드하기"를 수행하면 된다. 현재의 모든 레지스터 값을 초기화하려면 상단의 지우개 버튼을 사용하면 된다.

 

지금까지의 기능이 시뮬레이터의 정적인 부분을 다루었다면 다양한 장비가 붙어서 동작하는 실제 PLC처럼 동적인 모습을 보일 수 있는 기능이 애니메이션이다. 상단의 "No Animation"으로 선택하고 [OK]를 누르면 동작하고 있는 애니메이션을 중단시키는 역할을 하고 나머지 라디오 버튼을 선택하고 [OK]를 누르면 해당 애니메이션 주기적으로 수행한다.

 

"Increment BYTES"와 "Increment WORDS"는 모든 레지스터를 대상으로 한꺼번에 모두 변경한다. 디지털 레지스터는 0에서 1, 1에서 0을 반복하고 아날로그 레지스터는 1씩 증가시키는데 "Increment BYTES"는 하나의 레지스터에 있는 2바이트를 각각 바이트 단위로 1씩 증가시키고 "Increment WORDS"는 2바이트를 묶어서 1씩 증가시킨다. 모든 태그에 단순한 값 변화를 적용해 볼 때 유용하다.

 

mod_RSsim 시뮬레이터의 매력 중 하나는 스크립트를 활용해서 마치 PLC가 동작하는 것처럼  만들 수 있다는 것이다. 위의 그림처럼 "Training PLC simulation"을 선택하고 준비한 스크립트 파일 이름을 직접 입력하면 된다. 주의할 것은 우측의 "..."을 눌러서 파일을 선택하려고 클릭하면 필자의 경우는 프로그램이 비정상 중단되었다. 직접 입력하면 문제없이 동작한다. 경로 없이 파일명만 입력하면 프로그램 폴더에서 스크립트를 가져오므로 그렇게 입력해도 된다.

 

dim x
dim n
dim runtime
dim pi

pi = 3.141592
n=0
for n=0 to 10 step 2
   x = getregistervalue(3,n)
   SetRegisterValue 3, n, x+1
   SetRegisterValue 3, n + 1, 10000 + 10000 * sin(x * pi / 180)
next

스크립트는 VB 스크립트만 사용할 수 있다. 위의 코드는 "Holding Register" 테이블에서 12개의 레지스터를 루프로 변경하는 것으로 한 레지스터는 현재 값을 1씩 증가시키고 바로 다음 레지스터는 이전 레지스터 값의 SIN 사각 함숫값을 입력하도록 했다. 만약 두 레지스터 값으로 그래프를 그리면 하나는 직선을 다른 하나는 사인 곡선을 그리게 될 것이다.

 

위의 그림은 VB 스크립트를 적용하여 애니메이션을 수행하고 있는 모습이다. 증분하고 있는 레지스터와 사인 값을 보이고 있는 레지스터 쌍을 볼 수 있으며 상단에는 애니메이션이 수행 중임을 초록불로 확인할 수 있다. 만약 스크립트가 정상 동작하지 않는다면 앞서 언급한 대로 화면 우측 하단의 [Comms] 버튼을 누르면 스크립트의 오류 등을 확인할 수 있다. 알면 알수록 유용한 도구이다.

 

 

728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함