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

JavaLikeCalc


Author Message
Written on: 20. 01. 2013 [22:27]
Vorgehen
Артём Корниевский
registered since: 08.07.2012
Posts: 20
Роман Здравствуйте. Тут немного другое. Дело в том, это решение не с тензодатчиком, а для другой нужды. Тут я думаю как связать ультразвуковой дальномер urm37, работающий под собственным протоколом с преобразователем частоты в одной ява программе. Потому что пробовал разносить по разным модулям и проскакивает ошибка транспорта. Алгоритм такой. С помощью messIO шлю запрос на транспорт дальномера, принимаю ответ, извлекаю информативные байты, и отправляю в пид регулятор вызываю пид регулятор и он сравнивает с уставкой и вырабатывает регулирующее воздействие, умножаю выходную величину с пид регулятора на частоту и отправляю кадр записи в транспорт частотника. И всё это хочу в одной ява программе.. Потому что использование модулей юзер протокол и модбас не принесло должного результата. По отдельности вроде работает, а вот вместе их связать не получилось. Ошибки. Вот я и подумал что ява программа может помочь. Всё вроде сделал, и контрольная сумма вроде есть, но вот как из ASCII ввода переходить в HEX и считать не знаю. Спасибо за намёк проштудирую юзер протокол. Уж очень хочется внедрить Ваш продукт у себя на производстве.

Ну и сам датчик urm37 несколько шумный. Одно измерение из 4 - фейк. Но с этим найду как бороться.

[This article was edited 3 times, at last 20.01.2013 at 22:43.]
Written on: 20. 01. 2013 [22:54]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"Vorgehen" wrote:

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

Для этого и создан модуль Пользовательский протокол и на котором уже достаточно много подобных протоколов реализовано. А намёков на него Вы не понимаете!

"Vorgehen" wrote:

Потому что пробовал разносить по разным модулям и проскакивает ошибка транспорта.

Это по каким ещё модулям если протокол там собственный?

Вот, в модуле пользовательского протокола, для примера реализация протокола "Elemer TM510x", с CRC16:
JAVASCRIPT
//Request form:
//<mess addr="1">{req}</mess> - message tag
//  addr - remote station address (1...254)
 
io.setAttr("err","");
addr = io.attr("addr").toInt();
if(addr < 1 || addr > 254) { io.setAttr("err","1:Device address out of range 1...254"); return; }
request = ":"+addr.toString(10)+";"+io.text()+";";
//> Calc KS
KS = 0xFFFF;
for(i = 1; i < request.length; i++)
{
	KS = KS ^ request.charCodeAt(i);
	for(j = 0; j < 8; j++)
		KS = (KS&0x01) ? (KS >> 1)^0xA001 : (KS >> 1);
}
request += KS.toString(10)+"\r";
//SYS.messDebug("PRT","Request: "+request);
 
//Send request
resp = tr.messIO(request);
while(resp.length && resp[resp.length-1] != "\r")
{
	tresp = tr.messIO("");
	if(!tresp.length) break;
  	resp += tresp;
}
if(resp.length && resp.charCodeAt(0) == 0xFF) resp = resp.slice(1);
if(resp.length < 7 || resp[resp.length-1] != "\r" ||
	resp[0] != "!" || resp.slice(1).toInt() != addr || (KSpos=resp.lastIndexOf(";")) < 0)
{ io.setAttr("err","2:No or error respond"); return; }
//SYS.messDebug("PRT","Respond: "+resp);
 
//> Calc KS
KS = 0xFFFF;
for(i = 1; i < min(KSpos+1,resp.length); i++)
{
	KS = KS ^ resp.charCodeAt(i);
	for(j = 0; j < 8; j++)
		KS = (KS&0x01) ? (KS >> 1)^0xA001 : (KS >> 1);
}
if(KS != resp.slice(KSpos+1).toInt(10)) { io.setAttr("err","6:KS error."); return; }
io.setText(resp.slice(resp.indexOf(";")+1,KSpos));


Learn, learn and learn better than work, work and work.
Written on: 21. 01. 2013 [00:07]
Vorgehen
Артём Корниевский
registered since: 08.07.2012
Posts: 20
Это по каким ещё модулям если протокол там собственный?

Модуль Юзер протокол и модуль Модбас.

Вот, в модуле пользовательского протокола, для примера реализация протокола "Elemer TM510x", с CRC16:

Нету такого у меня в примерах. Могу снимок экрана отправить в доказательство. Хотя версия вроде последняя 0.8.0.4 на оси Федора.

И в примере функция charCodeAt, которая использует ASCII ввод,т.е. каждый символ переводит в ASCII где 1 не 1, а 3131.
А документацию к юзер протоколу я уже читал много раз. Буду дальше думать спасибо Вам Роман.
Written on: 21. 01. 2013 [06:39]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
Что тут думать? Алгоритм считает контрольную сумму ASCII символов шестнадцатиричных чисел и пробелов потому что строку подаёте в таком формате. На входе алгоритма в str_in нужна бинарная строка! Как закодировать в бинарную строку и декодировать полученную КС объяснил выше. Складываете входную строку с декодированной КС и получаете что нужно (str_outASCII="11 06 00 28 01 f4 0b 45 ").
JAVASCRIPT
str_inASCII="11 06 00 28 01 f4 ";
 
str_in=Special.FLibSYS.strEnc2Bin(str_inASCII);
 
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 );
 
str_outASCII=str_inASCII + Special.FLibSYS.strDec4Bin(str_out);


