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:
//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 ").
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
как правильно пользоваться данной функцией?
|