Ir al contenido

PLC Solution Library · Herramientas de ingeniería

Calculadora 4-20 mA: escalado, shunt a 0-10 V y entrada del PLC

Para leer una señal de 4-20 mA en una entrada de 0-10 V de un PLC, pon una resistencia de 500 Ω entre la entrada y 0 V: 4 mA dan 2 V y 20 mA dan 10 V.Escálala con valor = mín + (mA - 4) / 16 x (máx - mín). Con 3,6 mA o menos, trátalo como fallo: hilo roto, sin alimentación o señal de fallo baja.

La calculadora usa los datos de las entradas analógicas de las hojas de datos del M-Duino, el Ardbox, el ESP32 PLC y el Raspberry PLC. Gratis y sin registro: el resultado siempre está en pantalla.

1Tu señal

Escribe la corriente, el valor o la lectura del PLC. Los otros dos se ajustan.

2Tu entrada del PLC

ESP32 PLC 14: las entradas AI0.0 y AI0.1 leen 4-20 mA directamente en modo 4-20 mA, sin shunt. Esta calculadora cubre las entradas de 0-10 V.

3Tu lazo

Los valores del transmisor son ejemplos: tómalos de su hoja de datos.

Resultado

Medida válida

Valor5,00 bar
En la entrada5,924 V
Lectura del PLC606 / 1023
Corriente del lazo12,00 mA
Resistencia en paralelo con la entrada
493,7 Ω
Impedancia de entrada
39 kΩ
Entrada a fondo de escala (10 V) a
20,26 mA
Lectura a 4 mA · a 20 mA
202 · 1010
Pasos útiles · bits efectivos
808 · 9,7 bit
Un paso son
19,8 µA · 0,012 bar
Ve la saturación · ve el fallo alto NE 43
no · no
Potencia de la resistencia a 20 mA · 21 mA
0,200 W · 0,221 W
Error por la tolerancia, a 20 mA
± 0,125 bar
Lazo
14,1 V libres a 20 mA (mínimo 12,0 V)

Basta con una resistencia shunt

  • Con esta resistencia la entrada llega a fondo de escala a 20,26 mA: el PLC no distingue la saturación ni el fallo alto de NAMUR NE 43 (21 mA o más). Si los necesitas, usa 477 Ω o menos, por ejemplo 470 Ω.
  • Para 500 Ω tienes el borne de carril DIN IS.ACANTO10-0.5k, con la resistencia al ±1 %.

Ver el borne IS.ACANTO10-0.5k

Conexión
24 VCC+0 VPLCI0.7GND500 ΩTransmisor2 hilos4 mA = 1,97 V · 20 mA = 9,87 V

La corriente del lazo va del transmisor a la resistencia de la entrada I0.7. El GND del PLC, la resistencia y el 0 V de la fuente comparten un punto.

Código para tu PLC · loop420.ino

// 4-20 mA transmitter on M-Duino 21+ input I0.7 (M-Duino: 0-10 Vdc, 10 bit)
// Shunt resistor of 500 ohm between I0.7 and GND turns the loop current into a voltage.
// Generated by the Industrial Shields 4-20 mA calculator: https://www.industrialshields.com/plc-solution-library/tools/4-20ma-calculator
// Check the values on your hardware with a loop calibrator before you use them.
// Arduino IDE with the Industrial Shields AVR boards package. Select your M-Duino model.

const int AI_PIN = I0_7;   // analog input used for the loop
const float ADC_MAX   = 1023.0;   // 10 bit, from the M-Duino Family datasheet
const float AI_RANGE  = 10.0;     // input range in volts
const float R_SHUNT   = 500.0;    // shunt resistor in ohm
const float R_INPUT   = 39000.0;    // input impedance in ohm (0 = not known, treated as ideal)
const float R_EQ = (R_INPUT > 0.0) ? R_SHUNT * R_INPUT / (R_SHUNT + R_INPUT) : R_SHUNT;

const float PV_MIN = 0.000;   // value at 4 mA (bar)
const float PV_MAX = 10.000;   // value at 20 mA (bar)

// NAMUR NE 43 limits in mA
const float MA_FAULT_LOW  = 3.6;   // 3.6 mA or less: broken wire or low fault signal
const float MA_RANGE_LOW  = 3.8;   // 3.6 to 3.8 mA: under range
const float MA_RANGE_HIGH = 20.5;  // 20.5 to 21 mA: over range (saturated)
const float MA_FAULT_HIGH = 21.0;  // 21 mA or more: high fault signal

const int N_SAMPLES = 16;

float readCounts() {
  uint32_t sum = 0;
  for (int i = 0; i < N_SAMPLES; i++) {
    sum += analogRead(AI_PIN);
  }
  return (float)sum / N_SAMPLES;
}

float countsToMilliamps(float counts) {
  float volts = counts * AI_RANGE / ADC_MAX;
  return volts / R_EQ * 1000.0;
}

float milliampsToValue(float mA) {
  float pv = PV_MIN + (mA - 4.0) * (PV_MAX - PV_MIN) / 16.0;
  if (PV_MIN < PV_MAX) {
    if (pv < PV_MIN) pv = PV_MIN;
    if (pv > PV_MAX) pv = PV_MAX;
  }
  return pv;
}

void setup() {
  Serial.begin(115200);
  pinMode(AI_PIN, INPUT);
}

void loop() {
  float counts = readCounts();
  float mA = countsToMilliamps(counts);
  float pv = milliampsToValue(mA);

  Serial.print(mA, 2);
  Serial.print(" mA  ");
  if (MA_FAULT_LOW >= mA) {
    Serial.println("LOOP FAULT: broken wire or low fault signal");
  } else if (mA >= MA_FAULT_HIGH) {
    Serial.println("HIGH FAULT SIGNAL from the transmitter");
  } else if (counts >= ADC_MAX - 0.5) {
    Serial.print(pv, 2);
    Serial.println(" bar  (input at full scale: the current can be higher)");
  } else {
    Serial.print(pv, 2);
    Serial.print(" bar");
    if (MA_RANGE_LOW > mA) Serial.println("  (under range)");
    else if (mA > MA_RANGE_HIGH) Serial.println("  (over range, saturated)");
    else Serial.println();
  }
  delay(500);
}

Lee 16 muestras, las pasa a mA con la resistencia y la impedancia de entrada, comprueba los límites de NAMUR NE 43 y escala el valor. M-Duino, Ardbox y ESP32 PLC: Arduino IDE con el paquete de placas de Industrial Shields. Raspberry PLC: C++ con librpiplc. Los comentarios están en inglés.

Envíame el cálculo y el código

Te enviamos esta configuración, el código y la conexión por email, y un ingeniero los revisa para tu proyecto.

Enviármelo

Cómo funciona el cálculo de 4-20 mA

Un transmisor de 4-20 mA fija una corriente entre 4 y 20 mA proporcional a lo que mide. Las entradas analógicas de las familias M-Duino, Ardbox, ESP32 PLC y Raspberry PLC miden de 0 a 10 V, así que una resistencia convierte la corriente en tensión. Estas son las fórmulas que usa la calculadora, en este orden.

  1. Resistencia que ve el lazo. La impedancia de entrada queda en paralelo con el shunt: R_eq = R x Z_in / (R + Z_in)
  2. Tensión en la entrada. Ley de Ohm: V = I x R_eq
  3. Lectura del PLC. Con una entrada de 0 a 10 V y N bits: lectura = V / 10 x (2^N - 1)
  4. Vuelta a mA en el programa. I = lectura x 10 / (2^N - 1) / R_eq
  5. Unidades de ingeniería. valor = mín + (I - 4) / 16 x (máx - mín)
  6. Fondo de escala. La entrada se satura a I_fs = 10 V / R_eq. Por encima, todas las corrientes se leen igual.
  7. Potencia de la resistencia. P = I² x R
  8. Tensión del lazo, 2 hilos. Lo que queda para el transmisor, con R_cable = 2 x longitud x 0,0175 / sección (cobre): V_tx = V_fuente - I x (R_eq + R_cable)

Entradas analógicas de los PLC de Industrial Shields para 4-20 mA

Las cuatro familias tienen entradas analógicas de 0-10 Vdc. Lo que cambia es la resolución y, en el M-Duino y el Ardbox, la impedancia de entrada de 39 kΩ que da la hoja de datos. Valores con un shunt de 500 Ω:

