Vai al contenuto
PLC Forum


Blocchi Cfc - devo fare un MOVE


Fabio66

Messaggi consigliati

Buongiorno a tutti. premetto che non ho grande esperienza con il CFC e quindi non vorrei sparare grosse imprecisioni.

Sto lavorando ad una modifica di un progetto in PCS7 sviluppato con il CFC.

Devo semplicemente spostare una word da un DB ad un'altro se un bit si trova allo stato di TRUE.

Quando il bit si trova FALSE la word ( destinazione ) non deve essere toccata poichè viene gestita da un pannello operatore

In altre parole, quando un bit va a 1 un valore che l'operatore aveva digitato attraverso un MP277, viene sovrascitto da

un valor di defalt

Non trovo nella libreria un Move come in S7, HO tentato di scrivere una Fb ( con db d'istanza ) oppure una Fc

per poi usarla come blocco all'interno del CFC, ma queste restituiscono sull'uscita sempre e comunque un valore e quindi

mi sovrascrivono la word

Con l' S7 facevo in questo modo :

UN E0.0

SPB XXX

L DB10.DBW10

T DB20.DBW10

XXX:resto del programma

Se il bit E0.0 era false, la db10.dbw20 non era toccata dal sw

Ho provato ad usare un SELECT, ma anche questo, presuppone sempre un valore in uscita, che sia IN1 oopure IN2.

Non sò che fare, magari è una banalità, ma mi sono "piantato"

Grazie a tutti coloro che mi aiuteranno

FABIO

Link al commento
Condividi su altri siti


Gianmario Pedrani

Mi sembra molto strano che CFC non abbia un blocco ti spostamento, magari non è un blocco gia fatto ma bensi un FB con quelle caratteristiche...

Un altra cosa che potresti fare all'inuizio del tuo blocco che hai scritto, e mi sembra corretto, è inserire un comando SET all'inizio di tutto, e poi prova...

ciaooooo

Link al commento
Condividi su altri siti

Allora, tu potresti costruire un blocco in AWL oppure in SCL.

AWL : FC 55
      UN    M    100.0
      SPB   m001
      L     DB10.DBW    10
      T     DB20.DBW    10
m001: NOP   0
SCL
FUNCTION FC55
VAR_TEMP
END_VAR

BEGIN;

  IF M100.0 = TRUE THEN
     DB20.DW10 := DB10.DW10;
  END_IF;    
   
END_FUNCTION
Poi, dovresti identificare nel progetto, una sorgente SCL utilizzata in un CFC/CFB e richiamare il blocco.
SCL

FC55();

Se non riesci a trovare una sorgente SCL utilizzata in un CFC/CFB, allora crea un FB in SCL coll' instance DB e costruisce un nuovo CFB in un CFC corrente oppure un nuovo CFC, richiama dal catalogo questo FB compilalo nel gruppo OB1 od OB35, e scaricalo alla CPU.

Modificato: da Savino
Link al commento
Condividi su altri siti

Grazie ragazzi. Il problema non è nello scrivere un blocco che faccia il move, il problema che il blocco ha sempre una uscita che collego alla word destinazione.

mi spiego meglio:

attualmente mi trovo un softare che elabora pid ed altro. alcuni set point vengono da un pannello operatore, inoltre c'è anche il Wcc che come supervisore.

Il cliente mi chiede che in talune condizioni il setpoint di un pid debbe essere sovracritto da un valore fisso. Supponiamo che il set sia in

DB100.DBD72

Il tutto è gia scritto in un chart CFC ( sto parlando di PCS7)

se faccio un blocchetto con quanto mi indicate, l'uscita dal blocco mi sovrascrive sempre la variabile DB100.DBD72

se faccio una fb , che ha quindi un db d'istanza mi viene sempre passata la variabile associata all'out del blocco, mentre se faccio una FC questa si appoggia

per i paramentri alle variabili locali, che comunque contengono qualcosa.

Invece io voglio sovrascrivere la DB100.DBD72 solo in determinate condizioni.

Booo ? non sò come fare.

Al momento ho risolto mettendo un blocco select il quale ha 2 ingressi che vengono portati in uscita se un bit vale 1 oppure zero

ad un ingresso ho portato sempre la stessa variabile DB100.DBD72, che ho in uscita, mentre nell'altro ingresso ho messo la costante che il cliente chiede.

Funziona ma mi pare una schifezza....

avete altre idee ?

Link al commento
Condividi su altri siti

Al momento ho risolto mettendo un blocco select il quale ha 2 ingressi che vengono portati in uscita se un bit vale 1 oppure zero

ad un ingresso ho portato sempre la stessa variabile DB100.DBD72, che ho in uscita, mentre nell'altro ingresso ho messo la costante che il cliente chiede.

Funziona ma mi pare una schifezza....

Perche'? se ho capito bene, avrei fatto anche cosi'...

Un blocco che riceve in ingresso i due Set point, a secondo dell' ENABLE, fa la selezione e lo invia in uscita... poi vai nel CFC ove si trova il PID, interrompi l'interconnessione esistente tra la variabile d'input della interfaccia del blocco e la variabile SP_IN del PID (CONT_C)... tracci delle nuove interconnessioni tra le variabili d'input e il tuo blocco select e poi l'output lo colleghi al SP_IN.

Perche dovrebbe essere una schifezza? <_<

Modificato: da Savino
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...