오프셋을 사용하여 슬레이브에서 데이터 읽기
이 명령을 사용하여 사용한 포트의 시스템 레지스터에서 정의한 대로 MEWTOCOL-COM 또는 Modbus RTU 프로토콜을 사용하여 통신 포트를 통해 슬레이브에서 데이터를 요청합니다. 마스터와 슬레이브에 동일한 프로토콜을 설정해야 합니다. 마스터와 슬레이브의 메모리 영역은 일치해야 합니다.
Modbus 프로토콜을 사용한 데이터 전송을 위해서 컴파일러는 Modbus 참조 번호를 기준으로 Modbus 커맨드를 생성합니다.
입력
PLC 기종에 따라 통신 포트를 지정합니다.
COM 포트(예: SYS_COM0_PORT)
이더넷 포트(예: SYS_ETHERNET_USER_CONNECTION_1)
MCU/SCU(예: COM01의 16#xx01 (xx = 슬롯 번호))
슬레이브의 스테이션 번호 (MEWTOCOL: 1-99, MODBUS 1-247)
SYS_ETHERNET_USER_CONNECTION_xx가 Port 입력에 적용된 경우, 1로 설정
데이터가 요청된 슬레이브의 시작 어드레스입니다.
메모리 영역 유형 |
시스템 변수 |
---|---|
내부 플래그 |
|
링크 플래그 |
|
외부 입력 |
|
외부 출력 |
|
내부 플래그 |
|
타이머/카운터 설정값 |
|
타이머/카운터 경과값 |
|
데이터 레지스터 |
|
링크 플래그 |
|
링크 레지스터 |
|
파일 레지스터 |
|
입력 레지스터 |
|
출력 레지스터 |
데이터가 요청된 슬레이브의 시작 어드레스에 대한 오프셋입니다.
전송할 워드(비트) 수.
또는:
워드 수
Modbus RTU의 경우: 16#001–16#07F
MEWTOCOL-COM의 경우: 16#001–16#1FD 또는 16#001–16#1B(FP0, FP-e)
또는:
비트 전송용 제어 워드: 16#8T0F에서 T는 마스터로의 비트 전송을 의미하고, F는 슬레이브로의 비트 전송을 의미합니다(FP7에는 적용되지 않음).
출력
요청한 데이터가 기록되는 마스터 유닛의 워드 영역 또는 레지스터
FP7에만 해당: 모든 에러 코드에 대한 설명은 Modbus/MEWTOCOL 통신 에러 코드 표를 참조하십시오.
그 외 PLC의 경우: 0으로 설정
전송 중: 마스터 통신 전송 플래그가 TRUE입니다.
전송 완료: 마스터 통신 전송 플래그가 FALSE입니다.
정상 완료: FALSE
비정상적인 완료: TRUE
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
Words_Bits에서 지정한 전송 데이터 번호가 잘못된 경우
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
Words_Bits에서 지정한 전송 데이터 번호가 잘못된 경우
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
bReadResult: BOOL:=FALSE;
wReadFromSlaveResult: WORD:=0;
(*result of write to slave instruction*)
iSlaveStationNumber: INT:=0;
(*slave station number*)
arrResults: ARRAY [0..9] OF REAL:=[10(0.0)];
(*Array of results to be read from slave station*)
iSlaveMemoryOffset: INT:=200;
iSlaveMemorySize: INT:=1;
END_VAR
VAR CONSTANT
iSlaveMemoryArea: INT:=5;
(*memory Area in slave station*)
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_VARIN,,SYS_COM1_PORT,15,2,17,4,);
B(B_VARIN,,iSlaveStationNumber,15,3,17,5,);
B(B_CONTACT,,bReadResult,4,1,6,3,);
B(B_VAROUT,,wReadFromSlaveResult,34,3,36,5,);
B(B_VAROUT,,arrResults,34,2,36,4,);
B(B_VARIN,,SYS_MEMORY_AREA_DT,15,4,17,6,);
B(B_VARIN,,iSlaveMemoryOffset,15,5,17,7,);
B(B_VARIN,,iSlaveMemorySize,15,6,17,8,);
B(B_F,FP_READ_FROM_SLAVE_AREA_OFFS!,,17,0,34,8,,?DEN?DnPort?DStationNumber?HSlaveMemoryArea?DSlaveMemoryOffset?DWords_Bits?AENO?CDestination?CResult);
L(1,2,4,2);
L(6,2,17,2);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (bReadResult) then
FP_READ_FROM_SLAVE_AREA_OFFS(Port := SYS_COM1_PORT,
StationNumber := iSlaveStationNumber,
SlaveMemoryArea := SYS_MEMORY_AREA_DT,
SlaveMemoryOffset := iSlaveMemoryOffset,
Words_Bits := iSlaveMemorySize,
Destination => arrResults[0],
Result => wReadFromSlaveResult);
end_if;