21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 21. 01. 2013 [08:53]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"Vorgehen" wrote:

Это по каким ещё модулям если протокол там собственный?

Модуль Юзер протокол и модуль Модбас.

Можно было и Protocol.ModBus использовать (http://wiki.oscada.org/Doc/ModBus#h592-7), тогда вопрос CRC16 вообще не стоял-бы. Причём можно его использовать прямо из DAQ.ModBus в параметре логического типа (http://wiki.oscada.org/Doc/ModBus#h592-18).

Модуль "Пользовательского протокола" это тоже, что вы делаете сейчас отдельно на JavaLikeCalc, только с выносом в него протокольно-транспортной части, оставив только часть работы с данными на DAQ.LogicLev.

"Vorgehen" wrote:

Нету такого у меня в примерах. Могу снимок экрана отправить в доказательство. Хотя версия вроде последняя 0.8.0.4 на оси Федора.

Кто Вам виноват, что его у Вас нет? 0.8.0 это LTS и он не отслеживает всех изменений, в том числе и в библиотеках файлов БД, поскольку для него только поддержка! А последнее на странице библиотеки http://wiki.oscada.org/Using/APIFunctionLibs или в дереве рабочей версии.

"Vorgehen" wrote:

И в примере функция charCodeAt, которая использует ASCII ввод,т.е. каждый символ переводит в ASCII где 1 не 1, а 3131.

И правильно! Посылка должна быть только в бинарном виде, а вид ASCII и его функции вообще предусматривался только для отладки и возможности отобразить в читабельном виде.

Learn, learn and learn better than work, work and work.
Written on: 21. 01. 2013 [09:20]
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
"Vorgehen" wrote:
Тут я думаю как связать ультразвуковой дальномер urm37, работающий под собственным протоколом с преобразователем частоты в одной ява программе.

Для разных протоколов нужно использовать разные линии связи. Потому что в какой-нибудь момент данные одного протокола могут оказаться адресами-командами другого и получите сбой в системе. Соответственно дальномер и частотник сидели бы на разных сом-портах и проблем бы не было.
"Vorgehen" wrote:
Ну и сам датчик urm37 несколько шумный. Одно измерение из 4 - фейк. Но с этим найду как бороться.

Алгоритм
http://www.termist.com/laborat/stat/otsew/otsew_01.htm
Программа (правда в маткаде, но в яву переписать несложно):
http://www.termist.com/laborat/stat/otsew/otsew_02.htm

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 21. 01. 2013 [10:03]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"almaz" wrote:

"Vorgehen" wrote:
Тут я думаю как связать ультразвуковой дальномер urm37, работающий под собственным протоколом с преобразователем частоты в одной ява программе.

Для разных протоколов нужно использовать разные линии связи. Потому что в какой-нибудь момент данные одного протокола могут оказаться адресами-командами другого и получите сбой в системе. Соответственно дальномер и частотник сидели бы на разных сом-портах и проблем бы не было.

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

Learn, learn and learn better than work, work and work.
Written on: 22. 01. 2013 [19:59]
Vorgehen
Артём Корниевский
registered since: 08.07.2012
Posts: 20
Ну и однозначно через один транспорт, если оба устройства на одном COM, а не через разные транспорты, но подключенные на один COM-порт, тогда точно чудеса будут.
Это естественно. На разные транспорты и на разные порты. Спасибо Роман.

Что тут думать? Алгоритм считает контрольную сумму ASCII символов шестнадцатиричных чисел и пробелов потому что строку подаёте в таком формате. На входе алгоритма в str_in нужна бинарная строка! Как закодировать в бинарную строку и декодировать полученную КС объяснил выше. Складываете входную строку с декодированной КС и получаете что нужно
Вчера утром прозрел. Спасибо Алмаз.

Алгоритм
http://www.termist.com/laborat/stat/otsew/otsew_01.htm
Программа (правда в маткаде, но в яву переписать несложно):
http://www.termist.com/laborat/stat/otsew/otsew_02.htm

Спасибо за неоценимую помощь Друзья.



[This article was edited 1 times, at last 22.01.2013 at 21:56.]
Written on: 07. 06. 2013 [19:41]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"almaz" wrote:

Может всё-таки есть возможность вызова подпрограммы в пределах одного и того же кода?

Есть, в виде функции funcCall(): http://wiki.oscada.org/Doc/OpisanieProgrammy#h920-10

"almaz" wrote:

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

Сейчас можно в любом логическом источнике данных такое сделать. Например, в DAQ.JavaLikeCalc создать контроллер и ряд атрибутов параметра объектного типа. Вот в эти атрибуты, как в объект можно писать что угодно, причём они будут сохраняться (руками или периодически), а затем загружаться, при старте. Инициализацию тех-же таблиц можно делать прямо в процедуре контроллера DAQ.JavaLikeCalc, а потом везде использовать.

Learn, learn and learn better than work, work and work.
Written on: 08. 10. 2016 [17:36]
tka4ev_s
Сергей Ткачев
registered since: 19.10.2014
Posts: 30
В документации нашел функцию CRC
решил посчитать контрольную сумму для MODBUS
CRC-16/MODBUS 123456789 0x8005 0xFFFF 0x4B37

CRC(123456789, 0x8005, 16, 0xffff)
rez=15739 или 0x3d7b

если реверсировать поленом
CRC(123456789, 0x4003, 16, 0xffff)
rez=5952 или 0x1740

а результат должен получиться 0x4B37
как правильно пользоваться данной функцией?



7537