PASSO 0
La CPU deve conoscere che la configurazione dei dispositivi collegati sarà gestita dal programma utente. Quindi l'opzione "abilita configurazione del dispositivo da programma utente" deve essere attiva. Nelle proprietà della CPU, l'opzione:

deve essere attivata. Passiamo ora al passo successivo dove andiamo a presentare le funzioni della libreria LCC.
PASSO 1
Useremo due funzioni della libreria:
a - LCC_ConfigDevice (FB);
b - LCC_ReconfigSys (FB).
- a -
La FB LCC_ConfigDevice richiama al suo interno la funzione di sistema "WRREC". Quest'ultima è di tipo asincrona. Richiederà più cicli per essere elaborata. La funzione "WRREC" è utilizzata per scrivere il DataSet della CPU. Vediamo ora la FB LCC_ConfigDevice.
in cui i tipi di dato delle interfacce sono:

Particolare attenzione dovrà essere dedicata alla costruzione dell'elemento dataRec .Le informazioni di configurazione risiedono proprio in quella struttura dati. Vediamo quindi come ho gestito la configurazione della mia CPU 1512SP-F-1PN.
NOTA: la CPU alla partenza comunque necessita di una configurazione base, altrimenti se il data set non è corretto passa dallo stato di avvio a quello di stop senza attivare alcuna procedura di lettura degli IO.
Utilizzo la FB LCC_ConfigDevice per configurare il rack del PLC. Nel caso della mia CPU il numero di moduli che posso andare a gestire sono 66:

come si può notare nella pagina di configurazione dell'hardware per la CPU. Di conseguenza ho creato nel PLC una struttura dati per indicare la presenza o meno di un modulo e la sua posizione nel rack. Prima di vedere la struttura dati presento il codice che ho inserito in OB100 per far si che la CPU si avvii con un data set corretto:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
"Tag_18" := FALSE; spia per verifica codice eseguito
"System".Sts.ConfigDone := "System".Sts.LccConfigOk := "System".Sts.IOconfigOk := FALSE;
FOR #index := 1 TO 66 DO
// check how many module configured
IF "Configurator".Config.PLC_IO_Configuration.RackPlc[#index].Name <> '' THEN
#Cnt := #Cnt + 1;
END_IF;
//reset all values "ohDataset".ohS71500.slots structure data
"ohDataset".ohS71500.slots[#index].NumSlot := 0;
"ohDataset".ohS71500.slots[#index].BaseTypeSlot := 0;
END_FOR;
//set the header's value
"ohDataset".ohS71500.header.blockLength := 4 + INT_TO_USINT(#Cnt) * 2;
"ohDataset".ohS71500.header.blockID := 196;
"ohDataset".ohS71500.header.type := 2; //1500SP CPU
"ohDataset".ohS71500.header.typeSub := 0;
//set the plc rack configuration accordingly to the DB
//fill the structure data with real module installed
FOR #index := 1 TO 66 DO
"ohDataset".ohS71500.slots[#index].NumSlot := "Configurator".Config.PLC_IO_Configuration.RackPlc[#index].NumMod;
"ohDataset".ohS71500.slots[#index].BaseTypeSlot := "Configurator".Config.PLC_IO_Configuration.RackPlc[#index].BaseUnitType;
END_FOR;
//reset var status
"ohDataset".ohS71500StatusID := 0;
"ohDataset".ohS71500Status := 0;
//call block library for set up the configuration
"LCC_ConfigDevice_DB"(hwID := 33,
statusID => "ohDataset".ohS71500StatusID,
status => "ohDataset".ohS71500Status,
dataRec := "ohDataset".ohS71500);
IF ("ohDataset".ohS71500Status = 0) THEN
"System".Sts.LccConfigOk := TRUE;
END_IF;
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
