Объявление

Свернуть
Пока нет объявлений.

Агава ПЛК40 slave

Свернуть
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Агава ПЛК40 slave

    Здравствуйте, подскажите, пожалуйста, как решить данный вопрос.

    Есть два ПЛК40. Один настроен в режиме мастера, второй в режиме слейва.
    При считывании мастером нужного регистра, получаю правильный ответ.
    При записи регистра мастером, слейв не реагирует.
    Приложил скрины мастера и слейва

  • #2
    Сообщение от Евгенийй Посмотреть сообщение
    Здравствуйте, подскажите, пожалуйста, как решить данный вопрос.

    Есть два ПЛК40. Один настроен в режиме мастера, второй в режиме слейва.
    При считывании мастером нужного регистра, получаю правильный ответ.
    При записи регистра мастером, слейв не реагирует.
    Приложил скрины мастера и слейва
    Добрый день, какие регистры нужно записывать в слейв? Тип регистра, размер(16 бит или 32) в какой адрес протокола слейв ПЛК?

    Комментарий


    • #3
      Регистр 5
      тип word
      адрес слейва 1

      Комментарий


      • #4
        Сообщение от Евгенийй Посмотреть сообщение
        Регистр 5
        тип word
        адрес слейва 1
        Ознакомьтесь с этим Modbus Slave RTU плюс RETAIN переменные - Форум КБ АГАВА (kb-agava.ru) там есть решение, Вам нужен ФБ который реализует перезапись значения слейв устройства.

        Комментарий


        • #5
          Добавил ФБ в проект, в программу добавил строку
          //Задержка выключения при P воды после насосов < min ПН1-2
          SetPoints[0](valueu := 1 , pBuff := ADR(RegHoldingBuf), nReg := 5, DataType := EnDataType.dtUInt);
          Записал
          VAR
          SetPoints : ARRAY[0..50] OF fbValue;
          RegHoldingStart: UINT := REG_HOLDING_START;
          RegHoldingBuf: array [ 0 .. REG_HOLDING_NREGS - 1 ] of word;
          END_VAR

          компиляция прошла успешно, загрузка в ПЛК не проходит. Выходят исключения (см.скрин)
          Последний раз редактировалось Евгенийй; 15-02-2023, 11:04 AM.

          Комментарий


          • #6

            Комментарий


            • #7
              Андрей, благодарю за помощь, передача с мастера на слейв 16/32 битных переменных проходит успешно.
              Подскажите, как организовать передачу переменных типа bool.

              Комментарий


              • #8
                Сообщение от Евгенийй Посмотреть сообщение
                Андрей, благодарю за помощь, передача с мастера на слейв 16/32 битных переменных проходит успешно.
                Подскажите, как организовать передачу переменных типа bool.
                Для того чтобы из Slave устройства отдавать данные на ВУ, по 2 функции(DiscretInputs) - нужно использовать функцию SetBits из биб-ки AgavaTypes.

                Например: если нужно отправить бит состояния какой то переменной из Slave, то необходимо использовать функцию так

                // [DI] Дискретные входы.
                SetBits( adr( RegDiscreteBuf ), 50, 1, sel(sDI[0].bValue, 0, 1 ) );



                Где:
                RegDiscreteBuf - Тип таблицы.
                50 - номер регистра
                1 - Количество изменяемых бит

                sel(sDI[0].bValue, 0, 1 ) - sDI[0].bValue - переменная типа bool, 0 или 1 - состояние переменной( False \ True)

                Если требуется считать бит из таблицы Coils то нужно использовать функцию getBits

                Определение функции:

                Function getBits : byte
                var_input

                pByteBuf: pointer to byte;
                bitOffset: uint;
                nBits: byte;
                end_var
                var constant

                BITS_UCHAR: byte := 8;
                end_var
                var

                p: pointer to uint;
                WordBuf, ByteOffset, nPreBits, Mask: uint;
                end_var

                Реализация:


                ByteOffset := bitOffset / BITS_UCHAR;

                // How many bits precede our bits to set.
                nPreBits := bitOffset - ByteOffset * BITS_UCHAR;

                // Prepare a mask for setting the new bits.
                Mask := shl( 1, nBits ) - 1;

                // Copy bits into temporary storage.
                p := pByteBuf + ByteOffset;
                WordBuf := p^;

                // Throw away unneeded bits.
                WordBuf := shr( WordBuf, nPreBits );

                // Mask away bits above the requested bitfield.
                WordBuf := WordBuf and Mask;

                getBits := uint_to_byte( WordBuf );

                Использование аналогично setBits

                VarBool := getBits(adr(RegCoilsBuf), 50, 1));


                VarBool - Переменная в проекте типа bool
                50 - Регистр
                1 - Количество бит

                Комментарий


                • #9
                  Столкнулся с еще одной проблемой, подскажите, пожалуйста, как решить. Для работы контроллера в режиме slave взял готовый пример из AgavaSDK. На визуализации сделал выбор скорости передачи из массива и запись адреса слейва. Переменные находятся в Globals retain. После изменения с экрана ПЛК скорости и адреса, проверяю изменения с помощью модбас сканера. Тут все в порядке, после перезагрузке контроллера установленные скорость и адрес слетают.

                  Комментарий

                  Обработка...
                  X