Форум » » Отличие CP3 и MC2E » Ответить

Отличие CP3 и MC2E

kislez2015: Такая ситуация - есть программа, в которой есть всего 1 simpl+ модуль. Он скомпилирован для процессоров 2 и 3 серии Но почему-то на MC2E программа работает корректно, а на CP3 такое ощущение, что работает все кроме simpl+ модуля... В чем может быть дело?

Ответов - 36, стр: 1 2 All

Igor: kislez2015, что за модуль и в чем выражаются "ощущения"?

kislez2015: Igor модуль, который из данных сервера делает фамилии для 24 кнопок, изображающих места. а при нажатии людьми кнопок формирует строку очередности докада. И вот строка очередности на MC2E формируется, а на CP3 - нет... абсолютно одна программа но при этом я моделирую ответы сервера через serial i/o и этот же simpl+ модуль обрабатывает эти строки, вытягивая из них номер места, и фамилию т е не работает этот модуль тоже частично

Igor: kislez2015, это не тот ли модуль который зарождался тут?


kislez2015: Igor частично))) но на деле с сервера идет строка, в которой зашит номер места и фамилия вот из фамилий при нажатии людьми кнопок формируется "строка ожидания" единственное, что я заметил - это то, что если скомпилировать мой модуль для X-gen он выдает 10 ошибок, но не думаю, что это должно влиять - ведь для этих двух процов я компилирую для 2 и 3 серий

Вячеслав: Приложите часть кода по PUSH событию, для формирования строки очередности. Я так понимаю, что только эта чать не работает. Подозреваю, нужен просто корректный конвертор русских букв. С латинскими названиями можете попробовать? В дебагере строку очередности можете вывести (в смысле она пустая или нет) Вообще конвертор русских букв используете?

kislez2015: Вячеслав конвертер русских букв вообще не использую... все тестирую на английском вот кусок что отвечает за формирование 2 списков при нажатии желающими на кнопку (первый - максимум 5 фамилий для вывода, и второй - все фамилии во внутренней памяти) не уверен, что тут реально разобраться)) CHANGE Report { INTEGER pos, sit, L, num_rep, pn; STRING NewDelegate[50], NumberString[2], HexNumber[1], removebuf[1200]; STRING NewDelegateWithNumber[51]; // we make the list when somebody push the button IF (mid(Report, 1, 19)="report delegatename" && DelegateCommandShot=1) { NewDelegate=mid(Report, 22, len(Report)-22); sit=byte(Report,21)-64; NumberString=itoa(sit)+"\x0D"; print("Delegate nawat %d", DelegatePressed[sit]); print(" NumberString %s", NumberString); IF (DelegatePressed[sit]=1) { NumberInList=NumberInList+1; print("Chislo v Ocheredi %d", NumberInList); IF (NumberInList<=5) { SubListAfter=SubListBefore+NewDelegate+"\x0D"; DelagateList=SubListAfter; SubListBefore=SubListAfter; SubListAfter2=SubListAfter; SubListBefore2=SubListBefore; } ELSE { SubListAfter2=SubListBefore2+NewDelegate+"\x0D"; SubListBefore2=SubListAfter2; } NumberList=NumberList+NumberString; print(" Spisok cifr %s", NumberList); } ELSE IF (DelegatePressed[sit]=0) { NumberInList=NumberInList-1; print("Chislo v Ocheredi%d", NumberInList); IF (NumberInList<5) { L=len(NewDelegate); pos=find(NewDelegate,SubListBefore,1); SubListAfter=Left(SubListBefore,pos-1); removebuf=RemoveByLength(pos+L,SubListBefore); SubListAfter=SubListAfter+SubListBefore; DelagateList=SubListAfter; SubListBefore=SubListAfter; SubListAfter2=SubListAfter; SubListBefore2=SubListBefore; } ELSE { pos=find(NewDelegate,SubListBefore2,1); L=len(NewDelegate); SubListAfter2=Left(SubListBefore2,pos+L); pos=0; num_rep=0; while (find("\x0D",SubListAfter2,pos+1)>0) { pos=find("\x0D",SubListAfter2,pos+1); num_rep=num_rep+1; } pos=find(NewDelegate,SubListBefore2,1); SubListAfter2=Left(SubListBefore2,pos-1); removebuf=RemoveByLength(pos+L,SubListBefore2); SubListAfter2=SubListAfter2+SubListBefore2; SubListBefore2=SubListAfter2; IF (num_rep<=5) { pos=0; num_rep=0; while (num_rep<5) { pos=find("\x0D",SubListAfter2,pos+1); num_rep=num_rep+1; } SubListAfter=Left(SubListAfter2,pos); DelagateList=SubListAfter; SubListBefore=SubListAfter; } } pn=find(NumberString,NumberList,1); NumberList2=Left(NumberList,pn-1); removebuf=RemoveByLength(pn+1,NumberList); NumberList2=NumberList2+NumberList; NumberList=NumberList2; print(" Spisok cifr %s", NumberList); } }

Вячеслав: Начну с частностей (которые по идее не зависят от серии контроллера, но только по идее см. ниже) Мне кажется ошибочным часть кода: while (num_rep<5) { pos=find("\x0D",SubListAfter2,pos+1); num_rep=num_rep+1; } SubListAfter=Left(SubListAfter2,pos); Вне зависимости от результатов функции find, данный цикл выполнится 5 раз (num_rep= 0 1 2 3 4) Если в строке SubListAfter2 окажется менее 5 блоков оканчивающихся на "\x0D", то значение переменной POS после цикла будет равно 0. А следовательно результат SubListAfter=Left(SubListAfter2,pos) обнулит строку SubListAfter. Если это не задумка программиста при которой нужно очищать строку SubListAfter при количестве записей менее 5, то налицо ошибка приводящая к потере данных. Учитывая код вашего блока можно предположить что сохранение значения глобальной переменной SubListAfter2 к концу блока не важно, то всю конструкцию: IF (num_rep<=5) { pos=0; num_rep=0; while (num_rep<5) { pos=find("\x0D",SubListAfter2,pos+1); num_rep=num_rep+1; } SubListAfter=Left(SubListAfter2,pos); можно заменить одной единственной строкой (которая не потеряет данные и оптимизирует код): SubListAfter=Remove("\x0D",SubListAfter2); По поводу частичной работоспособности при эмуляции ответов сервера могу предположить, либо не достаточное количество эмулированных ответов (ошибка может появится не сразу) или тем что ответ сервера отличается от вашей эмуляции, а именно ответ представляет собой не полную строку. Исходя из вашего кода смею предположить, что переменная Report имеет у вас тип String_input, а такие вещи правильнее реализовывать через тип Buffer_input. В буфере можно собирать куски строк, а не терять их части при событии CHANGE. Теперь об особенностях 3 серии: Количество одновременных циклов while в 3 серии ограничено 8 (правда проверялось внутри одного SIMPL+ модуля, но скорее всего справедливо для всей программы) Таким образом при превышении числа 8 одновременно запущенных циклов while, тело следующих игнорируется со всеми вытекающими. Проверить просто, добавьте отладочную информацию для дебагера с помощью Print или Trace (бывает работает только одна из них - это тоже "особенности" уже любой серии) до цикла и в его теле. Пример: Trace("\nPoint1"); while (num_rep<5) { Trace("\nPoint2 num_rep=%u",num_rep); pos=find("\x0D",SubListAfter2,pos+1); num_rep=num_rep+1; } Если в дебагере вы увидите пару подряд идущих Point1 Point1 не разделенных Point2, то факт невыполнения тела цикла налицо. Оптимизируйте программу с целью уменьшения циклов while (например как я предложил выше) и попробуйте отказаться от бесконечных циклов while например на polling входах некоторых модулей. Ну и на закуску: В вашем куске кода не бьется количество скобок } не говоря уж про неиспользованные и объявленные переменные. Либо часть кода удалена, либо скопировали без последней скобки. Удачи!

kislez2015: Вячеслав пока не могу проверить, спасибо но циклы while пока единственное на что можно спихнуть вину за неработоспособность?

Вячеслав: Почему же единственное, а предполагаемая ошибка о которой я писал точно не ошибка? Тем более могут быть и другие в таком длинном коде, чем вдаваться в разборку проще начать отлаживать по контрольным точкам, состояние нужной переменной. Только представьте что может произойти, когда тело события CHANGE Report еще обрабатывается, а пришел еще один ответ от сервера. Хорошо, если второй процесс будет поставлен в очередь ( а это не так) а так они оба будут пытаться изменить общие для них глобальные переменные в одно и тоже время по своему усмотрению. Впрочем в 3 серии за счет скорости вероятность этого явления скорее будет уменьшаться, чем увеличиваться поэтому этот вариант скорее на заметку. Если при эмуляции ответов сервера, все правильно работает, то смотрите в сторону buffer_input. Опять таки дебагер вам в помощь. Ведь там видно строка от сервера как приходит на одной строчке или иногда на 2 распадается и т.п.

kislez2015: Вячеслав но почему он на MC2E работает без проблем? мне интересно именно какое различие этих процессоров может быть причиной? а про первый пункт - завтра попробую

Вячеслав: Я затрудняюсь сказать как обрабатывается прием команд в COM порт у процессора. Другими словами в какой момент, процессор принимает решение, что пора данные из буфера передать программе управления. Может 3 серия, решает это делать раньше чем вторая и строка приходит частями. Ваш код к этому не готов.

kislez2015: Не знаю поможет ли... но то что я кинул на самом деле не IF а Esle if. А накинается кодом вверху, но эту часть он отрабатывает нормально (всего там 24 таких повротения). И я тестируюсь не на сервере, а засчет Serial IO который дает имена 8ми и 24 людей CHANGE Report { INTEGER pos, sit, L, num_rep, pn; STRING NewDelegate[50], NumberString[2], HexNumber[1], removebuf[1200]; STRING NewDelegateWithNumber[51]; // we must to act when filling places with data IF (mid(Report, 1, 19)="report delegatename" && BusyStart=1) { HexNumber=mid(Report, 21, 1); IF (CompareStringsNoCase(HexNumber, "\x41")=0) { Seat_Number[1]="1"; Delegatename[1]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x42")=0) { Seat_Number[2]="2"; Delegatename[2]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x43")=0) { Seat_Number[3]="3"; Delegatename[3]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x44")=0) { Seat_Number[4]="4"; Delegatename[4]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x45")=0) { Seat_Number[5]="5"; Delegatename[5]=mid(Report, 22, len(Report)-22); } ELSE IF

Вячеслав: Кучу вложенных друг в друга If мне тоже не по душе, может и компилятору тоже 0)) Используйте конструкцию Switch(HexNumber) {case(0x41):{} case(0x42):{} и т.п.} Будет более наглядно и компактно. Serial i/o созданный для имитации ответов сервера у вас заведен на вход Report модуля? Если только с него присылать статусы все работает?

