PDA

Просмотр полной версии : ИП320 и ПК (обычный комп)



Otool
21.08.2009, 07:52
Всем привет!
Вобщем, реализовали задачку "ИП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 значение из регистра.

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


Для того, чтобы ответить вам по делу, необходим пример запроса (а не только ответы) и конфигурация вашей панели.

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

Otool
21.08.2009, 11:34
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, 12:26
Вобщем, небольшое уточнение. Неправильно брали сдвиг по числу байт из ответа.
Ситуация такая:

На один регистр в ответе приходит 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 байт мусора. Вопрос - зачем?

Ельцов Андрей
28.08.2009, 09:22
пожалуйста, пришлите лог данных, которые вы посылаете в порт(панель) и ответы от панели.