PLC: obtenga el valor absoluto del número cuando la CPU no tiene la instrucción "ABS"

-2

Estoy trabajando con un PLC "CLICK" de automationdirect. Estoy tratando de configurar una banda muerta para un valor de proceso específico X. Cuando X cambia en más de una cantidad específica, algo debería suceder.

La forma más sencilla de hacerlo es simplemente restar el valor anterior de X del valor actual. Luego, si el valor absoluto de este resultado es mayor que la banda muerta permitida, "haga algo".

Sin embargo, el PLC "CLIC" no tiene un operador de ABS, que puedo encontrar. La única forma en que puedo pensar para simular esto es haciendo SQRT (valor ^ 2), que siempre arrojará un número positivo. Pero esto parece una enorme sobrecarga, además de ciclos de CPU desperdiciados, y la probabilidad de desbordamiento cuando hay en juego números más grandes.

Supongo que podría Y el resultado con 0x7fff pero eso me obliga a trabajar con números de 16 bits (el PLC no permite operaciones AND en INT de 32 bits).

Conjunto de instrucciones "CLICK": enlace

Apreciaría cualquier consejo.

    
pregunta Ryan Griggs

2 respuestas

2

Si aún desea evitar la comparación de signos y la multiplicación por -1, puede usar el siguiente procedimiento adaptado de enlace . Inicialmente, se realiza un desplazamiento a la derecha aritmética de 31 bits (supongo que aquí, enteros con signo de 32 bits) para recuperar el bit de signo, con extensión. La idea central es deshacer el complemento de 2 si el número es negativo (restar 1 e invertir con una o exclusiva, en ese orden). Si el número es positivo, una suma y una o exclusiva se realizan con el valor cero, sin ningún efecto. El código está en C, pero puede adaptarse a sus necesidades.

#include <stdio.h>

#define BAND    15

int main() {
  int n = -20, mask;

  mask = n >> 0x1F;
  if (((n + mask) ^ mask) > BAND)
      printf("OUT OF BAND");

  return 0;
}
    
respondido por el Dirceu Rodrigues Jr
1

Si le falta una instrucción AND bitwise, aún puede realizar la operación en un rango de bits repitiendo el siguiente renglón para todos los bits,

|  A_bit_0  B_bit_0        R_bit_0  |
|---[ ]------[ ]--------------( ) --|
|                                   |

Y para bitwise OR,

|  A_bit_0                 R_bit_0  |
|--+-[ ]--+-------------------( ) --|
|  |      |                         |
|  | B_0  |                         |
|  +-[ ]--+                         |

Usando este método para OR y XOR, incluso el cambio, puede transformar el código C en lógica de escalera PLC.

    
respondido por el northerntechie

Lea otras preguntas en las etiquetas