Files
HundM_Fortna/=A01+UH01-KF00/Programmbausteine/900_Communications/LCom_Example.scl
T

151 lines
9.1 KiB
Plaintext

ORGANIZATION_BLOCK "LCom_Example"
TITLE = "Main Program Sweep (Cycle)"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
BEGIN
(* REGION CONFIGURATION
// Set configuration values in first call of FB
IF "LCom_ExampleComData".firstCycle THEN
//-----------------------------------------------------------
// Connection parameter
//-----------------------------------------------------------
// hardware identifier of the local interface, PLC tags--Default tag table--System constant default value: PROFINET_interface_1 = 64
"LCom_Communication_DB".configuration.connection.interfaceID := 64;
//unique connection identifier (W#16#0001...W#16#0FFF)
"LCom_Communication_DB".configuration.connection.connectionID := 16#1F4;
//used protocol: 1=TCP protocol, 2=LCom protocol
"LCom_Communication_DB".configuration.connection.comService := "LCOM_TCP_CONNECTION";//"LCOM_TCP_CONNECTION";
//FALSE: passive (server), TRUE: active connection establishment (client)
"LCom_Communication_DB".configuration.connection.isClient := FALSE;//FALSE;;
//TRUE: accept requests from all partners, FALSE: only specified partner is allowed in case of server
"LCom_Communication_DB".configuration.connection.acceptUnknownPartner := TRUE;
//local port number (possible values: 1...49151; caution: some may be reserved for internal use; recommended values: 2000...5000)
"LCom_Communication_DB".configuration.connection.localPort := 3456;
//partner port number, use only in case of client or specified partner (possible values: 1...49151; recommended values: 2000...5000)
"LCom_Communication_DB".configuration.connection.partnerPort := 3456;
//partner IP address xxx.xxx.xxx.xxx = [1].[2].[3].[4], use only in case of client or specified partner
"LCom_Communication_DB".configuration.connection.partnerIP.ADDR[1] := 192;
"LCom_Communication_DB".configuration.connection.partnerIP.ADDR[2] := 168;
"LCom_Communication_DB".configuration.connection.partnerIP.ADDR[3] := 1;
"LCom_Communication_DB".configuration.connection.partnerIP.ADDR[4] := 244;
//life sign cycle time if no other data exchange is active (T#1ms...T#24d20h31m23s647ms); only valid with LCom protocol
"LCom_Communication_DB".configuration.connection.lifeSignCycleTime := T#1s;
//-----------------------------------------------------------
// QDN support since LCom_Communication version 2.1.0 !
// additionally a DNS server must be configured in PLC
//-----------------------------------------------------------
// value: 1 = IPv4, 10 = QDN (qualified domain name)
"LCom_Communication_DB".configuration.connection.connectType := "LCOM_CON_TYPE_IPV4"; //LCOM_CON_TYPE_QDN;
//define interfaceID and partner domain name with use of QDN
IF "LCom_Communication_DB".configuration.connection.connectType ="LCOM_CON_TYPE_QDN" THEN
// set to "0" for integrated interface; "x" for used CP;
"LCom_Communication_DB".configuration.connection.interfaceID := 0;
// Fully qualified domain name of the partner end point, which must finish with "."
"LCom_Communication_DB".configuration.connection.partnerQDN := 'lcomserver.lan.';
END_IF;
//-----------------------------------------------------------
//-----------------------------------------------------------
// Sender configuration
//-----------------------------------------------------------
//time interval for cyclic communication (T#1ms...T#24d20h31m23s647ms)
"LCom_Communication_DB".configuration.sender.cycleTime := T#1s;
//timeout in case of missing confirmation (T#1ms...T#24d20h31m23s647ms); only valid with LCom protocol
"LCom_Communication_DB".configuration.sender.ackTimeout := T#1s;
//-----------------------------------------------------------
// Configure time synchronization
//-----------------------------------------------------------
//TRUE: synchronize local time with received timestamps, FALSE: do not use received timestamps
"LCom_Communication_DB".configuration.timeSync.usePartnerTimestamps := FALSE;
//time synchronization send mode 0: inactive, 1: cyclic, 2: at time of day
"LCom_Communication_DB".configuration.timeSync.sendMode := "LCOM_CYCLE_TIME_SYNC";
//time interval for cyclic mode (T#1ms...T#24d20h31m23s647ms)
"LCom_Communication_DB".configuration.timeSync.cycleTime := T#1h;
//time synchronization at specified time of day (for sendMode = 2 only)
// "LCom_Communication_DB".configuration.timeSync.sendAtTimeOfDay := TOD#05:00:0.000;
//-----------------------------------------------------------
//-----------------------------------------------------------
// Initialize send buffer
//-----------------------------------------------------------
"LCom_ExampleComData".serializePos := 0;
"LCom_ExampleComData".serializeRetval := Serialize(SRC_VARIABLE := "LCom_ExampleComData".userSendData, DEST_ARRAY => "LCom_ExampleComBuffers".sendBuffer, POS := "LCom_ExampleComData".serializePos);
"LCom_ExampleComData".sendDataLength := DINT_TO_UDINT("LCom_ExampleComData".serializePos);
//----------------------------------------------------------
"LCom_ExampleComData".comEnable := TRUE;
"LCom_ExampleComData".firstCycle := FALSE;
END_IF;
END_REGION CONFIGURATION
REGION INCREMENT_DATA_VALUES
// Increment user variables when FB has send data
IF NOT "LCom_ExampleComData".sending AND "LCom_ExampleComData".sendingOld THEN
"LCom_ExampleComData".userSendData.counter := "LCom_ExampleComData".userSendData.counter + 1;
"LCom_ExampleComData".userSendData.value := "LCom_ExampleComData".userSendData.value + 0.1;
// Serialize data before sending
"LCom_ExampleComData".serializePos := 0;
// "LCom_ExampleComData".serializeRetval := Serialize(SRC_VARIABLE := "LCom_ExampleComData".userSendData, DEST_ARRAY => "LCom_ExampleComBuffers".sendBuffer, POS := "LCom_ExampleComData".serializePos);
// "LCom_ExampleComData".sendDataLength := DINT_TO_UDINT("LCom_ExampleComData".serializePos);
// 68 61 6C 6C 6F 0A
"LCom_ExampleComBuffers".sendBuffer[0] := 16#70;
"LCom_ExampleComBuffers".sendBuffer[1] := 16#65;
"LCom_ExampleComBuffers".sendBuffer[2] := 16#6e;
"LCom_ExampleComBuffers".sendBuffer[3] := 16#69;
"LCom_ExampleComBuffers".sendBuffer[4] := 16#73;
"LCom_ExampleComData".sendDataLength := 5;
END_IF;
"LCom_ExampleComData".sendingOld := "LCom_Communication_DB".sending;
END_REGION INCREMENT_DATA_VALUES
REGION CALL_LCOM_FB
// Call Communication FB
// Data is sent cyclic, when function block is connected
"LCom_Communication_DB"(enable := "LCom_ExampleComData".comEnable,
send := "LCom_ExampleComData".connected,
sendDataLength := "LCom_ExampleComData".sendDataLength,
connected => "LCom_ExampleComData".connected,
sending => "LCom_ExampleComData".sending,
dataReceived => "LCom_ExampleComData".dataReceived,
receivedDataLength => "LCom_ExampleComData".receivedDataLength,
busy => "LCom_ExampleComData".comBusy,
error => "LCom_ExampleComData".comError,
status => "LCom_ExampleComData".comStatus,
sendBuffer := "LCom_ExampleComBuffers".sendBuffer,
receiveBuffer := "LCom_ExampleComBuffers".receiveBuffer,
diagnostics := "LCom_ExampleComData".diagnosticData);
END_REGION CALL_LCOM_FB
REGION ERROR_HANDLING
// Error Handling
IF "LCom_ExampleComData".comError AND NOT "LCom_ExampleComData".comBusy THEN
// User cleared error detected. New rising edge on enable input is necessary to clear the error.
// E.g. a wrong configuration value can be a user cleared error
"LCom_ExampleComData".comEnable := FALSE;
ELSIF "LCom_ExampleComData".comError THEN
// Autmatically cleared error detected. The FB tries to solve the problem on it's own.
// E.g. if the connection is lost, the FB tries a reconnect to the partner
;
ELSE
; // No error detected
END_IF;
END_REGION ERROR_HANDLING
REGION DESERIALIZE
// Deserialize data after receiving
IF "LCom_ExampleComData".dataReceived THEN
"LCom_ExampleComData".deserializePos := 0;
"LCom_ExampleComData".deserializeRetval := Deserialize(SRC_ARRAY := "LCom_ExampleComBuffers".receiveBuffer, DEST_VARIABLE => "LCom_ExampleComData".userReceiveData, POS := "LCom_ExampleComData".deserializePos);
END_IF;
END_REGION DESERIALIZE
*)
END_ORGANIZATION_BLOCK