четверг, 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 минут и более, в зависимости от длины команды.

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

  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-х знаков.

      Удалить