Страница 6 из 12

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Чт ноя 08, 2018 6:42 am
directman66
Такой вариант (напрямую с com-портом) не предусматривался, конвертируйте его в tcp с помощью ser2net и обращайте по ip адресу.

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Чт ноя 08, 2018 10:40 am
Fav0rit
Не знаю правильно ли у всех отображается мощность, если правильно, то я удивлен, потому что значения мгновенной мощности у меня не сходились даже близко и я понял где ошибка.
Вот пример обмена данными со счетчиком:
send:32081600813E (запрос на получение значений мгновенной мощности)
answ:32 c1325d c1325d 000000 000000 8e45 (ответ: адрес PvT Pv1 Pv2 Pv3 CRC)

Так вот, в ответе мгновенной мощности c1 32 5d два старших разряда старшего байта указывают положение вектора
полной мощности и все байты читаются в порядке 1 3 2, то есть c1 5d 32, причем два старших бита этого числа мы должны отбросить, а полученное число разделить на 100.
c15d32 =
110000010101110100110010
000000010101110100110010 -> 89394/100 = 893.94 Вт

Описание протокола: http://www.incotexcom.ru/doc/M23x%20236 ... .12.11.pdf
На странице 44 сказано про старшие биты, на странице 53 (рисунок 36) показано схематично.

Если получится исправить расчет в модуле - пришлю результат.

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Чт ноя 08, 2018 3:35 pm
Fav0rit
Исправленная функция.
В гитхабе отправил...

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

function merc_gd($socket252, $cmd, $factor = 1, $total = 0)
{
$this->send($socket252, $cmd);
$result =$this->read($socket252);

	$ret = array();
	
	$start_byte = 1;
	
	if ( $total != 1 )
	{
		for ( $i = 0; $i < 4; $i++ )
		{
         	//if ( dechex(ord($result[$start_byte + $i * 3])) >= 40 )
			//$result[$start_byte + $i * 3] = chr(dechex(ord($result[$start_byte + $i * 3])) - 40);
			if ( strlen($result) > $start_byte + 2 + $i * 3 )
				// Для всех запросов кроме мощности используем стандартный рассчет
				if (substr($cmd,2,6)!='081600') {
					$ret[$i] = hexdec($this->dd($result[$start_byte + $i * 3]).$this->dd($result[$start_byte + $i * 3 + 2]).$this->dd($result[$start_byte + $i * 3 + 1]))*$factor;
				}
				// При запросе мощности нужно маскировать два старших разряда старшего бита
				else {
					$hex = $this->dd($result[$start_byte + $i * 3]).$this->dd($result[$start_byte + $i * 3 + 2]).$this->dd($result[$start_byte + $i * 3 + 1]);
					$bin=base_convert($hex, 16, 2);
					// Обрезаем строку до 22 бит
					while (strlen($bin)>22) $bin=substr($bin,1);
					$ret[$i] = bindec($bin)*$factor;
				}
		}
	}
	else
		$ret[0] = hexdec($this->dd($result[$start_byte+1]).$this->dd($result[$start_byte]).$this->dd($result[$start_byte+3]).$this->dd($result[$start_byte+2]))*$factor;
	return $ret;
}

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Чт ноя 08, 2018 5:34 pm
stellhawk
Спасибо, днем уже сам понял.
а есть пример настройки ser2net?
пробовал разные варианты, но всё что-то не то.
пробовал вот такие например, но с них ответ неадекватный на команды
1884:telnet:0:/dev/ttyUSB0:9600
1883:telnet:0:/dev/ttyUSB0:9600 NONE 2STOPBITS 8DATABITS -XONXOFF -RTSCTS LOCAL
на выходе
send:01010101010101013D7A
answ:
send:0805C673
answ:fffb03fffb01fffe01fffd00
send:08000670
answ:
send:08034671
answ:
send:080287B1
answ:
send:0102020202020202FAFC
answ:
send:0818067A
answ:
Причем ответ всегда такой шлю тестовую посылку:
send:001B07B30<br>answ:fffb03fffb01fffe01fffd00<br>
всё равно такой же ответ.
через утилиту mercury236 напрямую с /dev/ttyUSB0 нормально работает.

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Пт ноя 09, 2018 7:19 am
directman66
Fav0rit писал(а): Чт ноя 08, 2018 3:35 pm Исправленная функция.
В гитхабе отправил...
Спасибо принял. Не было возможности самому заняться.

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Пт ноя 09, 2018 7:23 am
directman66
stellhawk писал(а): Чт ноя 08, 2018 5:34 pm Спасибо, днем уже сам понял.
а есть пример настройки ser2net?
пробовал разные варианты, но всё что-то не то.
пробовал вот такие например, но с них ответ неадекватный на команды
1884:telnet:0:/dev/ttyUSB0:9600
1883:telnet:0:/dev/ttyUSB0:9600 NONE 2STOPBITS 8DATABITS -XONXOFF -RTSCTS LOCAL
у меня запускается через скрипт командой

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

ser2net -C "3004:raw:60:/dev/ttyUSB0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS"

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Пт ноя 09, 2018 9:42 am
Fav0rit
directman66 писал(а): Пт ноя 09, 2018 7:19 am
Fav0rit писал(а): Чт ноя 08, 2018 3:35 pm Исправленная функция.
В гитхабе отправил...
Спасибо принял. Не было возможности самому заняться.
Нет проблем, главное, чтобы мой код правильно работал, потому что там не самый красивый подход да и программист из меня так себе...

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Пт ноя 09, 2018 9:49 am
directman66
Просьба отписаться, кто пользуется модулем, каков результат. К сожалению, у меня нет оборудования меркурий для тестирования.

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Пт ноя 09, 2018 12:34 pm
stellhawk
к сожалению пока никак. не могу пробиться через ser2net что-то с настройками не так, а что пока не знаю.

Re: [Модуль] Счетчики Меркурий (mercury)

Добавлено: Пт ноя 09, 2018 6:10 pm
ученик
Может настройки с моего аппарата помогут?
Мои настройки Ser2net
только скорость 9600, а не как на скриншоте.
конфигуратор меркурия общается со счетчиком через ser2net.