Vai al contenuto
PLC Forum


Semplice Calcolo


Nesus

Messaggi consigliati

Ho un piccolo problema del quale non riesco a venirne a capo

in pratica con un modulo AI acquisisco un valore di temperatura che varia da 14000 bit a 21000 bit che sostanzialmente equivalgono a circa 0°C --> 100°C

prendendo un valore a caso in questo range per esempio 16000 dovrei moltiplicarlo per un coefficiente calcolato: 0.014438964 e sottrarre un offset di 199.1505113.

è un calcolo semplice che però non riesco a capire come lo interpreta nel programma visto che ci son in gioco numeri interi e numeri a virgola mobile

io ho provato così

L PEW 350	// valore dell'esempio a 16000

L 0.014438964   // coefficiente calcolato


*R


T MD 100	// in teoria dovrebbe dare 231.023424


L MD 100

L -199.1505113		//


+R


T MD 104	  //in teoria 31.8729127

grazie in anticipo!

Modificato: da Gabriele Riva
Inserito tag Code
Link al commento
Condividi su altri siti


Inserita: (modificato)

Trovato la soluzione!!!!

L	 15600

	  T	 MD	32


	  L	 MD	32

	  DTR  

	  T	 MD   220


	  L	 1.443896e-002

	  T	 MD	36


	  L	 MD   220

	  L	 MD	36


	  *R	

	  T	 MD   210


	  L	 MD   210

	  L	 -1.991505e+002


	  +R	

	  T	 "md_out_temp_cuscin_4"

Modificato: da Gabriele Riva
Inserito tag Code
Link al commento
Condividi su altri siti

Senza scomodare tutte quelle MD di appoggio, che poi magari rischi di sovrapporre in altri punti del programma, puoi fare anche così:


L 15600

DTR

L 1.443896e-002

*R

L -1.991505e+002

+R

T "md_out_temp_cuscin_4"

p.s. io non uso mai md/mw per appoggiare calcoli altrimenti devi tenerne traccia o rischi di fare casini.

casomai crea una o più variabili locali TEMP e nominale p.es. wTemp1, wTemp2 , dTemp1, rTemp1 ecc. ecc.

oppure dagli un nome coerente, sempre usando le TEMP se ti servono solo localmente, oppure MD/MW/DBW/DBD se il contenuto ti serve anche altrove, risulterà tutto più leggibile.

Modificato: da Gabriele Riva
Inserito tag CODE
Link al commento
Condividi su altri siti

Gabriele Riva

JumpMan, il codice lo devi inserire con il tag codice,

quando inserisci il codice evidenzialo e clicca sul tag: code.png?t=B8DJ5M3

Ho corretto tutti i messaggi precedenti.

Link al commento
Condividi su altri siti

Ad essere pignoli, mancherebbe un'istruzione.

Prima di convertire il dato da DINT a REAL con l'istruzione DTR, sarebbe corretto convertire il dato da INT a DINT con l'istruzione ITD.

Nel caso dell'esempio non cambia nulla perché il valore INT è compreso tra 0 e 32767.

Se il valore in formato INT fosse negativo, allora la conversione da INT a DINT diventerebbe indispensabile.

Oppure si dovrebbe inserire il dato direttamente come DINT usando la sintassi

L L#15600.

Visto però che il dato di origine in realtà sarà la lettura di un canale analogico, consiglio molto vivamente di non omettere la conversione da INT a DINT.

Link al commento
Condividi su altri siti

Inserita: (modificato)

Grazie a tutti per le risposte !

jumpMan: ho provato ad utilizzare il codice che hai scritto ma in uscita mi non mi da i valori desiderati :/ come mai?

batta : aggiungendo al codice di JumpMan la conversione ITD potrei scrivere anche:

L 15600

ITD

DTR

L 1.443896e-002

*R

L -1.991505e+002

+R

T "md_out_temp_cuscin_4"

i risultati delle singole istruzioni le appoggia nell'ACCU 2 e le riprende in automatico senza il bisogno che le richiami ogni volta?

Modificato: da Nesus
Link al commento
Condividi su altri siti

mi correggo jumpman... ora stranamente mi funziona.. a forza di salvare visto che stavo provando ad usare le variabili temporanee come mi hai detto mi si è aggiornato il valore giusto :D comunque molto utili le variabili temp comincerò ad utilizzarle più spesso!

Link al commento
Condividi su altri siti

comunque molto utili le variabili temp comincerò ad utilizzarle più spesso!

un avvertimento, essendo locali queste perdono il loro valore all'uscita, quindi usale solo per appoggi temporanei.

Non interrogare una temp prima di averla scritta, stai attento se hai dei salti e per qualche motivo vai a leggere una temp senza averla prima scritta, otterresti dei valori casuali.

Link al commento
Condividi su altri siti

JumpMan, il codice lo devi inserire con il tag codice

lo so, ma ieri ho ottenuto questo:


[color=#000000][font=helvetica, arial, sans-serif][size=2]L		[/size][/font][/color][color=#006666][font=helvetica, arial, sans-serif][size=2]15600[/size][/font][/color][font=helvetica, arial, sans-serif][size=3]


[indent=1][size=4]


[color=#000000]		  T	  MD	 [/color][color=#006666]32[/color] [color=#000000]		  L	  MD	 [/color][color=#006666]32[/color] [color=#000000]		  DTR  

		  T	  MD   [/color][color=#006666]220[/color] [color=#000000]		  L	  [/color][color=#006666]1.443896e-002[/color] [color=#000000]		  T	  MD	 [/color][color=#006666]36[/color] [color=#000000]		  L	  MD   [/color][color=#006666]220[/color] [color=#000000]		  L	  MD	 [/color][color=#006666]36[/color] [color=#000000]		  [/color][color=#666600]*[/color][color=#000000]R	

		  T	  MD   [/color][color=#006666]210[/color] [color=#000000]		  L	  MD   [/color][color=#006666]210[/color] [color=#000000]		  L	  [/color][color=#666600]-[/color][color=#006666]1.991505e+002[/color] [color=#000000]		  [/color][color=#666600]+[/color][color=#000000]R	

		  T	  [/color][color=#008800]"md_out_temp_cuscin_4"[/color][/size][/indent][/size][/font]

e poi dopo aver corretto tutto mi è sfuggito l'ITD.

Comunque, Nesus, se carichi una costante puoi anche caricare direttamente un valore a 32 bit:

L L#
15600

e omettere l'ITD

Link al commento
Condividi su altri siti

i risultati delle singole istruzioni le appoggia nell'ACCU 2 e le riprende in automatico senza il bisogno che le richiami ogni volta?

Quando usi una istruzione di caricamento (L) la cpu sposta il valore di ACCU 1 in ACCU 2 e carica il valore dell'istruzione Load in ACCU 1,

quindi se usi 2 L di fila hai il primo valore caricato in ACCU 2 e l'ultimo in ACCU 1

Se poi fai una operazione matematica, la cpu la esegue tra i 2 accumulatori e appoggia sempre il risultato in ACCU 1

se successivamente scrivi l'istruzione T la cpu prenderà sempre ACCU 1 (il risultato) e lo trasferirà, se invece usi un altro L, il risultato viene trasferito in ACCU 2 e il nuovo valore caricato in ACCU 1, quindi puoi proseguire con l'operazione successiva (tra il risultato precedente e il novo valore caricato).

Spero di essere stato chiaro, ciao

Modificato: da JumpMan
Link al commento
Condividi su altri siti

Tutto chiarissimo :) comunque non sono costanti quelle che carico ma valori che vengono da campo =) seguendo quel pezzo di codice semplificato funge alla grande ;)

Grazie

ah p.s. riguardo al <tag> dava anche a me lo stesso problema che ha dato a Jumpman :)

Modificato: da Nesus
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...