Страница 3 из 4

Re: Модуль работы с контроллерами Uniel

Добавлено: Вс дек 04, 2016 12:59 pm
DAP
Ошибку нашел, но незнаю как исправить этот кусок кода:

Код: Выделить всё

 //check outputs
   $outputs=SQLSelect("SELECT * FROM unielproperties WHERE DEVICE_ID='".$rec['ID']."' AND TYPE=1 ORDER BY NUM");
   $result=$this->sendDeviceCommand($rec['ID'], 0x0b, array(0x00, 0x00, 0x00));
   if (isset($result[4])) {
    $value=decbin($result[4]); //ошибку вызывает эта операция,чтобы всё работало $value должна быть массивом что-то вроде $value=array(0,0,1,0,0,0,0,1); сконвертировать в массив - не умею.
    //print_r($result);
    //echo $value."<br/>";
    $total=count($outputs);
    for($i=0;$i<$total;$i++) {
     $old_value=$outputs[$i]['CURRENT_VALUE'];
     if ($rec['TYPE']=='dimmer' && $value[(int)$outputs[$i]['NUM']]=='1') {
      $result=$this->sendDeviceCommand($rec['ID'], 0x05, array(0x00, 0x40+(int)$outputs[$i]['NUM'], 0x00));
      if (isset($result[4])) {
       $level=(int)$result[4];
       $outputs[$i]['CURRENT_VALUE']=$level;
      }
     } else {
      $outputs[$i]['CURRENT_VALUE']=(int)$value[(int)$outputs[$i]['NUM']]; // почему не использовать $value[$i] вместо (int)$value[(int)$outputs[$i]['NUM']]
     }
     SQLUpdate('unielproperties', $outputs[$i]);

     if ($outputs[$i]['LINKED_OBJECT'] && $outputs[$i]['LINKED_PROPERTY']) {
      if ($old_value!=$outputs[$i]['CURRENT_VALUE'] || $outputs[$i]['CURRENT_VALUE']!=gg($outputs[$i]['LINKED_OBJECT'].'.'.$outputs[$i]['LINKED_PROPERTY'])) {
      }
      setGlobal($outputs[$i]['LINKED_OBJECT'].'.'.$outputs[$i]['LINKED_PROPERTY'], $outputs[$i]['CURRENT_VALUE'], array($this->name=>'0'));
     }


    }
   }

Re: Модуль работы с контроллерами Uniel

Добавлено: Пн дек 05, 2016 2:58 am
DAP
Решение найдено:

