On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение



ссылка на сообщение  Отправлено: 12.09.16 15:28. Заголовок: Соединить строку без Gather


Здравствуйте!
Получаем строку от Кулмастера примерно такого вида:
Stat3\x0D\x0A100 OFF 32C 30C Med Fan OK 0\x0D\x0A101 OFF 16C 26C Med Fan OK 0\x0D\x0A102 OFF 24C 25C Low Fan OK 0\x0D\x0A103 OFF 32C 29C Low Fan OK 0\x0D\x0A104 OFF 32C 28C Low Fan OK 1\x0D\x0A105 OFF 32C 29C Low Fan OK 0\x0D\x0A106 ON 32C 28C Low Fan OK 1\x0D\x0AOK\x0D\x0A>\x0D\x0A>
Но по Comу он приходит поделенным на 3 куска зачастую. А задача стоит для всех шести кондиционеров снять значения температуры и вкл/выкл
Можно это как-то соединить в одну строку?? Судя по всему gather здесь не поможет, потому что из-за возможности быть значению ON или OFF длина строки может измениться 6 символов. И очень вряд ли, но все же - когда температура станет меньше 10 градусов - тоже самое.
Как можно поступить?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 26 , стр: 1 2 All [только новые]







ссылка на сообщение  Отправлено: 12.09.16 16:50. Заголовок: marty_iron, это тот ..


marty_iron, это тот случай когда надо использовать SIMPL+. Поднимаете BUFFER_INPUT. Представляете себе идеальную строку символов, которую нужно получить для корректной обработки данных, и определяете ее уникальные признаки. Например, она должна быть определенной длины, заканчиваться определенной последовательностью символов и т.д. По каждому изменению содержимого буфера прибавляете его к промежуточной строковой переменной и анализируете ее на предмет соответствия требованиям к идеальной строке. Если строка идеальна, отправляете ее на дальнейшую обработку и очищаете буфер. Если не идеальна, очищаете буфер и ждете дальнейших изменений его содержимого.
PS. На мой взгляд, задача изначально поставлена некорректно. В приведенной строке видны данные по всем шести кондиционерам. Видимо, данная строка является неким возвратом статуса шлюза. В подобной ситуации я бы не собирал данную строку воедино, а напротив - формировал бы из нее раздельные строки данных по каждому кондиционеру, приняв в качестве уникального признака последовательность \x0D\x0A. В итоге получились бы строки вида:
Stat3\x0D\x0A
100 OFF 32C 30C Med Fan OK 0\x0D\x0A
101 OFF 16C 26C Med Fan OK 0\x0D\x0A
102 OFF 24C 25C Low Fan OK 0\x0D\x0A
103 OFF 32C 29C Low Fan OK 0\x0D\x0A
104 OFF 32C 28C Low Fan OK 1\x0D\x0A
105 OFF 32C 29C Low Fan OK 0\x0D\x0A
106 ON 32C 28C Low Fan OK 1\x0D\x0A
OK\x0D\x0A
>\x0D\x0A

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 12.09.16 17:22. Заголовок: Igor но там бывают с..


Igor но там бывают случаи когда он ее делит например так
Stat3\x0D\x0A100 OFF 32C 30C Med Fan OK 0\x0D\x0A10
1 OFF 16C 26C Med Fan OK 0\x0D\x0A102 OFF 24C 25C Low Fan OK 0\x0D\x0A103 OFF 32C 29C Low Fan OK 0\x0D\x0A104 OFF 3
2C 28C Low Fan OK 1\x0D\x0A105 OFF 32C 29C Low Fan OK 0\x0D\x0A106 ON 32C 28C Low Fan OK 1\x0D\x0AOK\x0D\x0A>\x0D\x0A>

как тогда быть?

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 12.09.16 17:31. Заголовок: Timings подкрутить? ..


Timings подкрутить?

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 12.09.16 17:32. Заголовок: p.vladi поясните?..


p.vladi поясните?

Спасибо: 0 
ПрофильЦитата Ответить





ссылка на сообщение  Отправлено: 12.09.16 17:39. Заголовок: marty_iron, прежде в..


marty_iron, прежде всего проверить настройки интерфейса, например, на предмет скорости обмена данными, попробовать изменить скорость. Проверить прошивки CoolMaster и Crestron. Словом, исключить все прочие варианты решения проблемы, и уж потом программить.
Вы привели 5 строк. В первой есть две полноценные строки
Stat3\x0D\x0A
100 OFF 32C 30C Med Fan OK 0\x0D\x0A

и один обрывок
10

Полноценные строки вынимаем из буфера и отправляем на дальнейшую обработку. "10" записываем в промежуточную переменную.
Во второй строке есть обрывок
1 OFF 16C 26C Med Fan OK 0\x0D\x0A

полноценная строка
102 OFF 24C 25C Low Fan OK 0\x0D\x0A

и еще один обрывок
103 OFF 32C 29C Low Fan OK

К обрывку "10", записанному ранее в промежуточную строковую переменную, приклеиваем первый обрывок из новой строки, получаем полноценную строку
101 OFF 16C 26C Med Fan OK 0\x0D\x0A

и отправляем ее на дальнейшую обработку.
Нанести, смыть, повторить

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 12.09.16 20:28. Заголовок: Igor большое спасибо..


Igor большое спасибо!
но последний вопрос
никогда не пользовался BUFFER_INPUT, чем он отличается от остальных?

Спасибо: 0 
ПрофильЦитата Ответить





ссылка на сообщение  Отправлено: 12.09.16 20:42. Заголовок: marty_iron, BUFFER_I..


marty_iron, BUFFER_INPUT - один из способов введения в модуль SIMPL+ строковых (serial) данных. В отличие от STRING_INPUT, содержимое которого полностью замещается на новое при изменении входной строки, в случае BUFFER_INPUT новые данные выстраиваются за уже имеющимися в буфере. Это очень важно как раз в случаях, подобных вашему. Есть и обратная сторона - нужно полностью осознавать реализуемый вами алгоритм обработки данных BUFFER_INPUT, в частности - не допускать пепеполнения и вовремя очищать буфер.
Вообще, этот вопрос лучше адресовать тем кто профессионально занимается программированием. Или почитать справку.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 12.09.16 21:32. Заголовок: Igor а как его очист..


Igor а как его очистить? это же входная величина

Спасибо: 0 
ПрофильЦитата Ответить





ссылка на сообщение  Отправлено: 12.09.16 21:46. Заголовок: Это есть в справке к..


Это есть в справке к SIMPL+.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




ссылка на сообщение  Отправлено: 12.09.16 23:21. Заголовок: Загрузите все вариан..


Загрузите все варианты приходящих строк в Excel и проанализируйте их состав и длину.
Не поддавайтесь на советы, где предлагают многоэтажные программы, все решается гораздо проще.


Спасибо: 0 
ПрофильЦитата Ответить





ссылка на сообщение  Отправлено: 12.09.16 23:43. Заголовок: #DEFINE_CONSTANT min..


#DEFINE_CONSTANT min_hvac 100
#DEFINE_CONSTANT max_hvac 106

BUFFER_INPUT from_coolmaster[5000];
DIGITAL_OUTPUT HVAC_POWER[7];
ANALOG_OUTPUT HVAC_T1[7],HVAC_T2[7];

STRUCTURE HVAC_structure
{
integer POWER;
integer t1;
integer t2;
};

HVAC_structure HVAC[max_hvac];

Function PrintParameters()
{
integer k;
for(k=min_hvac to max_hvac)
{
HVAC_POWER[k]=HVAC[k].POWER;
HVAC_T1[k]=HVAC[k].t1;
HVAC_T2[k]=HVAC[k].t2;
}
}

Function FuncWaitStop()
{
wait(20,parser)
{
PrintParameters();
}
}

