본문 바로가기

프로그래밍/C

[C언어]리눅스 모드버스 RTU modbus slave 프로그램 (RS485)

반응형
 

~

 

485통신을 하는 마스터기기를 이용하여 데이터를 읽어올 수 있게한 프로그램입니다.

 

모드버스 RTU 마스터프로그램을 이용하여 Fnc3(read register)를 이용하면 원하는 데이터값을 출력해줍니다.

 

점점 한국어자료가 없어지더니 이번글은 아에 영어자료만 보고 작성했네요

 

~

 

 

~

코드

 

    modbus_t *ctx;

    modbus_mapping_t *mb_mapping;

    int rc;

 

    ctx = modbus_new_rtu("/dev/ttyUSB1", 38400, 'N', 8, 1);

    modbus_set_slave(ctx, 1);

    modbus_connect(ctx);

 

    mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,

                                    MODBUS_MAX_READ_REGISTERS, 0); // fnc3기준, 0~79address

           //3번째 인자값에 의해 fnc3의 메모리크기가 증가

 

    mb_mapping->tab_registers[01]=123;       //[ ] 안에 숫자가 메모리 주소, 우측값이 데이터

    mb_mapping->tab_registers[02]=456;

    mb_mapping->tab_registers[03]=789;

 

    if (mb_mapping == NULL) { 에러코드! }

 

    while(1){

      uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];

      rc = modbus_receive(ctx, query);

      if (rc >= 0) modbus_reply(ctx, query, rc, mb_mapping);

      else break;

    }

    

    에러코드!

    modbus_mapping_free(mb_mapping);

    modbus_free(ctx);

 

~

 

 

 

~

실행결과

이전글에서 사용했던 Comanalyzer를 이용하여 Master -> PC로 데이터 전송시,

 

Fnc-3 , Address-1 을 입력하면 출력값으로 123

Fnc-3 , Address-1 을 입력하면 출력값으로 456

Fnc-3 , Address-1 을 입력하면 출력값으로 789

 

완벽하게 나옵니다!

 

 

통신설정에 대한내용은 이전글을 참조해주시길 바랍니다.

링크는 아래를 클릭하시면 됩니다.

 

 

[C언어]리눅스 Modbus통신 RS485 Read input registers

요즘 자동화 설비를 안쓰고 맨손으로 무언가를 제작하는 회사는 찾기 힘들죠? 이런 자동화 설비들에는 거의 'ModBus통신'으로 통신이 가능하게 설계되어 있습니다. 그럼 이번시간에는, 리눅스 운�

doobudubu.tistory.com

 

반응형