115
공학석사학위청구논문 직렬 통신과 인터넷을 이용한 S-Bus 개발 S-Bus Development Using Serial Communication and Internet 20058인하대학교 공학대학원 전기공학과 이 진 근

S-Bus Development Using Serial Communication and Internet ... · 전통적 제어 방식 구조 필드 버스 구조 그림 1.1 전통 제어와 필드 버스 구조 비교 Fig. 1.1

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

공학석사학 청구논문

직렬 통신과 인터넷을 이용한 S-Bus 개발

S-Bus Development Using

Serial Communication and Internet

2005년 8월

인하 학교 공학 학원

기공학과

이 진 근

공학석사학 청구논문

직렬 통신과 인터넷을 이용한 S-Bus 개발

S-Bus Development Using

Serial Communication and Internet

2005년 8월

지도교수 권 오 규

이 논문을 공학석사학 논문으로 제출함

인하 학교 공학 학원

기공학과

이 진 근

이 논문을 이진근의

공학석사학 논문으로 인정함

2005년 8월

주심 : (인)

부심 : (인)

원 : (인)

- i -

요 약

산업 장의 제어 시스템은 빠른 속도로 발 해 가고 있다. 이에

발맞추어 보다 경제 이면서도 빠르고 정 한 제어 방법인 산업용

통신 규격에 한 심이 높아지고 있으며 그에 따른 다양한 기술

발 이 이루어지고 있다. 세계 인 제어 시스템 개발사들은 자사의

통신 규격을 세계 표 으로 정하고자 데이터 송 신뢰성 확보와

빠른 데이터 공유 사용의 편리성을 해 새로운 알고리즘 개발

에 박차를 가하고 있다.

본 연구에서는 PC 기반 로그램을 심으로 RS-422를 이용한

데이터 수집 제어와 수집 데이터를 인터넷을 통해 원거리 모니

터링이 가능한 S-Bus 시스템 개발을 통해 다양한 상황에 유연하게

처가 가능한 산업용 통신 시스템의 기본 알고리즘 개발과 방안을

제시한다. 그리고 최 16ms의 송 시간과 데이터 송 신뢰성 실

험을 통해 이 논문에서 개발한 시스템의 성능을 검증한다.

본 논문의 연구를 통해 개발된 알고리즘 하드웨어는 데이터의

표시기능 잡음방지에 한 사항을 보완하면 산업용 통신 제어

시스템으로의 장 용이 가능하며, 한 사무 가사 자동화 시

스템에도 활용이 가능하다.

- ii -

Abstract

The control systems have been rapidly developed and

progressed in the industrial fields. Along with this trend,

some attention is highly increased to the industrial

communication standards, and various technological

development has been achieved. Some biggest control

system development companies, with a view to make their

communication standards as an international one, try best to

develop new algorithm which allows us to acquire the

reliabilities of data transmissions, rapid data sharing, and its

convenience.

This thesis has proposed a basic algorithm and method

for an industrial communication system development which

could be adapted to various situations through development

of an S-Bus system, which permits the data collection and

control using RS-422 on the basis of PC based program,

and remote monitoring of the collected data on the internet.

And the system has been checked through some tests for

the reliability of data transmissions using maximum 16ms

of the transmission time.

- iii -

The algorithm and hardware developed through the

research in this thesis could be adapted to the industrial

communication control systems, if some problems related to

the data display function and the noise rejection are fully

resolved. It can be also utilized to the office and home

automation systems.

- iv -

목 차

요약 ·················································································································· i

Abstract ······································································································· ii

표 목록 ······································································································· vii

그 림 목록 ·································································································· viii

제 1 장 서 론 ······························································································ 1

1.1 연구배경 목 ············································································ 1

1.2 연구내용 범 ············································································ 2

1.3 논문의 구성 ······················································································ 3

제 2 장 련 이론 ······················································································ 5

2.1 직렬 통신 ·························································································· 5

2.1.1 RS-232C ····················································································· 7

2.1.2 RS-422 ························································································ 8

2.1.3 RS-485 ························································································ 9

2.2 인터넷 ································································································ 9

2.2.1 구조 ··························································································· 10

2.2.2 소켓 ······················································································· 11

2.2.3 로토콜 ··················································································· 11

2.2.4 주소 ··························································································· 12

2.3 통신 오류 검출법 ·········································································· 12

2.3.1 VRC ··························································································· 13

2.3.2 LRC ··························································································· 13

2.3.3 CRC ··························································································· 13

- v -

2.3.4 체크섬 ······················································································· 14

제 3 장 S-V iew 개발 ············································································ 1 5

3.1 자동 모드 직렬 통신 ···································································· 16

3.1.1 송신 알고리즘 ········································································· 17

3.1.2 수신 알고리즘 ········································································· 19

3.1.3 에러 체크 생성 알고리즘 ····················································· 21

3.1.4 통신 에러 처리 알고리즘 ····················································· 24

3.2 수동 모드 직렬 통신 ···································································· 26

3.3 TCP/IP 통신 ·················································································· 27

제 4 장 S-Card 개발 ············································································· 3 0

4.1 메인 컨트롤러 소개 ······································································ 30

4.1.1 직렬 통신 기능 ······································································· 31

4.1.2 10비트 ADC 기능 ·································································· 32

4.1.3 디지털 입출력 ········································································· 32

4.2 통신 제어 알고리즘 개발 ···························································· 33

4.2.1 수신 알고리즘 ········································································· 33

4.2.2 송신 알고리즘 ········································································· 35

4.2.3 통신 에러 처리 알고리즘 ····················································· 36

4.3 S-Card의 하드웨어 구성 ····························································· 37

제 5 장 S-Bus 구 성 능 검 증 ···················································· 3 9

5.1 S-Bus 컨버터 개발 ······································································ 39

5.2 S-Card와 S-View 인터페이스 구축 ········································ 40

5.3 RS-422 성능 검증 ········································································· 42

5.4 TCP/IP 성능 검증 ········································································ 47

- vi -

제 6 장 결론 ······························································································ 50

참고 문헌 ···································································································· 52

부 록 ·············································································································· 55

A1. S-Card 로그램 ············································································ 56

A2. S-View 로그램 ··········································································· 65

A3. 인터넷 통신 데이터 기록 ····························································· 99

A4. 회로도 ····························································································· 102

- vii -

표 목 록

표 2.1 통신 규격 비교 ················································································ 6

표 4.1 통신 모드 구분 ·············································································· 31

표 4.2 PIC16F877A 입출력 포트 특징 ·················································· 33

표 4.3 S-Card 기본 사양서 ····································································· 38

표 5.1 S-Bus 직렬 통신 송 시간 시험 결과 ·································· 43

표 5.2 데이터 오류 발생 ·········································································· 45

표 5.3 데이터 에러 기록 한 일 발췌 ······································ 46

표 5.4 클라이언트 측 데이터 송 시험 결과 ···································· 47

표 5.5 송수신 지연 시간 비교 ································································ 48

표 5.6 서버와 클라이언트 송 데이터 비교 ······································ 49

- viii -

그 림 목 록

그림 1.1 통 제어와 필드 버스 구조 비교 ·········································· 2

그림 3.1 S-View 실행 구성도 ································································ 15

그림 3.2 S-View 직렬 통신 순서도 ······················································ 17

그림 3.3 S-View 송신 순서도 ································································ 19

그림 3.4 S-View 수신 순서도 ································································ 21

그림 3.5 LRC 생성 순서도 ······································································ 22

그림 3.6 CRC BCC 생성 순서도 ···························································· 24

그림 3.7 S-View 에러 처리 순서도 ······················································ 26

그림 3.8 수동 모드 통신 순서도 ···························································· 27

그림 3.9 TCP/IP 송신 순서도 ································································ 29

그림 4.1 S-Card 수신 순서도 ································································· 34

그림 4.2 S-Card 송신 순서도 ································································· 36

그림 4.3 S-Card BCC 체크 순서도 ······················································ 37

그림 4.4 S-Card 사진 ··············································································· 38

그림 5.1 S-Bus 컨버터 사진 ·································································· 40

그림 5.2 송신선 하드웨어 구성 ······························································ 41

그림 5.3 통신 조건별 송 시간 ···························································· 44

그림 5.4 이상 데이터 기록화면 ························································ 46

- 1 -

제 1 장 서 론

1.1 연구 배경 목

과거 일 일 구조의 통 제어 방식은 더욱 복잡해지고 다양해

지는 산업 설비 제어와 계측 데이터 수집을 하기에는 차 역

부족 상을 보이고 있다. 산업 장의 각종 데이터 수집 산업

자동화는 더욱 빠른 속도로 다양화 되면서 고도의 기술 발 을

꾀하고 있으나 통 제어 구조는 보다 많은 정보의 달을 원하

는 이용자들의 욕구를 충족시키지 못하고 있다. 배선의 증가 주

컨트롤러의 규모 증가 등 경제 인 많은 문제 을 안고 있기 때문

이다. 한 제어 시스템의 이상 발생 시 일 일 구조로 인한 많은

배선과 비 해진 로그램은 고장 원인 악 시간의 증가와 보수

비용의 증가 등으로 효율 시스템 운 의 방해가 된다.

그림 1.1의 통 제어 방식과 필드버스의 략 비교도에서 알

수 있듯이 산업용 통신을 통한 계측 제어 방법인 필드버스는 이

러한 문제 의 해결 방안으로 두되고 있다.

지멘스의 Profibus-DP, 미쓰비시의 CC-Link등 세계 인 제어기

기 메이커에서는 직렬 통신과 이더넷 등을 이용한 자사만의 필드버

스 제어 방법들을 개발, 상품화하여 매하고 있다.

본 연구는 이러한 산업용 통신 제어 시스템 개발을 통해 각종 제

어기기의 운 정보 수집 제어를 한 유연한 처 기능을 갖춘

산업용 통신 규격의 석을 마련하고자 한다. 한 직렬 통신으로

수집된 데이터를 원거리 모니터링이 가능하도록 인터넷 통신을 이

용하고자 한다.

- 2 -

통 제어 방식 구조 필드 버스 구조

그림 1.1 통 제어와 필드 버스 구조 비교

Fig. 1.1 Comparison of tradition control with field bus structure

1.2 연구 내용 범

‘Smart’와 ‘Simple’의 의미를 지닌 본 연구 목표인 S-Bus 개발은

RS-232C와 TCP/IP를 이용한 PC 기반 제어 시스템인 S-View와

마이크로컨트롤러를 이용한 제어 상인 S-Card 개발, 시스템 인터

페이스 구성의 세단계로 나 어 진행한다.

S-View 개발은 비주얼 베이직을 이용하여 데이터 수집과 입출력

제어를 한 직렬 통신 알고리즘과 세계 어느 곳에서든 속이 가

능하고 데이터의 송이 가능하도록 범용 인터넷 통신을 이용한 송

수신 알고리즘 개발의 두 주제를 주안 으로 모니터링 알고리즘 개

발 S-Card 제어 알고리즘 개발을 한다.

본 시스템의 슬 이 인 S-Card는 PIC16F877A 마이크로컨트롤

러를 이용하여 마스터로부터 송신되는 제어 명령에 따른 연산 처리

- 3 -

알고리즘과 아날로그 데이터 수집, 디지털 입출력 제어 알고리즘 개

발을 한다. S-Crad 한 S-View와 같이 통신 알고리즘 개발이 그

주가 된다.

각 시스템의 하드웨어 연결은 S-Bus 컨버터 개발을 통해 PC의

RS-232C 규격을 RS-422로 변환하여 멀티 통신 인터페이스를 구축

한다.

각 구성의 성능 시험 본 연구의 가장 요한 인 데이터의

송에 한 정확도 검증을 통해 S-Bus의 신뢰도 산업 장

용의 가능성을 검토한다.

본 연구는 S-Bus의 데이터 송수신 알고리즘 개발에 요도를 두

고 개발하 으며 노이즈와 같은 외부 향에 한 응, 입출력 확

장에 한 사항과 통신 이블 사양과 같은 사항은 연구 내용에 포

함하지 않았다. 로그램 개발에 련된 언어에 한 설명은 생략되

었으며 이에 한 자세한 사항은 부록에 실은 개발 로그램 문

과 해당 언어에 한 기본서 참고 문헌을 참조하기 바란다.

1.3 논문의 구성

본 연구의 구성은 여섯 개의 장으로 구성되며

제 1장은 S-Bus 개발의 배경 목표, 연구 내용 범 에 해

서술한다.

제 2장은 S-Bus 구성을 한 직렬 통신, TCP/IP와 표 통신

에러 검출 방법 등의 이론 사항에 해 서술한다.

- 4 -

제 3장은 마스터 역할의 PC 기반 제어 로그램인 S-View 개발

과정에 한 서술이다.

제 4장은 데이터 수집 제어 상인 S-Card의 개발과정에 하

여 서술한다.

제 5장은 S-Bus의 하드웨어 인터페이스 구축을 한 컨버터 개

발 성능 검증에 하여 서술한다.

제 6장은 연구 내용을 정리하는 결론에 하여 서술한다.

마지막으로 부록에는 S-View와 S-Bus 로그램 문과 하드웨

어 회로도, 그리고 인터넷 통신 성능 검증 자료의 일부를 발췌하여

기록한다.

- 5 -

제 2 장 련 이론

2.1 직렬 통신

직렬 통신이란 산업 장에 가장 많이 용되어 있는 네트워크

방법으로 송로를 통하여 데이터비트를 1개의 비트단 로 외부로

송수신하는 방식이다. 이해하기 쉽게 를 들면 침시계를 이용하

여 1분 동안 미리 정해 놓은 서로의 약속( 침이 1 에서 5 사이

에 소리를 내면 ‘1’, 6 에서 10 사이는 ‘2’ 등)에 의해 1부터 12까

지의 숫자를 표 하는 것도 일종의 직렬 통신이 될 수 있다. 이러한

직렬 통신은 병렬 통신과 비교하여 다음과 같은 몇 가지 장 을 지

니고 있다. 첫째 구 이 비교 쉽고, 둘째 병렬 통신에 비해 송

거리가 길며, 셋째 기존의 통신선로를 쉽게 활용할 수가 있어 비용

의 감이 크다. 단 으로는 병렬통신에 비해 송 속도가 느리다는

을 꼽을 수 있다. 직렬통신의 표 인 것으로 모뎀, LAN, RS232

C/422/485 등이 있다.

직렬통신을 크게 구분하면 비동기식 방식과 동기식 방식 2가지로

나 어진다. 앞에서 를 든 침시계의 경우는 동기식 통신이라고

할 수 있다. 1분마다 정기 으로 정보 달이 이루어지며 한 달

할 정보가 없어도 송신측과 수신측이 항상 기 상태이어야 하기

때문이다.

동기 송은 송신측과 수신측이 동기를 맞추어 각 비트 간에 시

간을 정확히 일치시키어 미리 정해진 길이의 문자열을 하나의 묶음

으로 만들어 송하는 방법이다. 한 버퍼 기억장치가 필요하고

2000bps 이상의 고속 송( 형컴퓨터 송방식)에 합하다.

- 6 -

비동기 송 방식은 송신측과 수신측이 동기를 맞추지 않고 송

하는 Start-Stop 송방식이다. 송수신 측의 클록에 약간의 오차가

있어도 데이터 송에 무리가 없으며 2000 bps 이하의 낮은 속도에

서 사용 된다. 앞으로 다룰 RS-232C는 비동기식 통신의 표 인

방식이다. 한 RS-232C의 단 을 보완하기 해 개발된 RS-422

RS-485 방식도 비동기식 통신 방법이라 할 수 있다.

표 2.1 통신 규격 비교

Table 2.1 Communication standard comparison

분류 RS-232C RS-422 RS-485

동작모드 single-ended differential differential

최 속수

(diver/receiver)1/1 1/10 32/32

최 통달거리 약 15m 약 1.2km 약 1.2km

최고 통신 속도 20kb/s 10Mb/s 10Mb/s

지원 송방식 단방향 통신 이 통신 반이 통신

노이즈 응 약함 강함 강함

임피던스 600Ω 100∼150Ω 100∼150Ω

최 출력 압 ±25V -0.25V ∼ +6V -7V ∼ +7V

최 입력 압 ±15V -7V ∼ +7V -7V ∼ +7V

- 7 -

직렬 통신 데이터 형식에는 ASCII 모드와 바이 리 모드가 있다.

먼 ASCII 모드는 기본 으로 문자, 숫자 그리고 기호들을 모

두 7비트로 표 하고 있다. 주로 제어 코드 문자를 표 하는 데

많이 사용된다.

바이 리 모드는 송하고자 하는 데이터가 숫자 주일 경우

송 바이트를 일 수 있는 장 이 있습니다. 다시 말하자면 ‘213’ 라

는 데이터 송 시 ASCII 모드는 ‘32 31 33’라는 3개 바이트로 표

되나 바이 리 모드는 ‘11010101’로 1개 바이트로 표 이 가능하게

되는 것이다.

2.1.1 RS-232C

많은 사람들이 비동기식 통신방식을 RS232C로 알고 있는데 실질

으로 RS232C는 비동기식 통신 콘트롤러(Universal Asynchronous

Receiver/ Transmitter,이하 UART)에서 나오는 디지털신호를 외부

와 인터페이스 시키는 기 인 신호 방식이며 이는 자산업 회

(Electronic Industries Association, 이하 EIA)에 의해 규정되어져

있다. 그 내용은 데이터단말기와 데이터통신기 사이의 인터페이스에

한 기 인 인수, 컨트롤 핸드셰이킹, 송 속도, 신호 기시간,

임피던스 인수 등을 정의하 으나 송되는 데이터의 포맷과 내용

은 지정하지 않으며 데이터단말기간의 인터페이스에 한 내용도

포함하지 않는다. 같은 규격이 국제 신 화자문 원회(Consultative

Committee for International Telegraph and Telephony, 이하

CCITT)에서도 CCITT V.24에서 규정을 하고 있다.

UART에서 나오는 신호는 보통 TTL신호 벨을 갖기 때문에 노

- 8 -

이즈에 약하고 통신거리에 제약이 있다. 실제로 +3V이상 일 때 ‘0’,

-3V이하에서 “1”의 논리 값을 가지기 때문에 ±12V 가량의 고 압

을 출력하여 차로 인해 발생하는 노이즈의 한계를 어느 정도

보완한다.

2.1.2 RS-422

RS-232C의 노이즈에 약하고 송 거리가 짧은 단 을 보완하여

개발된 인터페이스 IC를 Line driver/receiver라 부르며 이 422번

째로 승인되어 422번이라는 번호를 사용한다.

이 규격은 로토콜에 한 규정은 없이 기, 기계 인 규격만을

다루고 있다. 가장 큰 특징은 송신과 수신을 각각 +,-로 분리해서

반 논리신호와 함께 차동 모드로 보내는 방법을 사용함으로써

송 노이즈가 발생하여도 +,- 선간의 감쇄 작용과 수신측에서는

이 +,- 신호들을 비교하여 단하기 때문에 노이즈의 향에서 벗어

날 수 있는 것이다. 이러한 노이즈에 한 신뢰도 확보가 우수하기

때문에 산업용 통신으로 많이 용되고 있다. +TX, -TX 선간 는

+RX, -RX 선간 압차가 +0.2V이상은 ‘1’ -0.2 이하는 ‘0’의 논리값

을 갖는다. 다른 특징으로 1:N의 멀티드롭 통신이 가능하다는

이다. 멀티 드롭 통신 방법에는 몇 가지 요 사항들이 있는데 이는

5.2 에서 자세히 다루도록 한다.

- 9 -

2.1.3 RS-485

RS-485는 RS-422의 확장된 버 으로 낮은 임피던스를 가지는 구

동기와 수신기를 사용함으로써 RS-422보다 회선 당 노드수가 더 많

이 허용된다. RS-422와 마찬가지로 기 신호의 특성과 제어 신호

에 한 기능만 규정하고 있다. 이 통신 규격의 가장 큰 장 은 모

든 장치들이 같은 라인에서 데이터를 송 수신을 할 수 있다는

것이다. 한 반이 방식과 이 방식의 통신을 모두 지원한다.

