MC 프로토콜을 통해 외부 장치에서 데이터 읽기
PLC에는 마스터 통신 내에 전송이 있습니다. 통신은 MC 프로토콜을 지원하는 장치에 명령을 보내고 응답을 받는 방식으로 수행됩니다. PLC는 메모리 어드레스를 지정하고 사용자 프로그램에서 읽기 명령을 실행하여 프로토콜에 따라 메시지를 자동으로 생성합니다.
입력
이더넷 포트(예: SYS_ETHERNET_USER_CONNECTION_1)
데이터를 요청할 슬레이브의 메모리 영역.
유닛 |
메모리 영역 유형 |
시스템 변수 |
||
---|---|---|---|---|
비트 |
입력 |
X |
16진수 SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X |
|
출력 |
Y |
16진수 SYS_MC_PROTOCOL_MEMORY_AREA_OUTPUT_Y |
||
링크 릴레이 |
B |
16진수 SYS_MC_PROTOCOL_MEMORY_AREA_LINK_RELAY_B |
||
내부 릴레이 |
M |
10진수 SYS_MC_PROTOCOL_MEMORY_AREA_INTERNAL_RELAY_M |
||
래치 릴레이 |
L |
10진수 SYS_MC_PROTOCOL_MEMORY_AREA_LATCH_RELAY_L |
||
워드 |
데이터 레지스터 |
D |
10진수 SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D |
|
파일 레지스터 |
R |
10진수 SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_R |
||
ZR |
16진수 SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_ZR |
|||
링크 레지스터 |
W |
16진수 SYS_MC_PROTOCOL_MEMORY_AREA_LINK_REGISTER_W |
데이터를 요청할 슬레이브의 메모리 영역에 대한 오프셋.
범위: 16#0–16#F7FFFF(0–16252927)
수신된 데이터 수를 지정합니다. 수신된 데이터의 수는 워드 전송의 경우 워드 단위로, 비트 전송의 경우 비트 단위(입력 Words_Bits에 적용된 데이터 유형에 따라 다름)로 표시됩니다.
Words_Bits에서 지정한 전송 방식과 전송 데이터 번호는 Destination의 데이터 형식에 따라 다릅니다.
Destination에 지정된 메모리 영역 |
전송 방법 |
전송 데이터 수 Words_Bits |
주석 |
---|---|---|---|
16비트 메모리 영역 WX, WY, WR, WL, DT, LD |
워드 전송 |
1–960워드 |
|
1비트 메모리 영역 X,Y,R,L,DT,n,LD,n |
비트 전송 |
1–7168비트 |
전송 데이터 수가 홀수인 경우 4비트 더미 코드 16#0이 추가됩니다. |
출력
요청한 데이터가 기록되는 마스터 유닛의 워드 영역 또는 레지스터
실행 결과 코드(영역드 WX, WY, XR, WL, DT, LD 내 1워드)를 저장하는 마스터 유닛의 메모리 영역을 지정합니다.
0: 정상 완료
1: 통신 포트는 마스터 통신에 사용됨
2: 통신 포트는 슬레이브 통신에 사용됨
3: 동시에 사용할 수 있는 마스터 통신 명령의 수를 초과함
4: 전송 타임아웃
5: 응답 수신 타임아웃
6: 데이터 에러 발생
전송 중 마스터 통신 전송 플래그가 TRUE입니다.
전송 완료 마스터 통신 전송 플래그가 FALSE입니다.
정상 완료: FALSE
비정상적인 완료: TRUE
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
파라미터에 지정된 값이 허용 범위를 벗어난 경우.
이더넷 포트가 올바르지 않거나 이더넷 포트가 닫혀 있는 경우.
Words_Bits에서 지정한 전송 데이터 번호가 잘못된 경우.
Destination에 지정된 마스터 유닛에 영역 또는 레지스터가 올바르지 않거나 허용 범위를 벗어난 경우.
실행 결과 코드가 저장된 메모리 영역이 잘못된 경우.
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우..
파라미터에 지정된 값이 허용 범위를 벗어난 경우..
이더넷 포트가 올바르지 않거나 이더넷 포트가 닫혀 있는 경우..
Words_Bits에서 지정한 전송 데이터 번호가 잘못된 경우.
Destination에 지정된 마스터 유닛에 영역 또는 레지스터가 올바르지 않거나 허용 범위를 벗어난 경우..
실행 결과 코드가 저장된 메모리 영역이 잘못된 경우..
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
diMemoryOffset: DINT:=0;
awValues: ARRAY [0..2] OF WORD:=[3(0)];
iResult: INT:=0;
bEnable: BOOL:=FALSE;
abValues: ARRAY [0..2] OF BOOL:=[3(FALSE)];
iPort: INT:=0;
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_COMMENT,,Bit transfer,2,0,10,1,);
B(B_COMMENT,,Memory Areas: SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X ^SYS_MC_PROTOCOL_MEMORY_AREA_OUTPUT_Y ^SYS_MC_PROTOCOL_MEMORY_AREA_LINK_RELAY_B ^SYS_MC_PROTOCOL_MEMORY_AREA_INTERNAL_RELAY_M ^SYS_MC_PROTOCOL_MEMORY_AREA_LATCH_RELAY_L,13,0,39,6,);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VAROUT,,abValues,41,2,43,4,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,26,3,28,5,);
B(B_VARIN,,diMemoryOffset,26,4,28,6,);
B(B_VAROUT,,iResult,41,3,43,5,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_READ!,,28,0,41,7,,?DEN?DPort?HSourceMemoryArea?DSourceMemoryOffset?DWords_Bits?AENO?CDestination?CResult);
B(B_F,Size_Of_Var!,,21,5,28,7,,?D?C);
B(B_VARIN,,abValues,19,5,21,7,);
L(7,2,28,2);
L(1,2,5,2);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_COMMENT,,Memory Areas: ^SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D ^SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_R ^SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_ZR ^SYS_MC_PROTOCOL_MEMORY_AREA_LINK_REGISTER_W,13,0,39,5,);
B(B_COMMENT,,Word Transfer,2,0,10,1,);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VAROUT,,awValues,41,2,43,4,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,26,3,28,5,);
B(B_VARIN,,diMemoryOffset,26,4,28,6,);
B(B_VAROUT,,iResult,41,3,43,5,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_READ!,,28,0,41,7,,?DEN?DPort?HSourceMemoryArea?DSourceMemoryOffset?DWords_Bits?AENO?CDestination?CResult);
B(B_F,Size_Of_Var!,,21,5,28,7,,?D?C);
B(B_VARIN,,awValues,19,5,21,7,);
L(1,2,5,2);
L(7,2,28,2);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_COMMENT,,only valid for ethernet ports! ^--> Valid Ports: SYS_ETHERNET_USER_CONNECTION_1 - SYS_ETHERNET_USER_CONNECTION_216,3,1,52,4,);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
(*Bit transfer*)
If (bEnable) then
FP_MC_PROTOCOL_READ(Port := iPort,
SourceMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,
SourceMemoryOffset := diMemoryOffset,
Words_Bits := Size_Of_Var(abValues),
Destination => abValues, Result => iResult);
End_if;
(*Word transfer*)
If (bEnable) then
FP_MC_PROTOCOL_READ(Port := iPort,
SourceMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,
SourceMemoryOffset := diMemoryOffset,
Words_Bits := Size_Of_Var(awValues),
Destination => awValues, Result => iResult);
End_if;