EnglishУкраїнськаmRussian
Login/New
Topic with many replies

JavaLikeCalc


Author Message
Written on: 27. 03. 2010 [07:31]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
А объём одного листа ява-программы имеет какие-нибудь ограничения?

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 27. 03. 2010 [18:15]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
Имеет. Ограничено размером поля в БД.
Кроме того, адресация переходов виртуальной машинки ограничена 65535 байтами.

Learn, learn and learn better than work, work and work.
Written on: 30. 03. 2010 [17:54]
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.
Written on: 30. 03. 2010 [23:15]
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 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 31. 03. 2010 [08:32]
Aleksey
Aleksey Popkov
Contributor
registered since: 31.07.2008
Posts: 326
almaz wrote:

В связи с этим возник вопрос: глобальные объявления переменных, объектов для всех Ява-программ проекта возможны?

Помоиму такой возможности нет, хотя JavaLikeCalc, Роман улучьшает и может появиться и такое. ))))
Written on: 31. 03. 2010 [09:04]
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.
Written on: 20. 01. 2013 [12:09]
Vorgehen
Артём Корниевский
registered since: 08.07.2012
Posts: 20
Здравствуйте уважаемые Товарищи.
JAVASCRIPT
out = 0xFFFF;
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;
}

Этот код работает но функция charCodeAt(i) извлекает код символа в ASCII. Т .е. строку 11 06 00 28 01 f4 программа воспринимает как строку 3131 3036 3030 3238 3031 6634 и даёт crc16 равная 5bbf, т. е. мы получаем строку 11 06 00 28 01 f4 bf 5b. А прибор считает не в ASCII а в HEX и там получается контрольная сумма 450b и соответственно строка получается равной 11 06 00 28 01 f4 0b 45. Пробовал заменить функцию int charCodeAt(i) на string charAt, но безрезультатно потому что типы разные. Существует ли способ посчитать crc16 в HEX методе ввода?И если да то какая функция для этого подойдёт?Или может быть результат 5bbf можно привести к виду 450b преобразованием каким-нибудь?

[This article was edited 1 times, at last 20.01.2013 at 12:13.]
Written on: 20. 01. 2013 [13:37]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
"almaz" wrote:
Подсчёт 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 );

Только вначале закодируйте Вашу строку в бинарный вид strEnc2Bin("11 06 00 28 01 f4")
http://wiki.oscada.org/Doc/FLibSYS?v=yl0#h378-29
результат декодируйте из бинарной строки strDec4Bin(str_out)
http://wiki.oscada.org/Doc/FLibSYS?v=yl0#h378-30
Функция messIO принимает передаваемую строку в бинарном виде.

[This article was edited 1 times, at last 20.01.2013 at 13:58.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 20. 01. 2013 [21:26]
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:
Written on: 20. 01. 2013 [21:44]
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.



7461