Показано с 1 по 5 из 5

Тема: ИП320 и ПК (обычный комп)

  1. #1

    По умолчанию ИП320 и ПК (обычный комп)

    Всем привет!
    Вобщем, реализовали задачку "ИП320 в качестве панели оператора с запихиванием данных из обычного компа". Сваяли самодельный modbus-клиент, часа 3 пляски с бубнами и все заработало. Но остался непонятным один момент:
    При чтении данных из ИП320 приходит набор чисел. Например, читаем два регистра, получаем в ответ:
    58
    123567
    13
    3

    67
    146523
    45
    2

    Числа от балды набраны.

    Здесь видны группы из 4 чисел, где в 1 группе 58 значение регистра, 3 (последнее число) - номер регистра, причем, почему-то, в порядковом виде (т.е., если регистры нумеруются как 0, 1, 2, 3..., то здесь 1, 2, 3, 4), в панели данный регистр имеет адрес 2.

    А вот что такое 123567 и 13? Т.е., 2 и 3-е числа в ответе.

    И еще непонятно, почему во второй группе на месте номера регистра стоит 2 (в панели регистр имеет адрес 3, т.е. тут, по логике первой группы ответа, должно быть 4). Соответственно, во второй группе 67 значение из регистра.

  2. #2

    По умолчанию

    Цитата Сообщение от Otool Посмотреть сообщение
    Всем привет!
    Вобщем, реализовали задачку "ИП320 в качестве панели оператора с запихиванием данных из обычного компа". Сваяли самодельный modbus-клиент, часа 3 пляски с бубнами и все заработало. Но остался непонятным один момент:
    Для того, чтобы ответить вам по делу, необходим пример запроса (а не только ответы) и конфигурация вашей панели.

    Пока можно сказать только, что либо глючит ваш модбас клиент, либо ошибка в панели, либо что-то еще..

  3. #3

    По умолчанию

    procedure TModbus.SendQuery(Device, Func: Byte; const Val1, Val2: Word);
    var
    MsgBuffer: string;
    CRC: Word;
    begin
    MsgBuffer := #0#0#0#0#0#0#0#0;
    MsgBuffer[1] := Chr(Device);
    MsgBuffer[2] := Chr(Func);
    MsgBuffer[3] := Chr((Val1 shr 8) and $FF);
    MsgBuffer[4] := Chr(Val1 and $FF);
    MsgBuffer[5] := Chr((Val2 shr 8) and $FF);
    MsgBuffer[6] := Chr(Val2 and $FF);
    CRC := BuildCRC(MsgBuffer, 6);
    MsgBuffer[7] := Chr(CRC and $FF);
    MsgBuffer[8] := Chr((CRC shr 8) and $FF);

    sp_Write(FPortHandle, PChar(MsgBuffer), 8);
    end;


    SendQuery(Device, F_READ_HOLDING_REGISTERS, StartAddress, Count);
    ....

    Дата выпуска панели 05.06.08.
    Последний раз редактировалось Otool; 21.08.2009 в 11:36.

  4. #4

    По умолчанию

    Вобщем, небольшое уточнение. Неправильно брали сдвиг по числу байт из ответа.
    Ситуация такая:

    На один регистр в ответе приходит 8 байт, плюс 2 байта заголовок (номер девайса и тип запроса (функция) по 1 байту).
    Из этих 8 байт первые 2 номер регистра, следующие 2 значение регистра и оставшиеся 4 какие-то непонятные числа. То ли контрольная сумма, то ли еще что.

    Согласно документации на модбас, ответ с одного регистра должен быть 2 байта, а заголовок 3 байта (1 байт девайс, 1 байт функция, 1 байт счетчик). Из-за этого у нас и была первоначальная ошибка со сдвигом.
    Т.е. у Овена какой-то свой модбас. 8 байт ответа вместо 2-х и заголовок 2 байта вместо 3-х.

    И еще, при запросе 3 регистров вместо ожидаемых 26 байт (2+8+8+8) получаем около 200 байт. Нужные только первые 26. Т.е. 200 - 26 = 174 байт мусора. Вопрос - зачем?
    Последний раз редактировалось Otool; 21.08.2009 в 13:06.

  5. #5
    Ельцов Андрей
    Гость

    По умолчанию

    пожалуйста, пришлите лог данных, которые вы посылаете в порт(панель) и ответы от панели.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •