четверг, 28 апреля 2016 г.

Длинные команды в PLC I



PLC один устоячиво занимает место бюджетной системы дистанционного  сбора данных со счетчиков электроэнергии. Несмотря на то, что широко используется PLC II, на подходе PLC III, интерес к PLC I сохраняется. Поэтому продолжаем разбираться  с ее функционалом и сегодня затроним вопрос с длинными командами в PLC I.


Описание  длинных команд можно найти в  соответствующем документе. Приведу здесь основную информацию из него.
Длинные команды используются в том случае, когда возникает необходимость передать сетевому устройству команду, длина которой с аргументами превышает длину полезной нагрузки типового PLC-пакета (4 байта).
При  передаче длинных команд концентратор  передаёт адресный PLC-пакет  Сетевое устройство, имеющее указанный адрес и способное выполнить командный файл данного типа, "открывает" у себя в оперативной памяти буфер соответствующего размера и переходит в режим приёма указанного количества PLC-пакетов с данными. Концентратор  передаёт серию PLC-пакетов. 
После приёма последнего PLC-пакета с данными сетевое устройство проверяет целостность принятого командного файла и выполняет содержащуюся в нём команду. В качестве подтверждения выполнения команды сетевое устройство в течении 255 минут передаёт PLC-пакеты типа DAh ( "Выполнено" ) . Передача этих PLC-пакетов может быть прервана либо поступлением от концентратора любого PLC-пакета,, либо специальной командой типа DBh (возврат счетчика в режим "по умолчанию").
Для передачи длинных команд можно воспользоваться программным обеспечением BMonitor  и BQuark.
В  программе  BMonitor   для передачи длинных команд используется  поле размещенное на вкладке "Сервис", которая открывается кликом мыши по пустому пространству окна программы  справа от кнопки вызова справки и при удерживаемой в нажатом состоянии кнопки Ctrl

 В левом окне "Тип" указывается тип длинной команды. Их всего четыре:

ТИП
ПРИМЕЧАНИЯ
00h
Эмуляция системы команд счётчиков "Меркурий-200"
(без адреса счётчика в начале и без контрольной суммы в конце)
01h
Эмуляция системы команд счётчиков "Меркурий-230"
(без контрольной суммы)
10h
Команда на изменение тарифного расписания для многотарифных счётчиков электроэнергии
11h
Команда на изменение списка праздничных дней текущего года для многотарифных счётчиков электроэнергии

Далее указывается адрес, или ставится галочка широковещательной команды. В длинном поле указывается сама команда, байты указываются через пробел. Для выполнения, кликается кнопка "Выполнить"
На исполнение можно назначать несколько команд. В этом случае они буду сохранены в буфере концентратора  и будут выполняться по очереди, в соответствии с порядком их поступления в буфер.
Записать несколько команд можно поочередно вписывая их в поле команды и нажимая для каждой из них кнопку "Выполнить".
Для контроля заполнения буфера необходимо воспользоваться функцией "Проверка PLC буфера".
Для трехфазных счетчиков, для осуществления настроек в счетчике  всегда необходимо открывать канал связи на втором уровне доступа. Поэтому первой в очереди должна быть команда вида:

01 01 02 02 02 02 02 02 02
 
Второй особенностью работы с трехфазными счетчиками является необходимость добавления байта  01 вначале каждой посылки.



Программа не распознаёт ответы от счётчика на запросы в виде эмуляции системы команд счётчиков «Меркурий», поэтому по результату выполнения команд  в столбцах «Текущее» и «Срез» отображается содержимое полученного от счётчика пакета без расшифровки, а в поле «Пакет» при этом присутствует запись «Не выполнено» для «Меркурий 230» и выполнено для «Меркурий 200».

В программе BQuark, длинная команда прописывается в файле задания. Команда имеет вид:

RUN=M-230 - для трехфазников

и

RUN=M-200 - для однофазников


Родительским объектом для данной команды является объект  PLC_I_CONCENTRATOR
Дополнительные  параметры команды :
HEX =...   - HEX-строка с произвольной командой, адресованной счётчику (без сетевого адреса и контрольной суммы) в соответствии с протоколом счетчика.
DEVICE=54   - номер счётчика. Если параметр отсутствует, то команда будет адресована всем счётчикам сразу.

Пример. Команда управления реле в трехфазном счетчике.