반이 통신을 사용하면 RS-422에 비해 배선이 반으로 경감되

는 장 이 있다. N: N 멀티 드롭 방식이 가능하고 RS-422에 비해

복잡한 알고리즘을 갖는다.

2.2 인터넷

인터넷은 인터넷워크에서 유래한 단어로 상호 연결된 네트워크들

의 모임을 의미하며 소규모 사설 네트워크에 사용하는 이더넷과는

그 의미가 다른 형 네트워크로 네트워크 기술의 심이 되 가고

있다. [1]

일상생활이나 사무 자동화와 마찬가지로 산업 장도 주를 이루

던 직렬 통신 기술들보다 많은 정보의 달과 원거리 송이 가능

한 인터넷을 통한 시스템으로의 발 을 꾀하고 있다. 하지만 특정

용 라인을 사용하는 경우가 아닌 범용 라인의 경우는 아직까지는

직렬 통신과 같이 미리 약된 자원의 달 방식이 아닌 필요한 시

에 자원이 달되는 패킷 방식을 사용하기 때문에 동시에 동일

라인에 많은 정보의 달이 이루어 질 경우 혼잡이 발생될 수 있다.

- 10 -

이러한 특징으로 직 인 기기 제어에는 데이터의 정확한 송 확

보가 어려워 실 이 어려운 면이 있다.

2.2.1 구조

인터넷 구성은 물리층, 데이터 링크층, 네트워크층, 트랜스포트층,

세션층, 리젠테이션층, 애 리 이션층으로 구성된 통 인 7계

층 OSI 참조 모델을 신하여 다음과 같은 4계층으로 되어 있다.

최상부 계층은 애 리 이션 계층으로 실제 사용자의 용도에 맞

는 HTTP, SMTP, FTP등의 로토콜들을 포함하고 있다. 본 연구

의 개발 목표 하나인 S-View도 이런 특정 목 을 가진 애 리

이션 로토콜이라 할 수 있다.

그 아래 계층은 송 계층으로 주된 역할은 신뢰성 있는 시스템

간의 통신을 제공하며 혼잡 흐름 제어 등을 담당하며 로토콜

은 TCP(Transmission Control Protocol)와 UDP(User Datagram

Protocol)가 있다. TCP는 항상 연결 되어 있는 연결 지향성을 지니

고 있으며 일정하게 데이터가 송된다. 이 로토콜은 신뢰성 있는

송을 수행하기 한 데이터의 형식, 송 에러를 복구 등과 같은

정보들을 헤더에 담아 수신측에 달한다. 반면, UDP는 신뢰성이

보장되지 않고, 송 데이터가 비연결 인 데이터 그램 송 구조

( 송 시에만 연결되는 구조)를 제공하기 때문에 데이터의 손실이나

복이 나타날 수 있다. 한 TCP에 비해 신뢰도는 떨어지나 속도

면 에서는 효과 이기 때문에 정보의 신뢰성에 향을 받지 않는

로드 캐스트 등의 송에 주로 이용된다. [1]

세 번째 계층인 네트워크 계층의 역할은 “ 가 구에게 달할

- 11 -

지” 라는 통신에 있어 가장 요한 정보를 다룬다.

로토콜은 IP(Internet Protocol)로서 인터넷이 여러 네트워크를

연결하는 인터넷워크의 역할을 할 수 있도록 하는 가장 핵심 부분

이다.

최하 계층은 네트워크 속 계층으로 하드웨어와 소 트웨어가

합쳐져 구 되며, 표 인 가 이더넷이다.

이 4계층 가장 심이 되는 로토콜의 이름을 따라 TCP/IP

구조라 한다. [2]

2.2.2 소켓(TCP/UDP 소켓)

S-View 개발 툴인 비주얼 베이직은 소켓이라는 애 리 이션

로그래 인터페이스(이하 API)를 제공한다. 네트워크의 사용자는

자신이 보내고자 하는 정보가 상 방에게 오류 없이, 빠르게 도달되

기를 바란다. 그리고 이 과정을 사용자가 조 하기를 원한다. 이러

한 기 에 한 보답이 바로 소켓과 같은 API이다. [3]

2.2.3 로토콜

서로 다른 언어를 사용하는 사람들이 각기 자신의 언어로 어떤

정보를 달하려고 하면 그 내용을 서로 이해하지 못하듯 네트워크

상에서의 데이터 송도 기종의 차이나 통신 방식의 차이에 의해

서로 약속된 사항이 존재하지 않을 경우 정보 달이 이루어 지지

않는다. 즉 송신측과 수신측이 미리 정해 놓은 약속이 존재하여야

정상 인 데이터 교환이 이루어진다. 세계 공통 언어로서 ‘ 어’를

사용하는 것과 비슷하다 할 수 있다. 바로 이 ‘ 어’가 네트워크상의

- 12 -

‘ 로토콜’이라 말할 수 있다. 네트워크상의 로토콜은 하나만 존재

하는 것이 아니라 각 계층 로토콜, 체 로토콜 등 여러 개가

존재한다. TCP/IP의 를 들면 TCP/IP 로토콜에는 TCP, UDP,

어 리 이션 로토콜로는 HTTP, SMTP, POP등 여러 가지 로

토콜이 존재한다. 사용자는 이러한 로토콜 시스템에 맞는 로

토콜을 선택하여 구성하게 된다.

2.2.4 주소

편지를 보내기 해서는 상 방의 주소를 알아야 한다. 인터넷을

비록한 모든 통신에도 이는 동일하다. TCP/IP에서는 이러한 기능을

하기 하여 IP에 의해 사용되는 인터넷 주소와 TCP/UDP와 같은

송 로토콜에서 해석되는 추가 인 주소인 포트 번호가 필요하

다.

특히 어 리 이션 로토콜에 따라 데이터의 출입구인 포트가

다르게 용된다. 포트는 0에서 65535까지 사용가능하나 1023번까지

는 각 송 로토콜별로 미리 약속되어져 있기 때문에 임의 송

로그램 개발 시 1024번이후의 포트를 선정하여야 한다.

2.3 통신 에러 검출 기술

직렬 통신, 병렬 통신, 이더넷, 무선 통신 등 어떤 통신 방법에서

도 달되는 데이터의 정확성 신뢰성은 요한 문제이다. 통신에

한 기술 인 구 보다도 통신 데이터에 한 신뢰도는 더더욱

요하다. 계측된 값이나 산업용 설비의 작동을 한 요한 데이터의

- 13 -

송 시 오류가 발생되거나 잘못된 값이 달된다면 물 , 인 피

해의 직 인 원인이 될 수 있기 때문이다.

주로 사용 되고 있는 에러검출방법에는 패러티 검사(VRC, LRC),

CRC, 체크섬 등의 방법이 주로 용되어 지고 있다.

2.3.1 VRC

수직 복 검사(Vertical redundancy check)로 에러 검사 방법

가장 간단하고 가장 리 사용된다. 짝수개의 에러는 검출이 불가능

한 단 이 있다. 짝수(even) 패러티와 홀수(odd) 패러티 두 가지 종

류가 있다.

2.3.2 LRC

세로 복 검사(Longitudinal redundancy check)로 모든 바이트의

짝수 패리티를 모아서 데이터 단 로 만들어서 데이터 블록의 맨

뒤에 추가하여 송하는 방법이다.

2.3.3 CRC

Cyclical redundancy check의 약자로 체 블록 검사 방법으로 캐

리가 없는 이진 나눗셈(Modulo-2 연산)을 기반으로 하는 오류 검출

방식이다. 생성 다항식에 따라 크게 네 가지 정도의 방법으로 분류

되는 CRC 검사법은 생성 다항식이 n 비트라는 가정 하에 n 비트

이하의 모든 버스트(burst) 에러, n 비트 이상의 버스트 에러 부분

- 14 -

과 모든 1 비트, 부분의 2 비트 에러 검출이 가능한 효과가 좋은

검사 방법 하나이다.

에러 검출을 한 생성 식은 주로 네 가지 방법을 사용하며 그

특징은 다음과 같다.

CRC-CCITT는 유럽시스템들의 표 Block check character(이하

BCC)로 생성식은 생성다항식은 ‘x16

+ x12

+ x5

+ 1’ 이며 16비트의

BCC가 생성되고 최 16비트보다 작거나 같은 집단에러 100%, 16

비트보다 큰 집단에러의 경우는 99%이상의 확률의 검출 능력을 가

진다.

CRC-12의 생성다항식은 ‘x12

+ x11

+ x3

+ x2

+ x + 1’로 주로 동

기 방식에 생성 BCC는 12비트로 나타내진다. 검출은 12비트 에러

검출이 가능하다.

CRC-16은 8비트 캐릭터용의 동기방식에 응용되며 생성 다항식은

‘ x16

+ x15

+ x2

+ 1’ 이다. 다른 특징들은 CRC-CCITT와 유사하다.

CRC-32는 세 가지 방식이 주로 LAN 상에서 용된 것과는

달리 WAN 상에서 용되며 그 생성식은 ‘x32

+ x26

+ x23

+ x16

+

x12

+ x10

+ x8

+ x7

+ x5

+ x4

+ x2

+ x + 1’이다.

2.3.4 체크섬

복(VRC, LRC, CRC ….) 개념을 기반으로 상 계층 로토콜

에서 사용한다.

송 데이터의 맨 마지막에 앞서 보낸 모든 데이터를 다 합한 합

계를 보수화하여 송하고 수신측에서는 모든 수를 합산하여 검사

하는 방법이다.

- 15 -

3 . S-V iew 개발

S-Bus 시스템의 마스터인 S-View는 범용 PC의 RS-232C

TCP/IP 통신 기능을 이용한 PC 기반 제어 시스템이다. 로그램

개발은 마이크로소 트사의 비주얼 베이직을 이용하 다.

S-View는 송 속도, 송국 설정, 포트 설정, 데이터 설정 등의

직렬 통신 로토콜 설정 기능, S-Card 테스트 모드, 자동 모드,

송 데이터 기록, 통신 이상 상태 기록, 아날로그 설정값 조정 등의

기능을 갖추고 있다. 한 서버, 클라이언트 선택 기능을 추가하여

TCP/IP를 이용하여 인터넷 속을 통해 원격 모니터링 기능을 추가

하 다. 단 인터넷을 통한 원격 모니터링 속의 경우 사업자 제공

서버 회선 이상 등의 문제로 인해 직렬 통신에 비해 데이터 송의

신뢰성 확보가 어렵기 때문에 직 출력 제어 기능은 제외하 다.

S-View의 주요한 기능인 통신에 한 내용을 제외한 자세한 기

능에 한 로그램은 부록 A2를 참고하기 바란다.

그림 3.1 S-View 실행 구성도

Fig. 3.1 S-View execution configuration

- 16 -

3.1 자동 모드 직렬 통신

S-View 기 실행 시 모드는 자동 모드로 설정되며 수동 모드와

동시 실행은 불가능하다. 데이터 자동 송 설정으로 1 바이트 단

로 데이터를 변수에 기록 후 송신 버퍼를 형성하여 일 송신 처리

하 고 송, 수신 처리 가능 데이터 크기는 1024 바이트이며 수신 방

식은 풀링 방식을 이용하여 시퀸스 연산 처리를 하 다. 데이터

입력 방식은 바이 리 입력을 기본으로 하 다. 수신 데이터의 별도

처리 연산 ( 를 들어 수신 아날로그의 온도로의 환산 등)은 하지

않고 수신된 데이터를 핵사 값으로만 표 하 다.

로토콜 변경 설정은 송 속도는 57,600bps이고 포트 1번, 데이

터 비트 7 비트, 스톱 비티 1비트, 패러티 없음을 기본으로 하여 별

도의 설정 기능을 통해 변경 가능하도록 하 다. 한 LRC와 CRC

에러 체크 방법 병행에 의한 송 신뢰도를 높 으며 슬 이

(S-Card)를 10국까지 운 할 수 있도록 하 고 각 송국의 ON,

OFF 설정을 가능하게 하여 이상 슬 이 발생 시에도 정상 인

슬 이 와의 통신은 가능하게 하 다.

자동 운 모드는 운 에는 항상 포트 개방 상태를 유지하며

1국에서부터 10국까지 순차 으로 송수신 함수의 호출을 통해 연산

을 하게 된다. 그림 3의 순서도는 정상 인 운 상태의 통신 순서

이며 통신 에러나 송국 이상에 따른 조치 사항은 통신 에러 처리

알고리즘에서 자세히 다루도록 하겠다.

- 17 -

그림 3.2 S-View 직렬 통신 순서도

Fig. 3.2 Flow chart of S-View serial communication

3.1.1 송신 알고리즘

송신 함수는 함수 호출에 의해 미리 연산 처리된 변수를 불러 들

여 송신 버퍼에 기록 후 송 처리 된다. S-View 송신 버퍼는 17

바이트이며 최 송신 가능 버퍼는 1024바이트이다. 데이터의 송신

방법은 일 송 방식을 용하 다. 송신 로토콜의 구성은

『STX + 송국 주소 + 명령 + 데이터(11 바이트) + LRC + CRC

- 18 -

BCC_H + CRC BCC_L + EOT』으로 구성하 다.

송신 시 주의할 사항은 송신 직후 수신을 하며 수신 데이터가 정

상 으로 들어오지 않는다는 이다. 비주얼 베이직의 송신 명령은

실제 물리 으로 데이터가 송신 버퍼를 떠나는 시간보다 짧은 시간

내 연산 처리를 한다. 즉 송신 명령 연산 처리가 끝났다는 것이 실

제 물리 으로 데이터가 송신 완료 음을 의미하는 것이 아니다.

송신 버퍼 내에 보내야 할 데이터가 남아 있는 상태에 수신 데이

터가 들어온다면 정상 인 수신이 이루어 지지 않을 뿐만 아니라

수신측에서도 달 받은 데이터를 처리할 시간을 충분히 갖지 못하

여 이상 데이터를 송신 할 수도 있다. 이러한 이유로 송신 후 일정

지연 시간 후 수신 데이터를 받아 들어야 한다. S-View에서는

‘fdelay_us()’라는 함수를 이용하여 지연 시간을 형성하 다.

송신 후 지연 함수 호출 표

Call ftrans_data() ---- 송신 한수 호출

Call fdelay_us(710) ---- 지연 함수 호출

If autocomm.InBufferCount > 0 Then ---- 수신 신호 확인 Call

frev_data(conRx_num) ---- 수신 함수 호출

지연 함수(fdelay_us()) 표

strStop_t = Timer -- 함수 호출시 PC 시간 참조 기록

Do

If Timer < strStop_t Then strStop_t = strStop_t - 86400

-- 자정을 비 (24시간 → 86400 )

camp_t = Timer - strStop_t

DoEvents

Loop Until delay_t < camp_t -- 지연 요구 시간과 비교

- 19 -

그림 3.3 S-View 송신 순서도

Fig. 3.3 Flow chart of S-View transmission

3.1.2 수신 알고리즘

비주얼 베이직의 데이터 수신은 인터럽트 방식과 폴링 방식의 두

가지가 있다. 인터럽트 방식의 경우 연산 수신 기는 하지 않고

수신 신호가 감지될 때만 수신 이벤트가 발생되어 데이터를 받아

들이는 방식이고 풀링 방식은 수신 신호에 의한 이벤트 발생을

로세서가 지속 으로 시퀸스 방식에 의해 감시하는 방법이다.[1]

S-Bus 시스템에서 S-View는 마스터의 역할로 데이터 송신 시

각 슬 이 (S-Card)에게 순차 으로 보내진 요구 명령에 따라 수

신된 응답 데이터를 분석하고 한 무응답을 감시하기 때문에 시퀸

스 인 통신 처리가 필요하다. 이러한 이유로 비주얼 베이직 수신

방법 후자인 풀링 방식을 통하여 데이터 수신을 행한다. 수신 데

이터 체 버퍼는 30 바이트이며 데이터는 1바이트 단 로 수신하

여 바이 리로 변환을 해 『ASCB()』[3]함수를 이용하여 데이터

- 20 -

변환 처리 후 수신 변수에 기록한다.

수신 로토콜은 『ACK + 송국 주소 + 슬 이 수신 상태 +

데이터 (23 바이트) + LRC + CRC BCC_H + CRC BCC_L + CR +

LR』형식을 취하 으나 실제 로그램상의 수신은 로토콜이 맞지

않아도 일단 수신 완료 처리를 하 다. 이는 S-View가 장 용이

아닌 시험용이기 때문에 수신된 데이터의 기록을 통해 송 이상

유무를 확인하기 함이다. 장에 용 시는 헤더 검사, 송국 검

사, 테일 검사를 실시하여야 한다.

수신시도 송신 시와 같이 수신 지연 시간을 갖어야 한다. 데이터

가 여러 바이트라면 통신 드라이버는 데이터를 바이트 단 로 수신

버퍼에 순서 로 장한다. 수신 완료 부호의 수신으로 수신을 완료

하야야만 정상 인 수신이 완료 될 수 있고 이를 해서는 수신 명

령의 연산 처리보다 긴 시간의 수신 시간이 필요한 것이다. 본 연구

에서는 별도의 지연 시간 함수 호출을 하지 않고 데이터의 디스

이 연산에 의한 자연 지연으로 수신의 안정성을 확보하 다.

수신 지연 표

If autocomm.InBufferCount > 0 Then --수신 신호 확인

Call frev_data(conRx_num) --수신 함수 호출

Call fdisplay(i) --디스 이 함수 호출

- 21 -

그림 3.4 S-View 수신 순서도

Fig. 3.4 Flow chart of S-View reception

3.1.3 에러 체크 생성 알고리즘

S-Bus 에러 검출 검사 방법은 LRC 방식과 CRC 방식 두 가지를

이용하 다. 첫 번째 방법인 LRC 생성 알고리즘을 그림 6과 같은

순서도로 표 된다. 송신 시 LRC 연산은 8 비트의 LRC를 생성하게

되며 헤더에서부터 LRC 까지 13 바이트의 데이터를 배타 논리

합 연산하여 14번째 송신 버퍼에 담아 송하게 된다. 수신시 LRC

생성은 수신 받은 데이터의 헤더에서부터 LRC 까지의 26 바이트

의 데이터의 LRC를 생성한다.

- 22 -

배타 논리합 표

For i = 0 To cnt - num Step 1

intTemp = intTemp Xor data(i) --배타 논리합

Next I

그림 3.5 LRC 생성 순서도

Fig. 3.5 Flow chart of LRC creation

두 번째 방법인 CRC BCC 생성알고리즘은 그림 7과 같이 표 하

다. CRC는 송하는 모든 데이터를 생성식과 Module-2 연산에

의해 연산 처리하는 방법이다. CRC 연산의 BCC는 LRC와 다르게

16 비트로 생성되나 S-View의 송 단 는 1 바이트이기 때문에

생성된 CRC BCC는 8비트로 분리되어 송신할 때는 15번째, 16번째

송신 버퍼에 담겨 송된다. 수신시도 8비트씩 분리되어 수신된 데

- 23 -

이터를 16비트로 합산하는 연산 과정을 추가로 거치게 된다. 연산에

필요한 데이터는 LRC 연산과 동일하다.

Modulo-2 연산 표

For i = 0 To cnt - num Step 1

lngTemp = data(i) * &H100&

lngTemp_crc = lngTemp_crc Xor lngTemp

For j = 0 To 7

If (lngTemp_crc And &H8000&) Then

lngTemp_crc = ((lngTemp_crc * 2) Xor &H1021&) And

&HFFFF&

Else

lngTemp_crc = (lngTemp_crc * 2) And &HFFFF&

End If

Next j

Next I

생성 BCC 버퍼 기록 표

bytTxbf(14) = fGenerate_lrc(tx_num, 4, bytTxbf)

-- LRC 생성 함수 호출 연산 후 버퍼에 기록

bytTxbf(15) = (fGenerate_crc(tx_num, 4, bytTxbf) \ &H100&)

And &HFF&

-- CRC 생성 함수 호출 연산 후 상 8비트 버퍼에 기록

bytTxbf(16) = fGenerate_crc(tx_num, 4, bytTxbf) And &HFF&

-- CRC 생성 함수 호출 연산 후 하 8비트 버퍼에 기록

- 24 -

그림 3.6 CRC BCC 생성 순서도

Fig. 3.6 Flow chart of CRC BCC creation

3.1.4 통신 에러 처리 알고리즘

송신 데이터는 LRC, CRC 연산으로 생성된 BCC를 송함으로써

S-View에서는 에러 처리에 한 역할을 완료하게 된다. 이 데이터

에 한 에러 검사 처리는 슬 이 인 S-Card에서 담당하게 된

다. 수신 데이터의 경우는 송신과 다르다. 슬 이 로부터 수신 받

- 25 -

은 데이터를 슬 이 와 동일한 생성식에 의해 BCC 연산을 하고

이 데이터를 수신된 BCC와 비교 분석하여 에러 유무를 악한다.

에러 발생이 있을시 슬 이 측에 재 송 처리는 하지 않는다. 그

이유는 자동 모드 송 자체가 특정 이벤트에 의한 것이 아니라 시

퀸스 으로 송되기 때문이다. 에러의 발생 시 에러 발생 날짜와

시간을 에러 내용과 함께 한 일로 장하고 S-View 로그램

에서도 불러 들여 확인할 수 있게 구성하 다.

BCC 에러 검사 외에 송 명령에 무응답 하는 슬 이 에 한

조치 처리도 포함되어 있다. 무응답 슬 이 에 한 응답 요구는

5회 실시하며 5회 이상 무응답 시 해당 슬 이 의 송, 수신을 정지

한다. 이때도 정상 운 인 슬 이 는 정상 송수신을 실시한다.

무응답에 한 기록은 한 일로 기록되며 이상 내용과 이상 발

생 시간을 기록한다. BCC 이상 기록과 마찬가지로 S-View 로그

램에서 이상 내용을 불러들여 확인 할 수 있다.

BCC 비교에 의한 알람 기록 표시 표

If mbytRx_bf(26) <> gbytRxlrc_chk Or _

((mbytRx_bf(27) * &H100&) + mbytRx_bf(28)) <> _

glngRxcrc_chk Then -- 수신 BCC와 연산 BCC 비교

Call falmdisp(i, 0) --알람 표시 함수 호출

End If

- 26 -

그림 3.7 S-View 에러 처리 순서도

Fig. 3.7 Flow chart of S-View error process

3.2 수동 모드 직렬 통신

송신, 수신 함수의 기본 구조는 자동 모드와 동일하다. 단 1회

송 명령 시 1회 포트 개방이 이루어지고 송신과 수신의 처리가 수

동 송신 명령에 의해 실시되는 단발성 구조를 갖는다. S-Card의 수

집 데이터에 의한 제어기기 이상 단용 아날로그 설정값의 경우

별도의 송 로그램 구성이 없으며 수동 모드에서 그 값의 송

역할을 맡는다.

- 27 -

그림 3.8 S-View 수동 모드 통신 순서도

Fig. 3.8 Flow chart of S-View manual mode communication

3.3 TCP/IP 통신

비주얼 베이직에서 제공되는 인터넷 련 로토콜은 원소켓 컨

트롤과 INET 컨트롤, 웹 라우 컨트롤 등이 있다.[1]

S-View에서는 이 소켓 컨트롤을 이용하여 TCP/IP 통신을

구 하 다. 용 로컬 포트는 6000번으로 선정하 으며 클라이언트

PC에서 S-View 서버에 속을 원할 경우 서버의 주소와 속 포트

를 알아야만 속이 가능하다. 속 방법은 속하는 클라이언트에

각각의 소켓을 형성하고 속을 허용하여 직렬 통신을 이용해 수집

- 28 -

한 데이터를 스트링 상태로 송한다. 속이 허용되는 최 클라이

언트는 무제한이나 시스템의 처리 속도의 과부하를 방지하기 해

동시 속 클라이언트는 1개로 제한하 다. 그러나 속 인 클라

이언트의 해제 후 재 속은 계속 으로 허용하 다. 본 연구에서는

데이터 수신 모니터링 알고리즘만을 개발하 으며 인터넷을 통

한 원격 출력 제어 기능은 개발 상에서 제외하 다.

원소켓을 이용한 송, 수신시 주의하야야 할 은 데이터의 형태를

통일해야 한다는 것이다. 데이터의 형태가 다를 경우 수신 후 재해

석의 방안도 있지만 이러한 경우 불필요한 로그램으로 인한 연산

속도 하의 원인이 될 수도 있다.

본 시스템에서는 데이터의 분석이 연구 상이 아니기 때문에 스

트링 상태로 데이터의 송, 수신 처리를 하 다.

서버 데이터 송신 표

If sokserver(gintConnectID).State <> sckConnected Then

Exit Sub --연결해제상태이면 명령 무실행

End If

If sokserver(gintConnectID).State <> sckClosed Then

--연결된 클라이언트에만 데이터 송

sokserver(gintConnectID).SendData "서버 송신: " & _

Date & Time & vbCrLf & lblrxdata.Caption & vbCrLf

-- 데이터 송신(STRING 형태 송신)

End If

- 29 -

그림 3.9 TCP/IP 송신 순서도

Fig. 3.9 Flow chart of TCP/IP transmission

수신시는 데이터 수신시 인터럽트에 의한 이벤트 발생에 의해 데

이터를 정해진 버퍼로 수신한다. 수신 데이터는 송신과 동일한 형태

인 스트링 형태로 수신하 으며 별도 디스 이 연산을 통해 모니

터링 하 다.

클라이언트 수신 표

sokclient.GetData rcvdata, vbString, bytesTotal

-- 데이터 수신(STRING 형태 수신)

Open "c:\\tcprxlist.hwp" For Append As mintFile

Print #mintFile, lblrxdata.Caption

Close mintFile -- 한 일로 데이터 기록

addr = Val(Mid(rcvdata, 35, 2)) -- 송국 선별 숫자로 변환

lbladdr.Caption = addr -- 송국 별도 디스 이

- 30 -

4 . S-Card 개발

S-Bus의 슬 이 역할을 맡는 S-Card는 송수신 연산을 기본으

로 5개 채 의 아날로그 입력 연산, S-Card 상태 표시용 LCD 디스

이 연산 기능 S-View에서 송받은 데이터를 이용하여 아

날로그 설정값에 따른 알람 연산 내부 EEPROM 기록 연산 기

능, 디지털 8개 출력 연산 기능, 10개 디지털 입력의 송 데이터화

연산 기능을 갖추고 있다. 동작 속도는 20MHz로 동작되며 원은

9V 직류변압기를 통해 별도 공 을 받는다. S-Bus의 요 시스템

인 통신 알고리즘에 주안을 둔 구성을 갖추어 기타 기능은 통신 연

산의 부수 인 역할로서 개발되었다. 메인 컨트롤러는 마이크로칩사

의 PIC16F877A를 사용하 고 통신용 컨트롤러는 텍사스 인스트루

먼트사의 SN75179B를 사용하 다.

4.1 메인 컨트롤러 소개

S-Card의 메인 컨트롤러는 마이크로칩사의 PIC16F877A를 사용

하 다. PIC16F877A는 래쉬형 8비트 CMOS 원칩 마이크로 콘트

롤러로 RISC와 하바드 아키덱쳐 구조를 가진다. 8K 워드의 래시

로그램 메모리와 368바이트의 데이터 메모리, 256바이트의

EEPROM을 가진다. 로그램 메모리는 래시로 여러 번 라이 이

가능하다. 로그램 메모리는 14비트, 데이터 메모리는 8비트, 40핀

패키지. 최 동작속도 20MHz (실행속도 200ns)이다.[4] 여타의

MCU와 같이 동작 속도가 클수록 력 소비도 증가하는 특징이 있

다.

- 31 -

4.1.1 직렬 통신 기능

PIC16F877A는 동기식 비동기식 직렬 통신 기능을 가지고 있

다. 이 통신방법은 일반 으로 알고 있는 SCI(Serial Communication

Interface)로 RS-232 통신 방식을 말한다.

비동기 통신 방식은 CRT 터미 는 PC와 이 통신을 지원

하며 입력되는 데이터가 자신의 것인가를 단하기 한 어드 스

디텍터 기능인 AUSART(Addressable Universal Synchronous

Receiver Transmitter)를 지원한다. 한 이 통신 방법으로 송

신과 수신이 동시에 이루어 질 수 있다. 동기식 통신 방식은 어느

한쪽은 클록을 보내주고 받는 쪽에서는 클록에 맞추어 데이터를 송/

수신하는 반이 통신을 지원한다. 즉 비동기식과 다르게 송수신이

동시에 이루어지지 않는다. 주로 A/D, D/A, 직렬 EEPROM과 같은

칩들과의 통신에 사용된다.[4]

통신 모드는 세 가지로 구분된다. 아래 표는 그 구분이다.

표 4.1 통신 모드 구분

Table 4.1 Communication mode classification

모 드 통신 방식 특 징

비동기 통신 이 통신

동시에 서로 데이터를 주고받을 수

있으며, 마스터슬 이 구분 없이

언제라도 데이터 송수신이 가능

동기통신-

마스터반이 통신 클록을 공 해주는 역할

동기통신-

슬 이반이 통신 클록을 공 받아 동작

- 32 -

4.1.2 10비트 ADC 기능

아날로그 디지털 변환 해상도는 10비트이며 8개의 채 을 갖는다.

그러나 8개의 A/D 컨버터가 존재하는 것은 아니며 컨버터는 하나

밖에 없으며 A/D 련 지스터를 조작하여 컨버 을 한다. 샘 링

홀드 시간은 20us 이며 입력 최 압은 VDD + 0.3V, 최소값은

VSS - 0.3V이다. 그리고 최 값과 최소값의 차이는 최소 2V 이상

이 되어야 한다. 만약 이보다 작을 경우 정확한 값의 반환을 보장

받을 수 없다. 가장 좋은 결과를 얻을 수 있는 아날로그 소스 임피

던스는 10kΩ이다.[4]

참고로 0 ~ 5V의 아날로그 입력 값에 한 10비트 분해능은 약

488mV 단 로 세분화된 측정이 가능하다.

4.1.3 디지털 입출력

입출력 방향 선택이 자유로운 33개의 포트를 가지고 있으며 각각

의 포트는 특별한 기능을 가지고 있다. 한 각각의 포트는 실제로

입출력을 수행하는 포트 지스터와 입출력을 설정 지스터가 존

재한다. 포트를 입력 는 출력으로 설정하려면 우선 해당 포트의

입/출력을 설정하는 입출력 지정 지스터의 해당 비트를 출력 ‘0’

는 입력 ‘1’로 설정해야 한다. 33개의 포트 I/O기능 외 표 4와 같

은 각기 특징을 가지고 있다. 특히 포트 C, D에 해당하는 16개 포트

는 3.5V 이상 입력 시 하이 벨로 1.5V 이하를 로우 벨로 인식

하는 노이즈에 의한 오동작 방지 기능인 슈미트 트리거 기능을 내

장하고 있어 별도의 외부 회로가 필요하지 않다.[4]

- 33 -

표 4.2 PIC16F877A 입출력 포트 특징

Table 4.2 Feature of PIC16F877A in/out port

포 트입출

지스터

포트

수기 능

PORTA(05h) TRISA(85h) 6 I/O, A/D, TIMER0, SSP

PORTB(06h) TRISB(86h) 8 I/O, EXT_INT, RB_INT

PORTC(07h) TRISC(87h) 8 I/O, T1CK1, CCP,

I2C, USART

PORTD(08h) TRISD(88h) 8 I/O, PSP

PORTE(09h) TRISE(89h) 3 I/O, A/D, PSP 컨트롤 신호

4.2 통신 제어 알고리즘 개발

4.2.1 수신 알고리즘

데이터 수신 방법에는 소 트웨어 인 방법과 하드웨어 인 방법

이 있다. 먼 소 트웨어 인 방법은 데이터 수신 자체만의 기능은

하드웨어방법에 비해 다른 이 없으나 수신 신호가 들어 올 때까

지 지속 인 기 상태를 유지하게 된다. 이로 인해 통신 연산외의

다른 연산 수행이 간혹 정상 이지 못하게 되는 단 이 있다. 반면

하드웨어 인 방법은 다른 연산을 수행 수신 신호가 들어오면

인터럽트 기능에 의해 수신 데이터를 받아들이고 다시 다른 연산을

행하게 된다. PIC MCU의 모든 종류가 하드웨어 인 통신 기능을

가지고 있지는 않지만 S-Card에 용한 PIC16F877A의 경우는 하

- 34 -

드웨어 기능이 용되어 있다. S-Card에서는 하드웨어 인 인터

럽트 기능과 더불어 수신 신호를 체크하는 소 트웨어 인 방법을

가미하여 보다 안정 인 연산을 추구하 다.

하드웨어와 소 트웨어를 용한 수신 신호 확인

#int_rda ---- 하드웨어 수신

void rda_isr() ---- 함수 선언

if(kbhit()= 1 ---- 소 트웨어 수신 신호 감지

그림 4.1 S-Card 수신 순서도

Fig. 4.1 Flow chart of S-Card reception

- 35 -

4.2.2 송신 알고리즘

S-Card에서는 입출력 값과 AD값을 직 송수신하기 하여 8비

트 단 의 핵사 통신을 선정 하 다. 1회 송신 데이터는 30 바이트

이며 최 송 가능 데이터는 79 바이트이다. 송 로토콜은

‘ACK + 송국 + 수신 상태 + 데이터(22바이트) + LRC + CRC

BCC + 테일1 + 테일2’ 로 구성하 다.

멀티 통신의 경우 각 국의 송신 회선이 동시에 속되는 경우 송

신이 이루어 지지 않는 상이 발생된다. S-Card에서는 멀티

통신 시 발생되는 송신 불능 상의 해결 방안으로 여러 가지 방안

을 고안하여 용해 본 결과 포토커 러를 이용하여 송신 선로를

제어하는 방법을 실험을 통해 검증하 다. 송신선 제어에 한 하드

웨어 인 구성에 하여는 5.2 에서 다루도록 하겠다.

송신 선로 물리 개폐를 한 소 트웨어 표

Itx_buf[0] = 0x06; --송신 헤더(ASK)

략 --송신버퍼에 데이터 기록

Itx_buf[30] = 0x0a; --테일2

output_high(pin_c5); --멀티 통신을 한 tx 속

delay_cycles(2); --물리 속 시간 지연

for(i=0; i<Dtx_size+1; i++) -- 1바이트 단 송

putc(Itx_buf[i]);

delay_cycles(2); --물리 데이터 송 시간 확보

output_low(pin_c5); --멀티 통신을 한 tx 개방

- 36 -

그림 4.2 S-Card 송신 순서도

Fig. 4.2 Flow chart of S-Card transmission

4.2.3 통신 에러 처리 알고리즘

S-Card에서는 LRC와 CRC 두 가지를 복합한 이 에러 검출 방

식을 개발하여 송, 수신 데이터의 값을 검증하 다. 송신 시 LRC와

CRC의 BCC 값을 각각 구하여 별도로 송하고 수신시에서도 각각

의 BCC를 연산하여 LRC와 CRC BCC 수신 값과 연산 값이 동일할

때 정상 인 수신이 완료 된 것으로 단하고 데이터 수신 상태 정

상 신호를 송하고 만일 비정상 인 송으로 별될 경우 수신

- 37 -

이상 신호를 송하고 그 횟수를 기록하고 표시한다.

미리 연산 처리하여 계산된 LRC와 CRC BCC를 수신 LRC와

CRC BCC와 비교하여 연산 값과 수신 값이 동시에 만족하여야

송 에러가 없는 것으로 별한다.

그림 4.3 S-Card BCC 체크 순서도

Fig. 4.3 Flow chart of S-Card BCC check

4.3 S-Card의 하드웨어 구성

S-Card의 하드웨어 주요 구성은 통신 데이터의 정확한 송을

으로 개발하 다. 한 4비트 LCD 제어 알고리즘을 용하여

메인 컨트롤러의 최소 자원으로 데이터 송 상태 아날로그 값

을 확인할 수 있게 하 다. 이는 데이터의 확인을 보조하는 역할을

한다.

- 38 -

아울러 노이즈 방지, 입출력 확장에 한 고려는 하지 않았으며

한 AD 컨버터에 한 부분도 데이터의 확인 차원에서의 구성으

로 실제 장 용 시에는 개선 개발의 여지가 있음을 밝 둔

다.

표 4.3 S-Card 기본 명세서

Table 4.3 S-Card basic specification

구 분 사 양 구 분 명 세

TTL 입력5V TTL

벨 10MCU 종류 PIC16F877A

TTL 출력5V TTL

벨 9통신 방식 UART

아날로그 입력 5채 통신 속도 57,600 bps

아날로그

인지0 ~ 5V 통신 컨버터 IC SN 75179

입력 원 9 ~ 24V 디스 이 16 × 2 LCD

그림 4.4 S-Card 사진

Fig. 4.4 Photograph of S-Card developed

- 39 -

5. S-Bus 구 성 능 검 증

5.1 S-Bus 컨버터 개발

일반 인 PC 통신 포트는 RS-232C 통신 방식으로 ±12V의 압

벨을 갖으며 한 그 송 거리가 15m( 이블의 종류 환경에

따라 약간의 차이 존재)정도로 장거리 통신에는 합하지 않으며 노

이즈에 의한 데이터 손실 보상 방안이 부족하다. 이러한 단 을 보

완하기 해 환경 인 요소나 노이즈에 의한 향을 감소시키면서

보다 장거리의 데이터 송이 가능하도록 S-Bus에서는 RS-422 통

신 방식을 취하 으며 이에 맞추어 RS-232C 신호 벨을 RS-422

신호 벨로 변환하는 기능을 갖춘 S-Bus 컨버터를 개발하 다.

신호 벨을 맞추기 해 MAX232 IC를 이용하 으며 차동 방식

으로 변환을 해 SN75179를 사용하 다. 한 S-Bus 컨버터는

232-422 컨버터 기능 외에 TTL 신호를 직 연결하여 RS-422 규

격의 신호를 출력할 수 있도록 MAX232 IC와 TTL 신호 환 스

치를 추가함으로써 두 가지의 기능을 갖도록 개발하 다. 통신용 IC

원은 외부 원 장치로부터 공 받는다. S-Bus 컨버터의 회로도

는 부록 4를 참고하기 바란다.

- 40 -

그림 5.1 S-Bus 컨버터 사진

Fig.5.1 Photograph of S-Bus converter

5.2 S-Card과 S-Bus 컨버터의 인터페이스 구축

RS-422 멀티 인터페이스 구축에 있어 가장 요한 사항은 각 국

의 송신 선로가 동시에 회선에 속 되서는 안 된다는 이다. 수신

의 경우는 마스터에서 모든 슬 이 로 동시에 데이터를 송하고

슬 이 에서도 송 받은 데이터를 자신의 조건에 맞는 데이터만

받아들이기 때문에 모든 수신 선로가 기 으로 속되어 있어도

수신에는 문제가 발생되지 않는다. 그러나 송신의 경우는 각 슬 이

의 송신을 하나의 마스터가 송받아 리하기 때문에 여러 데이

터가 동시에 회선 상에 있을 시 송 데이터는 오류가 발생되거나

정상 인 송이 이루어 지지 못한다. 이 문제 을 해결하기 하여

S-Bus 시스템에서는 포토커 러와 소 트웨어 인 방법을 통합

용하여 각 슬 이 의 송 회선의 개방 상태를 유지하다 자신의

송 시만 속시키는 방법을 개발하여 용하 다.

- 41 -

아래는 송 회선의 소 트웨어 인 구 과 하드웨어 구 을 나

타 낸 것이다.

output_high(pin_c5); ---- 송신 회선 단락

송신 알고리즘

output_low(pin_c5); ---- 송신 회선 개방

그림 5.2 송신선 하드웨어 구성

Fig. 5.2 Transfer cable hardware configuration

S-Card 간의 속은 TX-TX, RX-RX 동일 속을 하고 S-Bus

컨버터와 S-Card의 속은 RX-TX교차 속을 한다.

속 구성도는 부록 4.2의 S-Bus 인터페이스 구성도를 참고하기

바란다.

- 42 -

5.3 RS-422 성능 검증

S-Bus의 주 기능인 RS-422를 통한 직렬 통신 시험은 데이터

송의 신뢰성에 그 주안 을 두고 성능 검증을 하 으며 그 검증 내

용은 송 소요 시간과 송 시 발생되는 에러 발생률과 데이터

에러 기록 상태로 나 어 실시하 다.

검증 조건은

▷ 사용 PC : 펜티엄3 1200MHz 모바일 노트북

▷ PC OS : XP professional sp2

▷ S-Card 동작 속도 : 20MHz,

▷ S-Card 송 속도 : 57,600 BPS

▷ 슬 이 간 이블 종류 : UTP 이블

▷ PC와 S-Bus 컨버터간 이블 : 232 다이 트 이블

▷ 슬 이 간 이블 거리 : 10m

▷ 장에서 발생될 수 있는 노이즈에 한 사항과 이블 사양

에 따른 통신 향 요인은 성능 검증에서 제외하 다.

첫 번째 송 소요 시간 시험은 5가지 경우를 임의로 설정하여

각기 2시간 동안의 시험을 하 다. 2시간동안의 통신 데이터 10

회에 걸쳐 무작 로 선정된 데이터의 송 횟수를 조사하 다. 이

검증을 통해 S-Bus의 1개국 최소 송 소요 시간은 S-View 단독

운 시 16.6ms이고 최 허용 속 가능국인 10국까지의 1회 최소

송 소요 시간은 166ms이다.

- 43 -

표 5.1 S-Bus 직렬통신 송횟수

Table 5.1 Transmission frequency in S-Bus serial communication

구 분

당 송 횟수

1회 2회 3회 4회 5회 6회 7회 8회 9회 10회 평균

1200MHz

단독 실행61 60 60 60 60 60 61 59 60 59 60

1200MHz

단독 실행

출력 허용

57 57 57 58 56 57 56 56 58 57 56.9

1200MHz

복수 실행51 47 50 50 51 51 49 52 51 51 50.3

1200MHz

복수 실행

출력 허용

46 47 49 49 48 45 44 47 48 49 47.2

클라이언트

속58 58 56 59 57 57 58 57 58 57 57.5

※ 구분 설명(S-Card는 공통)

1) 1200Mz 단독 실행 : PC 동작 속도 1200Mz로 아날로그 디

