Pregunta

Yo intente enviar ALETAS los comandos a través de UDP desde el PC (C#.NET) para PLC módulo Ethernet (Omron), pero no está recibiendo ningún responde desde el PLC y no tienen idea de donde puedo empezar de solución de problemas.

PLC tiene una muy simple lógica de escalera como sigue:Si DM100 tiene un valor de #0001, luego desencadenan en la salida 101.00.(Aquí, "Trigger" es sólo un nombre de símbolo para el área de memoria D100, y "Salida" es un símbolo para la salida 101.00) enter image description here

Luego escribí un pedazo de C# que realiza ALETAS comando de "Área de Memoria de Escritura", que tiene código de comando de 01 02, seguido por la dirección de inicio, el número de elementos a ser escrito, y la de datos.El código de C# debe escribir un valor de #0001 a los PLC D100 área para disparar en 101.00.

[suprimido el código que no funciona]..

La salida 101.00 no activar, ni recibo ninguna excepción.Me han asegurado lo siguiente:

  1. Puerto de nodo y la dirección configurada correctamente según lo confirmado por el "Trabajo en Línea" en CX-Programmer.También he ping a cada IP para asegurarse de que los nodos están conectados.
  2. El UdpClient el código es válido, ya que me escribió una muy simple servidor / cliente de código que logró enviar y recibir paquetes.
  3. Lógica de escalera no tiene ningún problema.He trasladado la escalera para PLC y probar por el Trabajo en Línea en el modo de Monitor y ajuste D100 un valor manualmente.

Sospecho que hay un error en la fins_cmnd de la matriz, pero como se ha visto en mi código, me han comentado como detalle como sea posible en cada uno de los valores;Posiblemente no pueda encontrar a mí misma falta nada.Sospecho que no será el análisis de la hexadecimal correctamente, pero de nuevo, yo no tengo ninguna excepción para que me guíe.

No tengo idea de dónde y cómo puedo solucionar.Espero que alguien de aquí con FINS programación o PLC experiencia me puede ofrecer algo de ayuda.

[RESPUESTA]
Gracias Porge por el enlace que me descubrió el problema.Después de un par de senderos para finalmente llegar a trabajar.Vea a continuación para el código de trabajo.

string SERV_IP_ADDR = "192.168.250.1";
const int FINS_UDP_PORT = 9600;

byte[] sendPacket = new byte[]
{
    // Full UDP packet: 80 00 02 00 00 00 00 05 00 19 01 02 82 00 64 00 00 01 00 01

    // Header
    0x80, //0.(ICF) Display frame information: 1000 0001
    0x00, //1.(RSV) Reserved by system: (hex)00
    0x02, //2.(GCT) Permissible number of gateways: (hex)02
    0x00, //3.(DNA) Destination network address: (hex)00, local network
    0x00, //4.(DA1) Destination node address: (hex)00, local PLC unit
    0x00, //5.(DA2) Destination unit address: (hex)00, PLC
    0x00, //6.(SNA) Source network address: (hex)00, local network
    0x05, //7.(SA1) Source node address: (hex)05, PC's IP is 192.168.250.5
    0x00, //8.(SA2) Source unit address: (hex)00, PC only has one ethernet
    0x19, //9.(SID) Service ID: just give a random number 19

    // Command
    0x01, //10.(MRC) Main request code: 01, memory area write
    0x02, //11.(SRC) Sub-request code: 02, memory area write

    // PLC Memory Area
    0x82, //12.Memory area code (1 byte): 82(DM)

    // Address information
    0x00, //13.Write start address (2 bytes): D100
    0x64, 
    0x00, //15.Bit address (1 byte): Default 0
    0x00, //16.No. of items (2 bytes): only one address which is D100
    0x01,

    // Write Data
    0x00, //18.Data to write (2 bytes): value is 1
    0x01,
};  

UdpClient client = new UdpClient(); //create a UdpClient instance

try
{
    client.Send(sendPacket, sendPacket.Length, SERV_IP_ADDR, FINS_UDP_PORT);
}
catch (SocketException se)
{
    Console.WriteLine(se.ErrorCode + ": " + se.Message);
}

client.Close();
¿Fue útil?

Solución

Ninguna de esas cadenas se analiza como hexadecimal. NumberStyles.AllowHexSpecifier permite el hexadecimal prefijo "0x", pero no analiza el número de hexadecimal a menos que esté presente.

Así que usted quiere (char)Int16.Parse("0x64", NumberStyles.AllowHexSpecifier).

Sin embargo, literales numéricos en C# puede ser hexadecimal, así que en lugar de hacer todo lo que puedes escribir 0x64 en su lugar.

He mirado a esta página como referencia para el protocolo, y también sería mejor crear el mensaje directamente como bytes en lugar de la especificación de puntos de código Unicode y decodificación de aquellos a los bytes como caracteres ASCII.También puede utilizar la matriz de especificación de sintaxis para eliminar una gran cantidad de desorden:

var message = new byte[]
{
    // header
    0x80, //(ICF) Display frame information: 1000 0001
    0x00, //(RSV) Reserved by system: (hex)00
    0x02, //(GCT) Permissible number of gateways: (hex)02
    0x00, //(DNA) Destination network address: (hex)00, local network
    0x00, //(DA1) Destination node address: (hex)00, local PLC unit
    0x00, //(DA2) Destination unit address: (hex)00, PLC
    0x00, //(SNA) Source network address: (hex)00, local network
    0x05, //(SA1) Source node address: (hex)05, PC's IP is 192.168.250.5
    0x00, //(SA2) Source unit address: (hex)00, PC only has one ethernet
    0x19, //(SID) Service ID: just give a random number 19

    // command
    0x01, //(MRC) Main request code: 01, memory area write
    0x02, //(SRC) Sub-request code: 02, memory area write

    // data
    0x82, //Memory area code, 2 bytes: 82(DM)
    0x00, //Write start address DM100
    0x64,
    0x00,
    0x00, //Word write: only one address
    0x01,
    0x00, //Write value of 1 to address DM100 (0000 0000 0000 0001)
    0x01, // - this value is 0xaabbccdd -> cc dd aa bb
    0x00, 
    0x00, 
};

También parece que hay algunos problemas con su sección de datos - según el documento vinculado a la dirección de memoria debe ser de 4 bytes, la escritura de la longitud de 2 bytes, y los valores de 4 bytes cada uno.Estos no coinciden con lo que tiene, así que hemos ampliado la sección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top