kislez2015: нет, просто тестирую этим На одном работает, на другом нет

kislez2015: Вячеслав а можно еще вопрос, есть конструкция такого типа в симпл+ edit_bluray_in_bedroom=edit_bluray_in_bedroom_p1; edit_top_box_in_bedroom=edit_top_box_in_bedroom_p1; edit_wdtv_in_bedroom=edit_wdtv_in_bedroom_p1; edit_blank_in_bedroom=edit_blank_in_bedroom_p1; edit_bluray_in_lr=edit_bluray_in_lr_p1; edit_top_box_in_lr=edit_top_box_in_lr_p1; edit_wdtv_in_lr=edit_wdtv_in_lr_p1; edit_blank_in_lr=edit_blank_in_lr_p1; как заставить каждый из этих сигналов быть малой длительности, пока они непрерывные никак не получается коммутацию сделать вроде бы пускаю через буфер, ставлю на enable вход сигнал длительность 1t, НО НЕТ - он все равно держится 233 мс. почему так происходит?

Вячеслав: Если речь про digital сигналы у него всего 2 состояния 1 и 0. Пока он не переходит в другое состояние, предыдущее можно назвать бесконечным. )) Для того чтобы послать импульс на digital_output выход SIMPL+ модуля используется функция pulse(1,edit_bluray_in_bedroom); В результате выход с именем edit_bluray_in_bedroom будет иметь значение 1 на протяжении 0,01с, потом вернется в значение 0. Может у Вас процессор перегружен неправильными кодами (бесконечными циклами), вот и тайминги ползут. Посмотрите в тулбоксе через командную строку загрузку процессора, при этом желательно дебагер не закрывать, так как он тоже серьезно грузит процессор. Загрузка процессора отображается по команде TOP В PRO3 можно загрузку посмотреть прямо на дисплее процессора

