미쓰비시 PLC 통신관련하여
**********************************************************/
/* */
/* Test program for Communication functions */
/* */
/* Copyright (C) 1999 MITSUBISHI Electric Corporation */
/* All Rights Reserved */
/**********************************************************/
/********************************************
* Include files *
********************************************/
#include <stdio.h>
#include <winsock.h>
#define FLAG_OFF 0 // 종료 플래그 OFF
#define FLAG_ON 1 // 종료 플래그 ON
#define SOCK_OK 0 // 정상 종료
#define SOCK_NG -1 // 이상 종료
#define BUF_SIZE 80 // 버퍼 사이즈
#define ERROR_INITIAL 0 // 초기화 에러
#define ERROR_SOCKET 1 // 소켓 작성 에러
#define ERROR_BIND 2 // 바인드 에러
#define ERROR_CONNECT 3 // 커넥트 에러
#define ERROR_SEND 4 // 송신 에러
#define ERROR_RECEIVE 5 // 수신 에러
#define ERROR_SHUTDOWN 6 // 셧다운 에러
#define ERROR_CLOSE 7 // 회선 클로즈 에러
typedef struct sck_inf {
struct in_addr my_addr;
unsigned short my_port;
struct in_addr aj_addr;
unsigned short aj_port;
};
int nErrorStatus; // 에러 정보 저장 변수
int Dmykeyin; // 더미 키 입력
int Closeflag; // 커넥션 종료 플래그
int socketno;
/***************************************************
* Reads in device "D" of specified No *
* on station No 1 *
***************************************************/
int main()
{
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData; // Winsock Ver 1.1 요구
int length; // 교신 데이터 길이
int result;
unsigned char s_buf[BUF_SIZE]; // 송신 버퍼
unsigned char r_buf[BUF_SIZE]; // 수신 버퍼
struct sck_inf sc; // 구조체 변수 선언
struct sockaddr_in hostdata; // 상대 기기측 데이터
struct sockaddr_in aj71e71; // Ethernet 모듈측 데이터
void Sockerror(int); // 에러 처리 함수
sc.my_addr.s_addr = htonl(INADDR_ANY); // 상대 기기측 IP Address(PC쪽 IP Address)
sc.my_port = htons(0); // 상대 기기측 Port No.(PC쪽 Port No.)
sc.aj_addr.s_addr = inet_addr("192.168.16.232"); // Ethernet 모듈측 IP Address(C00001FD) - PLC 모듈 IP 셋팅
sc.aj_port = htons(5002); // Ethernet 모듈측 Port No. - PLC 모듈
// PLC Port No : 138A(16진수)로 셋팅
Closeflag = FLAG_OFF; // 커넥션 종료 플래그 OFF
nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if (nErrorStatus != SOCK_OK) // Winsock 초기화 처리
{
Sockerror(ERROR_INITIAL);
return(SOCK_NG);
}
printf("Winsock Version is %d, %d\n", HIBYTE(wsaData.wVersion), LOBYTE(wsaData.wVersion));
printf("AJ_test Start\n");
socketno = socket(AF_INET, SOCK_STREAM, 0); // 소켓 생성
if (socketno == INVALID_SOCKET) // TCP/IP의 소켓 작성
{
Sockerror(ERROR_SOCKET);
return(SOCK_NG);
}
hostdata.sin_family = AF_INET; // PC 쪽 Socket 구조체 정의
hostdata.sin_port = sc.my_port; // PC 쪽 Port No, IP Address
hostdata.sin_addr.s_addr = sc.my_addr.s_addr;
if (bind(socketno, (LPSOCKADDR)&hostdata, sizeof(hostdata)) != SOCK_OK) // 바인드
{
Sockerror(ERROR_BIND);
return(SOCK_NG);
}
aj71e71.sin_family = AF_INET; // PLC 쪽 Socket 구조체 정의
aj71e71.sin_port = sc.aj_port; // PLC 쪽 Port No, IP Address
aj71e71.sin_addr.s_addr = sc.aj_addr.s_addr;
// --------------- 커넥트(Active 오픈 요구) ---------------- //
result = connect(socketno, (LPSOCKADDR)&aj71e71, sizeof(aj71e71));
/*if (connect(socketno, (LPSOCKADDR)&aj71e71, sizeof(aj71e71)) != SOCK_OK)
{
Sockerror(ERROR_CONNECT);
return(SOCK_NG);
printf("AJ_test Start4\n");
}*/
if (result == 0)
{
printf("Connect OK\n");
}
else if (result == SOCKET_ERROR)
{
printf("Connect FAIL\n");
}
Closeflag = FLAG_ON; // 커넥션 종료 플래그 ON
// ----------------이 부분까지 Ethernet과 PLC 연결 부분 ----------------- //
// --------------- D0 ~ D4 일괄 쓰기 요구 ----------------- //
// 송신 데이터를 보내면 " 수신할 수 없습니다, 에러 코드는 0입니다 " 라는
// 메세지가 나옴
///*
strcpy(s_buf, "500000FF03FF00002C000A14010000D*0000000005112233445566778899AA");
length = strlen(s_buf);
if (send(socketno, s_buf, length, 0) == SOCKET_ERROR) // 데이터 송신
{
Sockerror(ERROR_SEND);
return(SOCK_NG);
}
printf("\n 송신 데이터 \n%s\n", s_buf);
length = recv(socketno, r_buf, BUF_SIZE, 0); // 응답 데이터 수신
if (length = SOCKET_ERROR)
{
Sockerror(ERROR_RECEIVE);
return(SOCK_NG);
}
//r_buf[length] = '\0'; // 수신 데이터 끝에 NULL을 세트
printf("\n 수신 데이터 \n%s\n", r_buf);
//*/
// 위의 부분을 주석 처리후 밑의 읽기 요구는 수신 Data가 들어옴
// --------------- D0 ~ D4 일괄 읽기 요구 ----------------- //
strcpy(s_buf, "50000FF03FF000018000A04010000D*0000000005");
length = strlen(s_buf);
if (send(socketno, s_buf, length, 0) == SOCKET_ERROR) // 데이터 송신
{
Sockerror(ERROR_SEND);
return(SOCK_NG);
}
printf("\n 송신 데이터 \n%s\n", s_buf);
length = recv(socketno, r_buf, BUF_SIZE, 0); // 응답 데이터 수신
if (length == SOCKET_ERROR)
{
Sockerror(ERROR_RECEIVE);
return(SOCK_NG);
}
//r_buf[length] = '\0'; // 수신 데이터의 끝에 NULL을 세트
printf("\n 수신 데이터 : \n%s\n", r_buf);
if (shutdown(socketno, 2) != SOCK_OK) // 송신 금지 처리
{
Sockerror(ERROR_SHUTDOWN);
return(SOCK_NG);
}
if (closesocket(socketno) != SOCK_OK)
{
Sockerror(ERROR_CLOSE);
return(SOCK_NG);
}
Closeflag = FLAG_OFF; // 커넥션 종료 플래그 OFF
WSACleanup(); // Winsock.DLL 해제
printf("\nAJ_test End. \n\n 정상 완료했습니다. \n");
printf(" 프로그램을 종료하였습니다, 아무 키나 누르십시오.\n");
Dmykeyin = getchar(); // 키 입력 대기
return(SOCK_OK);
}
void Sockerror(int error_kind) // 에러 처리 함수
{
if (error_kind == ERROR_INITIAL)
{
printf(" 초기화 처리가 이상합니다.");
}
else
{
nErrorStatus = WSAGetLastError();
switch(error_kind)
{
case ERROR_SOCKET:
printf("소켓을 작성할 수 없습니다.");
break;
case ERROR_BIND:
printf("바인드할 수 없습니다.");
break;
case ERROR_CONNECT:
printf("커넥션을 확립할 수 없습니다.");
break;
case ERROR_SEND:
printf("송신할 수 없습니다.");
break;
case ERROR_RECEIVE:
printf("수신할 수 없습니다.");
break;
case ERROR_SHUTDOWN:
printf("Shutdown할 수 없습니다.");
break;
case ERROR_CLOSE:
printf("정상 클로즈 할 수 없습니다.");
break;
}
}
printf("에러 코드는 %d입니다. \n", nErrorStatus);
if (Closeflag == FLAG_ON)
{
nErrorStatus = shutdown(socketno, 2); // 셧다운 처리
nErrorStatus = closesocket(socketno); // 클로즈 처리
Closeflag = FLAG_OFF; // 커넥션 종료 플래그 OFF
}
printf("프로그램을 종료했습니다.아무키나 누르십시오.\n");
Dmykeyin = getchar();
WSACleanup();
return;
}
'개발 관련 정보' 카테고리의 다른 글
[펌]윈도우7 MBR 문제 발생시 조치 방법 (0) | 2014.12.23 |
---|---|
투명 비트맵 만들기 (0) | 2014.12.10 |
윈도우 메시지 정의 파일 참고용 (0) | 2014.12.10 |
char*를 wchar_t*로 형 변환 참고.. (0) | 2014.12.10 |
FormView처럼 화면 꾸미기(MFC,VCL) (0) | 2014.12.10 |