Автор | Сообщение |
|
Отправлено: 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 градусов - тоже самое. Как можно поступить?
|
|
|
Ответов - 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
|
|
|
|
Отправлено: 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> как тогда быть?
|
|
|
|
Отправлено: 12.09.16 17:31. Заголовок: Timings подкрутить? ..
Timings подкрутить?
|
|
|
|
Отправлено: 12.09.16 17:32. Заголовок: p.vladi поясните?..
p.vladi поясните?
|
|
|
|
Отправлено: 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 и отправляем ее на дальнейшую обработку. Нанести, смыть, повторить
|
|
|
|
Отправлено: 12.09.16 20:28. Заголовок: Igor большое спасибо..
Igor большое спасибо! но последний вопрос никогда не пользовался BUFFER_INPUT, чем он отличается от остальных?
|
|
|
|
Отправлено: 12.09.16 20:42. Заголовок: marty_iron, BUFFER_I..
marty_iron, BUFFER_INPUT - один из способов введения в модуль SIMPL+ строковых (serial) данных. В отличие от STRING_INPUT, содержимое которого полностью замещается на новое при изменении входной строки, в случае BUFFER_INPUT новые данные выстраиваются за уже имеющимися в буфере. Это очень важно как раз в случаях, подобных вашему. Есть и обратная сторона - нужно полностью осознавать реализуемый вами алгоритм обработки данных BUFFER_INPUT, в частности - не допускать пепеполнения и вовремя очищать буфер. Вообще, этот вопрос лучше адресовать тем кто профессионально занимается программированием. Или почитать справку.
|
|
|
|
Отправлено: 12.09.16 21:32. Заголовок: Igor а как его очист..
Igor а как его очистить? это же входная величина
|
|
|
|
Отправлено: 12.09.16 21:46. Заголовок: Это есть в справке к..
Это есть в справке к SIMPL+.
|
|
|
|
| постоянный участник
|
|
|
Отправлено: 12.09.16 23:21. Заголовок: Загрузите все вариан..
Загрузите все варианты приходящих строк в Excel и проанализируйте их состав и длину. Не поддавайтесь на советы, где предлагают многоэтажные программы, все решается гораздо проще.
|
|
|
|
Отправлено: 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); Заработает с вас яндекс.пиво$
|
|
|
|
|
Отправлено: 13.09.16 08:32. Заголовок: Вячеслав как у вас т..
Вячеслав как у вас тут все сложно)) поизучаю но там конечно была задача не делать аналоговые и цифровые выходы там хотят сформировать смс вида: Kond1 is ON, temperature 26C
|
|
|
|
Отправлено: 13.09.16 08:42. Заголовок: marty_iron прошу изв..
marty_iron прошу извинить за тупой вопрос: а чем родной модуль не устраивает? Вполне себе рабочий. Но для процов 2-й серии лучше соединяться по RS-232.
|
|
|
|
Отправлено: 13.09.16 09:08. Заголовок: Kaveckiy а это и ест..
Kaveckiy а это и есть данные с родного модуля!
|
|
|
|
Отправлено: 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" - плохая пара токенов) - тогда при поступлении данных будут щёлкать выходы в порядке появления токенов, и вам с помощью интерлоков и буферов нужно обновить состояние соответствующего агрегата.
|
|
|
|
Отправлено: 13.09.16 11:49. Заголовок: eoulianov но в чем и..
eoulianov но в чем идея Serial IO при этой ситуации? вот он находит "100", но дальше-то нужно отследить On или OFF и какая указана первая температура после него
|
|
|
|
| постоянный участник
|
|
|
Отправлено: 13.09.16 11:52. Заголовок: marty_iron, вам нужн..
marty_iron, вам нужно найти и реализовать решение? Мой совет таков: после такого подробного и даже более (целый коллективный разум!), потока реальных решений, если не идет дело, то подсоберите денег и наймите специалиста по Crestron.
|
|
|
|
Отправлено: 13.09.16 13:49. Заголовок: Чуток поправил а то ..
Чуток поправил а то форум не верно отображает (интерпретирует) i в квадратных скобках
|
|
|
|
Отправлено: 13.09.16 16:05. Заголовок: Igor Вячеслав а если..
Igor Вячеслав а если я в итоге сформировал одну строку, но получил такое - что это означает? вот эти (...) Это просто не отображается или это превышение длины строки? click here
|
|
|
|
Отправлено: 13.09.16 19:36. Заголовок: marty_iron, сожалею,..
marty_iron, сожалею, но я пас. В те времена, когда я учил людей, мы, помимо прочих, неизменно придерживались следующего правила: учить деятельности, а не раздавать ее результаты. Я предложил алгоритм, согласно которому, на мой взгляд, ваша задача может быть корректно решена. Коллеги пошли другим путем и предложили вам готовые решения. Дайте себе ответ на следующие вопросы: 1. "... я в итоге сформировал одну строку..." Какими средствами вы ее сформировали? Если сторонними - вопрос к разработчикам этих средств. Если собственными - ищите ошибку в коде (это деятельность). Или обратитесь за готовым результатом - выложите код на обозрение соучастников. 2. "Это просто не отображается..." Не хватет существительного. Что не отображается? 3. "... или это превышение длины строки?" Какой строки?
|
|
|
Ответов - 26
, стр:
1
2
All
[только новые]
|
|