Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.20;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.012 c
2-1247657431
Цукор5
2009-07-15 15:30
2009.09.20
HKEY_CURRENT_USER и юзеры


2-1247757748
antonn
2009-07-16 19:22
2009.09.20
как глянуть строку с AV в DLL? :)


15-1248210928
J
2009-07-22 01:15
2009.09.20
Помогите прочесть архив.


2-1247762842
fics)
2009-07-16 20:47
2009.09.20
Отчет в *.RTF


2-1247747799
Canya
2009-07-16 16:36
2009.09.20
Работа с Cookies Internet Explorer