kislez2015: Вячеслав но мне же сначала нужно до pulse(1,edit_bluray_in_bedroom) понять нужно ли этому сигналу вообще присваивать единичное значение. в том и проблема...

Вячеслав: Тогда так: if (edit_bluray_in_bedroom_p1=1){pulse(1,edit_bluray_in_bedroom);} Это основываясь на вашем куске кода, предполагая что переменная edit_bluray_in_bedroom_p1 определяет нужно ли сигналу присваивать (теперь на время) единичное значение. Имейте ввиду, что если выходу dit_bluray_in_bedroom до этого места уже жестко установили единичное значение (присвоив =1), pulse уже не вернет его с 0.

kislez2015: Вячеслав спасибо а еще вопрос про оптимизацию кода в симпл+ если у меня мой симпл+ модуль сохраняет пресеты матричного коммутатора - 4 выхода 5 входов, выходит 20 значений Если у меня в программе предполагается 4 пресета - выходит в памяти надо хранить 80 значений, чтобы по запросы присваивать их на 20 выходов. Это же как я понимаю никак не оптимизировать? у меня весь модуль состоит в присваивании пресетов значениям фидбеков а потом по запросу вывод их...

Вячеслав: Не совсем понял идею, но по мне так при 4 выходах и 5 входах, возможных комбинаций будет не 20, а 45=1024 С количеством пресетов скорее всего придется определиться заранее. Пусть их будет 20 и пусть они будут пользовательскими (сохраняемыми). Чтоб сохранить 1 пресет нужен массив переменных например nonvolatile integer in_for_out[4] где элемент in_for_out[1] содержит значение номера входа, который был скоммутирован на выход с номером 1. элемент in_for_out[2] содержит значение номера входа, который был скоммутирован на выход с номером 2. и т.д. Следовательно чтобы сохранить 20 пользовательских пресетов в энергонезависимой памяти (для любых комбинаций вход-выход) нужно 20 таких массивов: nonvolatile integer in_for_out[20][4] Т.е. суть оптимизации это использование массива переменных. Это наглядно, компактно и удобно для управления. Для сохранения пресета в таком массиве, желательно чтоб выход с модуля управлением матричным коммутатором имел аналоговые выходы для каждого номера выхода коммутатора, какой номер входа на него скоммутирован. Хороший пример в этом смысле Crestron DigitalMedia матрицы. Часто матричные коммутаторы имеют встроенную функцию сохранения текущей конфигурации вход-выход (Extron, RGB Spectrum). И в этом случае можно просто управлять сохранением и загрузкой этих пресетов посылая команду на матричный коммутатор с номером пресета (SAVE или LOAD)

kislez2015: Вячеслав ну у меня так примерно и есть, только я не массивы, а обычные переменные использовал

