roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
Имеет. Ограничено размером поля в БД.
Кроме того, адресация переходов виртуальной машинки ограничена 65535 байтами.
Learn, learn and learn better than work, work and work.
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
almaz wrote:
Получилось. Программа некрасивая, но работает:
CRC = new Array
(
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
...
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
);
CRC1 = new Array
(
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
);
CRC.concat(CRC1);
А таблицу то зачем вгонять?
Проще в лоб посчитать, и не факт, что это будет дольше.
Например, для CRC 16 это:
out = 0xFFFF;
in = SYS.strFromCharCode(01,07);
for( i = 0; i < in.length; i++ )
{
out = out^in.charCodeAt(i);
for( j=0; j<8; j++ ) out = (out&1) ? ((out>>1)^0xA001) : out >> 1;
}
Исполняется 350 мкс для 10 байт.
Learn, learn and learn better than work, work and work.
|
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
|
Работа с большими массивами может пригодиться для других задач.
Подсчёт CRC16 немного переработал для выдачи сразу в строчном формате (str_in - входная строка, str_out - выходная CRC16):
out = 0xFFFF;
for( i = 0; i < str_in.length; i++ )
{
out = out^str_in.charCodeAt(i);
for( j=0; j<8; j++ ) out = (out&1) ? ((out>>1)^0xA001) : out >> 1;
}
str_out=SYS.strFromCharCode(out&0xFF,(out&0xFF00)>>8 );
Табличный подсчёт CRC16 ModBus оказался медленнее чем прямой расчёт (у меня 2000 мкс против 300 мкс для 2 байт). Хотя на С++ табличный расчёт всегда был быстрее. Видимо из-за того, что таблица в JavaLikeCalc каждый раз создаётся заново при входе в программу и уничтожается при выходе. И это касается любых переменных, объявленных в программе.
Спасибо за подсказку по оптимизации Ява-программы!
В связи с этим возник вопрос: глобальные объявления переменных, объектов для всех Ява-программ проекта возможны?
[This article was edited 1 times, at last 30.03.2010 at 23:15.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Aleksey
Aleksey Popkov
Contributor
registered since: 31.07.2008
Posts: 326
|
almaz wrote:
В связи с этим возник вопрос: глобальные объявления переменных, объектов для всех Ява-программ проекта возможны?
Помоиму такой возможности нет, хотя JavaLikeCalc, Роман улучьшает и может появиться и такое. ))))
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
almaz wrote:
В связи с этим возник вопрос: глобальные объявления переменных, объектов для всех Ява-программ проекта возможны?
Эти самые глобальные объекты нужно где-то предусматривать.
В принципе мысли по этому поводу уже были, как минимум для реализации возможности вызова функции с контекстом данных. Такой механизм позволил-бы в JavaLikeCalc вызывать сложные функции, с множеством входов и выходов просто указав контекст данных, а не пробрасывая отдельно каждый атрибут.
Кроме того, висит вопрос проброса атрибута-объекта в блочном вычислителе и других пользователях, но там ещё больше открытых вопросов.
Learn, learn and learn better than work, work and work.
|
Vorgehen
Артём Корниевский
registered since: 08.07.2012
Posts: 20
|
Алмаз спасибо Вам за ответ, но это немного не то. Дело в том что как привести к строке я разобрался, и с функцией messIO уже тоже успел. Ту другое дело.
Сейчас попробую ещё раз объяснить суть проблемы.
Есть строка 11 06 00 28 01 f4, её контрольная сумма, которую понимает прибор будет 45 0b и строка примет вид 11 06 00 28 01 f4 0b 45.
А алгоритмы которые приведены в этой теме используют функцию charCodeAt. Которая работает с кодами символов по ASCII. Она приводит строку к виду
31 31 20 30 36 20 30 30 20 32 38 20 30 31 20 66 34 и считает для неё контрольную сумму. Которая действительно равна 5bbf, т. е.
31 31 20 30 36 20 30 30 20 32 38 20 30 31 20 66 34 bf 5b. Т. е. считается контрольная сумма для ASCII кодов искомой последовательности байт.
Не понимаю как напрямую посчитать не прибегая к извлечению кодов символов по ASCII. Все выходные просидел :bang:
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"Vorgehen" wrote:
Все выходные просидел :bang:
Незачем было стандартно-реализуемые вещи мутить через собственную реализацию, особенно если примеров в модуле пользовательского протокола найти не получается.
Learn, learn and learn better than work, work and work.
|