• 검색 결과가 없습니다.

반복되는 Function Code에 대한 응답

문서에서 FARA PLC (페이지 170-181)

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 방법은 좌측의 당사 규약을 준수 하는 범위에서 여러 가지로 구현가능하다)

문서에서 FARA PLC (페이지 170-181)