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

Тема: ПЛК73 Чтение МВ110-16Д через Modbus

  1. #1

    По умолчанию ПЛК73 Чтение МВ110-16Д через Modbus

    Подскажите, что делаю не так? Данные читает, но как то нестабильно, большую часть времени чтение завершается ошибкой.

    Кусок кода:

    (*Устанавливаем настройки COM-порта*)
    IF port_opened=0 THEN
    Settings.Port:=com_num; (*номер COM-порта*)
    Settings.dwBaudRate:=9600; (*скорость*)
    Settings.byParity:=0;
    Settings.dwTimeout:=1;
    Settings.byStopBits:=0;
    Settings.dwBufferSize:=0;
    Settings.dwScan:=0;
    END_IF
    (*Открываем COM-порт*)
    COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
    (*Если COM-порт открыт, то переходим к приему и передачи данных *)
    IF COM_SERVICE1.ready THEN
    port_opened:=2;
    END_IF

    IF port_opened=2 THEN (*Удачно проинициализировали*)

    IF cmpl THEN
    enabl :=TRUE;
    END_IF

    tErr(IN:=m, PT := t#100ms);
    IF tErr.Q THEN
    m := FALSE;
    enabl := TRUE;
    END_IF

    readInputs(
    Enable:= enabl,
    Mode:= MB_RTU,
    DevAddr:= 1,
    FirstAddr:= 51,
    Quantity:= 1,
    ComHandle:= Settings.Port,
    TimeOut:= T#100ms,
    Buffer:= readBuffer, (*таймаут T#50ms*)
    Complete=>cmpl , (* скопировать признак завершения операции *)
    Exception=>err);

    IF enabl AND NOT cmpl THEN
    enabl := FALSE;
    END_IF

    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
    IF err=0 THEN (*Если нет ошибок, то получаем данные типа INT из буфера*)
    x:=BYTE_TO_WORD(readBuffer[1]) OR SHL(BYTE_TO_WORD(readBuffer[0]),8);
    readQuantity := readQuantity+1;
    END_IF
    END_IF

    IF err <> 0 THEN
    enabl := FALSE;
    m := TRUE;
    END_IF
    END_IF
    Последний раз редактировалось Зинец Олег; 04.11.2020 в 22:13.

  2. #2
    Пользователь Аватар для A.Simonov
    Регистрация
    11.07.2017
    Адрес
    Москва
    Сообщений
    328

    По умолчанию

    Цитата Сообщение от Зинец Олег Посмотреть сообщение
    Подскажите, что делаю не так? Данные читает, но как то нестабильно, большую часть времени чтение завершается ошибкой.

    Кусок кода:

    (*Устанавливаем настройки COM-порта*)
    IF port_opened=0 THEN
    Settings.Port:=com_num; (*номер COM-порта*)
    Settings.dwBaudRate:=9600; (*скорость*)
    Settings.byParity:=0;
    Settings.dwTimeout:=1;
    Settings.byStopBits:=0;
    Settings.dwBufferSize:=0;
    Settings.dwScan:=0;
    END_IF
    (*Открываем COM-порт*)
    COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
    (*Если COM-порт открыт, то переходим к приему и передачи данных *)
    IF COM_SERVICE1.ready THEN
    port_opened:=2;
    END_IF

    IF port_opened=2 THEN (*Удачно проинициализировали*)

    IF cmpl THEN
    enabl :=TRUE;
    END_IF

    tErr(IN:=m, PT := t#100ms);
    IF tErr.Q THEN
    m := FALSE;
    enabl := TRUE;
    END_IF

    readInputs(
    Enable:= enabl,
    Mode:= MB_RTU,
    DevAddr:= 1,
    FirstAddr:= 51,
    Quantity:= 1,
    ComHandle:= Settings.Port,
    TimeOut:= T#100ms,
    Buffer:= readBuffer, (*таймаут T#50ms*)
    Complete=>cmpl , (* скопировать признак завершения операции *)
    Exception=>err);

    IF enabl AND NOT cmpl THEN
    enabl := FALSE;
    END_IF

    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
    IF err=0 THEN (*Если нет ошибок, то получаем данные типа INT из буфера*)
    x:=BYTE_TO_WORD(readBuffer[1]) OR SHL(BYTE_TO_WORD(readBuffer[0]),8);
    readQuantity := readQuantity+1;
    END_IF
    END_IF

    IF err <> 0 THEN
    enabl := FALSE;
    m := TRUE;
    END_IF
    END_IF
    Добрый день.
    Если прибор иногда все же отвечает, то скорее всего проблема с:
    1) Физическим подключением (не витая пара, отсутствие терминальных резисторов и т.п.)
    2) Судя по коду, в случае успеха прибор не выжидает никаких пауз и тут же высылает следующую посылку.
    попробуйте добавить некоторую задержку.

    Прикладываю многократно проверенный и рабочий пример.
    Вложения Вложения
    Александр Андреевич Симонов
    Инженер по продуктам «ПЛК, модули и OwenCloud»
    e-mail: support@owen.ru
    e-mail: a.simonov@owen.ru

  3. #3

    По умолчанию

    Зачем вам схема? Подключено всё напрямую ПЛК-МВ110 витой парой с резисторами (120Ом). Частотника и всего, что можем мешать нет! tErr прилеплен для того, чтобы выжидать время после ошибки. Прилепил в надежде, что буде лучше, но ничего не изменилось. А так, обосрать можно всё, что угодно. Я тут помощи прощу. Тут вроде бы технический форум а не "вечер саркастической шутки".

  4. #4

    По умолчанию

    A.Simonov. Спасибо буду пробовать.

Похожие темы

  1. ПЛК73 + МВ110-224.8А протокол ModBus
    от den_ger в разделе ПЛК63/73
    Ответов: 5
    Последнее сообщение: 01.06.2017, 07:50
  2. Ответов: 3
    Последнее сообщение: 10.10.2016, 14:09
  3. Ответов: 1
    Последнее сообщение: 12.03.2015, 12:13
  4. Ответов: 9
    Последнее сообщение: 27.02.2015, 11:07
  5. Датчики температуры modbus или любые другие через МВ110
    от logger в разделе Подбор Оборудования
    Ответов: 9
    Последнее сообщение: 27.02.2015, 11:07

Ваши права

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