9 장
3) 반복되는 Function Code에 대한 응답
주변장치
PLC
Q R R R R R R R
(1) 2 단계 통신 방법
(2) 4 단계 통신 방법
통신 규약 및 절차
FARA PLC N70plus 사용자 메뉴얼
부록1
통신 기능 코드
● 각각의 기능코드는 1바이트로 구성되며 PLC에서 정상적으로 쿼리(Q) 수신시 R 프레임에는 쿼리 에서 보낸 기능코드에 $80(Hex)를 더하여 보낸다. 2단계통신과 4단계의 통신의 차이점은 쿼리 나 Response 의 기능코드가 $20(Hex)의 차이가 있습니다.
● 주변기기는 자신이 보낸 쿼리를 PLC가 정상적으로 수신하였는지를 여부를 R 프레임의 Q Function Code를 검사하여 확인할수 있다.
통신 기능
쿼리(Q)
Function Code Response(R)
Function Code 비 고
2단계 4단계 2단계 4단계
비트 읽기
$21 $01 $A1 $81 상세설명 있음
비트 쓰기
$22 $02 $A2 $82 〃
워드 읽기
$23 $03 $A3 $83 〃
워드 쓰기
$24 $04 $A4 $84 〃
비트/워드 혼용 읽기
$25 $05 $A5 $85 〃
비트/워드 혼용 쓰기
$26 $06 $A6 $86 〃
프로그램 읽기
$27 $07 $A7 $87 상세설명 없음
프로그램 쓰기
$28 $08 $A8 $88 〃
명령어 읽기
$29 $09 $A9 $89 〃
명령어 변경
$2A $0A $AA $8A 〃
오퍼랜드 변경
$2B $0B $AB $8B 〃
명령어 삽입
$2C $0C $AC $8C 〃
명령어 삭제
$2D $0D $AD $8D 〃
명령어 찾기
$2E $0E $AE $8E 〃
오퍼랜드 찾기
$2F $0F $AF $8F 〃
프로그램 전부/부분 삭제
$20 $10 $A0 $90 〃
NO SERVICE
$00 $00 $00(Hex) $00(Hex) 〃
● 통신프레임의 비트/워드번지지정은 절대번지정방식을 사용하므로 4-3. 절대번지지정을 참조바랍니다.
● 프로그램읽기, 쓰기등 기타 기능코드에 대한 자세한 내용은 당사 기술부서로 연락바랍.
● Query란 ?
사전적인 의미로써 질문, 의문, 질문부호를 나타내며 통신에서 사용될때는 사용자나 응용프로그램이 상대측에 어떠한 정보를 요구하는 것을 말합니다.
(3) 쿼리(Query)에 실리는 기능코드(Function Code)
* $표시는 Hex(16진수)표기를 나타냄
● CRC 는 통신 프레임(Frame)이 에러없이 전송되었느지 여부를 확인하기 위하여 송신 프레임에 붙이는 일종의 체크섬코드(Check Sum Code)정보로써 2바이트로 구성된다.
● 송/수신측은 수신데이타를 1바이트 송/수신할때마다 CRC를 계산하여야 하므로 통신프로그램 작 성시 CRC계산에 많은 시간이 소요되므로 통신속도 개선 및 통신에러를 방지하기 위해서는 이 부 분의 속도를 향상시키도록 염두해 두어야 한다.
CRC 계산범위
C R C 계 산 범 위 2 바 이 트
CRC_Sum : CRC-16 계산수행후 잉여코드(송신할 CRC 내용) Data : CRC-16 계산을 원하는 데이터 입력(Byte Data) 1000 CRC_Sum = CRC_Sum XOR Data
1010 FOR I=1 to 8
1020 CARRY=CRC_Sum AND 1 1030 CRC_Sum=CRC_Sum SHR 1
1040 IF CARRY=1 THEN CRC_Sum XOR 0A001H 1050 NEXT I
1060 RETURN
(4) CRC(Cyclic Redundancy Checking, 순환중복검사)
Procedure CRC16(Data:Byte) Var i : Byte;
Begin
CRC_Sum := CRC_Sum xor Data;
for i : 1 to 8 do begin
if((CRC_Sum and 1)=1) then CRC_Sum := (CRC_Sum shr 1) xor $A001;
else CRC_Sum := CRC_Sum shr 1;
end;
End;
void Crc16(unsigned int Data) { unsigned int i;
Crc=Crc^(Data & 0x00FF);
for(i=0;i<=7;I++) {
if((Crc & 0x0001) == 0x0001) Crc=(Crc>>1)^0xA001;
else Crc=Crc>>1;
} }
DA SA 기능코드 길이 정보 CRC L CRC H
□ BASIC으로 작성한 CRC-16계산 서브루틴
□ PASCAL로 작성한 CRC-16계산 서브루틴
□ C로 작성한 CRC-16계산 서브루틴
통신 규약 및 절차
FARA PLC N70plus 사용자 메뉴얼
부록1
Q(Query) 및 R(Response) 프레임
DA SA 기능코드 길이 정보 CRC L CRC H
DA SA $80 01 00 CRC L CRC H
DA SA $00 01 00 CRC L CRC H
DA SA $8X 01 에러번호 CRC L CRC H
정보영역길이(바이트단위) 1~255:1~255바이트 0:256바이트
기능코드 (Function Code) 발신지 고유번호
수진지 고유번호
CRC-16코드 (2바이트)
QA(Query Acknowledge) 프레임
불 변
불 변 RR(Response Request) 프레임
에러발생시 R(Response) 프레임
Error #1. 잘못된 통신기능 코드 Error #2. 범위 초과
Error #3. 잘못된 프레임구성 Error #4. CPU가 수행하지 않음.
Error #5. 너무긴 프레임.
프레임은 SA에서 DA로 전송되며 Q나 RR 전송후 CPU로부터 발생하는 QA 와 R의 DA 및 SA는 바뀌어 있 음. CPU입장에서는 송신측은 CPU 자신이 되고, 수신측은 주변기기가 되기 때문.
1-3. 통신프레임의 구조
● 기능코드는 2단계통신을 기준으로 Q, R Frame의 예제를 설명하였습니다.
(1) 비트읽기
● 절대번지로 지정된 비트(R,L,M,K,F,TC)의 내용을 읽음.
● 연속하는 N개의 비트내용(ON/OFF)를 읽을수 있음.
DA SA $21 $03 BASE N
L H CRC
L H
읽고자하는 비트 갯수 비트절대번지(시작번지) 4-3. 절대번지 지정 참조
예) K127.12 (K127번지 12번째 비트) 의 절대비트번지 = $1BFC 임.
BASE L=$F C, H=$1B Q(Query) 프레임
R(Response) 프레임
DA SA $A1 N 비트값BASE+0 비트값BASE+1 ・・・・BASE+N-1비트값
Q에서 요구한 BASE비트에서 N개의 비트값 비트가 ON(=1)일때는 $FF , OFF (=0)일때는
$00 의 1바이트로 표시하여 전송함.
주변기기 ID(PC ID) PLD ID(CPU ID)
주변기기 ID(PC ID)
PLD ID(CPU ID) Q에서 보낸 DA,SA가 바뀌어져 주 변기기로 보내짐. PLC입장에서 수 신측은 주변기기가 해당되기 때문.
● 절대번지로 지정된 비트(R,L,M,K,F,TC)의 내용을 변경함. ON/OFF를 변경함.
● 연속하는 여러개의 비트내용를 변경할수 있음.
비트절대번지(시작번지) 4-3. 절대번지 지정 참조 Q(Query) 프레임
R(Response) 프레임
DA SA $A2 $01 $00
DA SA $22 N 비트값BASE+0 비트값BASE+1 ・・・・BASE+N-3비트값
BASE로부터의 변경하고자하는 비트값을 ON으로 하고자하면 $FF , OFF 하고자 하면 $00을 넣음.
고 정
LCRCH
LBASEH CRC
L H
LCRCH 기능코드,2단계통신시 정보의길이(바이트)
Q의 기능코드(Function Code)에 대한 R 응답 Q에 $80가 더해진 응답코드, 2단계통신시
수행완료 코드 정보의길이(바이트수):길이다음부터 CRC전까지
(2) 비트쓰기
통신 규약 및 절차
FARA PLC N70plus 사용자 메뉴얼
부록1
● 절대번지로 지정된 워드(R,L,M,K,F,W)의 내용을 읽음.
● 연속하는 N개의 워드내용를 읽을수 있음.
DA SA $23 $03 BASE N
L H CRC
L H
읽고자하는 워드 갯수 워드절대번지(시작번지) 4-3. 절대번지 지정 참조 예) K127 워드의 절대번지는
$01BF 이다.
BASE L=$BF, H=$01 Q(Query) 프레임
R(Response) 프레임
DA SA $A3 L ・・・・
Q에서 요구한 BASE워드에서 N개의 워드값
● 절대번지로 지정된 워드(R,L,M,K,F,W)의 내용을 변경함.
● 연속하는 N개의 워드내용를 변경할수 있음.
Q(Query) 프레임
R(Response) 프레임
DA SA $A4 $01 $00
고 정
LCRCH
LCRCH BASE+0워드값
L H BASE+1워드값L H BASE+N-1워드값 L H
길이 L = N*2
DA SA $24 L ・・・・
BASE번지부터 변경하고자 하는 N개 의 워드값.
LCRCH BASE+0워드값
L H BASE+N-1워드값
L H
길이 L = N*2+2 LBASEH
(3) 워드읽기
(4) 워드쓰기
● 절대번지로 지정된 비트나 워드내용를 읽음.
● 비트와 워드를 순서없이 혼용하여 읽을수 있음.
Q(Query) 프레임
R(Response) 프레임
DA SA $A5 Lx ・・・・
● 절대번지로 지정된 비트나 워드내용를 변경함.
● 비트와 워드를 순서없이 혼용하여 변경할수 있음.
Q(Query) 프레임
R(Response) 프레임
DA SA $A6 $01 $00
고 정
LCRCH
LCRCH
DA SA $25 L ・・・・ CRC
L H
L A0H L A1H L AnH
D0 D1
L H L DnH
Q에서 요구한 A0,A1,..,An 에 대하여 해당 비트나 워드의 내용 D0,D 1,..,Dn으로 응답된다.
Ax가 비트번지를 지정하면 Dx는 1바이트로 응답(ON=$F F ,OFF =$00) 하고 Ax가 워드번지를 지정하면 Dx는 1워드(2바이트)로 응답한다.
비트/워드 절대번지지정방법
15 14 13 0
절대번지(비트/워드) 0
0 1
0 1 X
비트 절대번지 워드 절대번지 사용 불가
Ax=A0,A1,..,An Dx=D0,D1,..,Dn
비트절대번지정방법
K127.12 비트의 절대번지=$1BFC Ax=0001 1011 1111 1010 Ax L=$F C, H=$1B 워드절대번지정방법
K127 워드의 절대번지=$01BF Ax=0100 0001 1011 1111 Ax L=$BF, H=$41
DA SA $26 L ・・・ CRC
L H
L A0H L A1H
비트/워드 절대번지지정방법
15 14 13 0
절대번지(비트/워드) 0
0 1
0 1 X
비트 절대번지 워드 절대번지 사용 불가
비트절대번지정방법
K127.12 비트의 절대번지=$1BFC Ax=0001 1011 1111 1010 워드절대번지정방법
K127 워드의 절대번지=$01BF AX=0100 0001 1011 1111
D0 D0
Ax가 비트절대번지로 지정되면 이에 해당하는 Dx는 1바이트로 표시되며 ON하고자할때는 $FF 를, OFF 하고자 할때는 $00으로 구성한다. Ax가 워드 절대번지로 지정되면 이에 해당하는 Dx는 1워드(2바이트)구성된다.
Lx는 Q의 Ax가 비트,워드에 따 라 R의 Dx가 달라지므로 수신된 R의 Lx확인에 주의 요함.
Lx는 Q의 Ax가 비트,워드에 따 라 Q의 Dx가 달라지며, 이에 따 라 L(정보길이)도 달라지므로 송 신프레임 구성시 주의 요함. Dx 는 1,2 바이트가 될수 있음.
(5) 비트/워드 혼용하여 읽기
(6) 비트/워드 혼용하여 쓰기
통신 규약 및 절차
FARA PLC N70plus 사용자 메뉴얼
부록1
● 예제는 사용자가 직접 통신프로그램을 작성을 위한 것입니다. 기술적인 문제점은 당사 영업부서나 기 술부서로 연락주십시요.
프 로 그 램 설 명
< PLC 통신예제 프로그램 >
#include<stdio.h>
#include<dos.h>
#include<conio.h>
#define PC_ID 0xE2
#define Time한계 28
#define 재시도한계 2
#define TRUE 1
#define FALSE 0
#define 하위바이트(x) (unsignedint) ((x)& 0x00FF)
#define 상위바이트(x) (unsignedint) (((x)& 0xFF00)>>8)
typedef int BOOL;
unsignedint PORTADD,DIVISOR,송신지연,수신지연;
unsignedint 수신프레임[262],수신프레임[262];
unsignedint Crc;
unsignedint 카드,i,ix,iy,smode;
unsignedint 포트번호;
unsignedint PlcID,OldID;
BOOL Success;
unsignedint 데이타,JobID,재시도C;
unsignedint Old,New,수신Index최대,송신Index최대,index,워치독;
unsignedint M[128],K[128]; /* Example Register */
void RR발생(void);
void Trs포트(unsignedint);
unsignedint Rec포트(void);
BOOL 송신발생(void);
BOOL 수신발생(void);
void Crc16(unsignedint);
void Job(void);
unsignedint 통신(void);
void M워드읽기(void);
void K워드쓰기(void);
void main(void) {
unsignedint i;
/* Selection of 통신 포트 */
clrscr();
printf("PORT: COM1[1]/ COM[2]/ GPC-232[3]/GPC-485[4]/ GPC-Parallel[5] = ");
scanf("%d",&포트번호);
if ((포트번호 < 1) || (포트번호 > 5)) 포트번호=5;
/* Selection of Baudrate for Serial 통신 */
송신지연=10;
if (포트번호 != 5) {
printf("GPC 카드 BAUD-RATE : 9600[1]/ 4800[2]/ 2400[3] = ");
scanf("%d",&i);
if ((i < 1) || (i > 3)) i=1;
if (i == 3) i=4;
if ((포트번호 == 1) || (포트번호 == 2)) DIVISOR=12 * i;
else DIVISOR=40 * i;
수신지연=3 * i + 1;
}
본 프로그램은 BorlandC++로 작성 되었으 며 주변기기(PC)를 사용하여 M000~M127 워드를 읽고 그값을 K000~K127 에 저장한 후 두 레지스터값을 비교하여 그결과를 모 니터에 "OK","FAIL"로 표시하는 간단한 통 신프로그램 예이다.
사용자는 앞서 설명된 통신 기능번호와 이 때 각각 송수신 정보를 조작또는 읽음으로 서 다양한 PLC제어를 할수 있다.
본 프로그램은 선언부, 주프로그램, 각종 함 수로 구성된다. 통신데이타 저장에 필요한 버퍼 및 변수들은 전역변수로 설정하여 메 인 및 함수에서 참조 가능하도록 하였다.
컴퓨터의 COM1,COM2를 사용하여 Serial통 신이 가능하며, GPU-300 카드를 PC에 접 속하면 Parallel통신이 가능하도록 하였다.
각각의 Q,QA,RR,R은 Job 함수에서 처리하 며 통신지연이 발생하거나 프레임이 중간에 깨질경우 3회 재시도하고 통신에러를 발생 한다.
통신은 JobID에 의하여 Q송신--->QA수신--->RR송신--->R수신의 과정을 순차적으로 진행되며어느 한 프레임에서라도 에러가 발 생시 재시도한다.
<프로그램 주요 동작>
1. 통신을 위한 초기 통신 포트 및 보드레 이트를 조정을 위하여 초기변수 입력.
2. 통신기능 코드를 사용하여 M영역의 데이 터를 읽어옴. M0~M127 워드 영역값을 읽어서
K0~K127 워드 에 저장한다.
K 레지스터는 정전유지 영역임.
3. 통신기능 코드를 사용하여 K영역에 데이 터 저장함.
4. M 영역과 K 영역의 데이터를 비교하여 값이 같을때 OK 표시함.
주 프로그램 시작
통신을 위해 주변장치의 포트 선택 : 시리얼 9 PIN, 25PIN : 퍼렐럴 GPU-300병렬포트
보드레이트 선택 : 9600 bps(최대) : 4800 bps : 2400 bps 선택된 포트별 통신 환경(지연시간) 설정.
참고> GPC-300 카드 포트 어드레스
=0x0300
1-4. 통신프로그램 예제
프 로 그 램 설 명
/* Initialization of GPC 카드 */
if(포트번호 == 1) PORTADD=0x3F0;
if(포트번호 == 2) PORTADD=0x2F0;
if ((포트번호 >= 3) && (포트번호 <=5)) {
PORTADD=0x300;
outportb(0x303,0xC0);/* Mode=2 of 8255 */
outportb(0x303,0x05);/* PC2=1 of 8255 :DisableIRQ2 */
outportb(0x301,0xFF);/* PB0=1 of 8255 :송신 Enable RS-485*/
outportb(0x303,0x01);/* PC0=1 of 8255 :Serial Input Enable*/
if(포트번호 == 3) outportb(0x303,0x02);/* PC1=0 of 8255 :Select RS-232 */
if(포트번호 == 4) outportb(0x303,0x03);/* PC1=1 of 8255 :Select RS-485 */
if(포트번호 == 5) outportb(0x303,0x00);/* PC0=0 of 8255 :DisableSerialInput*/
}
else outportb(PORTADD+0x09,(inportb(PORTADD+0x09)&0xF0));/*Disable Interrupt*/
/* Initialization of USART-Chip: 8250 */
if (포트번호 != 5) {
outportb(PORTADD+0x0B,0x80);/* Set of DLAB=1 */
outportb(PORTADD+0x09,0x00);/* Set of High Byte DIVISOR */
outportb(PORTADD+0x08,DIVISOR);/* Set of Low Byte DIVISOR */
outportb(PORTADD+0x0B,0x03); /* 패리티=None/Stop=1/Length=8 */
}
/* Processing 통신 of Read & Write */
for( ; ; ) {
printf("---\nPLC-ID (CPU ID) :");
scanf("%d",&PlcID);
M워드읽기();
K워드쓰기();
} }
void RR발생(void) {
수신프레임[2]=0;
수신프레임[3]=1;
수신프레임[4]=0;
}
void Trs포트(unsignedint 데이타) {
if (포트번호 == 5) outportb(PORTADD,데이타);
else outportb(PORTADD+0x08,데이타);
}
unsignedint Rec포트(void) {
unsignedint dt;
if (포트번호 == 5) dt=inportb(PORTADD);
else dt=inportb(PORTADD+0x08);
return(dt);
}
BOOL 송신발생(void) {
BOOL tf;
if (포트번호 == 5) tf=((inportb(PORTADD+0x02) & 0x80)==0x80);
else tf=((inportb(PORTADD+0x0D) & 0x20)==0x20);
return(tf);
}
BOOL 수신발생(void) {
BOOL rf;
if (포트번호 == 5) rf=((inportb(PORTADD+0x02) & 0x20)==0x20);
else rf=((inportb(PORTADD+0x0D) & 0x01)==0x01);
return(rf);
}
void Crc16(unsignedint 데이타) {
unsignedint i;
Crc=Crc^(데이타 & 0x00FF);
for(i=0;i<=7;i++) {
if((Crc & 0x0001) == 0x0001) Crc=(Crc>>1)^0xA001; /* 0x0001 : 다항식 */
else Crc=Crc>>1;
} }
GPC-300 카드 SETTING (8255chip setting) :접속된 통신카드를 통하여 통신 가능하도록 PLC 통신 사양대로 환경을 설정하는 부분.
CPU-ID: PLC 고유 ID (0~255) 입력
M영역(M0-M127) 레지스터값 읽어옴.
M영역의 값을 K영역에 저장.(K0-K127)
RR(REQUEST RESPONSE)요구 함수 부분.
통신 포트로 송신데이타 보내기
통신 포트로부터 수신데이타 읽어오기
송신 이벤트(EVENT) 발생시 외부로 데이터 출력함
수신 이벤트(EVENT) 발생시 외부로 데이터 입력함
CRC 계산부분
:송수신되는 데이터를 바이트(BYTE)단위로 코드화 함. 하나의 통신기능이 완료된후 최 종프레임에 첨부하거나 첨부된 CRC와 비교
하여 데이터의 오류를 검사하는데 사용된
다.
(참고:CRC 방법은 좌측의 당사 규약을 준수 하는 범위에서 여러 가지로 구현가능하다)