2012-03-14 73 views
6

intento enviar FINS comandos a través de UDP desde el PC (C# .NET) al módulo PLC Ethernet (Omron), pero no se ha hecho responde desde el PLC y no tienen idea de dónde puede comenzar a solucionar problemas.Enviar comando FINS de C# para PLC

PLC tiene una lógica de escalera muy simple de la siguiente manera: Si DM100 tiene valor de #0001, y dispare 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

Entonces escribí un pedazo de C# que realiza comando FINS de "Área de escritura en memoria" que tiene el código de comando 01 02, seguido por la dirección inicial, el número de elementos a escribir y los datos. El código C# debe escribir un valor de # 0001 en el área D100 del PLC para activar ON en 101.00.

[código de borrado que no funciona] ..

La salida 101.00 no se disparará, ni yo recibe ninguna excepción. Me he asegurado lo siguiente:

  1. puerto, nodo y la dirección configurada correctamente según lo confirmado por el "trabajo en línea" en CX-Programmer. También he hecho ping a cada IP para asegurarme de que los nodos estén conectados.
  2. El código UdpClient es válido ya que escribí un código de servidor/cliente muy simple que envía y recibe paquetes con éxito.
  3. La lógica de escalera no tiene ningún problema. Transferí la escalera al PLC y realicé la prueba de Work Online en modo Monitor y establecí el valor manualmente en D100.

Sospecho que hay error en la matriz fins_cmnd, pero como se ve en mi código, como han comentado los detalles posibles sobre cada valor; No puedo encontrarme perdiendo nada. Sospecho que no puedo analizar el hexadecimal correctamente, pero una vez más, no tengo ninguna excepción para guiarme. No tengo ni idea de dónde y cómo puedo solucionar los problemas. Espero que alguien aquí con FINS programación o experiencia en PLC me pueda ofrecer algo de ayuda.

[respuesta]
Gracias Porge para el enlace - Eso me encontré con el problema. Después de un par de senderos finalmente lograr que funcione. Vea a continuación 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(); 

Respuesta

6

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

Entonces querrías (char)Int16.Parse("0x64", NumberStyles.AllowHexSpecifier).

Sin embargo, los literales numéricos en C# pueden ser hexadecimales, por lo que en lugar de hacer todo lo que puede, simplemente escriba 0x64.

Acabo de mirar this page as a reference para el protocolo, y también sería mejor crear el mensaje directamente como bytes en lugar de especificar puntos de código Unicode y decodificarlos en bytes como ASCII. También puede utilizar la sintaxis de especificación de matriz 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 - de acuerdo con el documento vinculado la dirección de memoria debe ser de 4 bytes, la escritura longitud 2 bytes, y los valores 4 bytes cada uno. Estos no coinciden con lo que tienes, por lo que he ampliado esa sección.

+0

La memoria es, sí, 4 bytes, por lo tanto, tengo dos elementos de la matriz uno 0x00 y 0x64 juntos 4 bytes. porque cada "sección" solo toma 16 bits. – KMC

+0

@KMC: he expandido la parte de 'datos' en función de lo que creo que debe parecerse a una página determinada. ¿Ayuda? – porges