FamiliaResoluciónImpedancia de entradaLectura a 4 mA · 20 mAFondo de escala a
M-DuinoResolución: 10 bits (0 a 1023)Impedancia de entrada: 39 kΩLectura a 4 mA · 20 mA: 202 · 1010Fondo de escala a: 20,26 mA
Ardbox AnalogResolución: 10 bits (0 a 1023)Impedancia de entrada: 39 kΩLectura a 4 mA · 20 mA: 202 · 1010Fondo de escala a: 20,26 mA
ESP32 PLCResolución: 11 bits (0 a 2047)Impedancia de entrada: No figura (ideal)Lectura a 4 mA · 20 mA: 409 · 2047Fondo de escala a: 20,00 mA
Raspberry PLCResolución: 12 bits (0 a 4095)Impedancia de entrada: No figura (ideal)Lectura a 4 mA · 20 mA: 819 · 4095Fondo de escala a: 20,00 mA

ESP32 PLC 14: las entradas AI0.0 y AI0.1 leen 4-20 mA directamente en modo 4-20 mA, sin shunt. Esta calculadora cubre las entradas de 0-10 V.

En el M-Duino 21+, el ESP32 PLC 21+ y el Raspberry PLC 21, las entradas analógicas son I0.7 a I0.12; los modelos más grandes añaden más zonas con el mismo patrón. En el Ardbox Analog son I0.2 a I0.9.

Con una entrada ideal y 500 Ω, 20 mA caen justo en 10 V, así que el ESP32 PLC y el Raspberry PLC no tienen margen por encima de 20 mA: 470 Ω da ese margen.

Ejemplos resueltos

CasoEntradaResultado
Presión de 0 a 10 bar, M-Duino, 500 ΩEntrada: 12 mAResultado: 5,92 V, lectura 606, 5,00 bar
Nivel de 0 a 4 m, ESP32 PLC, 500 ΩEntrada: lectura 1000Resultado: 9,77 mA, 1,44 m
Temperatura de -50 a 150 °C, Raspberry PLC, 470 ΩEntrada: 21 mAResultado: 9,87 V, lectura 4042: fallo alto de NAMUR NE 43. Con 500 Ω leería 4095, fondo de escala, y el fallo parecería 150 °C.
Hilo roto, Ardbox Analog, 500 ΩEntrada: 0 mAResultado: 0 V, lectura 0: fallo, por debajo de 3,6 mA
250 Ω en un M-Duino, de 0 a 10 barEntrada: 20 mAResultado: 4,97 V, lectura 508: la mitad del rango, 0,025 bar por paso en lugar de 0,012 bar con 500 Ω
Lazo de 2 hilos a 24 V, 300 m de 0,5 mm², ESP32 PLC, 500 ΩEntrada: 20 mAResultado: Cable de 21 Ω, quedan 13,58 V para el transmisor

Cómo conectar un transmisor de 4-20 mA a una entrada de 0-10 V del PLC

  1. Elige la resistencia. 500 Ω para una entrada de 0-10 V, o 470 Ω si necesitas ver el fallo alto de NAMUR NE 43. Usa 1 % o mejor y al menos 0,5 W.
  2. Cablea el lazo. 2 hilos: +24 V al + del transmisor, el - del transmisor a la entrada analógica, y la resistencia entre la entrada y 0 V. 3 y 4 hilos: la salida del transmisor a la entrada, su 0 V al 0 V común.
  3. Comprueba la tensión del lazo. A 20 mA la fuente aún debe dejar la tensión mínima del transmisor después de la resistencia y el cable.
  4. Escala y comprueba fallos en el programa. Pasa la lectura a mA, comprueba los límites de NAMUR NE 43 y luego escala a unidades. Comprueba 4, 12 y 20 mA con un calibrador de lazo.

¿Resistencia shunt o convertidor aislado?

Basta con una resistencia shunt cuando el transmisor y el PLC comparten el mismo 0 V, el lazo tiene un solo receptor referido a masa y el cable se queda en un armario limpio. El IS.ACANTO10-0.5k es ese shunt en formato de carril DIN: un borne de paso con una resistencia de 500 Ω al ±1 %.

Usa un convertidor de señal aislado de 4-20 mA a 0-10 V cuando:

  • el transmisor o su fuente tienen otra referencia de masa, como un instrumento de 4 hilos alimentado desde otro cuadro;
  • otro equipo con la entrada referida a masa, como un segundo controlador o un registrador, lee el mismo lazo;
  • el cable va entre edificios o junto a variadores y cables de potencia, y las lecturas se mueven.

Las hojas de datos del M-Duino, el Ardbox, el ESP32 PLC y el Raspberry PLC dicen que el equipo no tiene aislamiento galvánico entre las masas de sistemas distintos, y recomiendan aisladores galvánicos cuando las masas son diferentes.

