Comunicación c# - Siemens Simatic HMI EsRecipeView

  • 40 Respuestas
  • 6996 Vistas

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #15 : abril 09, 2015, 15:18:39 pm »
Gracias, lo pruebo y te digo.

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #16 : abril 09, 2015, 20:44:33 pm »
Hola Boris, no anduvo. Con la interface normal en c# (con los botones solos) anda bien, pero con el código de reemplazo en el botón1, al apretarlo aparece un cartel de alarma que dice:

"Excepción no controlada del tipo 'System.InvalidCastException' en Prueba1.exe
Información adicional: La conversión especificada no es válida."

No obstante, la parte de la tabla sigue funcionando normal y si apretás el segundo botón no aparece el cartel de alarma.
 

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #17 : abril 10, 2015, 07:29:33 am »
A los campos de la tabla "tortas" los definí como Int; tiene que ver?

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1707
  • Soporte Técnico
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #18 : abril 10, 2015, 12:05:36 pm »
Buen día,

Como el mensaje de error indica, tenes un problema de "Cast" es decir de conversión de un tipo de dato a otro.
Definilos como bytes para probar.

También, utiliza Convert.ToByte() para convertir el Value a Byte para probar:

   // Asignar al primer byte de transmision valor en celda en: Fila 0, Columna 0.
   DataBytes[0] = Convert.ToByte(tortasDataGridView.Rows[0].Cells[0].Value);

   // Asignar al segundo byte de transmision valor en celda en: Fila 0, Columna 1.
   DataBytes[1] = Convert.ToByte(tortasDataGridView.Rows[0].Cells[1].Value);
« Última Modificación: abril 10, 2015, 12:08:20 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #19 : abril 10, 2015, 12:17:15 pm »
Genio!!! Anda un violín. Cuando puedas indicame como hago para enviar valores mayores que un byte. Gracias

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1707
  • Soporte Técnico
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #20 : abril 10, 2015, 15:26:06 pm »
Perfecto. Dicime, que lenguaje estas usando para programar el PLC ?.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #21 : abril 10, 2015, 17:41:34 pm »
Estoy usando Ladder.

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1707
  • Soporte Técnico
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #22 : abril 10, 2015, 21:46:39 pm »
Te adjunto un proyecto en StxLadder para el PLC que espera 3 valores tipo Int32.

De acuerdo al valor del Int32 recibido, activa o no un salidas (RELAY1 a RELAY3).
Por ejemplo si  primer Int32 es igual a "2020" activa salida 1.
Para el segundo valor Int32, si es "10123" activa salida 2.
Y finalmente para el tercer valor Int32 recibido es "405060" activa la salida 3.

Recordar que cada valor Int32 recibido contiene 4 bytes, por lo tanto se enviarían 12 bytes en total.

En el PLC el componente UdpRxDataRead en la N001 del diagrama OnUdpRx.sld utiliza la opción PACKED=true para convertir 12 bytes recibidos a 3 valores Int32 en cada elemento del del Array RxData[].

En C#, deberias transformar los valores Int32 a bytes (ya que tienen 4 bytes cada uno) antes de transmitirlos, así:

