Guardamos etiquetas del sistema SCADA / Sudo Null IT News

Más a menudo en SCADA Los sistemas utilizan licencias pagas que especifican un número limitado de etiquetas con las que puede trabajar, si desea más etiquetas (para recibir más señales de SOCIEDAD ANÓNIMA), entonces tendrás que pagar más. Naturalmente, es posible que quieras ahorrar un poco y salir de la situación limitándote a menos etiquetas, para ello tendrás que hacer un poco de trampa, que es sobre lo que me gustaría escribir.

La opción más sencilla, que también utilicé en nuestros proyectos, es utilizar etiquetas analógicas en lugar de etiquetas discretas: se pueden sustituir 16 señales discretas por una palabra. Pero obtener el bit requerido de una palabra usando SCADA es una tarea bastante simple. En Intouch, por ejemplo, al programar la respuesta al presionar un botón, un script que restablece el bit 4 puede verse así:

Y si necesitas, por el contrario, escribir 1 allí, entonces la fórmula será la siguiente: EMG_DO_W = EMG_DO_W | 0x0010 La función de cambiar el color de un elemento de visualización según el bit de estado parece similar (por ejemplo, mostré una comparación con un número decimal):

De esta forma sencilla, puedes guardar fácilmente 15 etiquetas (1 etiqueta en lugar de 16), pero aun así, incluso de esta manera sólo se ocupa 1 etiqueta. Pero puedes ir más allá y, en algunos casos, prescindir de ninguna etiqueta. Por ejemplo, existe un bloque estándar, el llamado Ready16, un bloque que indica la preparación del mecanismo y que consta de 16 condiciones (también 16 bits se convierten en una palabra); si no se cumple alguna de las condiciones, se inicia El mecanismo no es posible y, por lo tanto, para comprobar por qué podría ser así, es necesario resaltar las condiciones necesarias para el operador. Así es como podría verse:

¿Y cómo se pueden guardar etiquetas en este caso? Por eso, los sistemas SCADA suelen tener una capacidad incorporada para iniciar programas externos mediante scripts. La idea es simple: ejecutar un programa con la interfaz del bloque Redi16 dibujada de antemano, que a su vez se conectará al controlador, tomará la señal deseada y dibujará el estado del bloque en este momento. Un script al hacer clic en un botón, que especifica la dirección de la señal que debe recibir el programa; para mayor versatilidad, puede transmitir el texto del error, el título de la ventana, etc. Aquí está el script que hice para iniciar un programa externo en Intouch:

FileDelete ("c:\Ready16\text.txt");
DIM f AS MESSAGE;
f =" f:"+StringChar(34)+ "\Ready16\text.txt"+StringChar(34);
FileWriteMessage("c:\Ready16\text.txt",-1,"Готов к работе/в работе",1);
FileWriteMessage("c:\Ready16\text.txt",-1,"Ошибка Привода",1);
FileWriteMessage("c:\Ready16\text.txt",-1,"Связь с Приводом ОК",1);
FileWriteMessage("c:\Ready16\text.txt",-1,"Привод отвечает на команды ",1);
FileWriteMessage("c:\Ready16\text.txt",-1,"Ошибка Тормоза",1);
FileWriteMessage("c:\Ready16\text.txt",-1,"Разъединитель силовой цепи",1);
DIM h AS MESSAGE;
h =" h:"+StringChar(34)+ "40 - Станция Натяжения №2 Ролик №1"+StringChar(34);

StartApp "C:\Ready16\Ready16.exe "+h+f+" s:D800"+" l:D801"+" a:D802.1";

Eliminamos el texto antiguo, agregamos texto nuevo al archivo de texto, agregamos direcciones y encabezados y transferimos todo esto a nuestro programa. Inicialmente, quería pasar textos de error como argumentos, pero en Windows hay un límite en la longitud de los argumentos (obtuve 260 caracteres, como se menciona en aquí en los comentarios). También en Intach, la longitud de un mensaje de tipo mensaje también tiene su propio límite de 160 caracteres. En general, la forma más sencilla es intercambiar mensajes a través de un archivo.

El programa en sí está escrito en base a una biblioteca gratuita en C#. HslComunicación-Comunidad. Es muy extraño que al descargar un programa terminado de GitHub, Windows Defender se quejara de que contenía virus, aunque al verificar virustotal no se encontró nada. El código fuente de mi programa está aquí: Listo 16.

También se realizó un experimento para mostrar el estado de los bloques Ready16 al abrir la ventana correspondiente en la HMI. Puede adjuntar un script que se ejecutará antes de que se dibuje la interfaz de la ventana HMI. El script le pedirá la dirección del estado del bloque y ahora podrá resaltar los bloques en los colores apropiados:

DIM res AS MESSAGE;
OLE_CreateObject(%WS,"Wscript.Shell");
%WS.RegWrite("HKEY_CURRENT_USER\Software\ready16\value",0,"REG_DWORD");

res = %WS.Run("C:\Ready16\ReadWord.exe s:D800",2,1);
result = %WS.RegRead("HKEY_CURRENT_USER\Software\ready16\value");

En este ejemplo el intercambio entre programas se organiza mediante el registro de Windows, aunque también se podría realizar a través de un archivo intermedio. Simplemente me pareció que el registro funciona más rápido, corríjanme si me equivoco. Al ejecutar la función %WS.Ejecutar Puede usar los parámetros para iniciar la ventana en modo oculto, pero lo principal es habilitar el último parámetro WaitOnReturn, donde 1 significa que el script que inició el programa esperará a que se complete y solo entonces continuará con su script. En este caso, escribirá el estado del registro (en el que nuestro programa escribirá el estado de la palabra en la dirección D800 del controlador) en la etiqueta de resultado global.

PD: estos trucos no son de los desarrolladores ni para ellos, son más para aquellos que usan sistemas ya preparados que tienen restricciones de etiquetas en su proyecto.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *