슬레이브에 데이터 쓰기
사용되는 포트의 시스템 레지스터에 정의된 대로 MEWTOCOL-COM 또는 Modbus RTU 명령을 사용하여 통신 포트를 통해 마스터에서 슬레이브로 데이터를 쓰려고 할 때 이 명령을 사용합니다.마스터와 슬레이브에 동일한 프로토콜을 설정해야 합니다.마스터와 슬레이브의 메모리 영역은 일치해야 합니다. 마스터의 유저 영역에서 슬레이브 데이터를 사용할 수 없으면 F145_WRITE_DATA_TYPE_OFFS 또는 F145F146_MODBUS_MASTER를 사용합니다.
Modbus 프로토콜을 사용한 데이터 전송을 위해서 컴파일러는 Modbus 참조 번호를 기준으로 Modbus 커맨드를 생성합니다.입력
PLC 기종에 따라 통신 포트를 지정합니다.
COM 포트(예: SYS_COM0_PORT)
이더넷 포트(예: SYS_ETHERNET_USER_CONNECTION_1)
MCU/SCU(예: COM01의 16#xx01 (xx = 슬롯 번호))
슬레이브의 스테이션 번호(MEWTOCOL: 0–99, MODBUS: 0–255, 0: 브로드캐스팅)
SYS_ETHERNET_USER_CONNECTION_xx가 Port 입력에 적용된 경우, 1로 설정
슬레이브에 쓸 데이터에 대한 마스터의 소스 어드레스.
출력
데이터가 기록된 슬레이브의 대상 클래스입니다.
MasterData와 SlaveData는 동일한 데이터 형식이어야 합니다.
마스터에서 슬레이브로 외부 데이터 액세스를 설정하려면 글로벌 변수 리스트에서 고정 유저 어드레스(슬레이브 데이터와 동일한 어드레스)를 할당해야 합니다.
이 F 명령을 사용하는 대신 다음과 같은 가장 유연한 명령을 사용할 것을 권장합니다: FP_WRITE_TO_SLAVE_AREA_OFFS.
어느 명령도 활성되지 않으면 F145 또는 F146 명령만 실행될 수 있습니다. 프로그램에서 "F145/F146 not active" 플래그를 평가하여 명령 상태를 확인합니다.
F145 명령은 슬레이브에 보낸 해당 데이터만 요청합니다. 실제 처리는 스캔 종료 시 실행됩니다.
"F145/F146 error" 플래그를 평가하여 전송이 정상적으로 완료되었는지 또는 오류가 발생했는지 확인합니다.
브로드캐스팅 시(SlaveAddress가 0으로 설정) 최대 스캔 타임이 경과된 후에만 전송이 실행되는지 확인합니다.
대상 어드레스가 특수 내부 플래그(R9000에서), 특수 데이터 등록(DT9000/DT90000에서) 또는 파일 레지스터 FL이면 F145 또는 F146 명령을 실행할 수 없습니다.
글로벌 변수 리스트에서 프로젝트의 모든 POU에서 액세스할 수 있는 변수를 정의합니다.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
bBool1: BOOL:=FALSE;
bRead1: BOOL:=FALSE;
bWrite1: BOOL:=FALSE;
END_VAR
VAR_EXTERNAL
Slave2_g_bY38: BOOL:=FALSE;
END_VAR
시스템 변수 sys_bPulse1s가 bBool1에 복사됩니다. bWrite1 및 sys_bIsComPort1F145F146NotActive가 TRUE로 설정되면 bBool1은 슬레이브 2의 출력 Y38에 작성됩니다.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 3 ;
NETWORK_BODY
B(B_CONTACT,,sys_bPulse1s,3,1,5,3,);
B(B_COIL,,bBool1,24,1,26,3,);
L(5,2,24,2);
L(1,2,3,2);
L(1,0,1,3);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,sys_bIsComPort1F145F146NotActive,8,1,10,3,);
B(B_CONTACT,,bWrite1,18,1,20,3,);
B(B_VARIN,,SYS_COM1_PORT,21,2,23,4,);
B(B_VARIN,,2,21,3,23,5,);
B(B_VARIN,,bBool1,21,4,23,6,);
B(B_F,F145_WRITE_DATA!,Instance,23,0,33,6,,?DEN?DPort?DSlaveAddress?DMasterData?AENO?CSlaveData);
B(B_VAROUT,,Slave2_g_bY38,33,2,35,4,);
B(B_COIL,,bWrite1,36,1,38,3,E);
B(B_COIL,,bRead1,42,1,44,3,S);
L(1,2,8,2);
L(10,2,18,2);
L(20,2,23,2);
L(33,2,36,2);
L(38,2,42,2);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
bBool1 := sys_bPulse1s;
if (bWrite1 and sys_bIsComPort1F145F146NotActive) then
F145_WRITE_DATA(Port := SYS_COM1_PORT,
SlaveAddress := 2,
MasterData := bBool1,
SlaveData => Slave2_g_bY38);
bRead1 := true;
bWrite1 := false;
end_if;