MC 프로토콜을 통해 외부 장치에 데이터 쓰기
PLC에는 마스터 통신 내에 전송이 있습니다. 통신은 MC 프로토콜을 지원하는 장치에 명령을 보내고 응답을 받는 방식으로 수행됩니다. PLC는 메모리 어드레스를 지정하고 사용자 프로그램에서 쓰기 명령을 실행하여 프로토콜에 따라 메시지를 자동으로 생성합니다.
입력
이더넷 포트(예: SYS_ETHERNET_USER_CONNECTION_1)
슬레이브에 기록할 데이터에 대한 마스터 유닛의 워드 영역 또는 레지스터
전송 방법은 Source의 데이터 유형에 따라 다릅니다.
Source에 지정된 메모리 영역 |
전송 방법 |
전송된 데이터 수 |
주석 |
---|---|---|---|
16비트 메모리 영역 WX, WY, WR, WL, DT, LD |
워드 전송 |
1–960워드 |
|
1비트 메모리 영역 X,Y,R,L,DT,n,LD,n |
비트 전송 |
1–7168비트 |
전송된 데이터 수가 홀수인 경우 4비트 더미 코드 16#0이 추가됩니다. |
데이터가 기록되는 슬레이브의 메모리 영역.
유닛 |
메모리 영역 유형 |
시스템 변수 |
||
---|---|---|---|---|
비트 |
입력 |
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)
출력
FP7에만 해당:
0: 정상 완료
1: 통신 포트는 마스터 통신에 사용됨
2: 통신 포트는 슬레이브 통신에 사용됨
3: 동시에 사용할 수 있는 마스터 통신 명령의 수를 초과함
4: 전송 타임아웃
5: 응답을 기다리는 동안 타임아웃
6: 수신된 데이터의 에러
이 에러는 비정상적인 텔레그램이 수신될 때 발생합니다(예: 헤더에 형식 에러가 있을 때). 이 경우, 수신된 데이터는 삭제됩니다.
7: I/O 맵에 예약된 영역 부족
이 에러는 이더넷 연결 수가 16개를 초과할 때 발생합니다(고급 이더넷 통신). 통신 제어 플래그를 위해 예약된 워드 영역이 이더넷 연결 수에 비해 충분히 큰지 확인하십시오.
8: 현재 사용 중인 전송 버퍼
이 에러는 펌웨어 버전 4.57 이상이 설치된 FP7 PLC에서 발생할 수 있습니다.
통신 에러의 경우, MC 프로토콜과 관련된 다른 에러 코드가 설정될 수 있습니다. 자세한 내용은 사용 중인 PLC의 설명서를 참조하십시오.
그 외 PLC의 경우: 0으로 설정
전송 중: 마스터 통신 전송 플래그가 TRUE입니다.
전송 완료: 마스터 통신 전송 플래그가 FALSE입니다.
정상 완료: FALSE
비정상적인 완료: TRUE
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
이더넷 포트가 올바르지 않거나 이더넷 연결이 닫혀 있는 경우.
Words_Bits에서 지정한 전송 데이터 번호가 잘못된 경우
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
이더넷 포트가 올바르지 않거나 이더넷 연결이 닫혀 있는 경우.
Words_Bits에서 지정한 전송 데이터 번호가 잘못된 경우
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
bEnable: BOOL:=FALSE;
awValues: ARRAY [0..2] OF WORD:=[3(0)];
diMemoryOffset: DINT:=0;
iResult: INT:=0;
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 := 8 ;
NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VARIN,,abValues,18,3,20,5,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,26,5,28,7,);
B(B_VARIN,,diMemoryOffset,26,6,28,8,);
B(B_VAROUT,,iResult,41,2,43,4,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_WRITE!,,28,0,41,8,,?DEN?DPort?DSource?DWords_Bits?HDestMemoryArea?DDestMemoryOffset?AENO?CResult);
B(B_F,Size_Of_Var!,,21,4,28,6,,?D?C);
L(1,2,5,2);
L(7,2,28,2);
L(20,4,28,4);
L(21,4,21,5);
L(1,0,1,8);
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 := 8 ;
NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VARIN,,awValues,18,3,20,5,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,26,5,28,7,);
B(B_VARIN,,diMemoryOffset,26,6,28,8,);
B(B_VAROUT,,iResult,41,2,43,4,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_WRITE!,,28,0,41,8,,?DEN?DPort?DSource?DWords_Bits?HDestMemoryArea?DDestMemoryOffset?AENO?CResult);
B(B_F,Size_Of_Var!,,21,4,28,6,,?D?C);
L(1,2,5,2);
L(7,2,28,2);
L(20,4,28,4);
L(21,4,21,5);
L(1,0,1,8);
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_WRITE(Port := iPort,
Source := abValues,
Words_Bits := Size_Of_Var(abValues),
DestMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,
DestMemoryOffset := diMemoryOffset,
Result => iResult);
End_if;
(*Word transfer*)
If (bEnable) then
FP_MC_PROTOCOL_WRITE(Port := iPort,
Source := awValues,
Words_Bits := Size_Of_Var(awValues),
DestMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,
DestMemoryOffset := diMemoryOffset,
Result => iResult);
End_if;