Код: Выделить всё

 //check outputs
   $outputs=SQLSelect("SELECT * FROM unielproperties WHERE DEVICE_ID='".$rec['ID']."' AND TYPE=1 ORDER B$
   $result=$this->sendDeviceCommand($rec['ID'], 0x0b, array(0x00, 0x00, 0x00));
   if (isset($result[4])) {
    //$value=decbin($result[4]);
    //print_r($result);
    //echo $value."<br/>";
    $ret = decbin($result[4]); 
    while(strlen($ret) < 8)
        {
         $ret = "0".$ret;
        }  
    $value = array_reverse(str_split($ret));

    $total=count($outputs);
    for($i=0;$i<$total;$i++) {
     $old_value=$outputs[$i]['CURRENT_VALUE'];
     if ($rec['TYPE']=='dimmer' && $value[(int)$outputs[$i]['NUM']]=='1') {
      $result=$this->sendDeviceCommand($rec['ID'], 0x05, array(0x00, 0x40+(int)$outputs[$i]['NUM'], 0x00$
      if (isset($result[4])) {
       $level=(int)$result[4];
       $outputs[$i]['CURRENT_VALUE']=$level;
      }
     } else {
      $outputs[$i]['CURRENT_VALUE']=$value[$i];//(int)$value[(int)$outputs[$i]['NUM']];
     }
     SQLUpdate('unielproperties', $outputs[$i]);

     if ($outputs[$i]['LINKED_OBJECT'] && $outputs[$i]['LINKED_PROPERTY']) {
      if ($old_value!=$outputs[$i]['CURRENT_VALUE'] || $outputs[$i]['CURRENT_VALUE']!=gg($outputs[$i]['L$
      }
      setGlobal($outputs[$i]['LINKED_OBJECT'].'.'.$outputs[$i]['LINKED_PROPERTY'], $outputs[$i]['CURRENT$
     }


    }
   }

Re: Модуль работы с контроллерами Uniel

Добавлено: Пн дек 05, 2016 11:11 am
sergejey
Спасибо, внёс изменение

Re: Модуль работы с контроллерами Uniel

Добавлено: Пн дек 05, 2016 3:37 pm
DAP
Косяки в работе слайдера связаны с тем что в диммер заложена коррекция на реальную яркость (на мой взгляд хрень какая-то )
05.12.2016 13:11, Дмитрий пишет:

Добрый день. Вопрос по диммеру ламп накаливания Ydom.
Скажите с чем может быть связано, что на всех каналах диммер не выставляет яркость в 255 (максимум выставляется 245) и работает как-то странно например в программе управления я задаю яркость канала 50, а получаю 76, задаю 120, а получаю 123 может я сбил какую-то настройку?
Все верно. Тут учтена специфика ламп накаливания и работы симистора - симистор не может открыться при нулевом входном напряжении, а открывается при напряжении несколько вольт, так что примерно 4% времени (в самом начале) диммер остается закрытым, при этом потеря в мощности (а мощность в общем примерно как напряжение в квадрате) совсем невелика и составляет около 0,15%. Также учтена нелинейность (синус!) зависимости напряжения от времени, так что когда вы задаете % мощности, в трее "ответ" показано значение времени (пропорционально, единица соответсвует 255), в течении которого симистор открыт. Так что все у вас работает нормально, вы задаете % мощности, ответ - % времени.

Сергей
Дмитрий пишет:

Можно как-то отключить/исключить эту коррекцию?
Она приводит к тому что программа управления с обратной связью не может нормально отработать и выглядит это вот так:

https://www.youtube.com/watch?v=CNRBZNl ... e=youtu.be

Скажем для лабораторных работ это важно, а для хозяйки клацнувшей выключатель не имеет значения лампа потребляет 100% мощности или 99,85%. По этому хотелось бы получать заданное значение, очень не хочется городить код приводящий ответ к к нужному значению.
Нет, простыми средствами нельзя. Вы можете в программе обратной связи сделать функцию (например, табличную), преобразующую нормированные значения в относительные.

Если эта коррекция принципиальна, то я могу сделать прошивку без коррекции, но это будет стоить 200$ в рублях по курсу, на любое количество модулей. Так что думаю преобразовать значения в вашей программе будет проще и дешевле.

Сергей

Функция нормировки

char Norm(char L2n)
{
char tNorm;
char Tabl[]={0,11,22,28,32,35,38,40,42,44,46,48};


if((L2n>10) && (L2n<245))
tNorm=(char) ( 48+ ( (float)(255-L2n-10))*0.6766 );
else
{
if(L2n<11)
tNorm=255-Tabl[L2n];
else
{
tNorm=Tabl[255-L2n];
if (tNorm<0x0A)
tNorm=0x0A;

};

};
return(tNorm);


}


чтобы не потерять добавлю:
05.12.2016 16:21, Дмитрий пишет:

В диммере есть два уровня яркости: назначенный через порт и предустановленный с кнопки. Можно ли выставлять предустановленный для кнопки уровень через порт?

Да вроде можно, это параметры 0х12....0х19.
Сергей

Re: Модуль работы с контроллерами Uniel

Добавлено: Чт янв 05, 2017 6:16 pm
DAP
периодически падает цикл uniel как узнать причину? после рестарта может проработать час может сутки, потом останавливается.

Re: Модуль работы с контроллерами Uniel

Добавлено: Чт янв 05, 2017 11:33 pm
sergejey
DAP писал(а):периодически падает цикл uniel как узнать причину? после рестарта может проработать час может сутки, потом останавливается.
Посмотрите файл лога этого цикла -- в нём должна быть какая-то информация на момент падения.

Re: Модуль работы с контроллерами Uniel

Добавлено: Чт фев 02, 2017 11:20 pm
DAP
sergejey писал(а):
DAP писал(а):периодически падает цикл uniel как узнать причину? после рестарта может проработать час может сутки, потом останавливается.
Посмотрите файл лога этого цикла -- в нём должна быть какая-то информация на момент падения.
информации нет но происходит вот что : Цикл какое-то время работает и останавливается (зависает не отключаясь) иногда помогает перезапуск программы-шлюза ser2net
я добавил условие раз в 1000 опросов перезапускать ser2net, как можно ограничить время выполнения $unl->updateDevices(); пытался так: добавил при каждой итерации вызов set_time_limit(10); и включив авторестарт цикла но это не приводит к результату, цикл не отключается по таймауту.

Re: Модуль работы с контроллерами Uniel

Добавлено: Пт фев 24, 2017 9:03 pm
vsevolod.trofimov
Модуль настроил как на скриншоте. А каким образом, например, включить свет? Или отрегулировать яркость? Можно скрин?

Re: Модуль работы с контроллерами Uniel

Добавлено: Вс фев 26, 2017 6:01 pm
DAP
vsevolod.trofimov писал(а):Модуль настроил как на скриншоте. А каким образом, например, включить свет? Или отрегулировать яркость? Можно скрин?
Если вы о диммере -то измените связанное с каналом свойство.

Внес еще несколько изменений в модуль - теперь он корректно обрабвтывает яркость в диммере ламп накаливания и проверяет контрольную сумму ответа, но никак не могу победить зависание раз в два - три часа set_time_limit() не помогает. Есть в пхп аналог set_time_limit() включающий всё время выполнения без исключений? Или как автоматом убивать/перезапускать цикл если он завис?

Re: Модуль работы с контроллерами Uniel

Добавлено: Пн фев 27, 2017 7:27 pm
vsevolod.trofimov
что-то не могу разобраться. свойство прикрепил, но каким бы его не установил - ничего не меняется. может быть дело в настройках шлюза eth-rs485? я пробовал режимы tcp client и tcp server - результат одинаковый. у меня на странице появилось 7 input и 7 output - это правильно. Это считывается с устройства или 7+7 у всех?

по поводу цикла - я правильно понимаю, что скрипт должен постоянно крутиться в памяти, но вырубается по таймауту? можно еще max_execution_time, но вообще надо посмотреть что phpinfo() выдает для начала по поводу лимитов. он может вырубиться еще по лимиту памяти, например. что инициирует его запуск?