151 lines
9.1 KiB
Plaintext
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
|
|
|