본문 바로가기

프로그래밍/C

[C언어]리눅스 Modbus통신 RS485 Write register

반응형

요즘 자동화 설비를 안쓰고 맨손으로 무언가를 제작하는 회사는 찾기 힘들죠?

이런 자동화 설비들에는 거의 'ModBus통신'으로 통신이 가능하게 설계되어 있습니다.

그럼 이번시간에는, 리눅스 운영체제에서 Modbus로 값을 읽어오는

'Write register'에 대한 코드를 살펴보겠습니다.

(Write register와 Write registers는 다른 함수입니다. s조심!!)

 

~~~

 

 

~

코드

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <termios.h>

#include <fcntl.h>

#include <errno.h>

#include <time.h>

#include <modbus.h>

 

enum {TCP, RTU};

 

int main(void)

{

  int a, StationID, setdata;

  uint16_t test, Address;

  modbus_t *mb;

 

  printf("\nStationID:");

scanf("%d",&StationID);

  printf("\nAddress:");

scanf("%x",&Address);

  printf("\nData for set:");

scanf("%d",&setdata);



  mb = modbus_new_rtu("/dev/ttyUSB0",38400,'N',8,1); //PortNumber

 

  if (mb == NULL)

  {

  fprintf(stderr, "Unable to create the libmodbus context for RTU: %s\n", modbus_strerror(errno));

    return -1;

  }

 

  if(modbus_set_slave(mb, StationID) == -1) // Station ID

  {

    fprintf(stderr, "Unable to set the slave ID in context for RTU: %s\n", modbus_strerror(errno));

    return -1;

  }

  printf("\n setted slave!!!!\n");

  modbus_set_debug(mb,TRUE);

 

  if (modbus_connect(mb) == -1)

  {

    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));

    modbus_free(mb);

  scanf("%d",&test);

    return -1;

  } 

 

  struct timeval response;

  response.tv_sec = 0;

  response.tv_usec = 3000;

  //modbus_set_response_timeout(mb, 0, 1000);

 

a = modbus_write_register(mb,Address,setdata);



  printf("\n Value of a is: %d\n",a);

  printf("\n Value of a is: %d\n",test);

scanf("%d",&test);

  

  if (a==-1)

  fprintf(stderr, "Custom error: %s\n", modbus_strerror(errno));

 

}

 

기타 함수에 대한 자세한 설명은

 

modbus_write_register(3) — libmodbus-dev — Debian testing — Debian Manpages

modbus_write_register - write a single register SYNOPSIS¶ int modbus_write_register(modbus_t *ctx, int addr, const uint16_t value); DESCRIPTION¶ The modbus_write_register() function shall write the value of value holding registers at the address addr of

manpages.debian.org

이 사이트를 참조하시면 됩니다.

 

~

 

 

 

~

기타

 

실행결과나 설정에 대한 내용은

이전에 올린 Modbus통신글을 참조해주시면 됩니다!

 

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

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

doobudubu.tistory.com

 

반응형