kislez2015: Вячеслав блин, так он и не работает на CP3... а нет чего-то еще, что бросается в глаза? #SYMBOL_NAME "Names Server" #DEFINE_CONSTANT MAXSIZE 24 #DEFAULT_VOLATILE #ENABLE_STACK_CHECKING #ENABLE_TRACE DIGITAL_INPUT BusyStart, ModeratorCommand, DelegateCommandShot; DIGITAL_INPUT DelegatePressed[MAXSIZE]; STRING_INPUT Report[100]; DIGITAL_OUTPUT advance_delegate[MAXSIZE]; STRING_OUTPUT CurrentSpeakerString; STRING_OUTPUT DelagateList; STRING_OUTPUT Delegatename[MAXSIZE]; STRING_OUTPUT Seat_Number[MAXSIZE]; /******************************************************************************************* Global Variables *******************************************************************************************/ INTEGER NumberInList, CurrentSpeaker, NextSpeaker; STRING NumberList[100], NumberList2[100]; STRING SubListBefore[1180], SubListAfter[1180]; STRING SubListBefore2[1200], SubListAfter2[1200]; CHANGE Report { INTEGER pos, sit, L, num_rep, pn; STRING NewDelegate[50], NumberString[2], HexNumber[1], removebuf[1200]; STRING NewDelegateWithNumber[51]; // we must to act when filling places with data IF (mid(Report, 1, 19)="report delegatename" && BusyStart=1) { HexNumber=mid(Report, 21, 1); IF (CompareStringsNoCase(HexNumber, "\x41")=0) { Seat_Number[1]="1"; Delegatename[1]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x42")=0) { Seat_Number[2]="2"; Delegatename[2]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x43")=0) { Seat_Number[3]="3"; Delegatename[3]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x44")=0) { Seat_Number[4]="4"; Delegatename[4]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x45")=0) { Seat_Number[5]="5"; Delegatename[5]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x46")=0) { Seat_Number[6]="6"; Delegatename[6]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x47")=0) { Seat_Number[7]="7"; Delegatename[7]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x48")=0) { Seat_Number[8]="8"; Delegatename[8]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x49")=0) { Seat_Number[9]="9"; Delegatename[9]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x4A")=0) { Seat_Number[10]="10"; Delegatename[10]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x4B")=0) { Seat_Number[11]="11"; Delegatename[11]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x4C")=0) { Seat_Number[12]="12"; Delegatename[12]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x4D")=0) { Seat_Number[13]="13"; Delegatename[13]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x4E")=0) { Seat_Number[14]="14"; Delegatename[14]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x4F")=0) { Seat_Number[15]="15"; Delegatename[15]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x50")=0) { Seat_Number[16]="16"; Delegatename[16]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x51")=0) { Seat_Number[17]="17"; Delegatename[17]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x52")=0) { Seat_Number[18]="18"; Delegatename[18]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x53")=0) { Seat_Number[19]="19"; Delegatename[19]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x54")=0) { Seat_Number[20]="20"; Delegatename[20]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x55")=0) { Seat_Number[21]="21"; Delegatename[21]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x56")=0) { Seat_Number[22]="22"; Delegatename[22]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x57")=0) { Seat_Number[23]="23"; Delegatename[23]=mid(Report, 22, len(Report)-22); } ELSE IF (CompareStringsNoCase(HexNumber, "\x58")=0) { Seat_Number[24]="24"; Delegatename[24]=mid(Report, 22, len(Report)-22); } } // we make the list when somebody push the button ELSE IF (mid(Report, 1, 19)="report delegatename" && DelegateCommandShot=1) { NewDelegate=mid(Report, 22, len(Report)-22); sit=byte(Report,21)-64; NumberString=itoa(sit)+"\x0D"; print("Delegate nawat %d", DelegatePressed[sit]); print(" NumberString %s", NumberString); IF (DelegatePressed[sit]=1) { NumberInList=NumberInList+1; print("Chislo v Ocheredi %d", NumberInList); IF (NumberInList<=5) { SubListAfter=SubListBefore+NewDelegate+"\x0D"; DelagateList=SubListAfter; SubListBefore=SubListAfter; SubListAfter2=SubListAfter; SubListBefore2=SubListBefore; } ELSE { SubListAfter2=SubListBefore2+NewDelegate+"\x0D"; SubListBefore2=SubListAfter2; } NumberList=NumberList+NumberString; print(" Spisok cifr %s", NumberList); } ELSE IF (DelegatePressed[sit]=0) { NumberInList=NumberInList-1; print("Chislo v Ocheredi%d", NumberInList); IF (NumberInList<5) { L=len(NewDelegate); pos=find(NewDelegate,SubListBefore,1); SubListAfter=Left(SubListBefore,pos-1); removebuf=RemoveByLength(pos+L,SubListBefore); SubListAfter=SubListAfter+SubListBefore; DelagateList=SubListAfter; SubListBefore=SubListAfter; SubListAfter2=SubListAfter; SubListBefore2=SubListBefore; } ELSE { pos=find(NewDelegate,SubListBefore2,1); L=len(NewDelegate); SubListAfter2=Left(SubListBefore2,pos+L); pos=0; num_rep=0; while (find("\x0D",SubListAfter2,pos+1)>0) { pos=find("\x0D",SubListAfter2,pos+1); num_rep=num_rep+1; } pos=find(NewDelegate,SubListBefore2,1); SubListAfter2=Left(SubListBefore2,pos-1); removebuf=RemoveByLength(pos+L,SubListBefore2); SubListAfter2=SubListAfter2+SubListBefore2; SubListBefore2=SubListAfter2; SubListAfter=Remove("\x0D",SubListAfter2); DelagateList=SubListAfter; SubListBefore=SubListAfter; } } pn=find(NumberString,NumberList,1); NumberList2=Left(NumberList,pn-1); removebuf=RemoveByLength(pn+1,NumberList); NumberList2=NumberList2+NumberList; NumberList=NumberList2; print(" Spisok cifr %s", NumberList); } } } PUSH ModeratorCommand { INTEGER i, num_rep, pos; STRING removebuf[1200]; i=atoi(NumberList); Pulse(1, advance_delegate); removebuf=RemoveByLength(2,NumberList); pos=find("\x0D",SubListBefore2,1); CurrentSpeakerString=left(SubListBefore2,pos-1); removebuf=RemoveByLength(pos,SubListBefore2); SubListAfter2=SubListBefore2; NumberInList=NumberInList-1; IF (NumberInList<5) { DelagateList=SubListAfter2; SubListAfter=SubListAfter2; SubListBefore=SubListBefore2; } ELSE IF (NumberInList>=5) { num_rep=0; pos=0; while (num_rep<5) { pos=find("\x0D",SubListAfter2,pos+1); num_rep=num_rep+1; } SubListAfter=Left(SubListAfter2,pos); DelagateList=SubListAfter; SubListBefore=SubListAfter; } } Function Main() { the values to them. NumberInList=0; SubListBefore=""; SubListAfter=""; SubListBefore2=""; SubListAfter2=""; NumberList=""; NumberList2=""; }

kislez2015: Я расставил везде trace если сделать самый первый иф - он все имена и цифры заполняет, но все что после ELSE IF (mid(Report, 1, 19)="report delegatename" && DelegateCommandShot=1) - он не делает вообще а если не заполнять первый иф а сразу в эту часть ELSE IF (mid(Report, 1, 19)="report delegatename" && DelegateCommandShot=1), то он ее сделает всего 1 раз и больше не работает...

Вячеслав: 1.Конструкцию IF(mid(Report, 1, 19)="report delegatename" && DelegateCommandShot=1) надо писать так IF((mid(Report, 1, 19)="report delegatename") && (DelegateCommandShot=1)) 2.Логика построена на факте того, что кто то удерживает цифровые входы в состоянии 1 (DelegateCommandShot DelegatePressed[sit]) вы уверены что они останутся в 1 на момент выполнения строки их анализа в коде программы? Эти входы через внешний interlock или One Shot? 3.Если выполняется условие первого if (IF (mid(Report, 1, 19)="report delegatename" && BusyStart=1) ) оно исключает выполнение ELSE IF (mid(Report, 1, 19)="report delegatename" && DelegateCommandShot=1) Так написана ваша программа, почему Вас это смущает? 4.Это больше на работает, потому что не выполняется одно или оба из условий mid(Report, 1, 19)="report delegatename" или DelegateCommandShot=1 Предполагаю, что второе.(см. п.2) В отладке это можно увидеть, главное вcтавить Trace("\n mid=% DelCommSh=%u",mid(Report, 1, 19),DelegateCommandShot); в нужное место (предлагаю прямо перед первым IF).

