通过通信端口或以太网用户连接发送数据
此指令使用发送缓冲区将数据发送至连接到指定通信端口的外部设备(计算机、测量仪器、条形码读取器等),或通过以太网用户连接发送。如果应用于CPU的COM端口,指令还会清除接收缓冲区,复位“接收完成”标志并允许接收更多的数据。
输入
根据PLC的类型指定通信端口:
COM端口,例如SYS_COM0_PORT
以太网端口,例如SYS_ETHERNET_USER_CONNECTION_1
MCU/SCU,例如COM01中的16#xx01(xx = 插槽编号)
发送缓冲区
要发送的字节数:
负值:在系统寄存器中选择的结束代码不会增加到发送字符串。
0(0字节):准备系统以接收更多数据
16#8000: 切换通信模式
发送了指定字节数后,"发送完成"标志将变为TRUE。可能会发送或接收新数据。任意发送指令均会将"发送完成"标志变为FALSE并将无法接收数据。在无法期望任何响应的情况时,"发送完成"标志的评价可能会起到作用。例如:广播信息。
SendData包含在下列指令中:
SendCharacters
SendCharactersAndClearString
ClearReceiveBuffer
SetCommunicationMode
如果使用索引寄存器指定的区域超出限制。
如果由NumberOfBytes指定的要发送的字节数超出指定区域。
仅用于MCU的标志:
如果指定插槽中不存在MCU单元或应发送零字节。
如果在MEWTOCOL-COM主站/从站模式中指定16#8000
如果使用索引寄存器指定的区域超出限制。
如果由NumberOfBytes指定的要发送的字节数超出指定区域。
仅用于MCU的标志:
如果指定插槽中不存在MCU单元或应发送零字节。
如果在MEWTOCOL-COM主站/从站模式中指定16#8000
在此示例中,将传输字符串sSendData字符。定义30个字节的发送缓冲区(ARRAY [0...15] OF WORD),然后将字符串的8个字符("ABCDEFGH")复制到缓冲区。
发送缓冲区布局:
为要发送的字节数保留发送缓冲区的第一个字(偏移量0)。因此,将数据复制到偏移量1(SendBuffer[1])。
发送开始时(发送指令的执行条件变为TRUE),偏移量0中的值将设置为8。传输结束时,偏移量0中的值将自动重置为0。将从较低的字节开始发送偏移量1到偏移量4的数据。
将字符"ABCDEFGH"传输至连接到COM端口1的外部设备。对于起始代码和结束代码,选择默认设置“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从发送缓冲区awSendBuffer[0])的第一个元素发送数据(如Start指定)。要发送的字符串长度(8字节)设置为NumberOfBytes。使用函数LEN计算字节数。数据从COM端口1输出(如Port指定)。
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;