Hilo roto y saturación: límites de NAMUR NE 43

CorrienteSignificadoQué hace el programa
3,6 mA o menosFallo: hilo roto, sin alimentación o señal de fallo bajaPrograma: Alarma, sin valor
3,6 a 3,8 mAPor debajo del rangoPrograma: Valor en el mínimo de la escala, con aviso
3,8 a 20,5 mAMedida válidaPrograma: Valor escalado
20,5 a 21 mAPor encima del rango: el transmisor está saturadoPrograma: Valor en el máximo de la escala, con aviso
21 mA o másFallo: señal de fallo altaPrograma: Alarma, sin valor

Para ver las dos últimas filas, la entrada no debe saturarse antes de 21 mA. Con 500 Ω se satura entre 20,0 y 20,3 mA; con 470 Ω, entre 21,3 y 21,5 mA.

Código de ejemplo: 4-20 mA en un M-Duino

Este es el código que da la calculadora para un transmisor de 0 a 10 bar en la entrada I0.7 de un M-Duino con 500 Ω. Cambia los valores de arriba y copia tu versión desde la calculadora.

// 4-20 mA transmitter on M-Duino 21+ input I0.7 (M-Duino: 0-10 Vdc, 10 bit)
// Shunt resistor of 500 ohm between I0.7 and GND turns the loop current into a voltage.
// Generated by the Industrial Shields 4-20 mA calculator: https://www.industrialshields.com/plc-solution-library/tools/4-20ma-calculator
// Check the values on your hardware with a loop calibrator before you use them.
// Arduino IDE with the Industrial Shields AVR boards package. Select your M-Duino model.

const int AI_PIN = I0_7;   // analog input used for the loop
const float ADC_MAX   = 1023.0;   // 10 bit, from the M-Duino Family datasheet
const float AI_RANGE  = 10.0;     // input range in volts
const float R_SHUNT   = 500.0;    // shunt resistor in ohm
const float R_INPUT   = 39000.0;    // input impedance in ohm (0 = not known, treated as ideal)
const float R_EQ = (R_INPUT > 0.0) ? R_SHUNT * R_INPUT / (R_SHUNT + R_INPUT) : R_SHUNT;

const float PV_MIN = 0.000;   // value at 4 mA (bar)
const float PV_MAX = 10.000;   // value at 20 mA (bar)

// NAMUR NE 43 limits in mA
const float MA_FAULT_LOW  = 3.6;   // 3.6 mA or less: broken wire or low fault signal
const float MA_RANGE_LOW  = 3.8;   // 3.6 to 3.8 mA: under range
const float MA_RANGE_HIGH = 20.5;  // 20.5 to 21 mA: over range (saturated)
const float MA_FAULT_HIGH = 21.0;  // 21 mA or more: high fault signal

const int N_SAMPLES = 16;

float readCounts() {
  uint32_t sum = 0;
  for (int i = 0; i < N_SAMPLES; i++) {
    sum += analogRead(AI_PIN);
  }
  return (float)sum / N_SAMPLES;
}

float countsToMilliamps(float counts) {
  float volts = counts * AI_RANGE / ADC_MAX;
  return volts / R_EQ * 1000.0;
}

float milliampsToValue(float mA) {
  float pv = PV_MIN + (mA - 4.0) * (PV_MAX - PV_MIN) / 16.0;
  if (PV_MIN < PV_MAX) {
    if (pv < PV_MIN) pv = PV_MIN;
    if (pv > PV_MAX) pv = PV_MAX;
  }
  return pv;
}

void setup() {
  Serial.begin(115200);
  pinMode(AI_PIN, INPUT);
}

void loop() {
  float counts = readCounts();
  float mA = countsToMilliamps(counts);
  float pv = milliampsToValue(mA);

  Serial.print(mA, 2);
  Serial.print(" mA  ");
  if (MA_FAULT_LOW >= mA) {
    Serial.println("LOOP FAULT: broken wire or low fault signal");
  } else if (mA >= MA_FAULT_HIGH) {
    Serial.println("HIGH FAULT SIGNAL from the transmitter");
  } else if (counts >= ADC_MAX - 0.5) {
    Serial.print(pv, 2);
    Serial.println(" bar  (input at full scale: the current can be higher)");
  } else {
    Serial.print(pv, 2);
    Serial.print(" bar");
    if (MA_RANGE_LOW > mA) Serial.println("  (under range)");
    else if (mA > MA_RANGE_HIGH) Serial.println("  (over range, saturated)");
    else Serial.println();
  }
  delay(500);
}

