Показано с 1 по 6 из 6

Тема: ПЛК 323. Опрос по Modbus регистров ТРМ 202

  1. #1
    Пользователь
    Регистрация
    04.03.2014
    Адрес
    Санкт-Петербург
    Сообщений
    4

    По умолчанию ПЛК 323. Опрос по Modbus регистров ТРМ 202

    Добрый день уважаемые разработчики.
    С CodeSys начал работать недавно, поэтому заранее прошу прощения, если сделанные мною ошибки, являются "детскими". Все обновления CodeSys и библиотеки последних версий установлены. Есть ПЛК 323 и ТРМ 202. Соединены ПЛК RS-485 "P1 (он же com2, если всё правильно)" и RS-485 на ТРМ 202. Протокол ModBus адрес ТРМ - 2, MB_RTU (хотя можно и MB_ASCII, главное чтобы заработало) .
    Задача хоть на ST, хоть на CFC, получать хотя-бы один параметр (адрес к примеру 5) по функции 0x03 из ТРМ.
    Бьюсь уже 4 дня, но так ничего и не получилось. Привожу здесь ST и CFC, которыми пытался заполучить заветный параметр, может кто направит на путь истинный и поможет сдвинуться с мёртвой точки. Заранее благодарю!

    Пррограмма с библиотекой ModBus (OWEN) на ST:

    pResult1: DWORD;
    PortNum: ModBus.COM_Ports:=2;
    port_opened: BYTE := 0;
    Settings: ModBus.SysCom.COM_Settings; (*настройки последовательного порта *)
    SettingsEx: ModBus.SysCom.COM_SettingsEx;
    get1_modbus: ModBus.MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
    enabl: BOOL;
    TimeOut: TIME := T#150MS;(*таймаут*)
    Buffer: ARRAY [0..255] OF BYTE;
    cmpl: BOOL;
    err: INT;
    DataSize: WORD;
    x:WORD; (*считанное значение*)
    END_VAR



    IF port_opened=0 THEN
    Settings.sPort:=PortNum ; (*номер COM-порта*)
    Settings.ulBaudrate:=115200; (*скорость*)
    Settings.byParity:=0;
    Settings.ulTimeout:=0;
    Settings.byStopBits:=2;
    Settings.ulBufferSize:=0;
    SettingsEx.byByteSize:=8;
    SettingsEx.bBinary:=TRUE;
    PortHandle:=ModBus.SysComOpen2( ADR(Settings),ADR(SettingsEx),ADR(pResult1) );
    (*Если COM-порт открыт, то переходим к приему и передачи данных *)
    IF pResult1=0 THEN
    port_opened:=2;
    END_IF
    END_IF
    (* Читаем Modbus *)
    IF port_opened=2 THEN (*Удачно проинициализировали*)
    get1_modbus(
    Enable:=enabl , (* разрешение работы блока *)
    Mode:=1 , (*режим передачи*)
    DevAddr:=2 , (*адрес*)
    FirstAddr:=5 , (*номер регистра*)
    Quantity:=1, (*количество регистров*)
    ComHandle:=PortHandle ,(*номер COM-порта*)
    TimeOut:=TimeOut , (*Таймаут T#50ms*)
    Buffer:=Buffer , (* буфер данных *)
    Complete=>cmpl , (* скопировать признак завершения операции *)
    Exception=>err , (* скопировать регистр ошибок *)
    ByteCnt=>DataSize ); (*кол-во считанных байтов *)
    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
    IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
    x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
    END_IF
    END_IF
    END_IF



    Программа с библиотекой ModulsOwenLib на CFC:


    http://www.owen.ru/forum/images/attach/png.gif
    Изображения Изображения

  2. #2
    Пользователь
    Регистрация
    03.03.2008
    Адрес
    Новосибирск
    Сообщений
    238

    По умолчанию

    port_opened=2 - это условие выполняется?

  3. #3

    По умолчанию

    Добрый день.

    Нумерация Com-портов в ПЛК323 следующая

  4. #4
    Пользователь Аватар для DeMax
    Регистрация
    15.08.2008
    Адрес
    Бугульма
    Сообщений
    36

    По умолчанию

    В мануале написано (таблица 6.2), что стоповых бита должно быть 2, а в программе на CFC 1.
    Обмен-то с ТРМ идет? Ошибки обмена есть? rdata объявлен как указатель на байт, а к какой области памяти он привязан?
    Попробуй объявить переменную rdata типа WORD, подать ее на вход алгоблока ADR, а выход с алгоблока ADR подать на вход VarAdr.
    Результат будет находиться в rdata. И что-то мне подсказывает, что чтение должно выполняться по фронту на входе Enabl алгоблока uniread. Вроде бы надо поставить алгоблок BLINK для "передергивания" входа Enabl?

  5. #5
    Пользователь
    Регистрация
    04.03.2014
    Адрес
    Санкт-Петербург
    Сообщений
    4

    По умолчанию

    Вот это уже что-то для сдвига с мёртвой точки. А то везде, где я читал P1 (первый RS-485) был COM2. А он оказался COM4...
    Стоповый бит пробовал и 1 и 2. Разницы нет. COM порт открывается, условие port_opened=2 выполнятся, но дальше никак.
    Сегодня ещё пришёл ответ от техподдержки:
    _________________________________________________
    Если Вы используете первый порт физический RS485 , то его номер в программе 4. как я понял на форуме , Вы выставили 2й. попробуйте.
    Вот ещё пример опроса с СПК трм212 - http://www.owen.ru/forum/attachment....0&d=1379509212
    http://www.youtube.com/watch?v=tkXzTxf1HmE мой видео пример проекта.
    __________________________________________________

    Сегодня продолжу работу на основе новых данных и примеров. О результате обязательно отпишусь.

    Всем спасибо за отклик.
    Последний раз редактировалось rescom; 19.03.2014 в 14:56. Причина: дополнение

  6. #6
    Пользователь
    Регистрация
    04.03.2014
    Адрес
    Санкт-Петербург
    Сообщений
    4

    По умолчанию

    В общем, завести всё удалось, только методом, описанном в этом видео.
    http://www.youtube.com/watch?v=tkXzTxf1HmE

    Теперь будем учиться писать, полученные данные в файл на SD карту и с периодичностью отсылать результат центральному диспетчеру через GPRS канал.

    Всем спасибо!

Похожие темы

  1. Ответов: 4
    Последнее сообщение: 18.09.2012, 22:16
  2. Опрос трм-202 по GPRS
    от Сергей Борисович в разделе Эксплуатация
    Ответов: 3
    Последнее сообщение: 21.03.2012, 12:57
  3. ТРМ-202 нет соединения по modbus
    от Push_ON в разделе Сетевые технологии
    Ответов: 6
    Последнее сообщение: 20.02.2012, 13:44
  4. Опрос ТРМ 202
    от Олег_Хабаровск в разделе Помощь Разработчикам
    Ответов: 8
    Последнее сообщение: 11.03.2011, 13:04
  5. Ответов: 24
    Последнее сообщение: 15.04.2010, 15:12

Ваши права

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