OBJECTS
    TYPE=GSM_TERMINAL
        TYPE=GSM_GATE; NUMBER=+79159477417
            TYPE=PLC_I_CONCENTRATOR; ADDR=2001
                TYPE=COMMAND; RUN=M-230; HEX=01 01 02 02 02 02 02 02 02
                TYPE=COMMAND; RUN=M-230; HEX=01 03 18 01


Команды, для счетчиков формируются в соответствии с описанием системы команд. Их я размещу в следующей статье.

Время выполнения команд в PLC I довольно продолжительно и может достигать 30 минут и более, в зависимости от длины команды.

32 комментария:

  1. Анонимный16 мая 2016 г., 1:08

    У нас остро стоит вопрос по поводу перехода на полные показания. сотни счетчиков установлены с возможностью перехода, а сотни нет. И на каким подстанциям какие подключены не известно. Нам хотелось бы знать как послать адресно команду одному счетчику перейти в режим по умолчанию. В кротких командах даётся общая команда для всех FF 1F возможно ли вместо этого записать конкретный адрес? Или как это сделать с помощью длинной команды?

    ОтветитьУдалить
    Ответы
    1. 1FFF - это сетевой идентификатор означающий что команда широковещательная. Указывается младшим байтом вперед и поэтому имеет вид FF 1F
      Вместо FFF можете указать сетевой адрес конкретного счетчика.

      Удалить
    2. Анонимный17 мая 2016 г., 5:05

      Например? Если скажем будет номер 1 или 121 как его записать?

      Удалить
    3. 121 переводим в hex - получаем 79
      Записываем в поле SSSS пишем 79 10

      Удалить
  2. Анонимный17 мая 2016 г., 22:30

    Большое спасибо!!!

    ОтветитьУдалить
  3. 1.Как будет выглядеть пароль для открытия сеанса 489696
    TYPE=COMMAND; RUN=M-230; HEX=01 01 02 04 08 09 06 09 06
    Правильно ?

    2.Нужно ли открывать канал связи для перевода в однотарифный режим ?
    TYPE=COMMAND; RUN=M-230; HEX=01 03 2A 01

    ОтветитьУдалить
    Ответы
    1. Да. Все верно. При условии , что пароль в HEX кодировке. По умолчанию она именно HEX.

      Удалить
    2. А если в ASCII ?
      Как тогда указать?

      Удалить
    3. В соответствии с таблицей символов ASCII

      Удалить
  4. Хотелось бы уточнить такую путаницу в PLC-1.
    При каких условиях в каких командах , когда указывается группа счётчиков DEVICE=1,2,3,4 и когда
    указывается
    DEVICE=1
    DEVICE=2
    DEVICE=3
    DEVICE=4

    И как правильно работать именно с группой счётчиков ?



    ОтветитьУдалить
    Ответы
    1. Свойство DEVICE предназначено только для работы с одним счетчиком. Путаницы тут нет.

      Удалить
    2. А как обьяснить вот эту комманду ?
      TYPE=COMMAND; RUN=M-230; HEX=01 03 2A 01; DEVICE=160,159

      Обработались оба счётчика, остальные работают в тарифном режиме!!

      Удалить
    3. Не припомню что бы я указывал такую команду где-то. И в документации не встречал.

      Удалить
    4. 1.Так почитайте "Краткая справка по протоколу счётчиков М-230" в справке к Бикварку.

      2.Как же Вы переводите многотарифные счётчики в однотарифный?

      Удалить
    5. Для перевода ограниченной группы счетчиков потребуется несколько раз выполнить файл с командами для разных счетчиков. Если в одном файле размещать много команд, то может не хватить буфера обмена концентратора. В тоже время, если был успешный опыт использования команды DEVICE=1,3,5 то можно использовать её. Возможно это из разряда не предусмотренных возможностей.

      Удалить
  5. Подскажите пожалуйста как правильно пользоваться предоставленной в руководстве "Меркурий-PLC-I. Система сбора данных. Техническое описание" функцией long crc_octets (char *octets, int len)для расчета CRC24. Что нужно подставлять в аргументы функции?

    Чтобы не пробовал, полученный CRC код не совпадает с тем, что получаю при общении компьютера с концентратором 225.11 (использовал программу снифер).

    ОтветитьУдалить
    Ответы
    1. *octets - указатель на цепочку из len байтов от которых CRC24 высисляется

      Удалить
    2. Верна ли запись на C:
      std::cout << std::hex << " " << crc_octets("FFFF492401",5) << std::endl;

      в результате получаю crc = D2 60 B0.

      а в перехваченном сообщении от хоста к концентратору CRC = 80 53 1C

      (полный запрос 80 53 1C FF FF 49 24 01 86 85).

      что может быть не так?
      оговорюсь, обладаю неглубокими познаниями в С, да и с расчетом crc еще дела не имел, прошу прояснить ситуацию.

      Удалить
    3. Вопрос все еще актуален

      Удалить
    4. В настоящее время нет возможности ответить Вам, т.к. программист находится в отпуске.

      Удалить
    5. Отвечу на свой вопрос сам:
      Не правильно передавал аргумент octets в функцию.
      Передавал строку в виде Символов, нужно передавать в виде 16ричных значений, тогда все ок:

      char octets[] = { 0xFF, 0xFF, 0x49, 0x24, 0x01 }; //
      std::cout << std::hex << " " << crc_octets(octets,5) << std::endl;

      Удалить
  6. Добрый день!
    Отправили через концентратор команду на чтение серийного номера счетчика. После этого счетчик перестал передавать показания. Поможет ли нам команда "перейти в режим по умолчанию"? И если ее отправить всем счетчикам, то не нарушится ли работа остальных счетчиков, передающих показания по тарифам?

    ОтветитьУдалить
    Ответы
    1. Причина того, что счетчик не отработал команду на передачу серийного номера может заключаться в том, что счетчик не поддерживает её.
      Вернуть счетчик в режим передачи показаний накопленной энергии в формате 4-х знаков можно отправив команду возврата счетчик в режим "по умолчанию" Все счетчики отработавшие эту команду начнут передавать накопленные данные в формате 4-х знаков.

      Удалить
    2. Подскажите что за команда позволяет считать серийные(заводские номера счетчиков?) , не могу откопать нигде ее..

      Удалить
    3. Вы планируете "читать" серийный номер через PLC I интерфейс?

      Удалить
    4. Здравствуйте.Спасибо за обратную связь.
      Да у меня свежие Меркурии 234 на 3 ветках ТМ-1 ТМ-2, ТМ-3..
      Структура спроектирована так, что на ТМ-1 256 счетчиков должны сидеть на фазе А, 256 на ТМ-2 на фазе B и 256 ТМ-3 на фазе С.
      На каждой ветке в счетчике запрограммированы номера рабочей сетки с 1по 256.
      Учитывая специфику монтажа на данный момент приводим фазировку в соответствие.
      Насколько я понял что в случае с PLC-1,без использования ключей шифрования, возможен вариант чтения счетчика через силовой трансформатор с таким же номером PLC модема, чего во избежания путаницы с показаниями хотелось бы избежать..
      Надеюсь прочитать заводские номера, сделать анализ и соответственно сфазировать то что нужно сфазировать,
      что бы за зря не лазать по столбам.
      Понял, что возможно через сервисные функции Bmonitor, короткими командами указать концентратору что ему нужно забирать со счетчика.
      При этом , учитывая размер буфера коротких комманд и их возможное количество,мне понимается , что концентратор может формировать и отправлять счетчику 18 различных запросов (по крайней мере доступных в интерфейсе Bmonitor), как то :
      --------------
      Энергия активная точный срез = 00/00
      Энергия активная фаза А точный срез =00/10
      Энергия активная фаза В точный срез =00/20
      Энергия активная Т1 точный срез =00/30
      и т.д вплоть до
      Серийный номер =02/48
      Энергия активная, текущий тариф на 00:00=02/FE
      Вернуться в режим по умолчанию =02/FF
      -------------------------------------
      Можно пояснить чтио имеется ввиду под каждой командой..
      Что значит точный срез ? На каком временном интервале? Что подразумевается под режимом по умолчанию? Какие данные концентратор запрашивает счетчик в этом случае?
      Ссылка Специальное описание коротких команд, составленное конструктором системы: https://yadi.sk/d/RGwyJz8Sphwc7 приводит к ознакомлению ( не факт что отвечает на все вопросы) на документ "Интерфейс сетевых устройств", описание PLC-пакетов для одно- и трёхфазных счётчиков электроэнергии - можно его как то получить?
      В документе "Описание протокола счетчика меркурий 234" про PLC изложено ооочень скромно..
      Для эксплуатации мне по сути нужны показания по тарифу1 и тарифу2 на 00-00 часов первого/последнего дня возможных месяцев работы.
      В счетчике данные авточтений на 00-00 часов 1 числа месяца естественно имеются.. Но у меня
      Где видел упоминание что возможно чтение концентратором 6(шести) последних месяцев..
      Подскажите пожалуйста как мне их в него (концентратор) вытащить?.
      Буду премного благодарен и очень признателен за рецепт вида "необходимо и достаточно"..
      Видел упоминание что, приотправке команды на чтение серийного номера на концентратор , он перестает запрашивать и соответственно собирать и передавать данные показаний.. Актуален ли еще этот момент в моем случае?
      Отключением нагрузки по PLC-1, несмотря на всевозможные извествные проблемы с обратной связью и прочее , планирую заняться чуть позже, если не выгонят с работы.. Еще раз заранее спасибо..

      Удалить
    5. Документация по PLC I : https://yadi.sk/d/xhXaKRT93LLM4k
      Сразу скажу, счётчик может передавать только один тип данных, поэтому если он работает в режиме "по умолчанию" то он передает данные по электроэнергии (4 знака - по текущему тарифу) . Если он переведен в режим передачи доп. данных, например серийного номера, то он передает только серийный номер. Далее данные сохраняются в концентраторе и мы их читаем уже из концентратора. В концентраторе могут сохраняться данные по предыдущим месяцам, например за 6-ть последних месяцев энергия по двум тарифам. Получить из счётчика мы можем только определенную часть данных, перечень этих данных вы упомянули, говоря о программе BMonitor.
      Срез - это данные, например, по энергии, на фиксированный момент времени, конкретно на начало суток.

      Удалить
  7. Спасибо за ответ и за ссылки. Поясните пожалуйста ситуацию. Прошил концентратор прошивкой рекомендуемой для сбора полных показаний по тарифам и сумме (uC.Rev.3.4-40.41.4F.hex). Требуемые показания пошли,считал. Даю команду через монитор считать серийные номера, но такое ощущение что концентратор ее игнорирует напрочь. Давал команду на чтение серийников 14 раз подряд так что буфер забивался . Так же прописываю эту же команду и пытаюсь заслать ее через бикварк , что получилось однажды с соседним концентратором по коммутируемой линии связи (через GSM модем CSD соединение) Реакция однотипная , 00011: i/o 000026:000010 (01:18:07): Режим работы концентратора: MAIN.
    00012: i/o 000026:000010 (01:18:07): "Прозрачный" режим: Нет.
    00013: i/o 000026:000010 (01:18:07): Автопереход на зимнее время: Нет.
    00014: i/o 000060:000020 (01:18:08): Концентратор 203D, показания часов/календаря: 1:15:36, 01.08.2017, вторник.
    00015: i/o 000146:000030 (01:18:09): Концентратор 203D, версия микропрограммы: 'uC.Rev.3.4-40.41.4F от 30.05.2016'.
    00016: i/o 000146:000044 (01:18:59): Запрос типа 'NoAnswer' '364FA6-FFFFFF1F05-DCFF1F0248-43', нет ответа, OK., после чего серийные номера считались,но вновь прошитый концентратор молчит. Подскажите что с ним происходит? Или что я понимаю неверно.. Думал уже попробовать вернуть прошлую прошивку- может в ней дело, хотя вы везде в комментариях пишете что это не влияет на короткие команды? Заранее спасибо!!

    ОтветитьУдалить
    Ответы
    1. Принимая во внимание ваше пояснение чуть выше, то получается что концентратор не хочет переводится в режим передачи дополнительных данных в части чтения серийного номера?

      Удалить
    2. Получение полных показаний - это тоже короткая команда. Концентратор с указанной прошивкой просто в циклическом режиме отправляет короткую команду на получение полных показаний. Поэтому команда на получение серийного номера замещается сразу следующей за ней командой на получение полных показаний и не выполняется счётчиком. Повторюсь, прошивка uC.Rev.3.4-40.41.4F.hex реализует получение полных показаний, постоянной отправкой счётчикам короткой команды на получение полных показаний.

      Удалить
  8. Здравствуйте!
    Возможно ли в PLCI скачивать профиль со счетчиков М 236 PQL и чтобы программа верхнего уровня Меркурий Энергоучет автоматически считывала этот профиль?

    ОтветитьУдалить
    Ответы
    1. Возможность такая заложена в технологии PLC I, но реализации в программном обеспечении верхнего уровня отсутствует.

      Удалить