Вверх ↑
Этот топик читают: Гость
Ответов: 3851
Рейтинг: 159
#1: 2010-06-11 19:49:08 ЛС | профиль | цитата
три означенных электросчётчика объединены в сеть и подключены к компьютеру по RS-485. Элемент ComAsync с успехом обменивается с выбранным девайсом подсмотренными из другой проги сообщениями:
трассировка сообщений порта
Порт открыт процессом "Mercury.exe" (PID: 5336)

Запрос:10.06.2010 10:54:39.00864

3E 00 11 D0 >..?

Ответ:10.06.2010 10:54:39.10264 (+0.0938 seconds)

3E 00 11 D0 >..?

Запрос:10.06.2010 10:54:39.10264 (+0.0000 seconds)

3E 01 02 02 02 02 02 02 02 A8 66 >........?f

Ответ:10.06.2010 10:54:39.19564 (+0.0938 seconds)

3E 00 11 D0 >..?

Запрос:10.06.2010 10:54:39.19564 (+0.0000 seconds)

3E 08 12 97 C1 >..?A

Ответ:10.06.2010 10:54:39.28964 (+0.0938 seconds)

3E 64 E4 C4 97 04 00 32 ED >daA?..2i

Запрос:10.06.2010 10:54:39.28964 (+0.0000 seconds)

3E 08 00 17 CC >...I

Ответ:10.06.2010 10:54:39.38364 (+0.0938 seconds)

3E 01 4A 40 3E 0F 0B 07 A6 EF >.J@>...¦i

Запрос:10.06.2010 10:54:39.38364 (+0.0000 seconds)

3E 08 03 57 CD >..WI

Ответ:10.06.2010 10:54:39.47764 (+0.0938 seconds)

3E 02 02 50 AD 50 >..P­P

Запрос:10.06.2010 10:54:39.47764 (+0.0000 seconds)

3E 08 05 D7 CF >..?I

Ответ:10.06.2010 10:54:39.57064 (+0.0938 seconds)

3E 00 3E 91 DC >.>?U

Запрос:10.06.2010 10:54:39.57064 (+0.0000 seconds)

3E 08 02 96 0D >..?.

Ответ:10.06.2010 10:54:40.66464 (+0.0938 seconds)

3E 00 01 00 01 9D C5 >....?A

Порт закрыт

Поскольку существующий софт не удовлетворил потребителя, меня попросили попробовать. Дело в том, что в запросе указывается адрес, команда и CRC (2 байта). Первое понятно, второе известно, а вот CRC мне не удаётся приручить - наш "CRC16_32" даёт другой результат. В документации есть готовое решение:
Быстрый расчет CRC c полиномом MODBUS на языке Паскаль:


const srCRCHi:array[0..255] of byte = (
$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,
$00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
$00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41,
$00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40,
$01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40,
$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40,
$01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,
$00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,
$01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40,
$01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40);

srCRCLo:array[0..255] of byte = (
$00, $C0, $C1, $01, $C3, $03, $02, $C2, $C6, $06, $07, $C7, $05, $C5, $C4, $04, $CC, $0C, $0D, $CD,
$0F, $CF, $CE, $0E, $0A, $CA, $CB, $0B, $C9, $09, $08, $C8, $D8, $18, $19, $D9, $1B, $DB, $DA, 1A,
$1E, $DE, $DF, $1F, $DD, $1D, $1C, $DC, $14, $D4, $D5, $15, $D7, $17, $16, $D6, $D2, $12, $13, $D3,
$11, $D1, $D0, $10, $F0, $30, $31, $F1, $33, $F3, $F2, $32, $36, $F6, $F7, $37, $F5, $35, $34, $F4,
$3C, $FC, $FD, $3D, $FF, $3F, $3E, $FE, $FA, $3A, $3B, $FB, $39, $F9, $F8, $38, $28, $E8, $E9, $29,
$EB, $2B, $2A, $EA, $EE, $2E, $2F, $EF, $2D, $ED, $EC, $2C, $E4, $24, $25, $E5, $27, $E7, $E6, $26,
$22, $E2, $E3, $23, $E1, $21, $20, $E0, $A0, $60, $61, $A1, $63, $A3, $A2, $62, $66, $A6, $A7, $67,
$A5, $65, $64, $A4, $6C, $AC, $AD, $6D, $AF, $6F, $6E, $AE, $AA, $6A, $6B, $AB, $69, $A9, $A8, $68,
$78, $B8, $B9, $79, $BB, $7B, $7A, $BA, $BE, $7E, $7F, $BF, $7D, $BD, $BC, $7C, $B4, $74, $75, $B5,
$77, $B7, $B6, $76, $72, $B2, $B3, $73, $B1, $71, $70, $B0, $50, $90, $91, $51, $93, $53, $52, $92,
$96, $56, $57, $97, $55, $95, $94, $54, $9C, $5C, $5D, $9D, $5F, $9F, $9E, $5E, $5A, $9A, $9B, $5B,
$99, $59, $58, $98, $88, $48, $49, $89, $4B, $8B, $8A, $4A, $4E, $8E, $8F, $4F, $8D, $4D, $4C, $8C,
$44, $84, $85, $45, $87, $47, $46, $86, $82, $42, $43, $83, $41, $81, $80, $40);

const InitCRC:word = $FFFF;

function UpdCRC(C : byte; oldCRC : word) : word;

var i: byte;

arrCRC: array [0..1] of byte absolute oldCRC;

begin
i:= arrCRC[1] xor C;
arrCRC[1]:= arrCRC[0] xor srCRCHi[i];
arrCRC[0]:= srCRCLo[i];
UpdCRC:=oldCRC;
end;
// Пусть BufSend содержит подготовленный для посылки пакет длиной LengthSend байт

Crc := UpdCRC(BufSend[0],InitCRC);

For I := 1 to LengthSend-1 do Crc := UpdCRC(BufSend[I], Crc);

BufSend[LengthSend] := Crc div 256;

BufSend[LengthSend + 1] := Crc mod 256;



Пример:

Тест канала связи по адресу 00h: 00h0h1hB0h;

Тест канала связи по адресу 01h: 01h0h0h20h;
Всё нормально, плохо только, что не знаю я Паскаля. Решил покрутить наш элемент - что такое Init[/b] так и не понял и решил не трогать, и просто покрутил варианты с Type, Method и Polynom. Про Polynom выяснил, что для MODBUS возможны 3 его значения (0x8005 / 0xA001 / 0xC002). Итого 2х4х3=24 варианта - мощнейший брут дал отрицательный результат. Остался тот самый Init.

Может кто уже работал с этим MODBUS, или Меркурий-230, или знает почему наш элемент работает по другому?
Ну и вообще - кто что думает?


карма: 0
начавший
0
Ответов: 211
Рейтинг: 52
#2: 2010-06-11 20:39:30 ЛС | профиль | цитата
Andrey, Ну, по крайней мере, в приведенной реализации Init выставлен в дес. значение 65535.
Вот в этой строке const InitCRC:word = $FFFF
карма: 1
слтв
1
Голосовали:Andrey
Ответов: 3851
Рейтинг: 159
#3: 2010-06-11 21:05:22 ЛС | профиль | цитата
Minkovsky, + ТЕБЕ
куда я смотрел?
карма: 0
начавший
0
Ответов: 62
Рейтинг: 1
#4: 2010-09-02 11:03:41 ЛС | профиль | цитата
столкнувшись с меркуриями и подсчетом crc , сделал компонент для подсчета контрольной суммы - он есть в дистрибутиве hiasm.
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 85
Рейтинг: 7
#5: 2011-05-25 23:53:21 ЛС | профиль | цитата
jeka_kam писал(а):
столкнувшись с меркуриями и подсчетом crc , сделал компонент для подсчета контрольной суммы - он есть в дистрибутиве hiasm.

Речь идет о компоненте CRC16_32 (вычисление контрольных сумм по известным полиномам).

Попробовал запустить пример из ВИКИ http://ru.wikipedia.org/wiki/Modbus.
Протокол обмена Modbus, полином: A001
Код для проверки: 010F0013000A02CD01 - на выходе получал все что угодно, но нет ожидаемого 72CB.
Подскажите в чем я ошибаюсь. Вот схемка из 3 компонентов:
code_24176.txt


карма: 0

0
файлы: 1code_24176.txt [524B] [230]
Гость
Ответов: 17029
Рейтинг: 0
#6: 2011-05-28 13:54:41 правка | ЛС | профиль | цитата


Редактировалось 1 раз(а), последний 2025-01-12 10:52:01
карма: 0

0
Ответов: 62
Рейтинг: 1
#7: 2011-05-28 14:00:17 ЛС | профиль | цитата
Jek писал(а):
Подскажите в чем я ошибаюсь.


В каталоге проектов есть моя схемка для примера. Там только нужно сменить тип вычисления с ASCII на HEX.
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)