PeppePLC16 Inserito: 21 febbraio Segnala Share Inserito: 21 febbraio 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 More sharing options...
PeppePLC16 Inserita: 21 febbraio Autore Segnala Share Inserita: 21 febbraio programma codesys Link al commento Condividi su altri siti More sharing options...
Mattia Spoldi Inserita: 21 febbraio Segnala Share Inserita: 21 febbraio fai un esempio dei pesi nei 2 vettori e che risultati vuoi ottenere, poi cerchiamo di capire dove sbagli Link al commento Condividi su altri siti More sharing options...
drn5 Inserita: 21 febbraio Segnala Share Inserita: 21 febbraio (modificato) 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: 21 febbraio da drn5 Link al commento Condividi su altri siti More sharing options...
PeppePLC16 Inserita: 22 febbraio Autore Segnala Share Inserita: 22 febbraio 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 More sharing options...
PeppePLC16 Inserita: 22 febbraio Autore Segnala Share Inserita: 22 febbraio 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 More sharing options...
drn5 Inserita: 22 febbraio Segnala Share Inserita: 22 febbraio 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 More sharing options...
PeppePLC16 Inserita: 22 febbraio Autore Segnala Share Inserita: 22 febbraio 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 More sharing options...
Roberto Gioachin Inserita: 22 febbraio Segnala Share Inserita: 22 febbraio (modificato) 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: 22 febbraio da Roberto Gioachin Link al commento Condividi su altri siti More sharing options...
drn5 Inserita: 22 febbraio Segnala Share Inserita: 22 febbraio rimetti qui il codice attuale che ci diamo un occhiata. Link al commento Condividi su altri siti More sharing options...
PeppePLC16 Inserita: 22 febbraio Autore Segnala Share Inserita: 22 febbraio 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 More sharing options...
PeppePLC16 Inserita: 22 febbraio Autore Segnala Share Inserita: 22 febbraio 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 More sharing options...
Roberto Gioachin Inserita: 22 febbraio Segnala Share Inserita: 22 febbraio 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 More sharing options...
drn5 Inserita: 22 febbraio Segnala Share Inserita: 22 febbraio (modificato) 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: 22 febbraio da drn5 Link al commento Condividi su altri siti More sharing options...
Roberto Gioachin Inserita: 22 febbraio Segnala Share Inserita: 22 febbraio 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 More sharing options...
PeppePLC16 Inserita: 22 febbraio Autore Segnala Share Inserita: 22 febbraio 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 More sharing options...
batta Inserita: 22 febbraio Segnala Share Inserita: 22 febbraio (modificato) 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: 22 febbraio da batta Link al commento Condividi su altri siti More sharing options...
batta Inserita: 27 febbraio Segnala Share Inserita: 27 febbraio Pare che il diretto interessato non sia più interessato. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 28 febbraio Segnala Share Inserita: 28 febbraio 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora