управление из скады выходами мдвв

Стартовая страница › Форумы › Взаимодействие с устройствами › управление из скады выходами мдвв

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

    К сожалению под руками нет МДВВ. адресация с 0 или с 1 у разных производителей по разному. Овен адресует с 0, SCADA с 1, поэтому и приращение. Только у вас как-то наоборот, ведь 50-й для МДВВ у Овен это должен быть 51 в SCADA, а вы 49-й вписали и попали куда надо…. даже странно.

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

    пишет не в тот адрес это первое, вместо 50 почему то пишет в 51

    Существует некоторая путаница, т.к. в некоторых случаях адресация начинается с 1, а в некоторых с 0. Поэтому полезно проверять отправляемые данные.

    Рапида использует 0х006, а в документации на мдвв написано, что запись в регистры осуществляется функцией 0х10.

    Функция 10 отправляется Коммуникатором, если для команды стоит признак Множественная.

    #4588
    manjey73
    Участник

    Теперь стало понятнее почему регистр 1 а признак Множественная, проверил на ПР. так и есть. функция 10.

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

    Отправляю команду со значением 1

    В документации на странице 37 сказано, что надо отправлять значение от 0 до 1000 по адресам регистров от 0 до 7 (от 1 до 8 в настройках Коммуникатора).

    • Ответ изменён 9 лет, 8 месяцев назад пользователем Mikhail.
    #4591
    Mikhail
    Модератор

    Теперь стало понятнее почему регистр 1 а признак Множественная

    Вообще, у производителя странная логика включать один выход командой Write Multiple Registers

    #4593
    manjey73
    Участник

    Она не странная, возможно проблема а наличии места в прошивке, поэтому использовали одну команду Modbus. А там в приборе еще и Овен протокол прошит и DCON (может быть) плюс всякие настроечные параметры.
    Отсюда и урезания видимо…

    #4596
    alsergeevich
    Участник

    От 0 до 1000 надо значение отправлять если управлять одним входом, а я в шаблоне пока записал только маску выходов, если в неё отправить 1 то это соответствует выходу 1. Значит сейчас в шаблоне поменяю на множественную команду и по идее должно всё заработать. Ушёл проверять.

    #4597
    alsergeevich
    Участник

    Шаблон:
    <?xml version=»1.0″ encoding=»utf-8″?>
    <DevTemplate>
    <ElemGroups>
    <ElemGroup active=»true» tableType=»HoldingRegisters» address=»50″ name=»выходы»>
    <Elem name=»out» type=»ushort» byteOrder=»01234567″ />
    </ElemGroup>
    <ElemGroup active=»true» tableType=»HoldingRegisters» address=»51″ name=»входы»>
    <Elem name=»in» type=»ushort» byteOrder=»01234567″ />
    </ElemGroup>
    </ElemGroups>
    <Cmds>
    <Cmd tableType=»HoldingRegisters» multiple=»true» address=»49″ elemCnt=»1″ cmdNum=»1″ name=»on_out» />
    </Cmds>
    </DevTemplate>
    Вот что отправляет :
    10 10 00 31 00 01 02 00 00 62 21
    Расшифровка:
    10 Slave address 0x10 (16)
    10 Function code 0x10 (16) — Write Multiple Registers
    00 31 Starting address 0x0032 (50)
    00 01 Quantity 0x0001 (1)
    02 Byte count 0x02 (2)
    00 00 Registers value 0x0000 (0)
    62 21 CRC 0x6221 (25121)
    Всё ведь верно теперь, но всё равно не работает. Может я где-то ошибку делаю ?

    #4598
    alsergeevich
    Участник

    2017-02-15 17:41:43 Команда КП 61 «mymodbustest», тип: KpModbus, адрес: 16
    Команда «on_out»
    Отправка (11): 10 10 00 31 00 01 02 00 00 62 21
    Приём (5/5): 10 90 02 9D C4
    Ошибка устройства: [02] ILLEGAL DATA ADDRESS!
    Теперь с адресом, что-то не так ?

    #4599
    manjey73
    Участник

    у вас вместо 1 отправляется 0 почему-то
    00 00 Registers value 0x0000 (0)

    Как именно вы отправляете 1 ?

    Попробуйте использовать формулу.
    fRevers — название формулы

    тело формулы

    public double fRevers (int rev)
    {
    float q = Convert.ToSingle(CmdVal);
    byte[] f = new byte[4];
    byte[] o = new byte[4];
    f = BitConverter.GetBytes(q);
    Array.Copy(f,0,o,0,4);
    if (rev == 1)
    {
    Array.Copy(f, 0, o, 1, 1);
    Array.Copy(f, 1, o, 0, 1);
    Array.Copy(f, 2, o, 3, 1);
    Array.Copy(f, 3, o, 2, 1);
    }
    //else o = f;
    Array.Resize(ref o, 8);
    Double ou = BitConverter.ToDouble(o,0);
    return ou;
    }

    В Канале управления поставьте Использовать формулу и напишите fRevers(1)
    Это для float в общем, но целые числа тоже должен отправить.
    Попытки использовать Стандартную команду непосредственно в Коммуникаторе у вас ни к чему не приведут, там только бинарную команду надо отправлять или 00 01 или наоборот 01 00 (не помню)

    Хотя перестановка байт для float может не прокатить…

    • Ответ изменён 9 лет, 8 месяцев назад пользователем manjey73.
    • Ответ изменён 9 лет, 8 месяцев назад пользователем manjey73.
    #4603
    manjey73
    Участник

    Да, проверил на ПР200. В общем надо переставлять байты формулой, так как используется команда 0x10 и из коммуникатора отсылается double, в результате посылка идет не тех значений.
    Бинарная в шестнадцатиричном значении 0001 слитно отправит 1
    Формула для float не подойдет

    • Ответ изменён 9 лет, 8 месяцев назад пользователем manjey73.
    • Ответ изменён 9 лет, 8 месяцев назад пользователем manjey73.
    #4606
    manjey73
    Участник

    public double iRevers (int rev)
    {
    int q = Convert.ToInt32(CmdVal);
    byte[] f = new byte[2];
    byte[] o = new byte[2];
    f = BitConverter.GetBytes(q);
    Array.Copy(f,0,o,0,2);
    if (rev == 1)
    {
    Array.Copy(f, 0, o, 1, 1);
    Array.Copy(f, 1, o, 0, 1);
    }
    Array.Resize(ref o, 8);
    Double ou = BitConverter.ToDouble(o,0);
    return ou;
    }

    Использовать формулу, записать iRevers(1)

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

    Теперь с адресом, что-то не так ?

    Уточните, пожалуйста, какую из описанных в документации команд Вы пробуете отправить?

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

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

    #4618
    alsergeevich
    Участник

    Отправляю бинарную команду со значением 0011
    Отправляются такие данные:
    10 10 00 31 00 01 02 00 11 A2 2D

    10 Slave address 0x10 (16)
    10 Function code 0x10 (16) — Write Multiple Registers
    00 31 Starting address 0x0032 (50)
    00 01 Quantity 0x0001 (1)
    02 Byte count 0x02 (2)
    00 11 Registers value 0x0011 (17)
    A2 2D CRC 0xA22D (41517)

    Но опять пишет:
    Отправка (11): 10 10 00 31 00 01 02 00 11 A2 2D
    Приём (5/5): 10 90 02 9D C4
    Ошибка устройства: [02] ILLEGAL DATA ADDRESS!

    Отправляю номер команды 1 как в шаблоне, значение 0х0011.
    Команда на запись 0х10 как в доках, запись в регистры, всё верно.
    Адрес регистра 50, маска выходов, как в доках.
    Почему выскакивает эта Ошибка устройства: [02] ILLEGAL DATA ADDRESS!, какой адрес не верный или данные по адресу ?

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