요즘 자동화 설비를 안쓰고 맨손으로 무언가를 제작하는 회사는 찾기 힘들죠?
이런 자동화 설비들에는 거의 '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
'프로그래밍 > C' 카테고리의 다른 글
[C언어]조건부로 linux, Win32 컴파일 - ifdef 이용 (0) | 2020.10.01 |
---|---|
[C언어]window mutex, linux mutex 코드 비교 (0) | 2020.10.01 |
[C언어]리눅스 Modbus통신 RS485 Read input registers (0) | 2020.10.01 |
[C언어] C, C++ 코드실행시간 측정하기 (0) | 2020.10.01 |
[C언어]제곱을 구하는 pow함수! 음수의 제곱도 구할 수 있을까? (0) | 2020.10.01 |