Guías, casos y simuladores relacionados

Preguntas sobre señales de 4-20 mA

¿Qué resistencia necesito para leer 4-20 mA en una entrada de 0-10 V del PLC?

Usa 500 Ω en un M-Duino o un Ardbox: con su impedancia de entrada de 39 kΩ en paralelo, 500 Ω dan 493,7 Ω, así que 4 mA se leen como 1,97 V y 20 mA como 9,87 V.

En una entrada con impedancia ideal, como el ESP32 PLC y el Raspberry PLC de la calculadora, 500 Ω ponen 20 mA justo en 10 V, sin margen: 470 Ω da margen y permite ver el fallo alto de NAMUR NE 43.

Elige 1 % o mejor. Guía completa: Cómo convertir una señal de 4-20 mA a 0-10 V en un PLC Arduino.

¿Cómo escalo una señal de 4-20 mA a unidades de ingeniería?

Usa valor = mín + (mA - 4) / 16 x (máx - mín), donde mín es el valor a 4 mA y máx el valor a 20 mA.

Para un transmisor de 0 a 10 bar, 12 mA son 0 + 8 / 16 x 10 = 5 bar. La inversa es mA = 4 + 16 x (valor - mín) / (máx - mín).

¿Cómo detecta un PLC un hilo roto en un lazo de 4-20 mA?

Un hilo roto baja la corriente a 0 mA, por debajo del cero vivo de 4 mA.

NAMUR NE 43 trata 3,6 mA o menos como fallo, de 3,6 a 3,8 mA como por debajo del rango, de 3,8 a 20,5 mA como medida válida, de 20,5 a 21 mA como por encima del rango y 21 mA o más como fallo alto. El programa compara la corriente con estos límites antes de escalar el valor.

¿Por qué el PLC no ve 21 mA con una resistencia de 500 Ω?

Porque 500 Ω convierten 20 mA en 10 V, el máximo de una entrada de 0-10 V. Todo lo que pase de ahí se lee como fondo de escala, y el PLC no distingue el exceso de rango de un fallo alto.

Si necesitas el fallo alto de NAMUR NE 43, usa 470 Ω: el fondo de escala pasa a 21,28 mA con una entrada ideal, o a 21,53 mA en un M-Duino o un Ardbox, y pierdes un 6 % de resolución.

¿Qué potencia necesita la resistencia shunt?

P = I² x R. Una resistencia de 500 Ω disipa 0,2 W a 20 mA y 0,22 W a 21 mA. Una potencia nominal de al menos el doble, 0,5 W, la mantiene fría y estable. La calculadora da la cifra para tu resistencia.

¿Cuándo necesito un convertidor aislado en lugar de una resistencia shunt?

Basta con un shunt cuando el transmisor y el PLC comparten el mismo 0 V y ningún otro equipo con la entrada referida a masa está en el lazo.

Usa un convertidor aislado de 4-20 mA a 0-10 V cuando el transmisor o su fuente tienen otra referencia de masa, cuando otro equipo referido a masa lee el mismo lazo, o cuando un cable largo recoge ruido.

Las hojas de datos del M-Duino, el Ardbox, el ESP32 PLC y el Raspberry PLC dicen que el equipo no tiene aislamiento galvánico entre las masas de sistemas distintos.

¿Cómo leen una señal de 4-20 mA los PLC de Industrial Shields?

El ESP32 PLC 14 la lee directamente: sus entradas analógicas AI0.0 y AI0.1 tienen un modo 4-20 mA que se selecciona por software.

Las familias M-Duino, Ardbox, ESP32 PLC y Raspberry PLC tienen entradas analógicas de 0-10 Vdc (10 bits en el M-Duino y el Ardbox, 11 bits en el ESP32 PLC, 12 bits en el Raspberry PLC).

En ellas, un transmisor de 4-20 mA se conecta con un shunt de 500 Ω, como el borne de carril DIN IS.ACANTO10-0.5k, o con un convertidor aislado.

Envíame el cálculo y el código

El formulario envía tu configuración actual. Te respondemos por email con el cálculo, el código para tu PLC y la conexión, y un ingeniero los revisa para tu proyecto.

Gracias, tenemos tu cálculo

Un ingeniero de nuestro equipo te responderá por email con el cálculo, el código para tu PLC y la conexión. La calculadora de arriba conserva tus valores.