지철 입력 값의 변화만 상태로 통신

2) 1200Mz 단독 실행, 출력 허용 : 1번과 동일 조건에 디지털

출력 허용 출력 변경 데이터 송신, S-Card측 출력 변경

3) 1200Mz 복수 실행 : 1번과 동일 조건에 기타 로그램(음악

재생 로그램 1개, 인터넷 3개 사이트 속, 한 일 1개 동시 실

행 통신

4) 1200Mz 복수 실행, 출력 허용 : 3번과 동일 조건에 디지털

출력 허용 출력 변경 데이터 송신, S-Card측 출력 변경

5) 1200Mz 단독 실행 클라이언트 속: PC 동작 속도 1200Mz로 아날

- 44 -

로그 디지털 입력 값의 변화만 상태로 통신, 인터넷을 통해 클

라이언트에 수집 데이터 재 송

단독

단독, 출

력복수

복수, 출

클라이언트연결

16.6 17.519.8 21.1

17.3

0

5

10

15

20

25

전송시간(ms)

통신 조건(1200MHz)

그림 5.3 통신 조건별 송시간

Fig. 5.3 Transmission time for communication mode

두 번째 성능 시험은 첫 번째 검증 테스트와 동일한 조건으로 각

기 2시간 총 10시간동안의 통신 속도 검증 오류 발생에 한 사

항이다. 검증 시간 오류 발생은 2회의 BCC 이상이 있었으며 이

는 노이즈와 같은 외부 환경에 한 고려를 하지 않는 조건의 향

으로 단된다.

- 45 -

표 5.2 데이터 오류 발생 횟수

Table 5.2 Data error occurrence frequency

구 분 오류 발생 횟수 오류 종류

1200Mz 단독 실행 0 -

1200Mz 단독 실행

출력 허용0 -

1200Mz 복수 실행 2 1국, 3국 BCC 에러

1200Mz 복수 실행

출력 허용0 -

클라이언트 속 0 -

세 번째는 데이터 에러 검출 시 기록에 한 성능 검사이다.

기록에 한 검증이 필요한 이유는 통신의 주목 이 데이터의 오류

없는 정확한 달과 한 수신 받은 데이터의 분석에 의한 자료 수

집에 있기 때문이다. 표 5.3은 임의로 송 이상 상태 발생 송

데이터의 한 일로 장된 상태이고 그림 5.4는 한 일로 기

록된 데이터를 S-View에서 불러들인 화면이다.

데이터 구체 인 분석, 처리에 한 검증은 본 시스템이 용되는

성격에 따라 다른 알고리즘 용이 필요하므로 본 검증에서는 데이

터의 원형 값의 기록 검증만을 하 다.

- 46 -

그림 5.4 이상 데이터 기록화면

Fig. 5.4 Error and data recording display

표 5.3 데이터 에러 기록 한 일 발췌

Table 5.3 Hangŭl file sample of data and error recoding

데이터 기록

RS422 수신: 2005-04-25오후 12:29:35

1국 6 31 1 3 30 3 80 2 9E 2 9C 3 3E C0 0 FC 1

D3 2 A2 1 67 2 2C 2 CE 73 FE BD 0 0

에러 기록

2국 무응답(2005-04-27/오후 12:30:37)

1국 무응답(2005-04-27/오후 12:30:37)

1국 통신 종료(2005-04-27/오후 12:30:37)

2국 무응답(2005-04-27/오후 12:30:37)

2국 통신 종료(2005-04-27/오후 12:30:37)

- 47 -

5.4 TCP/IP 성능검증

직렬 통신으로 수집된 데이터를 용 회선 구성이 아닌 범용 회

선을 통해 속된 원거리 클라이언트에 데이터가 얼마나 빠르고 정

확하게 송되는지 그리고 송수신시 발생되는 지연 시간에 하여

실험하 다.

검증 조건은 아래와 같다.

▷ 서버용 PC : 펜티엄3 1200MHz 모바일 노트북

▷ 클라이언트용 PC : 셀러론 1700MHz 데스크탑 PC

▷ 서버 클라이언트 OS : XP professional SP2

▷ 네트워크 구성 : 데이콤 서버와 회사 서버 이용

첫 번째 검증은 클라이언트 측의 당 수신 속도를 시험하 다.

직렬통신에서 송신되는 데이터를 당 수신하는 횟수를 10회 걸쳐

샘 측정하 다.

표 5.4 클라이언트 측 데이터 송 시험 결과

Table 5.4 Test result of client data transmission

클라이언트 수신 횟수

1회 2회 3회 4회 5회 6회 7회 8회 9회 10회 평균 속도

30 35 32 36 34 35 33 36 37 34 34.2 29.2ms

두 번째 시험은 서버 측에서 송신된 데이터를 범용 인터넷 회선

을 통해 송하 을 때 클라이언트 측에서의 수신 받을 때까지의

- 48 -

지연시간에 한 시험을 실시하 다. 범용 인터넷 통신은 패킷을 통

한 공통 라인 송수신과 서버와 클라이언트가 직 연결되어 있지

않고 라우터, 회선 서버 등을 이용하여 경로를 찾아 가는 방식이기

때문에 어느 정도의 시간 지연이 있을 것이라 단하고 데이터의

송수신 시간을 비교하 다. 송수신 상이 되는 데이터는 동일한 데

이터를 선별하여 비교 분석하 다. 결과는 표 9와 같이 20 정도의

지연 상이 발생되었다. 이는 데이터의 실시간 수집, 제어에는 불

합리한 검사 결과이다.

표 5.5 송수신 지연 시간 비교

Table 5.5 Comparison of delay time between transmission and

reception

·구 분송신 및 수신 시작 시간 (2005년4월30일)

1회 2회 3회 4회 5회 6회

클라이언트 1:37:42 1:37:43 3:09:48 3:09:49 3:18:47 3:18:48

서버 1:37:22 1:37:23 3:09:27 3:09:28 3:18:26 3:18:27

지연 시간 20s 20s 21s 21s 21s 21s

세 번째는 수신된 데이터의 오류 발생에 한 검증이다. 직렬 통

신과 마찬가지로 인터넷을 통한 데이터 송도 가장 요한 은

오류 없는 정확한 데이터 송이다. 아무리 빠른 송이 이루어진다

고 해도 정확한 송이 되지 않는다면 그 데이터는 쓸모없는 정보

가 되기 때문이다.

본 검증 결과 S-Bus 시스템의 인터넷을 통한 데이터 송 크기

- 49 -

에 문제 이 발생하 다. 치명 인 데이터의 오류는 없으나 간헐

데이터 이상 수신 상이 발생되었다. 표 10과 부록 3.1의 데이터

기록과 같이 1회 수신시 수신되는 데이터 크기가 달라지는 상이

발생되었다. 서버에서 1회 수신된 값이 정상 으로 수신되기도 하고

간헐 으로 몇 회에 걸친 데이터가 한 번에 수신되는 상이 발생

되었다. 서버 측에서 송신 데이터를 제한하는 등의 통신 방법을 달

리 하 으나 상 발생은 계속되었다. 본 문제 에 한 원인 악

은 범용 인터넷 통신의 심도 깊은 조사와 연구 후 재조사가 필요하

다. 한 상태로 실용화 할 경우 수신 데이터의 정 한 분석 알

고리즘 개발이 필요하다.

표 5.6 서버와 클라이언트 송 데이터 비교

Table 5.6 Comparison of server and client transmission data

구분 데이터 비교

서버

RS422 수신: 2005-04-30오후 1:36:55

5국 6 35 1 3 BE 3 A0 1 0 3 0 3 0 C0 0 0 0

9C 1 D9 3 5D 0 E8 2 3 1E 81 0 0 0

클라이

언트

클라이언트 수신: 2005-04-30오후 1:37:14

서버 송신: 2005-04-29오후 1:36:55

5국 6 35 1 3 BE 3 A0 1 0 3 0 3 0 C0 0 0 0

9C 1 D9 3 5D 0 E8 2 3 1E 81 0 0 0

클라이언트 수신: 2005-04-30오후 1:37:14

서버 송신: 2005-04-30오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2 1F 2 1F C0 0 0

1 1 2 19 0 CB 3 34 1 E 30 D9 CD 0 0

서버 송신: 2005-04-30오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2 1F 2 1F C0 0 0

1 1 2 19 0 CB 3 34 1 E 30 D9 CD 0 0

- 50 -

6. 결론

본 연구에서 RS-232C와 TCP/IP통신 기능을 갖춘 S-View 로

그램과 8비트 마이크로 컨트롤러인 PIC16F877A를 이용하여 데이터

수집 제어 상인 S-Card를 개발하 다. 이 두 시스템을

RS-422 인터페이스로 연결되어 S-Bus를 완성하 다.

모듈 화된 고가의 필드 버스의 기본 성능에 응하면서도 사용자

의 요구에 맞는 유연한 필드 버스 시스템을 구성하기 한 통신에

한 기본 인 알고리즘 개발에 주안 을 두었으며 멀티 통신 시스

템을 통하여 알고리즘의 신뢰성 검증을 하 다.

시스템의 성능 검증은 임의의 각 상황에 따라 실시간 데이터

송 속도 송 데이터의 정확한 달과 송수신된 데이터의 기록

리에 하여 실시하 다.

본 연구의 결과물인 S-Bus의 첫 번째 목표인 직렬 통신은 시험

용의 한계 을 갖고 있기는 하나 데이터 송 신뢰도 면에 있어 기

이상의 결과를 보 다. 본 연구 내용 직렬 통신을 장에

용하기 하여서는 이블 사양 검토 노이즈와 같은 외부 환경

에 한 응 회로 구성이 필요하다. 한 S-View 구동 PC 성능

향상 연산 처리가 향상된 마이크로컨트롤러를 이용하여 S-Card

의 동작 속도를 증가 시킨다면 보다 정 한 제어 데이터 수집이

가능할 것이다.

두 번째 연구 목표 던 범용 인터넷 통신을 이용한 S-Bus 시스

템 구축 경우는 두 가지 문제 이 나타났다. 먼 약 20 의 송신과

수신의 지연 상이 나타났는데 이는 패킷을 통한 범용 인터넷 통

신의 특징에 의한 상이라 보여 지나 보다 심도 깊은 연구가 필요

- 51 -

할 것이다. 두 번째 부록3.1과 같이 수신 데이터의 크기가 다른

상인데 최 서버 측이나 클라이언트 측 알고리즘 이상이라 여기고

여러 가지 방법의 수정 개선을 실시하 으나 이 과정 원인

악이 되지 않았다. 오히려 직렬 통신상의 송 속도가 평균 당

4회 정도 증가하는 직렬 통신 알고리즘 개선 효과가 나타났다. 본

연구에서 직렬 통신과는 다르게 범용 인터넷 통신은 용 회선 구

성인 직렬 통신이나 LAN 구성의 이더넷 통신 모듈의 성능에는 못

미치는 연구 결과가 나오기는 하 으나 용 선로가 아닌 범용 통

신 선로를 이용한 데이터 송의 기 지식의 연구에 의의를 두고

지속 인 추가 연구를 실시함으로써 범용 인터넷을 통한 실시간 데

이터 송 모니터링 그리고 직 출력 제어에 한 신뢰성 있는

알고리즘 개발을 통해 산업용 가정용 제어 시스템으로의 한 단

계 발 된 S-Bus 시스템을 개발하여 실용화 해 나갈 것이다.

- 52 -

참고 문헌

[1] Michael J.Donahoo, Kenneth L.Calvert 박 철 역,

“TCP/IP 소켓 로그래 ”, 사이텍미디어, 2001

[2] ANK CO.Ltd, 이 란 역, “TCP/IP가 보이는 그림책”,

성안당, 2004

[3] 주경민, 박선완, 김민호, “Visual basic programming Bible”,

진출 사, 2004

[4] Microchip, “PIC16f87x data sheet”

[5] Gustaf Olsson, Gianguido Piani, “Compurt Systems for and

Control“, Automation, Prentice Hall, 1992

[6] 최선종, “Visual Basic과 함께 하는 열려라 통신”,

무한테크놀리지, 2003

[7] Texas instrument, “SN75179B Differential driver and receiver

data sheet”

[8] Maxim, “MAX220-MAX249 User's manual”

[9] CCS.INC, “PIC MCU C Compiler Reference Manual”

[10] 오정원, “PIC 마이컴용 C언어 CCS-C 실 가이드”,

컴 일테크놀리지, 1997

[11] 이희문, “PIC16F84의 기 + α, 성안당”, 2002

[12] ANK CO.Ltd, 김성훈 역, “C Programming가 보이는

그림책“, 성안당, 2003

[13] 박선호 편 , “PC포트 응용 장치의 설계”,

국제테크노정보연구소, 1993

[14] 박재삼, 신 섭, “컴퓨터 인터페이스 응용”, 세화, 2002

[15] 김보연, “센서를 활용하자”, 한진, 2003

[16] Texas instrument, “6N135 Optocouplers/optoisolators

data sheet“

- 53 -

[17] KEC, “KIA7805AP/API data sheet”

[18] ANK CO.Ltd, 이 란 역, “알고리즘이 보이는 그림책”,

성안당, 2004

- 54 -

- 55 -

부 록

A1. S-Card 로그램 ················································································ 56

A1.1 메인 로그램 ··············································································· 56

A1.2 LCD 컨트롤 로그램 ································································· 62

A2. S-View 로그램 ··············································································· 64

A2.1 통신 설정 로그램 ····································································· 64

A2.2 메인 임 로그램 ································································· 68

A2.3 테스트 모드 로그램 ································································· 69

A2.4 자동 모드 로그램 ····································································· 76

A2.5 입출력 로그램 ··········································································· 93

A2.6 알람 표시 로그램 ····································································· 93

A2.7 수신 일 표시 로그램 ··························································· 93

A2.8 알람 설정값 표시 로그램 ······················································· 94

A2.9 클라이언트 로그램 ··································································· 94

A2.10 공통 함수 ····················································································· 96

A2.11 공통 변수 ····················································································· 98

A3. 인터넷 통신 기록 ··············································································· 99

A3.1 클라이언트 수신 기록 ································································· 99

A3.2 서버 송신 기록 ··········································································· 100

A4. 회로도 ································································································· 102

A4.1 S-Card 구성 회로도 ·································································· 102

A4.2 S-Bus 인터페이스 구성도 ······················································· 103

A4.3 S-Bus 컨버터 회로도 ······························································· 104

- 56 -

A1. S-Card 로그램

A1.1 메인 로그램

#include<c:\program files\picc\

source\treatise\16f877A.h>

#device *=16 adc=10

#use delay(clock=20000000)

#users232(baud=57600,parity=n,

bits=8,xmit=pin_c6,rcv=pin_c7)

#fuses hs,nowdt,noprotect,nolvp

#priority rda,tbe

#byte porta = 0x05

#byte portb = 0x06

#byte portc = 0x07

#byte portd = 0x08

#byte porte = 0x09

#define Dtx_size 30

#define Drx_size 17

#define Drx_head Irx_buf[0]

#define Drx_address Irx_buf[1]

#define Drx_cmd Irx_buf[2]

#define Drx_portset Irx_buf[13]

#define Irx_lrc Irx_buf[14]

#define Lrx_crc(long)

(Irx_buf[15]&0xff)*0x100

+(Irx_buf[16]& 0xff)

#define Drx_tailIrx_buf

[Drx_size]

#define Dcrc_ccitt 0x1021

#define Dad_disp_sw pin_a4

#define Dads_disp_sw pin_d3

#define rx_adr 0x35

long Lad_bf ,Lad_bf1, Lad_bf2,

Lad_bf3, Lad_bf4, Lad_bf5,

Ladset[5];

char Irx_buf[Drx_size+1];

int Itx_buf[Dtx_size+1],

Isel_disp=0, Iad_seq_no=0;

int Irdata[10];

int Ieep_cnt, Ilrc_chk;

long Lcrc_chk;

int ng_cnt=0;

int rx_state;

int Imo = 0;

#bit Bdisp_swf = Imo.0

#bit Btxenable_f = Imo.1

#bit Brx_f = Imo.2

#bit Brx_f1 = Imo.3

#bit Btx_end = Imo.4

#bit Bad1_alm = Imo.5

#bit Bad2_alm = Imo.6

#bit Bad3_alm = Imo.7

int Im1 = 0;

#bit Bad4_alm = Im1.0

#bit Bad5_alm = Im1.1

#bit Blrc_f = Im1.2

#bit Bcrc_f = Im1.3

#bit tx_ok = Im1.4

#include"c:\program files\picc

\source\treatise\4bit lcd.c"

void txdata_func(int rx_state );

void checkbcc_func();

int generate_lrc(int Icnt,

- 57 -

int*Idata, int Inum);

long generate_crc(int Icnt, int

*Idata, int Inum);

void display_func();

void error_func();

void eeprom_func();

void outport_func(int rx_state);

#int_rda

void rda_isr() int i;

