Отправить команду FINS с C#на ПЛК

Я пытаюсь отправить команды FINS через UDP с ПК (C#.NET)на модуль Ethernet ПЛК (Omron), но не получает никаких ответов от ПЛК и понятия не имею, где я могу начать устранение неполадок.

ПЛК имеет очень простую лестничную логику, как показано ниже:Если DM100имеет значение #0001, то происходит запуск по выходу 101.00. (Здесь «Триггер» — это просто имя символа для области памяти D100, а «Выход» — это символ для вывода 101.00) enter image description here

. Затем я написал кусок C#, который выполняет команду FINS для «Области памяти». Write" с кодом команды 01 02, за которым следует начальный адрес, количество элементов для записи и данные. Код C#должен записать значение#0001в область D100ПЛК, чтобы активировать ON на 101.00.

[удален код, который не работает]..

Выход 101.00не сработал, и я не получаю никаких исключений. Я убедился, что следующие:

  1. порт, узел и адрес настроены правильно, что подтверждается «Работа в сети» в CX-Programmer. Я также пропинговал каждый IP-адрес, чтобы убедиться, что узлы подключены.
  2. Код UdpClientдействителен, поскольку я написал очень простой код сервера/клиента, который успешно отправляет и получает пакеты.
  3. В лестничной логике нет проблем. Я передал релейную диаграмму в ПЛК и протестировал работу в режиме онлайн в режиме монитора и вручную установил значение D100.

Я подозреваю, что в массиве fins_cmndесть ошибка, но, как видно из моего кода, я максимально подробно прокомментировал каждое значение; Я не могу обнаружить, что мне чего-то не хватает. Я подозреваю, что не могу правильно разобрать шестнадцатеричное число, но опять же, у меня нет никаких исключений, которые могли бы мне помочь.

Я понятия не имею, где и как я могу устранить неполадки.Надеюсь, что здесь кто-нибудь с FINSпрограммированием или опытом работы с ПЛК сможет мне помочь.

[ОТВЕТ]
Спасибо Porge за ссылку -, благодаря которой я узнал о проблеме. После пары трасс, наконец, заставить его работать. Ниже приведен рабочий код.

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();
5
задан KMC 15 March 2012 в 00:31
поделиться