Показано с 1 по 10 из 17

Тема: Запись регистров ТРМ202

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь
    Регистрация
    17.06.2016
    Адрес
    Витебск
    Сообщений
    251

    По умолчанию

    Цитата Сообщение от Saratov Посмотреть сообщение
    Добрый день, есть два прибора ПР200 и ТРМ202, подключены в компьютеру через 485 интерфейс. Есть программа на C#, в которую я интегрировал библиотеку для работы с протоколом Modbus, а именно NmodBus4.

    Для прибора ПР200 все замечательно читает и пишет(ReadHoldingRegisters/WriteMultipleRegisters/WriteSingleRegisters).

    Что касается прибора ТРМ202, корректно только читает регистры(ReadHoldingRegisters), не могу записать 5 и 6 регистры, выдает ошибку(WriteMultipleRegisters/WriteSingleRegisters).

    Насколько я понимаю у ПР200 функция записи имеет вид 0х06, а у ТРМ202 - 0х10? Кто-нибудь знает что нужно изменить или дополнить чтобы функция записи для ТРМ202 заработала?
    Действительно в ТРМ202 можно записывать только функцией 10hex, но хоть эта функция в Модбасе предполагает возможность записи нескольких регистров, в ТРМ возможно запись только одного регистра. Если попытаететесь записать за одну операцию 2 или более регистров - получите ошибку. Это касается не только ТРМ, но и некоторых других приборов ОВЕН.

  2. #2

    По умолчанию

    Цитата Сообщение от Santi Посмотреть сообщение
    Действительно в ТРМ202 можно записывать только функцией 10hex, но хоть эта функция в Модбасе предполагает возможность записи нескольких регистров, в ТРМ возможно запись только одного регистра. Если попытаететесь записать за одну операцию 2 или более регистров - получите ошибку. Это касается не только ТРМ, но и некоторых других приборов ОВЕН.
    У Вас есть пример кода для записи в ТРМ202? Я пробовал менять в классе Modbus код функции(WriteMultipleRegisters) с 16 на 10 и давать на запись массив с одним элементом, все равно ошибку выдает.

  3. #3

    По умолчанию

    Цитата Сообщение от Saratov Посмотреть сообщение
    Я пробовал менять в классе Modbus код функции(WriteMultipleRegisters) с 16 на 10 и давать на запись массив с одним элементом, все равно ошибку выдает.
    Я надеюсь, тут опечатка... или же Вы изменяете адрес начального опрашиваемого регистра для функции WriteMultiplyRegister (0х10), предполагая что меняете номер функции. Можете полностью предоставить структуру Вашей функции?

    Цитата Сообщение от Saratov Посмотреть сообщение
    и давать на запись массив с одним элементом, все равно ошибку выдает.
    Какая размерность массива?

  4. #4

    По умолчанию

    Цитата Сообщение от Гарчев Евгений Посмотреть сообщение
    Я надеюсь, тут опечатка... или же Вы изменяете адрес начального опрашиваемого регистра для функции WriteMultiplyRegister (0х10), предполагая что меняете номер функции. Можете полностью предоставить структуру Вашей функции?

    Какая размерность массива?
    Функции:
    Сначала сюда
    /// <summary>
    /// Write a block of 1 to 123 contiguous 16 bit holding registers.
    /// </summary>
    /// <param name="slaveAddress">Address of the device to write to.</param>
    /// <param name="startAddress">Address to begin writing values.</param>
    /// <param name="data">Values to write.</param>
    public void WriteMultipleRegisters(byte slaveAddress, ushort startAddress, ushort[] data)
    {
    ValidateData("data", data, 123);

    var request = new WriteMultipleRegistersRequest(slaveAddress, startAddress, new RegisterCollection(data));
    Transport.UnicastMessage<WriteMultipleRegistersRes ponse>(request);
    }

    Потом сюда


    internal virtual T UnicastMessage<T>(IModbusMessage message) where T : IModbusMessage, new()
    {
    IModbusMessage response = null;
    int attempt = 1;
    bool success = false;

    do
    {
    try
    {
    lock (_syncLock)
    {
    Write(message);

    bool readAgain;
    do
    {
    readAgain = false;
    response = ReadResponse<T>();

    var exceptionResponse = response as SlaveExceptionResponse;
    if (exceptionResponse != null)
    {
    // if SlaveExceptionCode == ACKNOWLEDGE we retry reading the response without resubmitting request
    readAgain = exceptionResponse.SlaveExceptionCode == Modbus.Acknowledge;
    if (readAgain)
    {
    Debug.WriteLine(
    "Received ACKNOWLEDGE slave exception response, waiting {0} milliseconds and retrying to read response.",
    _waitToRetryMilliseconds);
    Sleep(WaitToRetryMilliseconds);
    }
    else
    {
    throw new SlaveException(exceptionResponse);
    }
    }
    else if (ShouldRetryResponse(message, response))
    {
    readAgain = true;
    }
    } while (readAgain);
    }

    ValidateResponse(message, response);
    success = true;
    }
    catch (SlaveException se)
    {
    if (se.SlaveExceptionCode != Modbus.SlaveDeviceBusy)
    throw;

    if (SlaveBusyUsesRetryCount && attempt++ > _retries)
    throw;

    Debug.WriteLine(
    "Received SLAVE_DEVICE_BUSY exception response, waiting {0} milliseconds and resubmitting request.",
    _waitToRetryMilliseconds);
    Sleep(WaitToRetryMilliseconds);
    }
    catch (Exception e)
    {
    if (e is FormatException ||
    e is NotImplementedException ||
    e is TimeoutException ||
    e is IOException)
    {
    Debug.WriteLine("{0}, {1} retries remaining - {2}", e.GetType().Name, _retries - attempt + 1, e);

    if (attempt++ > _retries)
    throw;
    }
    else
    {
    throw;
    }
    }
    } while (!success);

    return (T)response;
    }

    Дальше

    internal override IModbusMessage ReadResponse<T>()
    {
    byte[] frameStart = Read(ResponseFrameStartLength);
    byte[] frameEnd = Read(ResponseBytesToRead(frameStart));
    byte[] frame = Enumerable.Concat(frameStart, frameEnd).ToArray();
    Debug.WriteLine("RX: {0}", string.Join(", ", frame));

    return CreateResponse<T>(frame);
    }

    Дальше

    public virtual byte[] Read(int count)
    {
    byte[] frameBytes = new byte[count];
    int numBytesRead = 0;

    while (numBytesRead != count)
    numBytesRead += StreamResource.Read(frameBytes, numBytesRead, count - numBytesRead);

    return frameBytes;
    }

    дальше сюда

    public int Read(byte[] buffer, int offset, int count)
    {
    try
    {
    return _serialPort.Read(buffer, offset, count);
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex.StackTrace, ex.Message, ex.InnerException);
    }
    return 0;

    }

    и тут вылетают Exception и застревает, потому как прошлая функция ждет ответ величиной 4


    Здесь в класса Modbus насколько я понял есть коды поддерживаемых функций и видимо 10 как раз не поддерживается, или я что то не так понимаю

    Modbus:
    namespace Modbus
    {
    /// <summary>
    /// Defines constants related to the Modbus protocol.
    /// </summary>
    internal static class Modbus
    {
    // supported function codes
    public const byte ReadCoils = 1;
    public const byte ReadInputs = 2;
    public const byte ReadHoldingRegisters = 3;
    public const byte ReadInputRegisters = 4;
    public const byte WriteSingleCoil = 5;
    public const byte WriteSingleRegister = 6;
    public const byte Diagnostics = 8;
    public const ushort DiagnosticsReturnQueryData = 0;
    public const byte WriteMultipleCoils = 15;
    public const byte WriteMultipleRegisters = 16;
    public const byte ReadWriteMultipleRegisters = 23;


    Вот так записываю в тестовом проекте

    Запись:
    SerialPort port = new SerialPort("COM3");

    // configure serial port
    port.BaudRate = 115200;
    port.DataBits = 8;
    port.Parity = Parity.None;
    port.StopBits = StopBits.One;
    port.ReadTimeout = 30;
    port.Open();

    // create modbus master
    IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);

    master.WriteSingleRegister(17,5,10);
    master.WriteMultipleRegisters(17,5,new ushort[] {100});

  5. #5

    По умолчанию

    Цитата Сообщение от Saratov Посмотреть сообщение
    Здесь в класса Modbus насколько я понял есть коды поддерживаемых функций и видимо 10 как раз не поддерживается, или я что то не так понимаю
    0х10 (это в HEX) = 16 (это в DEC)

    Цитата Сообщение от Saratov Посмотреть сообщение
    Запись:
    SerialPort port = new SerialPort("COM3");

    // configure serial port
    port.BaudRate = 115200;
    port.DataBits = 8;
    port.Parity = Parity.None;
    port.StopBits = StopBits.One;
    port.ReadTimeout = 30;
    port.Open();

    // create modbus master
    IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);

    master.WriteSingleRegister(17,5,10);
    master.WriteMultipleRegisters(17,5,new ushort[] {100});

    port.StopBits = StopBits.One; - в ТРМ2хх 2 стоп-бита

    master.WriteSingleRegister(17,5,10); - это лишнее.

    Адрес ТРМ-а 17-ый?

  6. #6

    По умолчанию

    Цитата Сообщение от Гарчев Евгений Посмотреть сообщение
    0х10 (это в HEX) = 16 (это в DEC)




    port.StopBits = StopBits.One; - в ТРМ2хх 2 стоп-бита

    master.WriteSingleRegister(17,5,10); - это лишнее.

    Адрес ТРМ-а 17-ый?
    да, адрес 17, пробовал я ставить port.StopBits = StopBits.Two - результата не дало.

  7. #7
    Пользователь
    Регистрация
    17.06.2016
    Адрес
    Витебск
    Сообщений
    251

    По умолчанию

    Цитата Сообщение от Saratov Посмотреть сообщение
    У Вас есть пример кода для записи в ТРМ202? Я пробовал менять в классе Modbus код функции(WriteMultipleRegisters) с 16 на 10 и давать на запись массив с одним элементом, все равно ошибку выдает.
    Мой пример Вам не поможет, я связывался с ТРМ202 со Шнайдеровской панели. А описанное мной ограничение можно прочитать в http://www.owen.ru/uploads/ki_prm_trm202_033.pdf

    Также я сталкивался с этим ограничением и в других ОВЕНовских приборах, в которых и в руководстве об этом ничего не написано. Видимо этот Модбас-нюанс фирменный стиль ОВЕНа.

Похожие темы

  1. СП270 Slave. Чтение и запись регистров PFW
    от petera в разделе Панели оператора (HMI)
    Ответов: 4
    Последнее сообщение: 02.05.2015, 18:36
  2. Переворачивание регистров
    от alek.yum в разделе ПЛК3xx (архив)
    Ответов: 36
    Последнее сообщение: 19.09.2014, 12:30
  3. Ответов: 9
    Последнее сообщение: 05.09.2008, 19:35
  4. Ответов: 23
    Последнее сообщение: 17.10.2007, 07:35

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •