Vai al contenuto
PLC Forum


Cast Da Dint A Int - In KOP


pablo.mrg

Messaggi consigliati

Ciao a tutti,

non riesco a trovare una funzione che mi consenta di trasformare un DINT in un INT.

In pratica devo passare da un numero reale (che varia da 0.0 a 50.0, gli Hz di un inverter per intenderci) alla sua rappresentazione intera che varia da 0 a 16383...

Link al commento
Condividi su altri siti


In effetti mi sembra che nel siemens 300 non sia possibile rispetto al 200 effettuare tale conversione,comunque in alternativa potresti estrarre dal dato dint la word o i primi 16 bit meno significativi del tuo dato in formato doppia parola.

Ciao

Link al commento
Condividi su altri siti

Per trasformare un numero reale in un numero intero, lo devi prima

convertire in un numero intero a 32 bit (DINT)

Nel gruppo delle operazioni di conversione l'editor Step7 mette

a disposizione 4 funzioni per questo scopo

ROUND: Arrotonda il numero reale al numero intero più vicino

TRUNC: Come sopra ma nel caso il numero sia a metà fra l'intero superiore e l'inferiore

ad esempio 1.5, arrotonda sempre all'itero inferiore

CEIL: Arrotonda sempre all'intero superiore

FLOOR: Arrotonda sempre all'intero inferiore

Tutte queste funzioni accettano come uscita un valore intero a 32 bit (DINT)

se le utilizzi negli editor KOP e FUP in AWL potresti scrivere:

L MDxx (numero da convertire)

(normalizzazione)

ROUND

T MWxxx (numero convertito)

Naturalmente devi essere certo al 100x100 che il numero intero risultato della conversione

sia >-32768 e <32767

Link al commento
Condividi su altri siti

Grazie mille,

in effetti cercavo una funzione "pronta" da tirar dentro nel KOP, alla fine ho scritto questa in AWL:

     
      L     #Frequenza
      L     1.000000e+002               // save 2 decimal
      *R                                // 100 * #drive_f_setpoint (ACCU2 * ACCU1)
      RND                               // conversion of a 32-bit IEEE floating-point number to 32-bit integer
      L     16384                       // 16384 = 4000HEX (rif 50Hz)
      *D                                // freq * 16384
      L     5000
      /D                                // (freq * 16384)/5000
      T     #FrequenzWord               // store computed set point in #SEND.f_setpoint

Link al commento
Condividi su altri siti

Non voglio fare il mestrino pignolo anche perchè non ho il diritto per esserlo

però io avrei scritto:

      L     #Frequenza
      L     1.000000e+002               // save 2 decimal
      *R                                // 100 * #drive_f_setpoint (ACCU2 * ACCU1)
      L     1.638400e+001                       // 16384 = 4000HEX (rif 50Hz)
      *R                                // freq * 16384
      L     5.000000e+001
      /R                                // (freq * 16384)/5000
      RND                               // conversion of a 32-bit IEEE floating-point number to 32-bit integer
      T     #FrequenzWord               // store computed set point in #SEND.f_setpoint

Link al commento
Condividi su altri siti

In effetti sembra meglio anche a me...

Quella scritta da "me" è in realtà estrapolata da una FC in AWL che gestisce il MM420, credo sia quella del tutorial, per cui l'avevo presa per buona e debuggata. P

roverò anche questa versione, grazie mille

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