통신 포트 또는 이더넷 사용자 연결을 통해 데이터 전송
이 명령은 이더넷 사용자 연결을 통해 또는 지정된 통신 포트에 연결된 외부 장치(컴퓨터, 측정 기기, 바코드 판독기 등)로 전송 버퍼를 사용하여 데이터를 전송합니다. CPU의 COM 포트에 적용되는 경우 이 명령은 수신 버퍼를 지우고 "수신 완료" 플래그를 초기화하며 추가 데이터 수신을 허용합니다.
입력
PLC 기종에 따라 통신 포트를 지정합니다.
COM 포트(예: SYS_COM0_PORT)
이더넷 포트(예: SYS_ETHERNET_USER_CONNECTION_1)
MCU/SCU(예: COM01의 16#xx01(xx = 슬롯 번호))
전송 버퍼
전송할 바이트 수:
음수 값: 시스템 레지스터에서 선택한 종료 코드는 전송 문자열에 추가되지 않습니다.
0(0바이트): 데이터를 추가로 수신할 시스템을 준비합니다.
16#8000: 통신 모드를 전환합니다.
지정된 바이트 수가 전송되면 "transmission done" 플래그는 TRUE로 전환됩니다. 새 데이터를 전송 또는 수신할 수 있습니다. 모든 전송 명령은 "transmission done" 플래그를 FALSE로 전환하고 데이터를 수신할 수 없습니다. "transmission done" 플래그 평가는 응답을 기대할 수 없는 경우(예: 브로드캐스트 메시지)에 유용할 수 있습니다.
SendData 는 다음 명령에 캡슐화됩니다.
SendCharacters
SendCharactersAndClearString
ClearReceiveBuffer
SetCommunicationMode
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
NumberOfBytes에서 전송할 바이트 수가 지정된 영역을 벗어납니다.
MCU 전용 플래그:
MCU 유닛이 지정된 슬롯에 없거나 0바이트를 전송해야 하는 경우.
MEWTOCOL-COM 마스터/슬레이브 모드에서 16#8000이 지정된 경우
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
NumberOfBytes에서 전송할 바이트 수가 지정된 영역을 벗어납니다.
MCU 전용 플래그:
MCU 유닛이 지정된 슬롯에 없거나 0바이트를 전송해야 하는 경우.
MEWTOCOL-COM 마스터/슬레이브 모드에서 16#8000이 지정된 경우
이 예제에서는 문자열 sSendData의 문자를 전송합니다. 30바이트(ARRAY [0...15] OF WORD)에 대한 전송 버퍼를 정의하고 8자의 문자열("ABCDEFGH")을 버퍼에 복사합니다.
전송 버퍼 레이아웃:
전송 버퍼의 첫 번째 워드(오프셋 0)는 전송할 바이트 수로 예약됩니다. 따라서 오프셋 1(SendBuffer[1])에 데이터를 복사합니다.
전송이 시작되면(전송 명령의 실행 조건이 TRUE로 바뀜) 오프셋 0의 값이 8로 설정됩니다. 전송이 끝나면 오프셋 0의 값이 자동으로 0으로 초기화됩니다. 오프셋 1에서 오프셋 4까지의 데이터가 하위 바이트부터 순서대로 전송됩니다.
COM 포트에 연결된 외부 장치로 "ABCDEFGH" 문자를 전송합니다. 시작 코드와 종료 코드의 경우 기본 설정 "No-STX" 및 "CR"이 선택됩니다.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
bSend: BOOL:=FALSE;
(*activates function*)
sSendData: STRING[30]:='ABCDEFGH';
(*up to 30 chars*)
awSendBuffer: ARRAY [0..15] OF WORD:=[16(0)];
(*for 30 chars + 1 word*)
END_VAR
bSend가 TRUE인 경우, F10_BKMV가 sSendData에 있는 문자열의 문자를 awSendBuffer[1]에서 시작하는 버퍼 awSendBuffer로 복사합니다. 문자열의 첫 번째 두 워드에는 문자열 헤더 정보가 포함됩니다(문자 최대 수 및 현재 문자 수). 문자열 헤더를 버퍼에 복사할 수 없습니다. 따라서 문자열의 시작 어드레스에 2의 오프셋을 입력한 후 데이터를 복사합니다. 전송 버퍼의 크기는 모든 데이터를 전송할 수 있도록 충분해야 합니다. SendBuffer의 배열 요소마다 SendString에 있는 문자열의 두 문자가 포함될 수 있습니다. SendBuffer[0]는 전송할 바이트 수를 위해 예약되어 있습니다.
SendData가 데이터를 Start에 지정된 대로 버퍼(awSendBuffer[0])의 첫 번째 요소로부터의 데이터를 전송합니다. 보낼 문자열의 길이(8바이트)는 NumberOfBytes에서 설정됩니다. 펑션 LEN을 사용하여 바이트 수를 계산합니다. 데이터는 Port에 지정된 대로 COM 포트 1에서 출력됩니다.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 10 ;
NETWORK_BODY
B(B_COMMENT,,Creating the send buffer,1,0,14,1,);
B(B_CONTACT,,bSend,3,2,5,4,R);
B(B_VAROUT,,awSendBuffer[1],26,4,28,6,);
B(B_F,F10_BKMV,,18,2,26,7,,?DEN?D@'s1'?Ds2?AENO?Cd);
B(B_F,Adr_Of_VarOffs_I!,,9,3,18,7,,?D@'Var'?DOffs?CAdr);
B(B_VARIN,,sSendData,7,4,9,6,);
B(B_F,AdrLast_Of_Var_I!,,9,7,18,9,,?D?C);
B(B_VARIN,,sSendData,7,7,9,9,);
B(B_VARIN,,2,7,5,9,7,);
L(5,3,18,3);
L(1,3,3,3);
L(18,3,18,4);
L(1,0,1,10);
L(18,6,18,8);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_COMMENT,,bSend sign of the bSend buffer via the serial interface,1,0,25,1,);
B(B_CONTACT,,bSend,3,2,5,4,R);
B(B_VARIN,,awSendBuffer[0],14,4,16,6,);
B(B_F,LEN!,,9,4,14,7,,?DIN?C);
B(B_VARIN,,sSendData,7,5,9,7,);
B(B_F,E_SendData!,,16,1,26,7,,?DEN?DPort?DStart?DNumberOfBytes?AENO);
B(B_VARIN,,1,14,3,16,5,);
L(1,3,3,3);
L(5,3,16,3);
L(14,6,16,6);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (DF(bSend)) then
(* Copy all characters of the SendString to the SendBuffer from position 1 *)
F10_BKMV(s1_Start := Adr_Of_VarOffs(Var := sSendData, Offs :=2),
s2_End := AdrLast_Of_Var(sSendData),
d_Start => awSendBuffer[1]);
(* Send the data of the SendBuffer via the COM Port 2 of the MCU unit in slot 3 *)
(* In SendBuffer[0] the number of bytes not yet transmitted is stored *)
SendData(Port :=1, start := awSendBuffer[0], NumberOfBytes := LEN(sSendData));
end_if;