УкраїнськаEnglishmRussian
Вхід/Новий
У темі багато повідомлень

JavaLikeCalc


Автор Повідомлення
Повідомлення створено: 27. 03. 2010 [07:31]
almaz
Almaz Karimov
Contributor
Автор теми
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
А объём одного листа ява-программы имеет какие-нибудь ограничения?

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

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

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

Помоиму такой возможности нет, хотя JavaLikeCalc, Роман улучьшает и может появиться и такое. ))))
Повідомлення створено: 31. 03. 2010 [09:04]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
almaz wrote:

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

Эти самые глобальные объекты нужно где-то предусматривать.
В принципе мысли по этому поводу уже были, как минимум для реализации возможности вызова функции с контекстом данных. Такой механизм позволил-бы в JavaLikeCalc вызывать сложные функции, с множеством входов и выходов просто указав контекст данных, а не пробрасывая отдельно каждый атрибут.

Кроме того, висит вопрос проброса атрибута-объекта в блочном вычислителе и других пользователях, но там ещё больше открытых вопросов.

Learn, learn and learn better than work, work and work.
Повідомлення створено: 20. 01. 2013 [12:09]
Vorgehen
Артём Корниевский
Зареєстрован(а) с: 08.07.2012
Повідомлення: 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 преобразованием каким-нибудь?

[Повідомлення редагувалось 1 раз(ів), останній раз 20.01.2013 в 12:13.]
Повідомлення створено: 20. 01. 2013 [13:37]
almaz
Almaz Karimov
Contributor
Автор теми
Зареєстрован(а) с: 25.09.2008
Повідомлення: 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 принимает передаваемую строку в бинарном виде.

[Повідомлення редагувалось 1 раз(ів), останній раз 20.01.2013 в 13:58.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 20. 01. 2013 [21:26]
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:
Повідомлення створено: 20. 01. 2013 [21:44]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"Vorgehen" wrote:

Все выходные просидел :bang:

Незачем было стандартно-реализуемые вещи мутить через собственную реализацию, особенно если примеров в модуле пользовательского протокола найти не получается.

Learn, learn and learn better than work, work and work.



2717