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

Отличие CP3 и MC2E

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

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

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 обрабатывал дольше, поэтому там работало и с задержкой



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