erandess писал(а):Да, есть желание поэкспериментировать со встроенным счетчиком Меги.
Получить счетчик очень просто. Вопрос лишь в том, что с ним делать дальше. Если использовать настройку на Меге Config -> Megad-ID -> srv_loop то она будет слать сообщение с параметром all=. Его обработка сделана в последнем обновлении, но там я просто теряю счетчик. Вот кусок кода метода
incomingMessage
Код: Выделить всё
/* если мега передала все параметры одной строкой all=OFF/0;OFF/0;OFF/0;OFF/0;ON/1;OFF/0;OFF/0;OFF;ON;OFF;OFF;OFF;OFF;OFF;288;203
Смотрим на строку! Сначала идут входы (со счетчиками), потом выходы, и в конце 2 АЦП порта. Универсального кода тут написать невозможно.
Все будет зависеть от комплектации меги, но с большей долей вероятности у Вас будет модуль 7I7O (7 входов 7 выходов) + 2 АЦП порта.
Разбиваем строку на массив, перебираем значения и устанавливаем нужные свойства. Это условие сработает ТОЛЬКО при передаче мегой
параметра all= и может пригодится для синхронизации статусов портов меги и статусов объектов МД.
ВНИМАНИЕ! в группах case нужно изменить код на свой!
*/
if (isset($params['all'])) {
$ps = explode(";", $params['all']);
$i=0;
foreach($ps as $pt) {
$i = $i + 1;
// Оторвать счетчик. Пока что у меня нет на него планов.
$pt = explode("/", $pt);
$pt = $pt[0];
// Заменить слова на цифры
if ($pt == 'ON') { $pt = 1; }
if ($pt == 'OFF') { $pt = 0; }
// Обрабатываем значения нужных нам портов
switch ($i) {
case 8:
// Если есть задача периодически синхронизировать статус порта меги со статусом объекта МД
// Изменение статуса объекта реле таким образом не приведет к отправке команды меге на включение или выключение порта, что нам и надо.
setGlobal('Relay1MegaD1.status',$pt);
break;
case 9:
// Просто сказать статус порта 2 для примера.
say('значение выхода 2 '.$pt);
break;
}
}
return;
}
Вот именно тут я отбрасываю счетчик. Код конечно написан совсем не в стиле php. Я только начал его изучать, и пока что сильно сказывается синтаксис VBA. Так что уж прощайте мне это, и если где можно сделать по красивей, обязательно напишите с примером!
Код: Выделить всё
// Оторвать счетчик. Пока что у меня нет на него планов.
$pt = explode("/", $pt);
$pt = $pt[0];
можно убрать $pt = $pt[0]; и за значением статуса порта так дальше и обращаться к $pt[0], а за значением счетчика к $pt[1]. Тогда в группах case можно указать, в какое свойство объекта МД писать значения счетчика. Вечерком сделаю полный пример и обновлю класс. Файл megad.php останется тот же. Я уже писал ранее, главное чтобы класс и файл были одной версии до точки. Иначе они не совместимы. И еще подсказка, при обновлениях МД файл megad.php затирается. Я так разок сам попался ))
Еще для получения счетчика нам будет интересен метод
getOutput. Его тоже перепишу вечерком чтобы по параметру раздельно возвращал статус и счетчик. С помощью него будет можно раз в установленный интервал времени самому забирать значение счетчика у меги. Или же сразу, когда это потребуется.
Если есть еще какие либо идеи, обязательно пишите, будем пробовать. Как нибудь попробуйте потестить двойное и долгое нажатие. Я хоть и давно уже прикрутил, но сам пока что нигде не использую. Там где это бы могло пригодится, пока что самой меги нету ) Заказал, скоро приедет.
Большая просьба, кто использует мой класс, жмакните спасибо в теме
http://smartliving.ru/forum/viewtopic.php?f=14&t=1832 где файлы. Мне было бы очень интересно знать кому он пригодился.