Vai al contenuto
PLC Forum


aiuto program


PeppePLC16

Messaggi consigliati

Salve non è molto che programmo ma sto studiando, ho creato un programma che fa l' automazione di 2 nastri trasportatori simulando con un sensore il peso dei pacchi ogni volta che vengono posati, ho creato 2  vettori che contengono i pesi dei pacchi sul nastro che li shifta con un TON e un For ogni secondo creando cosi una FIFO automatica. Ora il mio problema è che vorrei contare i pacchi uguali fra i due vettori ... sto provando così ma incrementa sempre il conteggio dei pacchi uguali  e ovviamente escludendo quelli pari a 0 :

FOR i := 0 TO 9 DO 
FOR j := 0 TO 9 DO 
    IF (posto [i] = posto1 [j]) AND (posto [j] AND posto[i]) >0 THEN 
    count := count+1 ; 
    ELSE count := count ; 
END_IF
END_FOR
END_FOR

cosa sbagli?

Link al commento
Condividi su altri siti


Te la racconto, perchè di scriverla non ho voglia....

Quando cerchi delle uguaglianze in quel modo , nel secondo FOR ogni volta che ne trovi una devi azzerare nel secondo vettore l'elemento trovato. Sennò sovraconteggi.

Inoltre devi contare le uguaglianze anche tra gli elementi del primo vettore..

Se per esempio nel primo vettore hai 2 volte il peso 500 e nel secondo lo hai 3 volte, nel tuo sistema attuale ne conti 6, quando invece sono 5.

Modificato: da drn5
Link al commento
Condividi su altri siti

12 ore fa, Mattia Spoldi ha scritto:

fai un esempio dei pesi nei 2 vettori e che risultati vuoi ottenere, poi cerchiamo di capire dove sbagli

 

fai conto che io abbia due array di 30 real, io voglio contare quanti numeri uguali ci sono tra i due array (nel mio caso i valori all' interno dell' array shiftano da soli ogni secondo) . I pesi nel programma vengono caricati all ' interno dell' array con un sensore di peso . 

Link al commento
Condividi su altri siti

11 ore fa, drn5 ha scritto:

Te la racconto, perchè di scriverla non ho voglia....

Quando cerchi delle uguaglianze in quel modo , nel secondo FOR ogni volta che ne trovi una devi azzerare nel secondo vettore l'elemento trovato. Sennò sovraconteggi.

Inoltre devi contare le uguaglianze anche tra gli elementi del primo vettore..

Se per esempio nel primo vettore hai 2 volte il peso 500 e nel secondo lo hai 3 volte, nel tuo sistema attuale ne conti 6, quando invece sono 5.

Ciao buongiorno , non posso azzerare i pacchi sul nastro perche lo fa in automatico quando diciamo esce dal nastro e cade su di una bilancia, quindi mi occorre sapere quanti pacchi uguali ci sono sui due nastri ( visualizzati con due array) senza poter azzerare nulla perchè andrei poi a forzare ciò che è la realtà non avendo più una panoramica corretta di cosa ho attualmente sui due nastri..puoi aiutarmi?

Link al commento
Condividi su altri siti

Dato che devi solo far di conto, copiati gli elementi dei 2 vettori originali in altri 2 vettori temporanei e su quelli poi fai il conteggio.

Link al commento
Condividi su altri siti

26 minuti fa, drn5 ha scritto:

Dato che devi solo far di conto, copiati gli elementi dei 2 vettori originali in altri 2 vettori temporanei e su quelli poi fai il conteggio.

ciao grazie ho fatto come hai detto e funziona ma solo quando i pacchi si trovano nella stessa posizione ex: se in array1[5] = 5 e anche array2[5] =5 incrementa, azzera e funziona ma se non si trovano nella stessa posizione non va 

 

Link al commento
Condividi su altri siti

Roberto Gioachin
18 ore fa, PeppePLC16 ha scritto:

(posto [j] AND posto[i]) >0

Intanto verifica meglio questa istruzione, come è fatta viene fatto un AND fra due interi e poi il risultato viene comparato con zero, funziona lo stesso ma formalmente è sbagliato, dovresti fare un AND fra i risultati di due comparazioni.

Poi per quale motivo hai fatto due cicli FOR ? uno non ti bastava visto che i vettori hanno la stessa dimensione?

Modificato: da Roberto Gioachin
Link al commento
Condividi su altri siti

1 minuto fa, drn5 ha scritto:

rimetti qui il codice attuale che ci diamo un occhiata.

FOR i := 0 TO 9 DO 
FOR j := 0 TO 9 DO 
    IF (posto [i] = posto1 [j]) AND (posto [j] AND posto[i]) >0 THEN 
    count := count+1 ; posto [i] := 0 ;
    ELSE count := count ; 
    END_IF
END_FOR
END_FOR

Link al commento
Condividi su altri siti

29 minuti fa, Roberto Gioachin ha scritto:

Intanto verifica meglio questa istruzione, come è fatta viene fatto un AND fra due interi e poi il risultato viene comparato con zero, funziona lo stesso ma formalmente è sbagliato, dovresti fare un AND fra i risultati di due comparazioni.

Poi per quale motivo hai fatto due cicli FOR ? uno non ti bastava visto che i vettori hanno la stessa dimensione?

perchè mi occorre sapere i pacchi uguali anche se non si trovano nella stessa posizione 

 

Link al commento
Condividi su altri siti

Roberto Gioachin

FOR i := 0 TO 9 DO 
    IF (posto [i] = posto1 [i]) AND posto [i] >0 AND posto1[i] >0 THEN 
    count := count+1 ;
    END_IF
END_FOR

 

 

Se non ho capito male il tuo problema, secondo me sarebbe sufficiente così!

Link al commento
Condividi su altri siti

for a = 0 to 9 do

   for b =0 to 9 do

       if posto[a] <>0 and posto1[b] <>0 then

            if posto[a] = posto1[b] then

                count := count + 1;

                posto1[b] := 0;

            end_if

       end_if

   end_for

end_for

 

 

Modificato: da drn5
Link al commento
Condividi su altri siti

Roberto Gioachin
46 minuti fa, PeppePLC16 ha scritto:

perchè mi occorre sapere i pacchi uguali anche se non si trovano nella stessa posizione 

Ok, allora il discorso è diverso, devi effettivamente fare 100 verifiche.

Verifica bene questa parte " (posto [j] AND posto[i]) "  hai inserito due volte lo stesso nome variabile con puntatore diverso

Link al commento
Condividi su altri siti

2 ore fa, drn5 ha scritto:

for a = 0 to 9 do

   for b =0 to 9 do

       if posto[a] <>0 and posto1[b] <>0 then

            if posto[a] = posto1[b] then

                count := count + 1;

                posto1[b] := 0;

            end_if

       end_if

   end_for

end_for

 

 

grazie

Link al commento
Condividi su altri siti

Una cosa ancora non mi è chiara: vuoi contare quanti pacchi uguali ci sono, ma "uguali" a cosa?
Mi spiego meglio con un esempio, con array, per praticità, ridotto a 5 elementi.
Supponiamo di trovare uan situazione di questo tipo:

    Buffer A    Buffer B
0     25          30          
1     30          40
2     28          25
3     25          28
4     40          20

Ti troverai con 3 pacchi con peso 25, 2 con peso 30, 2 con peso 28, due con peso 40, 1 con peso 20.
Come fai a contarli con un solo contatore?


Butto lì un'idea, forse strampalata (ci dovrei ragionare con calma).
Crea un buffer temporaneo della dimensione di entrambi i buffer, e metti tutti i pesi in questo unico buffer.
Fai un ordinamento di tutti i pesi (per queste dimensioni di array penso che l'algoritmo più adatto per l'ordinamento sia "Bubble sort").
Poi gestisci un altro array con i contatori dei pacchi uguali.
A partire dal primo elemento dell'array con tutti i pesi incrementi il primo contatore (e magari memorizzi anche il peso) fino a quando troverai pesi uguali (escludento il peso 0). Quando cambia il peso, cominci a contare sul contatore successivo.
Per rimanere all'esempio di prima, ti ritroveresti con una cosa simile:

Peso  Nr.Pacchi
 20      1
 25      3
 28      2
 30      2
 40      2



Condivido poi le osservazioni di @Roberto Gioachin relative alla condizione logica "IF (posto [i] = posto1 [j]) AND (posto [j] AND posto[i]) >0 THEN ".
E non servere mettere "ELSE Count := Count" per non incrementare.

Modificato: da batta
Link al commento
Condividi su altri siti

11 ore fa, batta ha scritto:

Pare che il diretto interessato non sia più interessato.

 

Già, purtroppo capita che, una volta trovata la soluzione al problema, chi ha aperto la discussione sparisca senza dare ulteriori notizie.☹️

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...