roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
Имеет. Ограничено размером поля в БД.
Кроме того, адресация переходов виртуальной машинки ограничена 65535 байтами.
Learn, learn and learn better than work, work and work.
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 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
Автор теми
Зареєстрован(а) с: 25.09.2008
Повідомлення: 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 каждый раз создаётся заново при входе в программу и уничтожается при выходе. И это касается любых переменных, объявленных в программе.
Спасибо за подсказку по оптимизации Ява-программы!
В связи с этим возник вопрос: глобальные объявления переменных, объектов для всех Ява-программ проекта возможны?
[Повідомлення редагувалось 1 раз(ів), останній раз 30.03.2010 в 23:15.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Aleksey
Aleksey Popkov
Contributor
Зареєстрован(а) с: 31.07.2008
Повідомлення: 326
|
almaz wrote:
В связи с этим возник вопрос: глобальные объявления переменных, объектов для всех Ява-программ проекта возможны?
Помоиму такой возможности нет, хотя JavaLikeCalc, Роман улучьшает и может появиться и такое. ))))
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
almaz wrote:
В связи с этим возник вопрос: глобальные объявления переменных, объектов для всех Ява-программ проекта возможны?
Эти самые глобальные объекты нужно где-то предусматривать.
В принципе мысли по этому поводу уже были, как минимум для реализации возможности вызова функции с контекстом данных. Такой механизм позволил-бы в JavaLikeCalc вызывать сложные функции, с множеством входов и выходов просто указав контекст данных, а не пробрасывая отдельно каждый атрибут.
Кроме того, висит вопрос проброса атрибута-объекта в блочном вычислителе и других пользователях, но там ещё больше открытых вопросов.
Learn, learn and learn better than work, work and work.
|
Vorgehen
Артём Корниевский
Зареєстрован(а) с: 08.07.2012
Повідомлення: 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
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"Vorgehen" wrote:
Все выходные просидел :bang:
Незачем было стандартно-реализуемые вещи мутить через собственную реализацию, особенно если примеров в модуле пользовательского протокола найти не получается.
Learn, learn and learn better than work, work and work.
|