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월
지도교수 권 오 규
이 논문을 공학석사학 논문으로 제출함
인하 학교 공학 학원
기공학과
이 진 근
- 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“
- 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