kislez2015: Вячеслав да, в пункте 2 - каждый на тогле Одна часть исключает вторую - да. Первая часть у меня - это заполнение индирект текст кнопок на тач-панели. вторая - создание списка. Но оба основаны на факте прихода report. Но самое главное-то тут - это работает на MC2E))) в техподдержке посоветовали написать BUFFER_INPUT Report[100]; и threadsafe CHANGE Report но это не помогло

kislez2015: Вячеслав я внутрь куска // we make the list when somebody push the button ELSE IF (mid(Report, 1, 19)="report delegatename" && DelegateCommandShot=1) даже специально поставил trace - после первого появления DelegatePressed[sit] - второй раз он в этот else даже не заходит... мне посоветовали эту статью http://support.crestron.com/app/answers/detail/a_id/5109/kw/3%20series , но я тут чтото мало что понимаю))

kislez2015: Вячеслав я видимо нашел причину, но почему это происходит? он в этой строке ELSE IF (mid(Report, 1, 19)="report delegatename" && DelegateCommandShot=1) идет нажатие кнопки, оно порождает ответ сервера и сигнал DelegateCommandShot. по trace я вижу, что ответ сервера пришел mid(Report, 1, 19)="report delegatename", на симпл+ модуль пришел сигнал DelegateCommandShot=1 но trace модуля показывает, что он внутри модуля 0. Почему такое может происходить? на входе 20 сигналов однократного нажатия, которые приходят на элемент or а с выхода на one shot, длительностью 1 секунда

kislez2015: Вячеслав получилось так: на MC2E работает, когда я снимаю сигнал с выхода OneShot на CP3 работает, когда я снимаю сигнал с выхода OR, который до элемента OneShot. Если снимать с выхода - не работает

Вячеслав: Попробуйте увеличить длительность сигнала pulse_time в элементе One shot. Просто к моменту обработки строки ELSE IF (mid(Report, 1, 19)="report delegatename" && DelegateCommandShot=1) этот сигнал уже возвращается в 0 состояние. Впрочем это противоречит улучшению производительности процессора, но учитывая вашу проблему с длительностью сигналов, у Вас наверно и OneShot не соблюдает длительность pulse_time CP3 на ebay покупали? ))

kislez2015: Вячеслав наоборот, когда я убрал этот элемент - все заработало т е задержка в появлении сигнала с выхода one shot давала появление 1 после события change... но непонятно, почему происходит отличие в работе с mc2e

Вячеслав: Тогда delay(5) в теле программы можно добавить.

kislez2015: Вячеслав а куда это надо прописать? и как? а в целом этому отличию работ есть какое то физическое объяснение? такие ситуации как-то обескураживают и огорчают)) начинаешь думать что все зависит не от тебя, а того как пойдет)

Вячеслав: С ваши количеством вложенных if даже объяснить сложно. Но чтоб не путаться с добавлением скобок, то можно и в самом начале пред 1 if. А что увеличение pulse_time в блоках One shot не помогает?

kislez2015: Вячеслав я их просто убрал и все заработало)

Вячеслав: Иногда так системные файлы стирают. Типа а зачем мне тут диск C занимать всякой ерундой )) Наверняка их добавили не просто так. А как раз чтоб нормировать сигнал нужной длительностью.

kislez2015: Вячеслав но это же добавлял я сам))) просто сигнал появлялся позже, чем нужно из-за делея, даже с задержкой 1t - пришлось убрать возможно, MC2E обрабатывал дольше, поэтому там работало и с задержкой



полная версия страницы