THREADSAFE CHANGE from_coolmaster
{
integer pos1,pos2,pos3,HVAC_number;
string TmpString$[200];

while(find("\x0A\x0D",from_coolmaster)>0)
{
pos1=find("\x0A\x0D",from_coolmaster);
TmpString$=RemoveByLength(pos1+1,from_coolmaster);
if(find("FAN OK",TmpString$)>0)
{
pos1=find("\x20",TmpString$);
HVAC_number=ATOI(mid(TmpString$,1,pos1-1));
pos1=find("ON",TmpString$);
pos2=find("OFF",TmpString$);
pos3=max(pos1,pos2);
if(pos1>0){HVAC[HVAC_number].POWER=1;}else
if(pos2>0){HVAC[HVAC_number].POWER=0;}
pos1=find("\x20",TmpString$,pos3);
pos2=find("C",TmpString$,pos3);
HVAC[HVAC_number].t1=ATOI(mid(TmpString$,pos1+1,pos2-pos1-1));
pos1=find("\x20",TmpString$,pos2);
pos2=find("C",TmpString$,pos1);
HVAC[HVAC_number].t2=ATOI(mid(TmpString$,pos1+1,pos2-pos1-1));
}
}
CancelWait(parser);
FuncWaitStop();
}
Буфер в данном случае можно не чистить. А вообще clearbuffer(from_coolmaster);
Заработает с вас яндекс.пиво$


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 13.09.16 08:32. Заголовок: Вячеслав как у вас т..


Вячеслав как у вас тут все сложно)) поизучаю
но там конечно была задача не делать аналоговые и цифровые выходы
там хотят сформировать смс вида: Kond1 is ON, temperature 26C

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 13.09.16 08:42. Заголовок: marty_iron прошу изв..


marty_iron прошу извинить за тупой вопрос: а чем родной модуль не устраивает?
Вполне себе рабочий. Но для процов 2-й серии лучше соединяться по RS-232.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 13.09.16 09:08. Заголовок: Kaveckiy а это и ест..


Kaveckiy а это и есть данные с родного модуля!

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 13.09.16 10:43. Заголовок: Ушла красота из этог..


Ушла красота из этого мира)
В SIMPL есть офигительно изящный Serial I/O, которым парсить такие строчки (как угодно порванные) ещё лет 15 назад можно было, и пока не нужно отслеживать всякие таймауты и неприятности - этот вариант по моему мнению гораздо прозрачнее S+ (хотя я работал кодером в молодости и С++ мой родной). Идея в том, чтобы записать в Serial IO все значения ожидаемых токенов типа "100" "101".. "OFF" "ON" "16C" "17C".. "Med", "Low", "Fan", "OK 0", .., чтобы они не "пересеклись" одно с другим (скажем "100" и "0" - плохая пара токенов) - тогда при поступлении данных будут щёлкать выходы в порядке появления токенов, и вам с помощью интерлоков и буферов нужно обновить состояние соответствующего агрегата.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 13.09.16 11:49. Заголовок: eoulianov но в чем и..


eoulianov но в чем идея Serial IO при этой ситуации? вот он находит "100", но дальше-то нужно отследить On или OFF и какая указана первая температура после него

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




ссылка на сообщение  Отправлено: 13.09.16 11:52. Заголовок: marty_iron, вам нужн..


marty_iron, вам нужно найти и реализовать решение?
Мой совет таков: после такого подробного и даже более (целый коллективный разум!), потока реальных решений, если не идет дело, то подсоберите денег и наймите специалиста по Crestron.

Спасибо: 0 
ПрофильЦитата Ответить





ссылка на сообщение  Отправлено: 13.09.16 13:49. Заголовок: Чуток поправил а то ..


Чуток поправил а то форум не верно отображает (интерпретирует) i в квадратных скобках

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 13.09.16 16:05. Заголовок: Igor Вячеслав а если..


Igor Вячеслав а если я в итоге сформировал одну строку, но получил такое - что это означает? вот эти (...)
Это просто не отображается или это превышение длины строки?
click here


Спасибо: 0 
ПрофильЦитата Ответить





ссылка на сообщение  Отправлено: 13.09.16 19:36. Заголовок: marty_iron, сожалею,..


marty_iron, сожалею, но я пас. В те времена, когда я учил людей, мы, помимо прочих, неизменно придерживались следующего правила: учить деятельности, а не раздавать ее результаты. Я предложил алгоритм, согласно которому, на мой взгляд, ваша задача может быть корректно решена. Коллеги пошли другим путем и предложили вам готовые решения.
Дайте себе ответ на следующие вопросы:
1. "... я в итоге сформировал одну строку..." Какими средствами вы ее сформировали? Если сторонними - вопрос к разработчикам этих средств. Если собственными - ищите ошибку в коде (это деятельность). Или обратитесь за готовым результатом - выложите код на обозрение соучастников.
2. "Это просто не отображается..." Не хватет существительного. Что не отображается?
3. "... или это превышение длины строки?" Какой строки?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 26 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 74
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет