안녕하세요 드레이크입니다^^ 지난글에 이어 이번에는 libmodbus를 활용하여 Slave를 구성해보도록 하겠습니다. 못 보신 분들은 아래 링크를 참고해주세요! https://gosuway.tistory.com/374?category=754463 modbus tcp Master (libmodbus 라이브러리) 안녕하세요 드레이크입니다^^ 이번에 modbus tcp를 연동하는 프로젝트를 진행하게 되어 modbus를 처음 접하게 되었는데요 처음에는 아래 사이트를 통해 개념을 숙지하였구요 http://comfilewiki.co.kr/ko/dok gosuway.tistory.com Slave는 TCP 소켓 통신에서 서버 개념과 같다고 볼 수 있습니다. 아래는 실제 사용한 소스코드이니 참고하시면 도움이 되실겁니다..
안녕하세요 드레이크입니다^^ 프로그램은 하나인데 메인보드의 종류가 여러개일때 네트워크 설정 및 통신에 문제가 생길 수 있습니다. 그럴때 프로그램 시작시 네트워크 디바이스명을 알아오게 해서 동작하게 하면 이 문제를 해결할 수 있습니다! 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 #include void GetNetworkDeviceName() { int32_t i = 1; struct ifaddrs *addrs,*tmp; bzero(Cache.NetworkDeviceName, sizeof(Cache.NetworkDeviceName)); getifaddrs(&addrs); tmp = addrs; while (tmp) ..
1234567891011121314#include // 어제 날짜 구하기time_t timer;struct tm t; // 하루 빼기timer = time(NULL) - (24 * 60 * 60); // 다중 쓰레드를 사용하는 프로그램에서는 localtime()이 아니 localtime_r() 써야 동작이 보장된다!!localtime_r(&timer, &t); // 영업일자는 어제로 저장sprintf(SaleDate, "%04d%02d%02d", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday);cs
안녕하세요 드레이크입니다^^ 이번에 modbus tcp를 연동하는 프로젝트를 진행하게 되어 modbus를 처음 접하게 되었는데요 처음에는 아래 사이트를 통해 개념을 숙지하였구요 http://comfilewiki.co.kr/ko/doku.php?id=tcpport:modbus-tcp_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%B4%EB%9E%80:index tcpport:modbus-tcp_프로토콜이란:index [Comfile Technology's Online Documentation] MODBUS-TCP란 MODBUS-TCP는 산업용 필드버스 분야에서 자주 사용되는 통신 프로토콜 입니다. TCP/IP 네트워크 상에서 상위장치와 하위장치간의 인터페이스를 위하여 고안된 ..
char __fastcall TMainFrm::ConnectServer(void) { struct hostent *pHostEnt; unsigned char IP[4]; AnsiString Addr; if(WSAStartup(MAKEWORD(2,2), &m_WsaData) != 0){ MsgBox("WSA Error"); return FALSE; } g_ServSock = socket(PF_INET, SOCK_STREAM, 0); if(g_ServSock==INVALID_SOCKET){ MsgBox("SOCKET Error"); return FALSE; } // 도메인 이름으로 IP주소 알아오기 pHostEnt = gethostbyname(SERVER_DOMAIN); memcpy(IP, pHostEnt-..
#include #include #define SERVER_PORT 9080 char __fastcall TMainFrm::InitSocket(void) { WSADATA wsaData; SOCKET servSock; SOCKET clntSock; SOCKADDR_IN servAddr; SOCKADDR_IN clntAddr; int clntAddrSize; if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { MsgBox("WSAStartup() Error"); return FALSE; } // TCP소켓 servSock = socket(PF_INET, SOCK_STREAM, 0); if(servSock == INVALID_SOCKET) { MsgBox("socket() ..
struct timeval tv_timeo = { 3, 500000 }; /* 3.5 second */ if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv_timeo, sizeof( tv_timeo )) == -1) { /* error */ } if (setsockopt( fd, SOL_SOCKET, SO_SNDTIMEO, &tv_timeo, sizeof( tv_timeo )) == -1) { /* error */ } 위의 예에서 보면 SO_RCVTIMEO과 SO_SNDTIMEO을 3.5초로 지정하였다. 이후에 send(2)나 recv(2) 혹은 sendto(2), recvfrom(2)을 블로킹 모드로 사용하면 해당 시간 내에 데이터가 수신되지 않으면 에러로 판단하고 -..
#include "CSerialCom.h" CSerialCom *m_Serial; AnsiString strMsg; int BaudRate[] = { 2400, 4800, 9600, 19200, 38400, 57600, m_Serial = new CSerialCom(Port+1, BaudRate[Baud]); if(!m_Serial->CreateComm()) { strMsg.sprintf( "COM%d (BaudRate : %d) 포트 연결 실패 !", Port+1, BaudRate[Baud]); MessageBox(Handle, strMsg.c_str(), MSG_TITLE, MessageBox(Handle, strMsg.c_str(), MSG_TITLE, MSG_NORMAL); return FALSE..
#include #include #include #pragma hdrstop #pragma argsused int Sum(int a, int b) { return a+b; } int Mul(int a, int b) { return a*b; } void main(int argc, char* argv[]) { int x; int (*Func[2])(int, int); printf("Val :"); scanf("%d", &x); Func[0] = Sum; Func[1] = Mul; printf("\n%d", Func[0](3, 3)); printf("\n%d", Func[1](3, 3)); }
- Total
- Today
- Yesterday