if(kbhit()= 1

lcd_gotoxy(15,1);

lcd_putc(" ");

Drx_head = getc();

if(Drx_head == 0x02)

Drx_address = getc();

if(Drx_head==0x02 &&

Drx_address==rx_adr)

for(i=2;i<Drx_size+1;i++)

Irx_buf[i] = getc();

checkbcc_func();

#int_ad

void ad_isr()

switch(Iad_seq_no)

case 0: Lad_bf5 = Lad_bf;

set_adc_channel(1);

Iad_seq_no =1;

break;

case 1: Lad_bf1 = Lad_bf;

set_adc_channel(2);

Iad_seq_no =2;

break;

case 2:

Lad_bf2 = Lad_bf;

set_adc_channel(3);

Iad_seq_no =3;

break;

case 3: Lad_bf3 = Lad_bf;

set_adc_channel(4);

Iad_seq_no =4;

break;

case 4: Lad_bf4 = Lad_bf;

set_adc_channel(0);

Iad_seq_no =0;

break;

void main()

set_tris_a(0x3f);

set_tris_b(0x00);

set_tris_c(0x9f);

set_tris_d(0x08);

set_tris_e(0x07);

portb = 0x00;

memset(Itx_buf,0,Dtx_size);

memset(Irx_buf,0,Drx_size);

lcd_init();

delay_ms(10);

setup_adc_ports(a_analog);

setup_adc(adc_clock_div_2);

setup_timer_1(t1_internal|t1_div

_by_1);

enable_interrupts(int_rda);

enable_interrupts(int_ad);

enable_interrupts(global);

for(Ieep_cnt=0;

Ieep_cnt<10;Ieep_cnt++)

- 58 -

Irdata[Ieep_cnt]= read_eeprom

(Ieep_cnt);

output_low(pin_c5);

lcd_gotoxy(0,0);

lcd_putc("NO:");

lcd_gotoxy(4,0);

lcd_putc(rx_adr);

lcd_gotoxy(6,0);

lcd_putc("ALM:");

lcd_gotoxy(12,0);

lcd_putc("NG:");

lcd_gotoxy(12,1);

lcd_putc("RX:");

while(1) Lad_bf = read_adc();

txdata_func( rx_state);

display_func();

outport_func( rx_state);

eeprom_func();

error_func();

void checkbcc_func()

Ilrc_chk =generate_lrc

(Drx_size,Irx_buf, 3);

Lcrc_chk = enerate_crc

(Drx_size,

Irx_buf, 3);

if (Ilrc_chk == Irx_lrc)

Blrc_f = 1;

else Blrc_f =0;

if (Lcrc_chk == Lrx_crc)

Bcrc_f = 1;

else Bcrc_f =0;

if (Blrc_f == 1

&& Bcrc_f == 1)

rx_state = 0x01;

lcd_gotoxy(15,1);

lcd_putc("OK");

else rx_state = 0x02;

ng_cnt = ng_cnt +1;

lcd_gotoxy(15,1);

lcd_putc("NG");

lcd_gotoxy(15,0);

lcd_putc(ng_cnt);

int generate_lrc(int Icnt, int

*Idata, int Inum) int i;

int Itx_lrc;

Itx_lrc = 0x00;

for(i=0; i<Icnt - Inum; i++)

Itx_lrc ^= Idata[i];

return Itx_lrc;

long generate_crc

(intIcnt,int*Idata, int Inum)

int i, j;

long Ltemp, Ltemp_crc;

Ltemp =0;

Ltemp_crc =0;

for (i=0; i<Icnt-Inum; i++)

Ltemp = Idata[i] << 8;

Ltemp_crc = Ltemp_crc ^

Ltemp;

for (j=0; j<8 ; j++)

if((Ltemp_crc

& 0x8000) == 0x8000)

Ltemp_crc = ((Ltemp_crc

<< 1) ^ Dcrc_ccitt) ;

- 59 -

else

Ltemp_crc=(Ltemp_crc << 1) ;

return Ltemp_crc ;

void txdata_func(bcc_ok)

int i;

while(Drx_cmd==0x01 ||

Drx_cmd == 0x03)

Itx_buf[0] = 0x06;

Itx_buf[1] = rx_adr;

Itx_buf[2] = rx_state;

Itx_buf[3] = (int)(Lad_bf1>>8);

Itx_buf[4] = (int)(Lad_bf1);

Itx_buf[5] = (int)(Lad_bf2>>8);

Itx_buf[6] = (int)(Lad_bf2);

Itx_buf[7] = (int)(Lad_bf3>>8);

Itx_buf[8] = (int)(Lad_bf3);

Itx_buf[9] = (int)(Lad_bf4>>8);

Itx_buf[10] = (int)(Lad_bf4);

Itx_buf[11] =(int)(Lad_bf5>>8);

Itx_buf[12] = (int)(Lad_bf5);

Itx_buf[13] = (input_c()) ^

0b00011111;

Itx_buf[14] = (input_e()) ^

0b00000111;

Itx_buf[15]= portb;

Itx_buf[16] = Irdata[0];

Itx_buf[17] = Irdata[1];

Itx_buf[18] = Irdata[2];

Itx_buf[19] = Irdata[3];

Itx_buf[20] = Irdata[4];

Itx_buf[21] = Irdata[5];

Itx_buf[22] = Irdata[6];

Itx_buf[23] = Irdata[7];

Itx_buf[24] = Irdata[8];

Itx_buf[25] = Irdata[9];

Itx_buf[26] = generate_lrc

(Dtx_size,Itx_buf, 4);

Itx_buf[27]=(int)(generate_crc(

Dtx_size, Itx_buf,4)>>8);

Itx_buf[28]=(int)(generate_crc(

Dtx_size, Itx_buf, 4));

Itx_buf[29] = 0x0d;

Itx_buf[30] = 0x0a;

output_high(pin_c5);

delay_cycles(2);

for(i=0; i<Dtx_size+1; i++)

putc(Itx_buf[i]);

Drx_cmd = 0x00;

delay_cycles(2);

output_low(pin_c5);

void error_func()

if(Lad_bf1>Ladset[0])

Bad1_alm = 1;

if(Lad_bf2>Ladset[1])

Bad2_alm = 1;

if(Lad_bf3>Ladset[2])

Bad3_alm = 1;

if(Lad_bf4>Ladset[3])

Bad4_alm = 1;

if(Lad_bf5>Ladset[4])

Bad5_alm = 1;

if(Drx_cmd == 0x30 ||

(!input(Dad_disp_sw)

- 60 -

&&!input(Dads_disp_sw)))

Bad1_alm = 0;

Bad2_alm = 0;

Bad3_alm = 0;

Bad4_alm = 0;

Bad5_alm = 0;

Drx_cmd = 0x00;

void display_func()

const intascii_num_tbl[10]

='0','1','2','3','4','5','6','7','8',

'9';

long Lad_1000, Lad_100,

Lad_10, Lad_1, Lad_disp;

long Lads_1000,Lads_100,

Lads_10, Lads_1, Lads_disp;

if(!input(Dad_disp_sw) &&

Bdisp_swf == 0)

Bdisp_swf = 1;

Isel_disp = Isel_disp +1;

if(input(Dad_disp_sw))

Bdisp_swf =0;

if(Isel_disp == 5)

Isel_disp =0;

switch (Isel_disp)

case 0: Lad_disp = Lad_bf1;

Lads_disp = Ladset[0];

lcd_gotoxy(0,1);

if(!input(Dads_disp_sw))

lcd_putc("as1:");

else lcd_putc("ad1:");

break;

case 1: Lad_disp = Lad_bf2;

Lads_disp = Ladset[1];

lcd_gotoxy(0,1);

if(!input(Dads_disp_sw))

lcd_putc("as2:");

else lcd_putc("ad2:");

break;

case 2: Lad_disp = Lad_bf3;

Lads_disp = Ladset[2];

lcd_gotoxy(0,1);

if(!input(Dads_disp_sw))

lcd_putc("as3:");

else lcd_putc("ad3:");

break;

case 3: Lad_disp = Lad_bf4;

Lads_disp = Ladset[3];

lcd_gotoxy(0,1);

if(!input(Dads_disp_sw))

lcd_putc("as4:");

else lcd_putc("ad4:");

break;

case 4: Lad_disp = Lad_bf5;

Lads_disp = Ladset[4];

lcd_gotoxy(0,1);

if(!input(Dads_disp_sw))

lcd_putc("as5:");

else lcd_putc("ad5:");

break;

if(!input(Dads_disp_sw))

Lads_1000 =

Lads_disp / 1000;

Lads_disp = Lads_disp -

(Lads_1000*1000);

- 61 -

Lads_100 = Lads_disp / 100;

Lads_disp = Lads_disp -

(Lads_100*100);

Lads_10 = Lads_disp / 10;

Lads_1 = Lads_disp % 10;

lcd_gotoxy(5,1);

lcd_putc(ascii_num_tb

[Lads_1000])l

lcd_gotoxy(6,1);

lcd_putc(ascii_num_tbl

[Lads_100]);

lcd_gotoxy(7,1);

lcd_putc(ascii_num_tbl

[Lads_10]);

lcd_gotoxy(8,1);

lcd_putc(ascii_num_tbl

[Lads_1]);

else

Lad_1000 = Lad_disp/1000;

Lad_disp=Lad_disp-(Lad_1000*

1000);

Lad_100 = Lad_disp / 100;

Lad_disp=Lad_disp-(Lad_100*1

00);

Lad_10 = Lad_disp / 10;

Lad_1 = Lad_disp % 10;

lcd_gotoxy(5,1);

lcd_putc(ascii_num_tbl

[Lad_1000]);

lcd_gotoxy(6,1);

lcd_putc(ascii_num_tbl

[Lad_100]);

lcd_gotoxy(7,1);

lcd_putc(ascii_num_tbl

[Lad_10]);

lcd_gotoxy(8,1);

lcd_putc(ascii_num_tbl[Lad_1]);

if(Bad1_alm == 1)

lcd_gotoxy(10,0);

lcd_putc("1");

else if (Bad2_alm == 1)

lcd_gotoxy(10,0);

lcd_putc("2");

else if(Bad3_alm == 1)

lcd_gotoxy(10,0);

lcd_putc("3");

else if(Bad4_alm == 1)

lcd_gotoxy(10,0);

lcd_putc("4");

else if(Bad5_alm == 1)

lcd_gotoxy(10,0);

lcd_putc("5");

else lcd_gotoxy(10,0);

lcd_putc(" ");

void eeprom_func()

while(Drx_cmd == 0x20 )

for(Ieep_cnt=0; Ieep_cnt<10;

Ieep_cnt++)

write_eeprom(Ieep_cnt,Irx_buf[

Ieepcnt+3]);

Irdata[Ieep_cnt] =

read_eeprom(Ieep_cnt);

Drx_cmd = 0x00;

- 62 -

if(Drx_cmd == 0x21)

for(Ieep_cnt=0; Ieep_cnt<2;

Ieep_cnt++)

write_eeprom(Ieep_cnt,Irx_buf[

Iee pcnt+3]);

Irdata[Ieep_cnt]=

read_eeprom(Ieep_cnt);

Drx_cmd = 0x00;

if(Drx_cmd == 0x22)

for(Ieep_cnt=2;

Ieep_cnt<4; Ieep_cnt++)

write_eeprom(Ieep_cnt,Irx_buf[

Iee pcnt+3]);

Irdata[Ieep_cnt]=read_eeprom(Ie

ep_ cnt);

Drx_cmd = 0x00;

if(Drx_cmd == 0x23)

for(Ieep_cnt=4;

Ieep_cnt<6;Ieep_cnt++)

write_eeprom(Ieep_cnt,Irx_buf[

Iee pcn +3]);

Irdata[Ieep_cnt] =

read_eeprom(Ieep_cnt);

Drx_cmd = 0x00;

if(Drx_cmd == 0x24)

for(Ieep_cnt=6; Ieep_cnt<8;

Ieep_cnt++)

write_eeprom(Ieep_cnt,Irx_buf[

Iee pcnt +3]);

Irdata[Ieep_cnt] =

read_eeprom(Ieep_cnt);

Drx_cmd = 0x00;

if(Drx_cmd == 0x25)

for(Ieep_cnt=8;Ieep_cnt<10;Iee

p_cnt++ )

write_eeprom(Ieep_cnt,Irx_buf[

Iee pcnt +3]);

Irdata[Ieep_cnt] =

read_eeprom(Ieep_cnt);

Drx_cmd = 0x00;

Ladset[0] = make16(Irdata[0],

Irdata[1]);

Ladset[1] = make16(Irdata[2],

Irdata[3]);

Ladset[2] = make16(Irdata[4],

Irdata[5]);

Ladset[3] = make16(Irdata[6],

Irdata[7]);

Ladset[4] = make16(Irdata[8],

Irdata[9]);

void outport_func(bcc_ok)

if(bcc_ok == 0x01 )

if(Drx_cmd == 0x02 ||

Drx_cmd == 0x03)

portb = Irx_buf[13];

A1.2 LCD 컨트롤 로그램

struct lcd_pin

boolean enable;

boolean rs;

boolean rw;

boolean unused;

int data : 4; lcd;

- 63 -

#byte lcd = 0x08

#define lcd_type 2

byte const lcd_init_string[4] =

0x20|(lcd_type << 2),0xc,1,6;

struct lcd_pin const lcd_write

= 0,0,0,0,0;

struct lcd_pin const lcd_read =

0,0,0,0,15;

int lcd_read_byte()

int low, high;

set_tris_d(lcd_read);

lcd.rw=1;

delay_cycles(1);

lcd.enable=1;

delay_cycles(1);

high=lcd.data;

lcd.enable=0;

delay_cycles(1);

lcd.enable=1;

delay_us(1);

low=lcd.data;

lcd.enable=0;

set_tris_d(lcd_write);

return((high<<4)|low);

void lcd_send_nibble(int n)

lcd.data =n;

delay_cycles(1);

lcd.enable=1;

delay_us(2);

lcd.enable =0;

void lcd_send_byte(int address,

int n) lcd.rs =0;

while(bit_test(lcd_read_byte(),7)

);

lcd.rs = address;

delay_cycles(1);

lcd.rw=0;

delay_cycles(1);

lcd.enable =0;

lcd_send_nibble(n>>4);

lcd_send_nibble(n & 0xf);

void lcd_init() int i;

set_tris_d(lcd_write);

lcd.rs=0;

lcd.rw=0;

lcd.enable=0;

delay_ms(15);

for(i=1;i<=3;++i)

lcd_send_nibble(3);

delay_ms(5);

lcd_send_nibble(2);

for(i=0;i<=3;++i)

lcd_send_byte(0,lcd_init_string[i

]);

void lcd_gotoxy(byte x,

byte y)

int address;

if(y==0)

address=0x00;

if(y==1)

address=0x40;

x = x-1;

address = address + x;

lcd_send_by te( 0, 0x 80| address) ;

- 64 -

void lcd_putc(char c)

switch(c)

case '\f' : lcd_send_byte(0,1);

delay_ms(2);

break;

case'\n' : lcd_gotoxy(1,2);

break;

case '\b' :

lcd_send_byte(0,0x10);

break;

default : lcd_send_byte(1,c);

break;

char lcd_getc(byte x, byte y)

char temp;

lcd_gotoxy(x,y);

lcd.rs=1;

temp = lcd_read_byte();

lcd.rs=0;

return(temp);

※ 명령어 c언어의 해설에

한 부분은 c 기본 서

ccs complier 기본서를 참고하

기 바란다. [9, 10, 11]

A2. S-View 로그램

A2.1 통신 설정 로그램

Option Explicit

Dim gstrPort As String

Dim gstrBaudrate As String

Dim gstrDatabit As String

Dim gstrParity As String

Dim gstrStopbit As String

Private Sub Form_Load()

Dim intAnd_temp As Integer

Dim I%

Dim lngWork_temp As Long

Height = 6780

Width = 8010

optauto.Value = True

mblnAuto = True

If mblnAuto = True Then

txtmode = 자동모드"

Optserver.Value = True

mblnserver = True

If mblnserver = True Then

txttcp ="서버"mainfrm.Caption

="S-View 서버"

gstrBaudrate

mcomset.mBaudrate

gstrParity = mcomset.mParity

gstrDatabit =mcomset.mDatabit

gstrStopbit =mcomset.mStopbit

gstrPort = mcomset.mPort

mlngW ork _ tempess= mcomset.

- 65 -

maddr

txtbaudrate(1).Text

=gstrBaudrate

txtparity(1).Text = gstrParity

txtdatabit(1).Text =gstrDatabit

txtstopbit(1).Text =gstrStopbit

txtport(1).Text = gstrPort

mcomsetting = gstrBaudrate &

"," & gstrParity & "," &

gstrDatabit & "," &gstrStopbit

mcomport = gstrPort

lngWork_temp =

mlngWork_tempess

txtaddr.Text=Hex(mlngWork_t

empess)

For i = 0 To 9 Step 1

intAnd_temp = lngWork_temp

And &H1

If intAnd_temp = &H1 Then

chkaddrset(i).ForeColor =

&HDD0303

chkaddrset(i).Value = 1

Else

chkaddrset(i).ForeColor =

&HFFFFFF

chkaddrset(i).Value = 0

End If

lngWork_temp

= lngWork_temp\2

Next i

End Sub

Private Sub

cmddicision_Click()

Dim bytresult As Byte

Dim lngaddr As Integer

Dim intCnt1 As Integer

Dim intAnd_temp As Integer

Dim intCnt2 As Integer

Dim lngWork_temp As Long

Dim mode$

Dim lngHexcnt As Long

lngHexcnt = 1

If optclient.Value = True Then

mblnserver = False

mblnclient = True

mainfrm.Caption = "S-View

클라이언트"

mainfrm.mnuclient.Enabled

= True

mainfrm.mnuautomode.Enabled

= False

mainf rm. mnutestmode. E nabled

= False

mainfrm.sbrcomm.Panels(2).Te

xt =client.sokclient.RemoteHost

&"/"& client.sokclient.

RemotePort

mainfrm.sbrcomm.Panels(3).Te

xt = "클라이언트"

End If

If Optserver.Value = True

Then

mblnserver = True

mblnclient = False

- 66 -

mainfrm.Caption =

"S-View 서버"

mainfrm.mnuautomode.Enabled

= True

mainf rm. mnutestmode. Enabled

= True

mainfrm.mnuclient.Enabled =

False

For intCnt1 = 0 To 9 Step 1

If chkaddrset(intCnt1).Value= 1

Then

lngaddr = lngaddr + Hex("&h"

& lngHexcnt)

lngHexcnt =lngHexcnt * 2 ^ 1

Next intCnt1

mlngWork_tempess = lngaddr

txtaddr.Text =

Hex(mlngWork_tempess)

lngWork_temp=mlngWork_tem

pess

For intCnt2 = 0 To 9 Step 1

intAnd_temp = lngWork_temp

And &H1

If intAnd_temp = &H1 Then

ch k addrset( intCnt2) . F oreColor

= &HDD0303

Else

ch k addrset( intCnt2) . F oreColor

= &HFFFFFF

End If

lngWork_temp =

lngWork_temp \ 2 ^ 1

Next intCnt2

If mlngWork_tempess

=&H0Then

MsgBox "운 국 선택을 해주

십시요!", vbExclamation +

vbOKOnly

Exit Sub

Else

Call fcommconfig

txtbaudrate(1).Text

=gstrBaudrate

txtparity(1).Text = gstrParity

txtdatabit(1).Text =gstrDatabit

txtstopbit(1).Text =gstrStopbit

txtport(1).Text = gstrPort

mcomsetting = gstrBaudrate &

"," & gstrParity

&","&gstrDatabit & "," &

gstrStopbit

mcomport = gstrPort

If opttest.Value = True Then

test.testcomm.Settings=

mcomsetting

test.testcomm.CommPort=

mcomport

test.lblCommset.Caption =

"설정:"&test.testcomm.Settings

&포트:"&test.testcomm.

CommPort

End If

End If

If mblnOn = 0 Then

- 67 -

If optauto.Value = True Then

mblnTest = False

mblnAuto = True

txtmode.Text = "자 동"

End If

If opttest.Value = True Then

mblnAuto = False

mblnTest = True

txtmode.Text = "테스트"

End If

End If

If mblnAuto = True Then

mode$ = "자동"

ElseIf mblnTest = True Then

mode$ = "테스트"

End If

mainfrm.sbrcomm.P anels(2).Te

xt = " 통신 설정 : " +

mcomsetting + " 포트 : " +

mcomport

mainfrm.sbrcomm.P anels(3).Te

xt = mode$ + " 모드"

c:\Microsoft Visual\Studio\

vb98\source\논문\config.txt

mintFile = FreeFile

mcomset.mBaudrate

= gstrBaudrate

mcomset.mParity = gstrParity

mcomset.mDatabit =gstrDatabit

mcomset.mStopbit =gstrStopbit

mcomset.mPort = gstrPort

mcomset.maddr=

mlngWork_tempess

Open"c:\programfiles\Microsoft

Visual Studio\vb98\source\논문

\config.txt" ForRandom As

mintFile Len = Len(mcomset)

Put #mintFile, , mcomset

Close mintFile

End If

End Sub

Private Sub fcommconfig()

Select Case cboport.ListIndex

Case 0: gstrPort = "1"

Case 1: gstrPort = "2"

Case 2: gstrPort = "3"

Case 3: gstrPort = "4"

End Select

Select Case

cboBaudrate.ListIndex

Case 0: gstrBaudrate="115200"

Case 1: gstrBaudrate ="57600"

Case 2: gstrBaudrate ="38400"

Case 3: gstrBaudrate ="19200"

Case 4: gstrBaudrate = "9600"

Case 5: gstrBaudrate = "4800"

End Select

Select Case

cboDatabit.ListIndex

Case 0: gstrDatabit = "9"

Case 1: gstrDatabit = "8"

Case 2: gstrDatabit = "7"

Case 3: gstrDatabit = "6"

End Select

- 68 -

Select Case

cboParity.ListIndex

Case 0: gstrParity = "n"

Case 1: gstrParity = "o"

Case 2: gstrParity = "e"

End Select

Select Case

cboStopbit.ListIndex

Case 0: gstrStopbit = "1"

Case 1: gstrStopbit = "1.5"

Case 2: gstrStopbit = "2"

End Select

End Sub

Private Sub opttest_Click()

If mblnOn = True Then

MsgBox "자동 운 입니다."

& vbCrLf & "자동운 을 지

하십시 요.", vbInformation +

vbOKOnly

End If

End Sub

A2.2 메인 임 로그램

Private Sub MDIForm_Load()

Height = 12000

Width = 16000

mblnAuto = True

mblnserver = True

mainfrm.Caption = "S-View 서

버"

mnuclient.Enabled = False

sbrcomm.Panels(4).Visible =

False

Open "c:\program

files\Microsoft Visual

Studio\vb98\source\논문

\config.txt" For Random As

#1 Len = Len(mcomset)

Get #1, , mcomset

Close #1

mcomsetting=mcomset.mBaudr

ate & "," & mcomset.mParity

& "," & mcomset.mDatabit &

"," & mcomset.mStopbit

mcomport = mcomset.mPort

mlngW ork _ tempess= mcomset.

maddr

sbrcomm.Panels(2).Text = "통

신설정 : " + mcomsetting + "

포트 : + mcomport

sbrcomm.Panels(3).Text =

"자동 모드"

If mblnclient = True Then

sbrcomm.Panels(2).Text=client.

sokclient.RemoteHost & "/" &

client.sokclient.RemotePort

sbrcomm.Panels(3).Text =

"클라이언트"

End If

sbrcomm.Panels(4).Visible

= False

End Sub

Private Sub

- 69 -

mnualmopen_Click()

almfile.Show

End Sub

Private Sub mnuclient_Click()

client.Show

End Sub

Private Sub

mnuautomode_Click()

auto.Show

test.Hide

End Sub

Private Sub mnuend_Click()

End

End Sub

Private

Submnurxhexopen_Click()

rxhexfile.Show

End Sub

Private Sub

mnutestmode_Click()

test.Show

auto.Hide

End Sub

Private Sub

mnucommset_Click()

commset.Show

End Sub

Private Sub

mnuform_Click(Index As

Integer)

Select Case Index

Case 0:

mainfrm.Arrange (vbCascade)

Case 1: mainfrm.Arrange

(vbTileHorizontal)

Case 2: mainfrm.Arrange

(vbTileVertical)

End Select

End Sub

A2.3 테스트 모드 로그램

Option Explicit

Const conTx_num As Integer

= 17

Const conRx_num As Integer

= 30

Dim gintadlimit(0 To 4) As

Integer

Dim gbytRxlrc_chk As Byte

Dim glngRxcrc_chk As Long

Dim gbytRxbf(0 To

conRx_num) As Byte

Private Sub Form_Load()

Height = 8520

Width = 13245

With testcomm

.Settings = mcomsetting

.CommPort = mcomport

.InBufferSize = conRx_num

.InputLen = "1"

.RThreshold = "0"

.InputMode

= comInputModeBinary

- 70 -

End With

lblCommset.Caption = "설정 :

" & testcomm.Settings & "

포트 : " &

testcomm.CommPort

Optcmd(0).Value = True

End Sub

Private Sub sldad_Scroll(Index

As Integer)

txtad(0).Text

=Str(sldad(0).Value)

txtad(1).Text

=Str(sldad(1).Value)

txtad(2).Text

=Str(sldad(2).Value)

txtad(3).Text

=Str(sldad(3).Value)

txtad(4).Text

=Str(sldad(4).Value)

End Sub

Private Sub

txtad_Change(Index As

Integer)

Dim i%

gintadlimit(0)

= Val(txtad(0).Text)

sldad(0).Value

= Val(txtad(0).Text)

gintadlimit(1)

= Val(txtad(1).Text)

sldad(1).Value

= Val(txtad(1).Text)

gintadlimit(2)

= Val(txtad(2).Text)

sldad(2).Value

= Val(txtad(2).Text)

gintadlimit(3)

= Val(txtad(3).Text)

sldad(3).Value

= Val(txtad(3).Text)

gintadlimit(4)

= Val(txtad(4).Text)

sldad(4).Value

= Val(txtad(4).Text)

For i = 0 To 4 Step 1

If gintadlimit(i) > 1023 Then

gintadlimit(i) = 1023

txtad(i).Text = 1023

End If

Next i

End Sub

Private Function fOutput_sel()

As Integer Dim intTx_output

As Integer

If tgboutput(0).Value = True

Then intTx_output

= intTx_output +&H1

If tgboutput(1).Value =

TrueThen intTx_output

= intTx_output +&H2

If tgboutput(2).Value = True

Then

intTx_output=intTx_output

+ &H4

- 71 -

If tgboutput(3).Value = True

Then intTx_output

= intTx_output +&H8

If tgboutput(4).Value = True

Then intTx_output

= intTx_output+&H10

If tgboutput(5).Value = True

Then intTx_output

= intTx_output+&H20

If tgboutput(6).Value = True

Then intTx_output

= intTx_output+&H40

If tgboutput(7).Value = True

Then intTx_output

= intTx_output+&H80

fOutput_sel = intTx_output

End Function

Private Function faddr_sel()

As String

Dim strTx_addr As String

Select Case cboAddr.ListIndex

Case 0: strTx_addr = &H31

Case 1: strTx_addr = &H32

Case 2: strTx_addr = &H33

Case 3: strTx_addr = &H34

Case 4: strTx_addr = &H35

Case 5: strTx_addr = &H36

Case 6: strTx_addr = &H37

Case 7: strTx_addr = &H38

Case 8: strTx_addr = &H39

Case 9: strTx_addr = &H40

End Select

faddr_sel = strTx_addr

End Function

Private Function fTxcmd_sel()

As String

Dim strTx_cmd As String

If Optcmd(0).Value = True

Then

strTx_cmd = &H1

If Optcmd(1).Value = True

Then

strTx_cmd = &H2

If Optcmd(2).Value = True

Then

Select Case

cbowrite_sel.ListIndex

Case 0: strTx_cmd = &H20

Case 1: strTx_cmd = &H21

Case 2: strTx_cmd = &H22

Case 3: strTx_cmd = &H23

Case 4: strTx_cmd = &H24

Case 5: strTx_cmd = &H25

End Select

End If

If Optcmd(3).Value = True

Then strTx_cmd = &H3

If Optcmd(4).Value = True

Then strTx_cmd = &H30

fTxcmd_sel = strTx_cmd

End Function

Private Sub

cmdTesttrans_Click()

Dim intOut_value%

- 72 -

Dim strTxaddr$

Dim strTxcmd$

Dim i%

On Error Resume Next

shpchkbcc(0).FillColor

= &HC0FFFF

shpchkbcc(1).FillColor=& HC0F

FFF

strTxaddr = faddr_sel

strTxcmd = fTxcmd_sel

intOut_value = fOutput_sel

If mblnAuto = True Then

MsgBox "자동 모드가 선택되

었습니다." + vbCrLf + "테스트

모드로 변경해 주십시요",

vbExclamation + vbOKOnly

Exit Sub

ElseIf mblnTest = True Then

If strTxaddr = "" Then

MsgBox " 송국을 정하지 않

았습니다.", vbExclamation

+vbOKOnly

Exit Sub

End If

If mlngWork_tempess = &H0

Then MsgBox "운 국 미설정

상태입다.",vbExclamation

+ vbOKOnly

Exit Sub

End If

If Optcmd(2).Value = True

Then

If strTxcmd = "" Then

MsgBox "쓰기모드를 선택하지

않았습다.",vbExclamation

+ vbOKOnly

Exit Sub

End If

End If

testcomm.PortOpen = True

test.Caption = "테스트 모드

(포트 열림)"

lbltx(0).Caption = "0"

Call ftrans_data(strTxaddr,

strTxcmd,gintadlimit(0),gintadli

mit(1),gintadlimit(2),gintadlimit(

3),gintadlimit(4),intOut_value,co

nTx_num)

intOut_value = 0

fdelay_us (900)

lbltx(0).Caption = " "

If testcomm.InBufferCount > 0

Then lblRx(0).Caption = "0"

For i = 0 To conRx_num

Step 1

gbytRxbf(i)=AscB(testcomm.In

put)

Next i

testcomm.PortOpen = False

test.Caption = "테스트 모드"

gbytRxlrc_chk=fGenerate_lrc(co

nRx_num,5, gbytRxbf)

glngRxcrc_chk=fGenerate_crc(c

onRx_num,5,gbytRxbf)

- 73 -

ElseIf testcomm.InBufferCount

= 0 Then

testcomm.PortOpen = False

test.Caption = "테스트 모드"

If ((strTxcmd = &H1) Or

(strTxcmd = &H3)) Then

MsgBox "응답이 없습니다.",

vbCritical + vbOKOnly

End If

If ((strTxcmd <> &H1) And

(strTxcmd <> &H3)) Then

MsgBox "응답이 없습니다." &

vbCrLf & " 송요구가 없는 명

령입니다." & vbCrLf & " 송

명령으로 송신값을 확인하십시

요.", vbCritical + vbOKOnly

End If

Exit Sub

End If

End If

Call fDisptestcomm.

InBufferCount=0

fdelay_us (200)

lblRx(0).Caption = " "

End Sub

Private Sub fDisp()

Dim intRx_ch(4) As Integer

Dim intRx_set(4) As Integer

Dim intRx_output As Integer

Dim intRx_inputc As Integer,

intRx_inpute As Intege

Dim intTemp_c%, intTemp_e%

Dim i%, j%, k%

Dim strRx_hex(0 To

conRx_num) As String

For k = 0 To conRx_num

Step 1

strRx_hex(k)=Hex(gbytRxbf(k)

)

Next k

lblrxdata.Caption =

strRx_hex(0)&""&strRx_hex(1)

&""&strRx_hex(2) & " " &

strRx_hex(3) & " "

&strRx_hex(4)&""&strRx_hex(

5)&""&strRx_hex(6)&""&strRx

_hex(7)&""&strRx_hex(8)&""&

strRx_hex(9) & " " &

strRx_hex(10)& " " &

strRx_hex(11)

&""&strRx_hex(12) & " "

&strRx_hex(13) & " " &

strRx_hex(14)

&""&strRx_hex(15) & " " &

strRx_hex(16)&vbCrLf&

strRx_hex(17)

&""&strRx_hex(18) & " " &

strRx_hex(19) & " " &

strRx_hex(20)

&""&strRx_hex(21) & " " &

strRx_hex(22) & " " &"

"&strRx_hex(23)&""&strRx_he

x(24) & " " & strRx_hex(25)

& " " & strRx_hex(26)

- 74 -

&""strRx_hex(27) & " " &

strRx_hex(28) & " " &

strRx_hex(29)

&""&strRx_hex(30)

intRx_ch(0) = (gbytRxbf(3) *

&H100&) + gbytRxbf(4)

intRx_ch(1) = (gbytRxbf(5) *

&H100&) + gbytRxbf(6)

intRx_ch(2) = (gbytRxbf(7) *

&H100&) + gbytRxbf(8)

intRx_ch(3) = (gbytRxbf(9) *

&H100&) + gbytRxbf(10)

intRx_ch(4) = (gbytRxbf(11) *

&H100&) + gbytRxbf(12)

intRx_inputc = gbytRxbf(13)

intRx_inpute = gbytRxbf(14)

intRx_output = gbytRxbf(15)

intRx_set(0) = (gbytRxbf(16) *

&H100&) + gbytRxbf(17)

intRx_set(1) = (gbytRxbf(18) *

&H100&) + gbytRxbf(19)

intRx_set(2) = (gbytRxbf(20) *

&H100&) + gbytRxbf(21)

intRx_set(3) = (gbytRxbf(22) *

&H100&) + gbytRxbf(23)

intRx_set(4) = (gbytRxbf(24) *

&H100&) + gbytRxbf(25)

lblch_state(0).Caption = "CH1:

" & intRx_ch(0)

pgbrx_ad(0).Value=intRx_ch(0)

lblch_state(1).Caption = "CH2:

" & intRx_ch(1)

pgbrx_ad(1).Value=intRx_ch(1)

lblch_state(2).Caption = "CH3:

" & intRx_ch(2)

pgbrx_ad(2).Value=intRx_ch(2)

lblch_state(3).Caption = "CH4:

" & intRx_ch(3)

pgbrx_ad(3).Value=intRx_ch(3)

lblch_state(4).Caption = "CH5:

" & intRx_ch(4)

pgbrx_ad(4).Value=intRx_ch(4)

lbloutstate.Caption=

Hex(intRx_output)

For i = 0 To 4 Step 1

intTemp_c = intRx_inputc And

&H1

If intTemp_c = &H1 Then

shpinput_c(i).FillColor = &HFF

Else: shpinput_c(i).FillColor =

&HFFFFFF

End If

intRx_inputc =intRx_inputc \ 2

Next I

For j = 0 To 2 Step 1

intTemp_e

=intRx_inputeAnd&H1

If intTemp_e = &H1 Then

shpinput_e(j).FillColor = &HFF

Else: shpinput_e(j).FillColor =

&HFFFFFF

End If

intRx_inpute =intRx_inpute \ 2

Next j

- 75 -

txtchk(0).Text =

Str(gbytRxbf(26)

txtchk(1).Text=Str(gbytRxlrc_c

hk)

txtchk(2).Text

=Str((gbytRxbf(27) * &H100&)

+ gbytRxbf(28))

txtchk(3).Text=Str(

glngRxcrc_chk)

txtchk(4).Text=Str(

intRx_set(0))

txtchk(5).Text=Str(

intRx_set(1))

txtchk(6).Text=Str(

intRx_set(2))

txtchk(7).Text=Str(

intRx_set(3))

txtchk(8).Text=Str(

intRx_set(4))

If gbytRxbf(26)

= gbytRxlrc_chkThen

shpchkbcc(0).FillColor

= &HFF0000

Else:

shpchkbcc(0).FillColor = &HFF

End If

If ((gbytRxbf(27) * &H100&)

+gbytRxbf(28))=glngRxcrc_chk

Then

shpchkbcc(1).FillColor

= &HFF0000

Else:

shpchkbcc(1).FillColor=&HFF

End If

pgbrx_ad(0).ToolTipText = "채

1 아날로그 수신값 : "

&intRx_ch(0)

pgbrx_ad(1).ToolTipText = "채

2 아날로그 수신값 : "

&intRx_ch(1)

pgbrx_ad(2).ToolTipText = "채

3 아날로그 수신값 : "

&intRx_ch(2)

pgbrx_ad(3).ToolTipText = "채

4 아날로그 수신값 : "

&intRx_ch(3)

pgbrx_ad(4).ToolTipText = "채

5 아날로그 수신값 : "

&intRx_ch(4)

lbloutstate.ToolTipText =

"MCU 출력상태의 수신값입니

다"

lblrxdata.ToolTipText = "수신

된 데이타의 HEX값입니다"

lblCommset.ToolTipText = "

재 통신 설정값입니다"

End Sub

Private Sub ftrans_data(

ByVal addr,ByVal cmd,ByVal

ch1limit, ByVal ,ch2limit,

ByVal ch3limit, ByVal

ch4limit,ByVal ch5limit, ByVal

out_val, ByVal tx_num)

Dim bytTxbf() As Byte

- 76 -

ReDim bytTxbf(tx_num)

bytTxbf(0) = &H2

bytTxbf(1) = addr

bytTxbf(2) = cmd

bytTxbf(3) = ch1limit \

&H100&

bytTxbf(4) =

ch1limit Mod &H100&

bytTxbf(5) = ch2limit \

&H100&

bytTxbf(6) =

ch2limit Mod &H100&

bytTxbf(7) = ch3limit \

&H100&

bytTxbf(8) =

ch3limit Mod &H100&

bytTxbf(9) = ch4limit \

&H100&

bytTxbf(10)

=ch4limit Mod &H100&

bytTxbf(11) = ch5limit \

&H100&

bytTxbf(12)

=ch5limit Mod &H100&

bytTxbf(13) = out_val

bytTxbf(14)=fGenerate_lrc(tx_n

um, 4,bytTxbf)

bytTxbf(15)=(fGenerate_crc(tx_

num, 4, bytTxbf) \ &H100&)

And &HFF&

bytTxbf(16)=fGenerate_crc(tx_

num,4, bytTxbf) And &HFF&

bytTxbf(17) = &H4

testcomm.Output = bytTxbf

End Sub

A2.4 자동 모드 로그램

Option Explicit

Const conTx_num

AsInteger=17

Const conRx_num

AsInteger=30

Dim gbytRxlrc_chk As Byte

Dim glngRxcrc_chk As Long

Dimgintworkaddr(0To9)

As Integer

Dim rcvdata As Variant

Dim gintConnectID As

Integer

Dim gblnlimit As Boolean

Dim gblninout As Boolean

Private Sub Form_Load()

Dim lngWork_temp As Long

Dim intAnd_temp As Integer

Dim i%

Height = 9120

Width = 8775

mblnOn = False

shpdata.FillColor=&HD7DCEB

shpon.FillColor = &HD7DCEB

shptcp.FillColor =&HD7DCEB

On Error Resume Next

With autocomm

- 77 -

.Settings = mcomsetting

.CommPort = mcomport

.InBufferSize=conRx_num+ 5

.InputLen = "1"

.RThreshold = "0"

.InputMode=comInputModeBin

ary

End With

lngWork_temp =

mlngWork_tempess

For i = 0 To 9 Step 1

intAnd_temp = lngWork_temp

And &H1

If intAnd_temp = &H1 Then

lblcom(i).ForeColor

= &HDD0303

gintworkaddr(i) = True

Else

lblcom(i).ForeColor

= &HE0E0E0

gintworkaddr(i) = False

End If

lngWork_temp =

lngWork_temp\ 2

Next i

If mblnOn = True Then

shpon.FillColor = &HFF0000

gintConnectID = 0

sokserver(gintConnectID)

.LocalPort =6000

sokserver(gintConnectID)

.Listen

stbstate.Panels(3).Visible

= False

stbstate.Panels(4).Visible

= False

Call fsock_state(sokserver

(gintConnectID).State)

stbstate.Panels(2).Text =

sokserver(gintConnectID).Loc

alIP & "/" & sokserver

(gintConnectID).LocalPort

End Sub

Private Sub tbrauto_Button

Click(ByVal Button As

MSComctlLib.Button)

Select Case Button.Key

Case "inout"

gblninout = True

inout.Show

Case "limit"

gblnlimit = True

rxset.Show

Case "almclear"

lstalm.Clear

Case "ad"

If mblnOn = True Then

rtgraph.Show

End If

End Select

End Sub

Private Sub

tgbdatawrite_Click()

If tgbdatawrite.Value = True

- 78 -

And mblnOn = True Then

mblnData = True

shpdata.FillColor =&H22FFFF

mainfrm.sbrcomm.Panels(4).Vi

sible = True

mainfrm.sbrcomm.Panels(4).

Text =

ElseIf tgbdatawrite.Value

= False Then

mblnData = False

shpdata.FillColor=&HD7DCEB

mainfrm.sbrcomm.Panels(4).Vi

sible = False

End If

End Sub

Private Sub cmdon_Click()

On Error Resume Next

If mblnTest = True Then

MsgBox "테스트 모드가 선택

되었습니다." + vbCrLf + "자

동모드로 변경해 주십시요

",vbExclamation + vbOKOnly

Exit Sub

ElseIf mblnAuto = True

Then

mblnOn = True

If mblnOn = True Then

shpon.FillColor = &HFF0000

mainfrm.Caption = "S-View "

+ "서버 " + "자동운전중"

autocomm.PortOpen = True

Call fcomm_normal

End If

End If

End Sub

Private Sub cmdoff_Click()

On Error Resume Next

autocomm.PortOpen = False

mblnOn = False

shpon.FillColor = &HD7DCEB

mainfrm.Caption = "S-View "

+ "서버 "

End Sub

Private Sub fcomm_normal()

ReDim

mbytRx_bf(conRx_num)

Dim strTxaddr$

Dim strTxcmd$

Dim gintadlimit(4) As Integer

Dim intOut_value%

Dim i%, k%

Dim blnUndisp As Boolean

Dim cnt(0 To 9) As Integer

mintFile = FreeFile

On Error Resume Next

strTxcmd = &H3

Do While mblnOn = True

And mblnAuto = True

For i = 0 To 9 Step 1

If gintworkaddr(i) = True

Then

strTxaddr = Str("&H" & (i +

31))

lbltxdisp(i).Caption = "O"

- 79 -

If gblninout = True And

gintworkaddr(i) = True And

mblnforceout =True Then

intOut_value = fforceout(i)

End If

Call ftrans_data(strTxaddr,

strTxcmd,gintadlimit(0),gintad

limit(1), gintadlimit(2),

gintadlimit(3), gintadlimit(4),

intOut_value, conTx_num)

lbltxdisp(i).Caption = " "

Call fdelay_us(710)

If autocomm.InBufferCount >

0 Then

lblrxdisp(i) = "O"

Call frev_data(conRx_num)

blnUndisp = True

gbytRxlrc_chk=fGenerate_lrc(

conRx_num,5,mbytRx_bf)

glngRxcrc_chk=fGenerate_crc

(conRx_num,5,

mbytRx_bf)

If mbytRx_bf(26)<>

gbytRxlrc_chkOr((mbytRx_bf(

27)*&H100&)+mbytRx_bf(28)

)<>glngRxcrc_chk Then

Call falmdisp(i, 0)

End If

lblrxdisp(i) = " "

ElseIf

autocomm.InBufferCount = 0

Then

Call falmdisp(i, 1)

blnUndisp = False

cnt(i) = cnt(i) + 1

If cnt(i) = 5 Then

Call falmdisp(i, 2)

gintworkaddr(i) = 0

End If

End If

Call fdisplay(i)

If tgbdatawrite = True And

gintworkaddr(i) = True And

blnUndisp = True Then

Call fdatawrite

End If

End If

If gblnlimit = True And

gintworkaddr(i) = True Then

Call flimit_disp(i)

If gblninout = True And

gintworkaddr(i) = True Then

Call finput(i, mbytRx_bf(13),

m b y t R x _ b f ( 1 4 ) ,

mbytRx_bf(15))

Next i

DoEvents

Loop

End Sub

Private Sub fdisplay(ByVal

cnt%)

Dim strRx_hex(0

ToconRx_num) As String

Dim i%, j%, k%

- 80 -

For i = 0 To conRx_num

Step1

strRx_hex(i)

= Hex(mbytRx_bf(i))

Next i

lblrxdata.Caption = cnt + 1

&국"& " " & strRx_hex(0) &

" " &strRx_hex(1) &

""&strRx_hex(2)

&""&strRx_hex(3)&""&strRx_

hex(4) & " " & strRx_hex(5)

&""&strRx_hex(6)&""&strRx_

hex(7)&""&strRx_hex(8)&""&

strRx_hex(9) & " "

&strRx_hex(10) & " " &

strRx_hex(11)&""&strRx_hex(

12) & " " &strRx_hex(13) &

" " & strRx_hex(14)&

""&strRx_hex(15) & " "

&strRx_hex(16) & vbCrLf &

" " &strRx_hex(17) & " " &

strRx_hex(18) & " "

&strRx_hex(19)&""&strRx_he

x(20) & " " &strRx_hex(21)

& " " &strRx_hex(22)&""

&strRx_hex(23) & " "

&strRx_hex(24) & " "

&strRx_hex(25)&""&strRx_he

x(26) & " " &strRx_hex(27)

& " " &strRx_hex(28)&

""&strRx_hex(29) & " "

&strRx_hex(30)

If sokserver(gintConnectID).

State<> sckConnected Then

shptcp.FillColor =&HD7DCEB

Exit Sub

End If

For j = 0 To gintConnectID

Step 1

If sokserver(gintConnectID).

State <> sckClosed Then

shptcp.FillColor = &HFF22FF

sokserver(gintConnectID).Sen

dData lblrxdata

DoEvents

End If

Next j

End Sub

Private Sub fdatawrite()

Open"c:\programfiles\

Microsoft VisualStudio\vb98

\sour\논 문\rxlist.hwp"

For Append As mintFile 'Len

= Len(lblrxdata)

Print #mintFile, Date & Time

&vbCrLf & lblrxdata.Caption

& vbCrLf

Close mintFile

End Sub

Private Sub flimit_disp(ByVal

cnt)

rxset.mfglimit.TextMatrix(cnt

+1, 1) =

(mbytRx_bf(16)*&H100&)+

- 81 -

mbytRx_bf(17)

rxset.mfglimit.TextMatrix(cnt

+1, 2) =

(mbytRx_bf(18)*&H100&)+

mbytRx_bf(19)

rxset.mfglimit.TextMatrix(cnt

+1, 3) =

(mbytRx_bf(20)*&H100&)+

mbytRx_bf(21)

rxset.mfglimit.TextMatrix(cnt

+1, 4) = (mbytRx_bf(22) *

&H100&) + mbytRx_bf(23)

rxset.mfglimit.TextMatrix(cnt

+1, 5) = (mbytRx_bf(24) *

&H100&) + mbytRx_bf(25)

End Sub

Private Sub falmdisp(ByVal

cnt%, ByVal num)

Dim i%

Select Case num

Case 0

lstalm.AddItem (cnt + 1) & "

국BCC 이상" & "(" & Date &

"/" & Time & ")"

Case 1

lstalm.AddItem (cnt + 1) & "

국 무응답" & "(" & Date &

"/" & Time & ")"

Case 2

lstalm.AddItem (cnt + 1) & "

국 통신 종료" & "(" & Date

& "/" & Time & ")"

End Select

i = lstalm.NewIndex

Open"c:\programfiles\

MicrosoftVisualStudio\vb98

\source\논문\alarmlist.hwp

"ForAppend As mintFile

'Len=Len(lstalm.List(i))

Print #mintFile, lstalm.List(i)

Close mintFile

End Sub

Private Sub

fsock_state(ByVal

num)

Select Case num

Case 0:

stbstate.Panels(1).Text =

"SOK" & gintConnectID & "

" & "닫혀있음"

Case 1:

stbstate.Panels(1).Text =

"SOK" & gintConnectID & "

" & "열려있음"

Case 2:

stbstate.Panels(1).Text =

"SOK" & gintConnectID & "

" & "수신대기"

Case 3:

stbstate.Panels(1).Text =

"SOK" & gintConnectID & "

" & "연결보류중"

Case 4:

stbstate.Panels(1).Text =

- 82 -

"SOK" & gintConnectID & "

" & "호스트고정중"

Case 5:

stbstate.Panels(1).Text =

"SOK" & gintConnectID & "

" & "호스트고정완료"

Case 6:

stbstate.Panels(1).Text =

"SOK" & gintConnectID & "

" & "연결중"

Case 7:

stbstate.Panels(1).Text =

"SOK" & gintConnectID & "

" & "연결완료"

Case 8:

stbstate.Panels(1).Text =

"SOK" & gintConnectID & "

" & "피어가연결을닫고있음"

Case 9:

stbstate.Panels(1).Text =

"SOK" & gintConnectID & "

" & "오류"

End Select

End Sub

PrivateSubsokserver_Connecti

onRequest(Index As

Integer,ByVal requestIDAs

Long)

gintConnectID

= gintConnectID+1 Load

sokserver(gintConnectID)

sokserver(gintConnectID).Acc

ept requestID

If sokserver(gintConnectID).

State = sckConnected Then

Callfsock_state(sokserver(

gintConnectID).State)

stbstate.Panels(3).Visible

=True

stbstate.Panels(3).Text

= "연결요청ID:" & requestID

End If

End Sub

Private Sub sokserver_Close(

Index As Integer)

sokserver(Index).Close

stbstate.Panels(3).Visible

= True

stbstate.Panels(3).Text = "연

결요청ID:"&requestID

&CStr(Index) + "번접속 해제"

End Sub

Private Sub

ftrans_data(ByVal addr,

ByVal cmd, ByVal ch1limit,

ByVal ch2limit, ByVal

ch3limit, ByVal ch4limit,

ByVal ch5limit, ByVal

out_val, ByVal tx_num)

Dim bytTxbf() As Byte

ReDim bytTxbf(tx_num)

bytTxbf(0) = &H2

bytTxbf(1) = addr

bytTxbf(2) = cmd

- 83 -

bytTxbf(3)=ch1limit\&H100

&bytTxbf(4)=ch1limit

Mod &H100&

bytTxbf(5) = ch2limit\

&H100&

bytTxbf(6)=ch2limitMod

&H100&

bytTxbf(7) =

ch3limit\&H100&

bytTxbf(8)=ch3limitMod

&H100&

bytTxbf(9) =

ch4limit\&H100&

bytTxbf(10) = ch4limit Mod

&H100&

bytTxbf(11)

= ch5limit\&H100&

bytTxbf(12)=ch5limitMod&H1

00&bytTxbf(13) = out_val

bytTxbf(14)=fGenerate_lrc(tx

_num, 4, bytTxbf)

bytTxbf(15)=(fGenerate_crc(t

x_num, 4, bytTxbf) \

&H100&) And &HFF&

bytTxbf(16)=fGenerate_crc(tx

_num, 4,bytTxbf) And

&HFF&

bytTxbf(17) = &H4

autocomm.Output = bytTxbf

End Sub

Private Sub frev_data(ByVal

rx_num)

ReDim mbytRx_bf(rx_num)

Dim i%

For i = 0 To rx_num Step 1

mbytRx_bf(i)

= AscB(autocomm.Input)

End Sub

Private Sub finput(ByVal cnt,

ByVal inputc, ByVal inpute,

ByVal data)

Dim i%, j%

Dim temp_c%, temp_e%

Select Case cnt

Case 0:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno1c(i).FillColor

= &HFF

Else:

inout.shpno1c(i).FillColor =

&HFFFFFF

End If

inputc = inputc \ 2 Next i

For j = 0 To 2 Step 1

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno1e(j).FillColor

= &HFF

Else:

inout.shpno1e(j).FillColor

= &HFFFFFF

End If

- 84 -

inpute = inpute \ 2

Next j

inout.lblout1.Caption

= Hex(data)

Case 1:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno2c(i) .Fil lColor

=&HFF

Else:

inout.shpno2c(i).FillColor

= &HFFFFFF

End If

inputc = inputc \ 2

Next i

For j = 0 To 2 Step 1

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno2e(j).FillColor

= &HFF

Else:

inout.shpno2e(j).FillColor

= &HFFFFFF

End If

inpute = inpute \ 2

Next j

inout.lblout2.Caption =

Hex(data)

Case 2:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno3c(i).FillColor

= &HFF

Else:

inout.shpno3c(i).FillColor

= &HFFFFFF

End If

inputc = inputc \ 2

Next i

For j = 0 To 2 Step 1

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno3e(j).FillColor

= &HFF

Else:

inout.shpno3e(j).FillColor

= &HFFFFFF

End If

inpute = inpute \ 2

Next j

inout.lblout3.Caption

= Hex(data)

Case 3:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno4c(i).FillColor

= &HFF

Else:

inout.shpno4c(i).FillColor

= &HFFFFFF

End If

- 85 -

inputc = inputc \ 2

Next i

For j = 0 To 2 Step 1

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno4e(j).FillColor

= &HFF

Else:

inout.shpno4e(j).FillColor

= &HFFFFFF

End If

inpute = inpute \ 2

Next j

inout.lblout4.Caption

=Hex(data)

Case 4:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno5c(i).FillColor

= &HFF

Else:

inout.shpno5c(i).FillColor

= &HFFFFFF

End If

inputc = inputc \ 2

Next i

For j = 0 To 2 Step 1

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno5e(j).FillColor

= &HFF

Else:

inout.shpno5e(j).FillColor

= &HFFFFFF

End If

inpute = inpute \ 2

Next j

inout.lblout5.Caption

= Hex(data)

Case 5:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno6c(i).FillColor

= &HFF

Else:

inout.shpno6c(i).FillColor

= &HFFFFFF

End If

inputc = inputc \ 2

Next i

For j = 0 To 2 Step 1

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno6e(j).FillColor

= &HFF

Else:

inout.shpno6e(j).FillColor

= &HFFFFFF

End If

inpute = inpute \ 2

Next j

inout.lblout6.Caption

- 86 -

= Hex(data)

Case 6:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno7c(i).FillColor

= &HFF

Else:

inout.shpno7c(i).FillColor

= &HFFFFFF

End If

inputc = inputc \ 2

Next i

For j = 0 To 2 Step 1

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno7e(j).FillColor

= &HFF

Else:

inout.shpno7e(j).FillColor

= &HFFFFFF

End If

inpute = inpute \ 2

Next j

inout.lblout7.Caption

= Hex(data)

Case 7:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno8c(i).FillColor

= &HFF

Else:

inout.shpno8c(i).FillColor

= &HFFFFFF

End If

inputc = inputc \ 2

Next i

For j = 0 To 2 Step 1

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno8e(j).FillColor

= &HFF

Else:

inout.shpno8e(j).FillColor

= &HFFFFFF

End If

inpute = inpute \ 2

Next j

inout.lblout8.Caption

= Hex(data)

Case 8:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno9c(i).FillColor

= &HFF

Else:

inout.shpno9c(i).FillColor

= &HFFFFFF

End If

inputc = inputc \ 2

Next i

For j = 0 To 2 Step 1

- 87 -

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno9e(j).FillColor

= &HFF

Else:

inout.shpno9e(j).FillColor

= &HFFFFFF

End If

inpute = inpute \ 2

Next j

inout.lblout9.Caption

=Hex(data)

Case 9:

For i = 0 To 5 Step 1

temp_c = inputc And &H1

If temp_c = &H1 Then

inout.shpno10c(i).FillColor

= &HFF

Else:

inout.shpno10c(i).FillColor

= &HFFFFFF

End If

inputc = inputc \ 2

Next i

For j = 0 To 2 Step 1

temp_e = inpute And &H1

If temp_e = &H1 Then

inout.shpno10e(j).FillColor

= &HFF

Else:

inout.shpno10e(j).FillColor

= &HFFFFFF

End If

inpute = inpute \ 2

Next j

inout.lblout10.Caption

= Hex(data)

End Select

End Sub

Private Function

fforceout(ByVal cnt)

Dim intTx_output As Integer

Select Case cnt

Case 0:

If inout.tgbout1(0).Value

= True

Then

intTx_output=intTx_output

+ &H1

If inout.tgbout1(1).Value

= True

Then

intTx_output=intTx_output

+ &H2

If inout.tgbout1(2).Value

= True

Then

intTx_output=intTx_output

+ &H4

If inout.tgbout1(3).Value

= True

Then

intTx_output=intTx_output

+ &H8

- 88 -

If inout.tgbout1(4).Value =

True

Then

intTx_output=intTx_output

+ &H10

If inout.tgbout1(5).Value

= True

Then

intTx_output=intTx_output

+ &H20

If inout.tgbout1(6).Value

= True

Then

intTx_output=intTx_output

+ &H40

If inout.tgbout1(7).Value =

True

Then

intTx_output=intTx_output

+ &H80

Case 1:

If inout.tgbout2(0).Value =

True

Then

intTx_output=intTx_output

+ &H1

If inout.tgbout2(1).Value =

True

Then

intTx_output=intTx_output

+ &H2

If inout.tgbout2(2).Value =

True

Then

intTx_output=intTx_output

+ &H4

If inout.tgbout2(3).Value

= True

Then

intTx_output=intTx_output

+ &H8

If inout.tgbout2(4).Value

= True

Then

intTx_output=intTx_output +

&H10

If inout.tgbout2(5).Value

= True

Then

intTx_output=intTx_output +

&H20

If inout.tgbout2(6).Value

= True

Then

intTx_output=intTx_output +

&H40

If inout.tgbout2(7).Value

= True

Then

intTx_output=intTx_output +

&H80

Case 2:

If inout.tgbout3(0).Value

= True

- 89 -

Then

intTx_output=intTx_output

+ &H1

If inout.tgbout3(1).Value =

True

Then

intTx_output=intTx_output

+ &H2

If inout.tgbout3(2).Value =

True

Then intTx_output =

intTx_output + &H4

If inout.tgbout3(3).Value

=True

Then intTx_output =

intTx_output + &H8

If inout.tgbout3(4).Value =

True

Then intTx_output =

intTx_output + &H10

If inout.tgbout3(5).Value =

True

Then intTx_output =

intTx_output + &H20

If inout.tgbout3(6).Value =

True

Then intTx_output =

intTx_output + &H40

If inout.tgbout3(7).Value =

True

Then intTx_output =

intTx_output + &H80

Case 3:

If inout.tgbout4(0).Value =

True

Then intTx_output =

intTx_output + &H1

If inout.tgbout4(1).Value =

True

Then intTx_output =

intTx_output + &H2

If inout.tgbout4(2).Value =

True

Then intTx_output =

intTx_output + &H4

If inout.tgbout4(3).Value =

True

Then intTx_output =

intTx_output + &H8

If inout.tgbout4(4).Value =

True

Then intTx_output =

intTx_output + &H10

If inout.tgbout4(5).Value =

True

Then intTx_output =

intTx_output + &H20

If inout.tgbout4(6).Value =

True

Then intTx_output =

intTx_output + &H40

If inout.tgbout4(7).Value =

True

Then intTx_output =

- 90 -

intTx_output + &H80

Case 4:

If inout.tgbout5(0).Value =

True

Then intTx_output =

intTx_output + &H1

If inout.tgbout5(1).Value =

True

Then intTx_output =

intTx_output + &H2

If inout.tgbout5(2).Value =

True

Then intTx_output =

intTx_output + &H4

If inout.tgbout5(3).Value =

True

Then intTx_output =

intTx_output + &H8

If inout.tgbout5(4).Value =

True

Then intTx_output =

intTx_output + &H10

If inout.tgbout5(5).Value =

True

Then intTx_output =

intTx_output + &H20

If inout.tgbout5(6).Value =

True

Then intTx_output =

intTx_output + &H40

If inout.tgbout5(7).Value =

True

Then intTx_output =

intTx_output + &H80

Case 5:

If inout.tgbout6(0).Value =

True

Then intTx_output =

intTx_output + &H1

If inout.tgbout6(1).Value =

True

Then intTx_output =

intTx_output + &H2

If inout.tgbout6(2).Value =

True

Then intTx_output =

intTx_output + &H4

If inout.tgbout6(3).Value =

True

Then intTx_output =

intTx_output + &H8

If inout.tgbout6(4).Value =

True

Then intTx_output =

intTx_output + &H10

If inout.tgbout6(5).Value =

True

Then intTx_output =

intTx_output + &H20

If inout.tgbout6(6).Value =

True

Then intTx_output =

intTx_output + &H40

If inout.tgbout6(7).Value =

- 91 -

True

Then intTx_output =

intTx_output + &H80

Case 6:

If inout.tgbout7(0).Value =

True

Then intTx_output =

intTx_output + &H1

If inout.tgbout7(1).Value =

True

Then intTx_output =

intTx_output + &H2

If inout.tgbout7(2).Value =

True

Then intTx_output =

intTx_output + &H4

If inout.tgbout7(3).Value =

True

Then intTx_output =

intTx_output + &H8

If inout.tgbout7(4).Value =

True

Then intTx_output =

intTx_output + &H10

If inout.tgbout7(5).Value =

True

Then intTx_output =

intTx_output + &H20

If inout.tgbout7(6).Value =

True

Then intTx_output =

intTx_output + &H40

If inout.tgbout7(7).Value =

True

Then intTx_output =

intTx_output + &H80

Case 7:

If inout.tgbout8(0).Value =

True

Then intTx_output =

intTx_output + &H1

If inout.tgbout8(1).Value =

True

Then intTx_output =

intTx_output + &H2

If inout.tgbout8(2).Value =

True

Then intTx_output =

intTx_output + &H4

If inout.tgbout8(3).Value =

True

Then intTx_output =

intTx_output + &H8

If inout.tgbout8(4).Value =

True

Then intTx_output =

intTx_output + &H10

If inout.tgbout8(5).Value =

True

Then intTx_output =

intTx_output + &H20

If inout.tgbout8(6).Value =

True

Then intTx_output =

- 92 -

intTx_output + &H40

If inout.tgbout8(7).Value =

True

Then intTx_output =

intTx_output + &H80

Case 8:

If inout.tgbout9(0).Value =

True

Then intTx_output =

intTx_output + &H1

If inout.tgbout9(1).Value =

True

Then intTx_output =

intTx_output + &H2

If inout.tgbout9(2).Value =

True

Then intTx_output =

intTx_output + &H4

If inout.tgbout9(3).Value

= True

Then intTx_output =

intTx_output + &H8

If inout.tgbout9(4).Value =

True

Then intTx_output =

intTx_output + &H10

If inout.tgbout9(5).Value =

True

Then intTx_output =

intTx_output + &H20

If inout.tgbout9(6).Value =

True

Then intTx_output =

intTx_output + &H40

If inout.tgbout9(7).Value =

True

Then intTx_output =

intTx_output + &H80

Case 9:

If inout.tgbout10(0).Value

= True

Then intTx_output =

intTx_output + &H1

If inout.tgbout10(1).Value

= True

Then intTx_output =

intTx_output + &H2

If inout.tgbout10(2).Value

= True

Then intTx_output =

intTx_output + &H4

If inout.tgbout10(3).Value

= True

Then intTx_output =

intTx_output + &H8

If inout.tgbout10(4).Value

= True

Then intTx_output =

intTx_output + &H10

If inout.tgbout10(5).Value

= True

Then intTx_output =

intTx_output + &H20

If inout.tgbout10(6).Value

- 93 -

= True

Then intTx_output =

intTx_output + &H40

If inout.tgbout10(7).Value

= True

Then intTx_output =

intTx_output + &H80

End Select

fforceout = intTx_output

End Function

A2.5 입출력 로그램

Option Explicit

Private Sub cmdcancel_Click()

mblnforceout = False

shpforceout.FillColor =

&HE0E0E0

End Sub

Private Sub cmdout_Click()

mblnforceout = True

shpforceout.FillColor = &HFF

End Sub

Private Sub Form_Load()

Height = 9615

Width = 10650

End Sub

A2.6 알람 표시 로그램

Option Explicit

Private Sub Form_Load()

mintFile = FreeFile

Dim strLine$, strFile$

Height = 7900

Width = 6030

Open "c:\program

files\\Microsoft Visual

Studio\vb98\source\논문

\alarmlist.hwp" For Input As

mintFile

Do Until EOF(mintFile)

Line Input #mintFile, strLine

strFile = strFile & strLine &

vbCrLf

Loop

Close mintFile

txtalm.Text = strFile

End Sub

A2.7 수신 일 표시 로그램

Option Explicit

Private Sub Form_Load()

mintFile = FreeFile

Dim strLine$, strFile$

Height = 8800

Width = 6200

Open "c:\program

files\\Microsoft

Visual Studio\vb98\source\논문

\rxlist.hwp" For Input As

mintFile

Do Until EOF(mintFile)

- 94 -

Line Input #mintFile, strLine

strFile = strFile & strLine &

vbCrLf Loop

Close mintFile

txtrxhex.Text = strFile

End Sub

A2.8 알람 설정값표시 로그램

Private Sub Form_Load()

Dim i%, k%

Width = 7000

Height = 7500

mfglimit.ColWidth(0) = 800

mfglimit.RowHeight(0) = 5

For i = 1 To 5

mfglimit.TextMatrix(0, i) = "

채 " & i

Next I

For k = 1 To 10

mfglimit.TextMatrix(k, 0) = k

&"국"

mfglimit.RowHeight(k) = 500

Next k

End Sub

A2.9 클라이언트 로그램

Private Sub Form_Load()

Height = 3495

Width = 7800

sokclient.RemoteHost =

"211.118.255.179"

sokclient.RemotePort = "6000"

stbstate.Panels(2).Text=sokclie

nt.RemoteHost&"/"&sokclient.

RemotePort

stbstate.Panels(3).Visible

= False

Call fsock_state(sokclient.State)

End Sub

Private Sub

sokclient_DataArrival

(ByVal bytesTotal As Long)

Dim rcvdata As Variant

sokclient.GetDatarcvdata,vbStri

ng, bytesTotal

lblrxdata.Caption = "클라이언트

수신:" & Date & Time &

rcvdata & vbCrLf

Open "c:\program

files\Microsoft

Visual Studio\vb98\source\논문

\tcprxlist.hwp" For Append As

mintFile

Print #mintFile,

lblrxdata.Caption

Close mintFile

End Sub

Private Sub

sokclient_Error(ByVal

Number As Integer,

Description

As String, ByVal Scode As

- 95 -

Long,ByVal Source As String,

ByVal HelpFile As String,

ByVal HelpContext As Long,

CancelDisplay As Boolean)

stbstate.Panels(3).Visible =

True

stbstate.Panels(3).Text=

Description

End Sub

Private Sub

t b r p r o p _ B u t t o n C l i c k ( B y V a l

Button As

MSComctlLib.Button)

Select Case Button.Key

Case "ipset"

sokclient.RemoteHost =

InputBox("호스트 주소", "주소

입력",

"211.118.255.179")

stbstate.Panels(2).Text =

sokclient.RemoteHost & "/" &

sokclient.RemotePort

Case "portset"

sokclient.RemotePort =

InputBox("호스트 포트", "포트

입력", "6000")

stbstate.Panels(2).Text =

sokclient.RemoteHost & "/" &

sokclient.RemotePort

Case "connect"

If sokclient.State =

sckConnected Then Exit Sub

sokclient.Connect

sokclient.RemoteHost,

sokclient.RemotePort

If sokclient.State =

sckConnected

Then stbstate.Panels(2).Text =

sokclient.RemoteHost & "/" &

sokclient.RemotePort

Call fsock_state(sokclient.State)

End If

Case "cancel"

sokclient.Close

If sokclient.State = sckClosed

ThenCallfsock_state(sokclient.S

tate)

End Select

End Sub

Private Sub

sokclient_Connect()

Call fsock_state(sokclient.State)

End Sub

Private Function

fsock_state(ByVal num)

Select Case num

Case 0: stbstate.Panels(1).Text

= "닫 있음"

Case 1: stbstate.Panels(1).Text

= "열려있음"

Case 2: stbstate.Panels(1).Text

= "수신 기"

Case 3: stbstate.Panels(1).Text

= "연결보류 "

- 96 -

Case 4: stbstate.Panels(1).Text

= "호스트고정 "

Case 5: stbstate.Panels(1).Text

= "호스트고정완료"

Case 6: stbstate.Panels(1).Text

= "연결 "

Case 7: stbstate.Panels(1).Text

= "연결완료"

Case 8: stbstate.Panels(1).Text

= "피어가연결을닫고있음"

Case 9: stbstate.Panels(1).Text

="오류"

End Select

End Function

A2.10 공통 함수

Sub fDelay(ByVal delay_t)

Dim strStop_t As Single

Dim camp_t As Single

strStop_t = Timer

Do

If Timer < strStop_t Then

strStop_t = strStop_t - 86400

camp_t = Timer - strStop_t

DoEvents

Loop Until delay_t < camp_t

End Sub

Function fGenerate_lrc(ByVal

cnt, ByVal num, ByRef data)

As Integer

Dim i%

Dim intTemp As Integer

intTemp = 0

For i = 0 To cnt - num

Step 1

intTemp = intTemp Xor

data(i)

Next I

fGenerate_lrc = intTemp

End Function

Function fGenerate_crc(ByVal

cnt, ByVal num, ByRef data)

As Long

Dim i&, j%

Dim lngTemp_crc&,

lngTemp&

lngTemp_crc = 0

lngTemp = 0

For i = 0 To cnt - num

Step 1

lngTemp = data(i) * &H100&

lngTemp_crc = lngTemp_crc

Xor lngTemp

For j = 0 To 7

If (lngTemp_crc And

&H8000&) Then

lngTemp_crc =

((lngTemp_crc*2) Xor

&H1021&) And &HFFFF&

Else

lngTemp_crc = (lngTemp_crc

*2) And &HFFFF&

End If

- 97 -

Next j

Next i

fGenerate_crc = lngTemp_crc

And &HFFFF&

End Function

Public Sub

ftrans_data(ByValaddr,

cmd,ch1limit,ch2limit,ch3limit,ch

4limit, ch5limit, out_val,

tx_num)

Dim bytTx_bf() As Byte

ReDim bytTx_bf(tx_num)

bytTx_bf(0) = &H2

bytTx_bf(1) = addr

bytTx_bf(2) = cmd

bytTx_bf(3) = ch1limit \

&H100&

bytTx_bf(4) = ch1limit Mod

&H100&

bytTx_bf(5) = ch2limit \

&H100&

bytTx_bf(6) = ch2limit Mod

&H100&

bytTx_bf(7) = ch3limit \

&H100&

bytTx_bf(8) = ch3limit Mod

&H100&

bytTx_bf(9) = ch4limit \

&H100&

bytTx_bf(10) = ch4limit Mod

&H100&

bytTx_bf(11) = ch5limit

\&H100& bytTx_bf(12)

= ch5limit Mod &H100&

bytTx_bf(14)=fGenerate_lrc(tx_

num, 4, bytTx_bf)

bytTx_bf(15) =

(fGenerate_crc(tx_num,4,bytTx

_bf)

\&H100&)And&HFF&bytTx_bf

( 1 6 ) = f G en e r a te _ cr c ( t x _ n u m ,

4,bytTx_bf) And &HFF&

bytTx_bf(17) = &H4

test.testcomm.Output=bytTx_bf

End Sub

Public Sub frev_data(ByVal

rx_num)

ReDim mbytRx_bf(rx_num)

Dim i%

For i = 0 To rx_num Step 1

mbytRx_bf(i)

=AscB(mainfrm. MSComm1.Inp

ut)

Next i

End Sub

Public Sub fdelay_us(ByVal

dly)

Dim i%, j%

For i = 0 To dly Step 1

For j = 0 To dly Step 1

Next j

Next i

End Sub

- 98 -

A2.11. 공통 변수

Option Explicit

Public mcomsetting$

Public mcomport$

Public mlngWork_tempess As

Long

Public mbytRx_bf() As Byte

Public mintFile As Integer

Public Type mconfig

mBaudrate As String

mParity As String

mDatabit As String

mStopbit As String

mPort As String

maddr As Long

mAd1 As Integer

mAd2 As Integer

mAd3 As Integer

mAd4 As Integer

mAd5 As Integer

End Type

Public mcomset As mconfig

Public mblnOn As Boolean

Public mblnData As Boolean

Public mblnAuto As Boolean

Public mblnTest As Boolean

Public mblnforceout As

Boolean

Public mblnserver As Boolean

Public mblnclient As Boolean

※ 명령어 비주얼 베이직 언

어의 해설에 한 부분은 비주

얼 베이직 기본 서 을 참고하

기 바란다. [3, 6, 12]

- 99 -

A3. 인터넷 통신 데이터 기록

A3.1 클라이언트 수신 데이터

클라이언트 수신: 2005-04-30

오후 1:37:14

서버 송신: 2005-04-30

오후 1:36:55

5국 6 35 1 3 BE 3 A0 1 0 3 0

3 0 C0 0 0 0 9C 1 D9 3 5D 0

E8 2 3 1E 81 0 0 0

클라이언트 수신: 2005-04-30

오후 1:37:14

서버 송신: 2005-04-30

오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2

1F 2 1F C0 0 0 1 1 2 19 0 CB

3 34 1 E 30 D9 CD 0 0

클라이언트 수신: 2005-04-30

오후 1:37:14

서버 송신: 2005-04-30

오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2

1F 2 1F C0 0 0 1 1 2 19 0 CB

3 34 1 E 30 D9 CD 0 0

서버 송신: 2005-04-30

오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2

1F 2 1F C0 0 0 1 1 2 19 0 CB

3 34 1 E 30 D9 CD 0 0

서버 송신: 2005-04-30

오후 1:36:55

2국 6 32 1 3 38 3 30 2 F 3 0

3 3C C0 0 0 2 CE 1 C0 2 FE

2 2C 2 4C 5D 97 B2 0 0

서버 송신: 2005-04-30

오후 1:36:55

2국 6 32 1 3 38 3 30 2 F 3 0

3 3C C0 0 0 2 CE 1 C0 2 FE

2 2C 2 4C 5D 97 B2 0 0

서버 송신: 2005-04-30

오후 1:36:55

2국 6 32 1 3 38 3 30 2 F 3 0

3 3C C0 0 0 2 CE 1 C0 2 FE

2 2C 2 4C 5D 97 B2 0 0

서버 송신: 2005-04-30

오후 1:36:55

3국 6 33 1 3 0 3 A0 0 0 2 0 2

0 C0 3 0 3 9D 2 5 3 57 2 F1

3 9D F7 80 C5 0 0

서버 송신: 2005-04-30

오후 1:36:55

3국 6 33 1 3 0 3 A0 0 0 2 0 2

0 C0 3 0 3 9D 2 5 3 57 2 F1

3 9D F7 80 C5 0 0

서버 송신: 2005-04-30

오후 1:36:55

3국 6 33 1 3 0 3 A0 0 0 2 0 2

0 C0 3 0 3 9D 2 5 3 57 2 F1

3 9D F7 80 C5 0 0

서버 송신: 2005-04-30

오후 1:36:55

4국 6 34 1 3 80 2 80 0 38 0 0

2 0 C0 1 0 1 6A 2 CE 0 72 2

29 2 BB 8E 38 9D 0 0

서버 송신: 2005-04-30

오후 1:36:55

4국 6 34 1 3 80 2 80 0 38 0 0

2 0 C0 1 0 1 6A 2 CE 0 72 2

- 100 -

29 2 BB 8E 38 9D 0 0

서버 송신: 2005-04-30

오후 1:36:55

4국 6 34 1 3 80 2 80 0 38 0 0

2 0 C0 1 0 1 6A 2 CE 0 72 2

29 2 BB 8E 38 9D 0 0

서버 송신: 2005-04-30

오후 1:36:55

5국 6 35 1 3 BE 3 A0 1 0 3 0

3 0 C0 0 0 0 9C 1 D9 3 5D 0

E8 2 3 1E 81 0 0 0

서버 송신: 2005-04-30

오후 1:36:55

5국 6 35 1 3 BE 3 A0 1 0 3 0

3 0 C0 0 0 0 9C 1 D9 3 5D 0

E8 2 3 1E 81 0 0 0

클라이언트 수신: 2005-04-30

오후 1:37:14

서버 송신: 2005-04-30

오후 1:36:55

5국 6 35 1 3 BE 3 A0 1 0 3 0

3 0 C0 0 0 0 9C 1 D9 3 5D 0

E8 2 3 1E 81 0 0 0

클라이언트 수신: 2005-04-30

오후 1:37:14

서버 송신: 2005-04-30

오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2

1F 2 1F C0 0 0 1 1 2 19 0 CB

3 34 1 E 30 D9 CD 0 0

클라이언트 수신: 2005-04-30

오후 1:37:14

서버 송신: 2005-04-30

오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2

1F 2 1F C0 0 0 1 1 2 19 0 CB

3 34 1 E 30 D9 CD 0 0

서버 송신: 2005-04-30

오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2

1F 2 1F C0 0 0 1 1 2 19 0 CB

3 34 1 E 30 D9 CD 0 0

서버 송신: 2005-04-30

오후 1:36:55

A3.2 서버 송신 데이터

RS422 수신: 2005-04-30

오후 1:36:55

5국 6 35 1 3 BE 3 A0 1 0 3 0

3 0 C0 0 0 0 9C 1 D9 3 5D 0

E8 2 3 1E 81 0 0 0

RS422 수신: 2005-04-30

오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2

1F 2 1F C0 0 0 1 1 2 19 0 CB

3 34 1 E 30 D9 CD 0 0

RS422 수신: 2005-04-30

오후 1:36:55

2국 6 32 1 3 38 3 30 2 F 3 0

3 3C C0 0 0 2 CE 1 C0 2 FE

2 2C 2 4C 5D 97 B2 0 0

RS422 수신: 2005-04-30

오후 1:36:55

3국 6 33 1 3 0 3 A0 0 0 2 0 2

0 C0 3 0 3 9D 2 5 3 57 2 F1

3 9D F7 80 C5 0 0

RS422 수신: 2005-04-30

오후 1:36:55

- 101 -

4국 6 34 1 3 80 2 80 0 38 0 0

2 0 C0 1 0 1 6A 2 CE 0 72 2

29 2 BB 8E 38 9D 0 0

RS422 수신: 2005-04-30

오후 1:36:55

5국 6 35 1 3 BE 3 A0 1 0 3 0

3 0 C0 0 0 0 9C 1 D9 3 5D 0

E8 2 3 1E 81 0 0 0

RS422 수신: 2005-04-30

오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2

1F 2 1F C0 0 0 1 1 2 19 0 CB

3 34 1 E 30 D9 CD 0 0

RS422 수신: 2005-04-30

오후 1:36:55

2국 6 32 1 3 38 3 30 2 F 3 0

3 3C C0 0 0 2 CE 1 C0 2 FE

2 2C 2 4C 5D 97 B2 0 0

RS422 수신: 2005-04-30

오후 1:36:55

3국 6 33 1 3 0 3 A0 0 0 2 0 2

0 C0 3 0 3 9D 2 5 3 57 2 F1

3 9D F7 80 C5 0 0

RS422 수신: 2005-04-30

오후 1:36:55

4국 6 34 1 3 80 2 80 0 38 0 0

2 0 C0 1 0 1 6A 2 CE 0 72 2

29 2 BB 8E 38 9D 0 0

RS422 수신: 2005-04-30

오후 1:36:55

5국 6 35 1 3 BE 3 A0 1 0 3 0

3 0 C0 0 0 0 9C 1 D9 3 5D 0

E8 2 3 1E 81 0 0 0

RS422 수신: 2005-04-30

오후 1:36:55

1국 6 31 1 3 80 0 E0 2 4F 2

1F 2 1F C0 0 0 1 1 2 19 0 CB

3 34 1 E 30 D9 CD 0 0

RS422 수신: 2005-04-30

오후 1:36:55

2국 6 32 1 3 38 3 30 2 F 3 0

3 3C C0 0 0 2 CE 1 C0 2 FE

2 2C 2 4C 5D 97 B2 0 0

- 102 -

A4. 회로도

A4.1 S-Card 구성 회로도

- 103 -

A4.2 S-Bus 인터페이스 구성도

- 104 -

A4.3 S-Bus 컨버터 구성 회로도

※ 회로 구성 사용 소자에 한 사항은 자 회로 기본 구성에

한 서 과 사용 소자 메뉴얼을 참고하기 바란다. [4,7,13,14,15,17]