Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 19

Тема: ТРМ-201 + Siemens HMI MP377. Modbus RTU

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

polubencev ТРМ-201 + Siemens HMI MP377.... 05.04.2025, 06:09
AlexandrGr Только наоборот. 3х - Input... 05.04.2025, 10:33
FPavel Да, прошу прощения,... 05.04.2025, 11:57
polubencev 4х40001 это формат, какой... 05.04.2025, 06:57
Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию ТРМ-201 + Siemens HMI MP377. Modbus RTU

    Здравствуйте! Подскажите как указывать адрес в WinCC для ТРМ201? По Modbus TCP указываешь к примеру %MW4105 и все работает. По RTU формат 4х40001. Объясните пожалуйста

  2. #2

    По умолчанию

    Так, иначе) как мне получить измеренное значение с трм на эту панель) у трм регистр 4105. WinCC дает ставить только 5 знаков , если по rtu

  3. #3

    По умолчанию

    Есть соглашение, тянущееся по историческим причинам от разработчиков Modbus - Modicon - что 3x40001 это регистр 0 (или 1 - всегда нужно проверять практикой) к которому обращаются функцией чтения 03.
    Т.е. регистр 4501 соответствует 3x44502 или 3x44501 в другой нотации.

  4. #4

    По умолчанию

    Цитата Сообщение от FPavel Посмотреть сообщение
    Есть соглашение, тянущееся по историческим причинам от разработчиков Modbus - Modicon - что 3x40001 это регистр 0 (или 1 - всегда нужно проверять практикой) к которому обращаются функцией чтения 03.
    Т.е. регистр 4501 соответствует 3x44502 или 3x44501 в другой нотации.
    Только наоборот.
    3х - Input register (read only) функция чтения 04
    4х - Holding register (read/write) функция чтения 03

  5. #5

    По умолчанию

    Вот смотрите, через modscan64 пытаешься ТРМ считать, не получается. Там адреса с 4хххх. Например через Овен ОРС, указываешь 4105 все идет

  6. #6

    По умолчанию

    Цитата Сообщение от polubencev Посмотреть сообщение
    Вот смотрите, через modscan64 пытаешься ТРМ считать, не получается. Там адреса с 4хххх. Например через Овен ОРС, указываешь 4105 все идет
    modscan64 платная программа и даже воспроизвести эксперимент не каждый сможет.

    Для изучения работы с Modbus читал уставку в ТРМ212 самописным тестовым кодом на FreePascal с использованием библиотеки работы с COM-портом Synaser

    Обратите внимание, что после приёма значения из порта, для адекватного вывода на печать приходилось выполнять обмен байт в принятом 16 или 32 разрядном числе.

    Кроме того, число типа Float занимает 2 регистра и не может быть типом MW, скорее уж MD - DWORD.
    Код:
          MB_ReadUInt16(ser, ModBusSetting_Addr, trm212SP, uiR);
          Writeln(uiR);
          Sleep(100);
          MB_ReadSignedInt16(ser, ModBusSetting_Addr, trm212SP, siR);
          Writeln(siR);
          Sleep(100);
          MB_ReadFloat32(ser, ModBusSetting_Addr, trm212SP_, fR);
          Writeln(fR: 0: 1);
          Sleep(100);
          MB_ReadChar8(ser, ModBusSetting_Addr, trm212DEV, cR);
          Writeln(cR);
          Sleep(100);
          MB_ReadChar8(ser, ModBusSetting_Addr, trm212VER, cR);
          Writeln(cR);
    Сама функция чтения была обёрткой над вызовом функции 03
    Код:
    function MB_ReadUInt16(var SerialPort: TBlockSerial; DevAddr, RegNo: word;
      var R: UInt16): integer;
    begin
      Result := MB_ReadRegesters(SerialPort, DevAddr, RegNo, 1, R);
      R := Swap(R);
    end;
    
    function MB_ReadFloat32(var SerialPort: TBlockSerial; DevAddr, RegNo: word;
      var R: Float32): integer;
    var
      t: TDWordConvert;
    begin
      Result := MB_ReadRegesters(SerialPort, DevAddr, RegNo, 2, t);
      t.dw := Swap(t.dw);
      t.w0 := Swap(t.w0);
      t.w1 := Swap(t.w1);
      R := t.f32;
    end;
    Вызов функции 03
    Код:
    function MB_ReadRegesters(var SerialPort: TBlockSerial;
      DevAddr, RegNo, RegCount: word; var ResBuffer): integer;
    var
      Buffer: TBuffer;
      crc16: word;
      i: integer;
      ReadLen: word;
    begin
      if not SerialPort.InstanceActive then
      begin
        //ComException('can not read from a closed port.');
        exit;
      end;
    
      if (DevAddr > 247) then
      begin
        if DevAddr > 40000 then
          DevAddr := DevAddr - 40001
        else
          exit;
      end;
    {
    Запрос
    00 - адрес устройства
    01 - функция
    02 - адрес первого из группы считываемых регистров hi
    03 - то же, lo
    04 - количество считываемых регистров hi
    05 - то же, lo
    06 - crc16 lo
    07 - то же hi
    }
      Buffer[0] := lo(DevAddr);
      Buffer[1] := $03;
      Buffer[2] := hi(RegNo);
      Buffer[3] := lo(RegNo);
      Buffer[4] := hi(RegCount);
      Buffer[5] := lo(RegCount);
      crc16 := Crc16InitValue;
      for i := 0 to 5 do
        Crc16 := UpdateCrc16(Buffer[i], crc16);
      Buffer[6] := lo(crc16);
      Buffer[7] := hi(crc16);
    
      SerialPort.SendBuffer(@Buffer, 8);
      SerialPort.RecvBufferEx(@Buffer, RegCount * 2 + 5, Timeout_1s div 10);
    
    {
    Ответ в корректном случае
    00 - адрес устройства
    01 - функция
    02 - количество байт в ответных данных
    03 - данные lo
    04 - данные hi
    05 - CRC16 lo
    06 - CRC16 hi
    
    В случае ошибки
    или таймаут
    или устройство пришлёт
    00 - адрес устройства
    01 - (=$83) код функции с установленным старшим битом
    02 - код ошибки (exception code)
    03 - lo crc16
    04 - hi crc16
    }
    
      if Buffer[01] = $83 then
      begin
        ReadLen := 5;
      end
      else
      begin
        ReadLen := Buffer[2] + 3;
      end;
      Crc16 := Crc16InitValue;
      for i := 0 to ReadLen - 1 do
        Crc16 := UpdateCrc16(Buffer[i], crc16);
      if Crc16 <> Buffer[ReadLen] + 256 * Buffer[succ(ReadLen)] then
      begin
        //ошибка приёма пакета - не правильный crc16
      end
      else
      begin
        //writeln('CRC16 Ok');
      end;
      if RegCount * 2 = Buffer[02] then
      begin
        move(Buffer[3], TBuffer(ResBuffer), RegCount * 2);
      end
      else
      begin
        //ошибка приёма пакета - не правильное количество принятых байт
      end;
      Result := SerialPort.LastError;
    end;
    При этом, адреса регистров задавались в 16-ричной системе счисления
    Код:
      {LvoP. Оперативные параметры (только чтение: Modbus-функция 0x03)}
      trm212STAT   = $0000; {binary}
      trm212PV1    = $0001; {Signed Int16}
      trm212PV2    = $0002; {Signed Int16}
      trm212LUPV   = $0003; {Signed Int16}
      trm212SP     = $0004; {Signed Int16} {запись: Modbus-функция 0x10}
      trm212SET_P  = $0005; {Signed Int16}
      trm212O      = $0006; {Int16}
      {LvoP. Рабочие параметры прибора (чтение: Modbus-функция 0x03), запись: Modbus-функция 0x10}
      trm212r_L    = $0007; {Int16}
      trm212r_out  = $0008; {Signed Int16}
      trm212R_S    = $0009; {Int16}
      trm212AT     = $000A; {Int16}
      {LvoP. Оперативные параметры прибора только чтение: Modbus-функция 0x03)}
      trm212DEV    = $1000; {Char[8]}
      trm212VER    = $1004; {Char[8]}
      trm212STAT_  = $1008; {binary}
      trm212PV1_   = $1009; {Float32}
      trm212PV2_   = $100B; {Float32}
      trm212LUPV_  = $100D; {Float32}
      trm212SP_    = $100F; {Float32}
      trm212SET_P_ = $1011; {Float32}
      trm212O_     = $1013; {Float32}

  7. #7

    По умолчанию

    Приводите параметры обмена по modscan64:
    - адрес регистра
    - количество регистров
    - порядок байт
    - тип данных
    и остальное

  8. #8
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    12,067

    По умолчанию

    AlexandrGr - да вроде все правильно, только иначе написано - 3х функция 40001 где 4(адресация Holdings)
    соответственно 4x функция - 30001 адресация Inputs

  9. #9

    По умолчанию

    Да, прошу прощения, неправильно по памяти записал нотацию...

    Конечно же, нужно было как поправил AlexandrGr, а написал в смысле как уточнил melky.

    Функцией 03 читают регистры 4x (Holding register), которые имеют диапазон значений 40001...49999 (они же при помещении в запрос имеют значения 0...9998). Т.е. 40001 это логический адрес регистра, а 0 это его же физический адрес.
    В разных реализациях Modbus по разному разрешается задавать адрес. Например, в ПЛК Koyo DL06 адрес регистра задавался логический и физический адрес регистра из карты Modbus для подключаемого прибора (в моём случае ВКТ-5) никак не подходил по диапазону (40001...49999) - потребовалось приведение к логическому.

  10. #10

    По умолчанию

    Всем спасибо, решено! RS-485 надо было А к В, В к А. Странно конечно, ну да ладно. А так да, правильно сказали - регистр 44105

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. ОВЕН ПЛК210 -> SIEMENS CPU 317-2 pn/dp ОБМЕН ПО MODBUS TCP/IP
    от monsterrnd в разделе Разработки
    Ответов: 25
    Последнее сообщение: 20.06.2024, 10:53
  2. Siemens S71200 подключить к kepware opc по modbus TCP
    от AlexanderUshakov в разделе Сервисное ПО
    Ответов: 1
    Последнее сообщение: 31.08.2020, 13:35
  3. СПК107 + Siemens S7-200 MODBUS
    от vavan_bonus в разделе СПК1xx (архив)
    Ответов: 2
    Последнее сообщение: 13.06.2019, 02:22
  4. SCADA WINCC от SIEMENS и Modbus Universal OPC
    от super100 в разделе Master SCADA 3
    Ответов: 9
    Последнее сообщение: 19.06.2016, 13:56
  5. ПЛК63 и Siemens по ModBus RTU
    от Viktor_13 в разделе ПЛК63/73
    Ответов: 9
    Последнее сообщение: 10.10.2015, 12:05

Ваши права

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