Форум: "Начинающим";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];
ВнизWriteBuffer - error - Access violation at addr... почему??? Найти похожие ветки
← →
Zheksonz (2009-07-15 10:25) [40]
> Slym © (15.07.09 08:17) [33]
всё хорошо, но юнит требует ComPortCtrl.dcu
← →
Sha © (2009-07-15 10:26) [41]> Slym © (15.07.09 09:27) [35]
похоже, оператор
MBSetCRC16(@Query,SizeOf(Query));
надо заменить наMBSetCRC16(@Query,SizeOf(Query)-2);
← →
Zheksonz (2009-07-15 10:29) [42]прикрученые вместо него
CPort
иCPortCtl
не восприняли многие ф-ции из этого юнита.
← →
Sha © (2009-07-15 10:32) [43]> Zheksonz (15.07.09 10:20) [39]
> Может быть это связано с тем, что я просто в цикле посылал 8 байт не разворачивая их, т.е. не меняя верхний с нижним???
ДА и АД вроде разные слова
← →
Slym © (2009-07-15 10:33) [44]Sha © (15.07.09 10:26) [41]
ниче нинадоprocedure MBSetCRC16(MBCmd:PByte;Size:integer);
var
CRC:word;
i:integer;
loCRC:byte;
begin
Dec(Size,SizeOf(word));
CRC:= $FFFF;
repeat
WordRec(CRC).Lo:=MBCmd^ xor WordRec(CRC).Lo;
for i := 1 to 8 do
begin
loCRC:=lo(CRC);
CRC := (CRC shr 1);
if (loCRC and $01)<>0 then
CRC:=CRC xor $A001;
end;
inc(MBCmd);
Dec(Size);
until Size=0;
PWord(MBCmd)^:=CRC;
end;
Zheksonz (15.07.09 10:25) [40]
пользуй только [35] пост... остальное не тот модбас
← →
Zheksonz (2009-07-15 10:41) [45]
> ДА и АД вроде разные слова
это да... остаётся одно непонятно... с какой целью были сделаны все эти развороты??? неужели не проще было бы использовать более читаемую структуру запроса???
← →
Sha © (2009-07-15 10:58) [46]> Slym © (15.07.09 10:33) [44]
> ниче нинадо
Ужас. Понимаю, что хотелось упростить. Но в результате получаем лишнюю запутанность.
В процедуру вычисления CRC передаем не размер данных, подлежащих суммированию, а размер+2. Кроме того, используем различающиеся между собой TWordRec и WordRec.
> Zheksonz (15.07.09 10:41) [45]
> с какой целью были сделаны все эти развороты???
Понемногу начинаю привыкать к твоей терминологии ).
Данные передаются в представленнии big-endian с целью соблюдения протокола Modbus/
← →
Zheksonz (2009-07-15 11:05) [47]
> Sha © (15.07.09 10:58) [46]
т.е. как мне правильно отправить формируемую мной команду???, которая в шестнадцатиричном представлении выглядит вот так:0x01, 0x06, 0x00, 0x04, 0x13, 0x88, 0xC5, 0x5D
← →
Zheksonz (2009-07-15 11:07) [48]
> Slym © (15.07.09 10:33) [44]
кстати да... код не прошёл... вернее не был адекватно воспринят инвертором((( хотьMBSetCRC16(@Query,SizeOf(Query));
, хотьMBSetCRC16(@Query,SizeOf(Query)-2);
← →
Sha © (2009-07-15 11:08) [49]Так и отправь, сначала первый байт, потом второй...
← →
Zheksonz (2009-07-15 11:50) [50]
> Sha © (15.07.09 11:08) [49]
меня запутал вот этот формат... тут вообще все байты задом наперёдCmdPref = $04000601;
← →
Sha © (2009-07-15 12:10) [51]> Zheksonz (15.07.09 11:50) [50]
> тут вообще все байты задом наперёд CmdPref = $04000601
Это число такое большое. При хранении в памяти занимает 4 байта, а его адресом является адрес самого младшего байта $01. В следующем байте хранится $06, далее $00 и $04. Когда мы станем его передавать, то укажем его адрес, т.е. адрес самого младшего байта. С него и начнется передача. Затем последовательно передадутся оставшиеся байты. Получается в точности тот же эффект, как при передаче массива байтов $01, $06, $00, $04.
← →
Zheksonz (2009-07-15 12:56) [52]понятно, а байты 5 и 6, которые служат для передачи параметра и 2 байта контрольной суммы, в ДОСе, на СИ, нужно разворачивать???
← →
Sha © (2009-07-15 13:06) [53]Устройству безразлично, на каком языке написана программа и под какой ОС она выполняется.
Твоя задача - обеспечить передачу такой последовательности байт, которую требует протокол обмена.
← →
Zheksonz (2009-07-15 13:23) [54]Sha © (15.07.09 13:06) [53]
согласен, ,т.е., с точки зрения протокола ModBus, правильным будет развернуть байты данных и байты контролной суммы перед отправкой???
← →
Sha © (2009-07-15 13:39) [55]> Zheksonz (15.07.09 13:23) [54]
"с точки зрения протокола ModBus" ты должен обеспечить передачу той же последовательности байт, которую передает код из [14].
По-разному объявленные структуры должны заполняться по-разному, например:
const
CmdPref = $04000601;
type
CmdPack = packed record
Pref: integer;
Data: word;
crc16: word;
end;
......
cp.Pref:=CmdPref;
или
const
CmdPref1 = $0601;
CmdPref2 = $0400;
type
CmdPack = packed record
Pref1: word;
Pref2: word;
Data: word;
crc16: word;
end;
......
cp.Pref1:=CmdPref1;
cp.Pref2:=CmdPref2;
или
const
CmdPref1 = $01;
CmdPref2 = $06;
CmdPref3 = $00;
CmdPref4 = $04;
type
CmdPack = packed record
Pref1: byte;
Pref2: byte;
Pref3: byte;
Pref4: byte;
Data: word;
crc16: word;
end;
......
cp.Pref1:=CmdPref1;
cp.Pref2:=CmdPref2;
cp.Pref3:=CmdPref3;
cp.Pref4:=CmdPref4;
> правильным будет развернуть байты данных и байты контролной суммы перед отправкой???
На мой взгляд, лучше воздерживаться от употребления слова "развернуть",
такая "терминология" находится за гранью понимания нормального программиста.
← →
Zheksonz (2009-07-15 14:13) [56]а что, кто-то ещё считает меня нормальным программистом???)) ок. учту.
с однобайтовыми значениями понятно, а как быть с Data и crc16, которые насчитывают по 2 байта???
← →
Sha © (2009-07-15 14:21) [57]> Zheksonz (15.07.09 14:13) [56]
> ок. учту.
Просто я привык к тому, что обычно развертывают циклы, и впадаю в ступор при необходимости развернуть данные.
> а как быть с Data и crc16, которые насчитывают по 2 байта???
В точности так, как в [14].
Или ты еще раз хочешь поговорить об этом?
← →
Zheksonz (2009-07-15 14:30) [58]
> Sha © (15.07.09 14:21) [57]
спасибо огромное!
← →
Slym © (2009-07-16 04:59) [59]Zheksonz (15.07.09 11:07) [48]
procedure MBSetCRC16(MBCmd:PByte;Size:integer);
var
CRC:word;
i:integer;
loCRC:byte;
begin
Dec(Size,SizeOf(word));
CRC:= $FFFF;
repeat
WordRec(CRC).Lo:=MBCmd^ xor WordRec(CRC).Lo;
for i := 1 to 8 do
begin
loCRC:=lo(CRC);
CRC := (CRC shr 1);
if (loCRC and $01)<>0 then
CRC:=CRC xor $A001;
end;
inc(MBCmd);
Dec(Size);
until Size=0;
PWord(MBCmd)^:=CRC;
end;
попробуй поиграться c присвоением +swap как в [35] посте
PWord(MBCmd)^:=swap(CRC);
со свапом генерирует такойже црц как и твой код... да и кто мешает тебе использовать твою функцию вычисления CRC
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.008 c