Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
6-1206621682
Vikindos
2008-03-27 15:41
2009.09.20
clientSocket посылка строкой


2-1247728376
Cobalt
2009-07-16 11:12
2009.09.20
Как сохранить число в трех однобайтовых.


2-1248097068
Константин
2009-07-20 17:37
2009.09.20
Проблема синхронизации. Подскажите.


15-1248078260
b/@.
2009-07-20 12:24
2009.09.20
Пожизненная лицензия - насколько оправдано ?


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский