Modbus Slave — настройка и ошибки

Просмотр 15 сообщений - с 16 по 30 (из 34 всего)
  • Автор
    Сообщения
  • #20658
    manjey73
    Участник

    Чисто мое мнение, слабоват драйвер.
    Единственный плюс, это совместимость шаблонов и больше ничего.

    1. нет возможности формировать для мастера разрозненные входные каналы для чтения одним запросом
    2. нет возможности сформировать посылки из входных каналов разных КП опять же, под один групповой запрос для мастера.

    #20659
    manjey73
    Участник

    Добавьте атрибуты в секции Elem
    № КП и № вх.канала

    Драйвер Modbus мастер по идее просто проигнорирует данные атрибуты
    А в драйвере Modbus slave появится возможность редактировать данные атрибуты.
    В № КП будет стоять по умолчанию из общих свойств или в конкретном случае из командной строки, при необходимости можно будет заменить на другой КП
    а в № вх.канала, требуемый канал для передачи.

    Для мастера что слейв отдаст, то и будет, нумерация сигналов останется той же последоваательной. Имена переменных так же.

    #20660
    manjey73
    Участник

    Как бы то, что не надо было забывать с самого начала — мастером может быть кто угодно, а не только другая Rapid Scada.

    #20669
    manjey73
    Участник

    Хм — а что, дорасчетные каналы в игноре для драйвера Modbus Slave ?

    Очень странное поведение при настройке двух групп запросов в слейве.
    Вроде адреса поставил разные, а переменные считываются строго по порядку и никак иначе, от слова совсем.

    з.ы. СЫРО….

    1

    2

    <?xml version="1.0" encoding="utf-8"?>
    <DevTemplate>
      <Settings>
        <ZeroAddr>true</ZeroAddr>
        <DecAddr>true</DecAddr>
        <DefByteOrder2 />
        <DefByteOrder4 />
        <DefByteOrder8 />
      </Settings>
      <ElemGroups>
        <ElemGroup active="true" tableType="HoldingRegisters" address="0" name="">
          <Elem name="Err_Code" type="ushort" byteOrder="" />
          <Elem name="Err_Time" type="double" byteOrder="" />
          <Elem name="T_Gvs" type="float" byteOrder="" />
          <Elem name="Uroven_Litr" type="float" byteOrder="" />
          <Elem name="T_Out" type="float" byteOrder="" />
        </ElemGroup>
        <ElemGroup active="true" tableType="HoldingRegisters" address="20" name="Группа2">
          <Elem name="xxx1" type="float" byteOrder="" />
          <Elem name="xxx2" type="float" byteOrder="" />
          <Elem name="xxx3" type="float" byteOrder="" />
          <Elem name="xxx4" type="float" byteOrder="" />
          <Elem name="xxx5" type="float" byteOrder="" />
        </ElemGroup>
      </ElemGroups>
      <Cmds />
    </DevTemplate>

    Одна картинка, если мастером прочитать 10 переменных к ряду одним запросом.
    Вторая, если читать так же, двумя запросами. Судя по номерам каналов в привязке и выставленным адресам регистров, адреса регистров никак не влияют на начало отсчета переменных в КП, из которого хотим прочитать данные.

    #20670
    manjey73
    Участник

    В общем пока вердикт такой, пользоваться данным драйвером невозможно без плясок с бубном….

    #20671
    manjey73
    Участник

    Либо ошибка в коде, либо задумка совершенно непонятна.
    В общем использовать данный драйвер в том виде, в котором он есть бесполезно.

    #20696
    Mikhail
    Модератор

    Основные задачи, которые решались при разработке данного драйвера Modbus Slave:
    1. Приём данных от контроллеров, которые являются Модбас мастером.
    2. Режим зеркала для устройства Модбас-мастер, подключенного к скаде.

    Для указанных выше задач драйвер подходит отлично.
    Если Ваша задача — предоставить значения произвольных каналов другой системе или прибору, то драйвер не слишком удобен, что определяется его архитектурой. Для предоставления произвольных данных вообще не нужны были бы шаблоны идентичные мастеру — просто выбрать нужные каналы и всё.

    #20697
    manjey73
    Участник

    Как раз вся суть создать шлюз в другую систему, в которую нет необходимости передавать все подряд.

    1. Дорасчетные каналы можно передать через драйвер, но для этого необходимо присвоить им номер сигнала — вопрос ЗАЧЕМ ? это нарушает несколько концепцию работы самой Scada, зачем присваивать дорасчетным каналам левые номера сигналов?
    2. Нельзя исключить канал, удалив у него номер сигнала, сами проверьте, что начинает происходить, если есть вторая группа регистров
    3. Тем более нельзя удалить номер сигнала, если у канала в КП это действующий параметр
    4. Чтобы передать только нужные значения, необходимо сформировать строгую последовательность в базе, что нарушает опять же концепцию работы системы, а именно «Создание каналов» при использовании шаблона устроства

    Чтобы передавать параметры другого КП нужно создать еще КП и настроить его через другой порт, например первый на 502, другой на 503 — опять же ЗАЧЕМ?
    Одна система Slave, просто необходимо создать на одном порту карту регистров только тех каналов, которые требуются к передаче. Вот если не хватит регистров, тогда только создаем еще один КП с новым портом и создаем еще одну карту — опять же, а почему этого не делать в одном КП за счет увеличения Опрашиваемых?
    То есть добавляем в Опрос КП новое, указываем порт, создаем карту.

    5. Драйвер никак не сообщает мастеру о том, что запрашивается отсутствующий регистр. Идет или «Ошибка связи» или чтение левых несуществующих нулей.

    #20698
    Mikhail
    Модератор

    Значения, берущиеся из скады, скорее всего, отобразятся при их запросе.

    #20699
    manjey73
    Участник

    6. И еще, вариант открытия нескольких сокетов на один порт? возможно ли такое программно? Было бы полезно, чтобы не создавать одинаковые карты регистров на разные порты. Как это в некоторых ПЛК или панелях работает ?

    Идет искажение параметров, при удалении номера сигнала, так как участвует номер сигнала и собственно номер индекса входного канала в КП, что приводит к путанице при попытке разбить запросы на 2 где второй запрос идет со смещением номера регистра….

    • Этот ответ был изменен 2 года, 7 месяцев назад от manjey73.
    #20701
    manjey73
    Участник

    Предположим в КП 200 переменных int и float кучей. Modbus ограничен 128-ю регистрами.
    Как передать все переменные?
    Каким образом драйвер Modbus Slave поймет, что в одном случае необходимо создавать список с 0-ого индекса переменных в КП, а в другом случае скажем с 100-ого ?

    Разбивать КП на два, три и более, чтобы драйвер Modbus Slave мог работать всегда с 0-ого индекса?

    Опять нарушаем всю концепцию…..

    #20702
    Mikhail
    Модератор

    6. И еще, вариант открытия нескольких сокетов на один порт? возможно ли такое программно?

    Если речь идёт о подключении нескольких TCP-клиентов (Модбас мастеров), то да.

    Modbus ограничен 128-ю регистрами. Как передать все переменные?

    В одном запросе Holding Registers по стандарту может быть только 125 регистров. Но само адресное пространство имеет 65535 адресов. Нужно их забирать запросами с <= 125 регистров.

    #20703
    Mikhail
    Модератор

    При переносе на 6-ю версию сделаю ревью драйвера на предмет доработок.

    #20704
    manjey73
    Участник

    В одном запросе Holding Registers по стандарту может быть только 125 регистров. Но само адресное пространство имеет 65535 адресов. Нужно их забирать запросами с <= 125 регистров.

    В нынешней реализации это возможно ?

    Да, хотелось бы более дружественной настройки для драйвера.
    Кстати, будете делать ревью, сделайте возможность перетаскивать переменные из группы в группу как для штатного Modbus, так и для Slave-а

    #20716
    manjey73
    Участник

    Для будущего обновления драйвера предусмотреть умножение переменной для процесса преобразования в один регистр.

    Так как во входном канале, который будет требоваться передать в виде int_16 или uint_16 может стоять своя формула.
    Было бы неплохо для драйвера Slave передавать значение канала в качестве одного регистра умноженного на 10, или 100 например

Просмотр 15 сообщений - с 16 по 30 (из 34 всего)
  • Вы должны авторизироваться для ответа в этой теме.