Código: (C#) [Seleccionar]
private void button1_Click(object sender, EventArgs e)
{
   // Variable para retorno de estado del PLC.
   UdpRxCmdStat OnUdpRxStat = UdpRxCmdStat.OK;

   // Crear array de bytes a enviar (12 bytes).
   byte[] DataBytes = new byte[12];

   // Onbtener valor en celda en: Fila 0, Columna 0.
   Int32 Val1 = Convert.ToInt32(tortasDataGridView.Rows[0].Cells[0].Value);

   // Copiar Val1 al array de bytes.
   DataBytes[0] = (byte)(Val1 >> 0);
   DataBytes[1] = (byte)(Val1 >> 8);
   DataBytes[2] = (byte)(Val1 >> 16);
   DataBytes[3] = (byte)(Val1 >> 24);

   // Onbtener valor en celda en: Fila 0, Columna 1.
   Int32 Val2 = Convert.ToInt32(tortasDataGridView.Rows[0].Cells[1].Value);

   // Copiar Val2 al array de bytes.
   DataBytes[4] = (byte)(Val2 >> 0);
   DataBytes[5] = (byte)(Val2 >> 8);
   DataBytes[6] = (byte)(Val2 >> 16);
   DataBytes[7] = (byte)(Val2 >> 24);

   // Onbtener valor en celda en: Fila 0, Columna 2.
   Int32 Val3 = Convert.ToInt32(tortasDataGridView.Rows[0].Cells[2].Value);

   // Copiar Val3 al array de bytes.
   DataBytes[8] = (byte)(Val3 >> 0);
   DataBytes[9] = (byte)(Val3 >> 8);
   DataBytes[10] = (byte)(Val3 >> 16);
   DataBytes[11] = (byte)(Val3 >> 24);

   // Enviar los 12 bytes UDP al script con el metodo "Send".
   PioBoard.Cmd.Udp.Send(DataBytes, 12, out OnUdpRxStat);           
}

Esa es la idea, no lo he probado al código, pero lo importante es que lo entiendas.
Avísame cualquier cosa.



SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #23 : abril 11, 2015, 13:26:00 pm »
Voy a ver si me sale y te aviso. Estuve practicando para enviarla al plc al clickear sobre una fila del datagrid que equivale a un registro de receta. Si logro hacerlo con números importantes ya va a estar completo. Muchas gracias.

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #24 : abril 11, 2015, 20:35:33 pm »
Es un caño. Tuve que actualizar el firmware del Plc y luego anduvo de una. Muchas gracias

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #25 : abril 12, 2015, 17:48:04 pm »
Habrá algún modo de cambiar un dato o una fila de datos ya guardados desde un datagrid clickeando en alguna parte? Por ejemplo: para una receta tengo 570 grs. de harina y quiero cambiarlos por 400; si lo intento me da un error y se cierra la presentación. Gracias

Este es el error que aparece:

Excepción no controlada del tipo 'System.InvalidOperationException' en Prueba1.exe
Información adicional: Update requiere que UpdateCommand sea válido cuando se pasa la colección DataRow con filas modificadas.

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1707
  • Soporte Técnico
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #26 : abril 12, 2015, 20:28:26 pm »
Mmm, no tengo ejemplos de ese tipo. Probablemente debas poner la datagrid en un modo de edición:

https://msdn.microsoft.com/en-US/library/yztkd864(v=vs.80).aspx

http://www.yevol.com/vcsharp/lesson32.htm

Otra opción, es que las pongas en read-only a todas las celdas. Pero uses algunos text-box en el Form editables,
y luego con algún control numeric selecciones a cual fila de la datagrid deben cargarse los valores de los text-box
que edites.

Proba buscar algunos tutoriales en google.com sobre datagridview o ejemplos.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #27 : abril 12, 2015, 20:34:07 pm »
Gracias, lo voy a intentar:

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #28 : abril 21, 2015, 22:26:00 pm »
Hola Boris, anda todo fenómeno menos una cuestión que no sé resolver. Envío al plc 24 bytes y los desempaco bien, pero cuando quiero mandar 28 (que es lo que necesito), el receptor de datos del plc solo admite hasta 24 y se pone nervioso. De los 7 paquetes de 4 bytes hay dos que podían ser de 2 bytes y con eso ya podría manejarme con los 24 bytes que soporta el quisquilloso receptor de datos.Qué puedo hacer para enviar esa mescolanza de bytes? Te envío el programa de visual.

Código: (C#) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using stx8081;
namespace Recetas1
{
    public partial class Form1 : Form
    {
        Stx8081 PioBoard;
        public Form1()
        {
            InitializeComponent();
            // Inicializar objeto PioBoard.
            PioBoard = new Stx8081("192.168.1.81", 0);

        }

        private void componentesBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.componentesBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'database1DataSet.Componentes' Puede moverla o quitarla según sea necesario.
            this.componentesTableAdapter.Fill(this.database1DataSet.Componentes);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Variable para retorno de estado del PLC.
            UdpRxCmdStat OnUdpRxStat = UdpRxCmdStat.OK;

         
            // Crear array de bytes a enviar (24 bytes).
            byte[] DataBytes = new byte[24];

            // Onbtener valor en celda en: Fila 0, Columna 0.
            Int32 Val1 = Convert.ToInt32(componentesDataGridView.Rows[0].Cells[0].Value);

            // Copiar Val1 al array de bytes.
            DataBytes[0] = (byte)(Val1 >> 0);
            DataBytes[1] = (byte)(Val1 >> 8);
            DataBytes[2] = (byte)(Val1 >> 16);
            DataBytes[3] = (byte)(Val1 >> 24);

            // Onbtener valor en celda en: Fila 0, Columna 1.
            Int32 Val2 = Convert.ToInt32(componentesDataGridView.Rows[0].Cells[1].Value);

            // Copiar Val2 al array de bytes.
            DataBytes[4] = (byte)(Val2 >> 0);
            DataBytes[5] = (byte)(Val2 >> 8);
            DataBytes[6] = (byte)(Val2 >> 16);
            DataBytes[7] = (byte)(Val2 >> 24);

            // Onbtener valor en celda en: Fila 0, Columna 2.
            Int32 Val3 = Convert.ToInt32(componentesDataGridView.Rows[0].Cells[2].Value);

            // Copiar Val3 al array de bytes.
            DataBytes[8] = (byte)(Val3 >> 0);
            DataBytes[9] = (byte)(Val3 >> 8);
            DataBytes[10] = (byte)(Val3 >> 16);
            DataBytes[11] = (byte)(Val3 >> 24);

            // Onbtener valor en celda en: Fila 0, Columna 3.
              Int32 Val4 = Convert.ToInt32(componentesDataGridView.Rows[0].Cells[3].Value);

              // Copiar Val4 al array de bytes.
              DataBytes[12] = (byte)(Val4 >> 0);
              DataBytes[13] = (byte)(Val4 >> 8);
              DataBytes[14] = (byte)(Val4 >> 16);
              DataBytes[15] = (byte)(Val4 >> 24);

              // Onbtener valor en celda en: Fila 0, Columna 4.
              Int32 Val5 = Convert.ToInt32(componentesDataGridView.Rows[0].Cells[4].Value);

              // Copiar Val5 al array de bytes.
              DataBytes[16] = (byte)(Val5 >> 0);
              DataBytes[17] = (byte)(Val5 >> 8);
              DataBytes[18] = (byte)(Val5 >> 16);
              DataBytes[19] = (byte)(Val5 >> 24);

              // Onbtener valor en celda en: Fila 0, Columna 5.
              Int32 Val6 = Convert.ToInt32(componentesDataGridView.Rows[0].Cells[5].Value);

              // Copiar Val6 al array de bytes.
              DataBytes[20] = (byte)(Val6 >> 0);
              DataBytes[21] = (byte)(Val6 >> 8);
              DataBytes[22] = (byte)(Val6 >> 16);
              DataBytes[23] = (byte)(Val6 >> 24);

              // Onbtener valor en celda en: Fila 0, Columna 6.
              Int32 Val7 = Convert.ToInt32(componentesDataGridView.Rows[0].Cells[6].Value);

              // Copiar Val3 al array de bytes.
              DataBytes[24] = (byte)(Val7 >> 0);
              DataBytes[25] = (byte)(Val7 >> 8);
              DataBytes[26] = (byte)(Val7 >> 16);
              DataBytes[27] = (byte)(Val7 >> 24);

            MessageBox.Show("Se envía una receta");
            // Enviar los 24 bytes UDP al script con el metodo "Send".
            PioBoard.Cmd.Udp.Send(DataBytes, 24, out OnUdpRxStat);     
       


        }
    }
}

« Última Modificación: abril 22, 2015, 18:41:35 pm por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1707
  • Soporte Técnico
Re:Comunicación c# - Siemens Simatic HMI EsRecipeView
« Respuesta #29 : abril 22, 2015, 18:48:35 pm »
Buenas tardes,

En teoría podrías enviar hasta 252 bytes en un solo paquete.

¿ Que sintoma te da de que recibís mal los datos ?.

¿ Estas usando un array lo suficientemente grande en el PLC para copiar los bytes recibidos ?.

Por otro lado, fijate que en C# estas usando un array de 24 bytes:

            // Crear array de bytes a enviar (24 bytes).
            byte[] DataBytes = new byte[24];



Saludos
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com