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

Тема: массив из Bit

  1. #1

    По умолчанию массив из Bit

    Здравствуйте, форумчане. Возник вопрос, как это сделать, но пока не получается, точнее получилось, но не очень удобно. Есть массив
    Код:
    BoolArray:ARRAY[0..15] OF BOOL;
    Пришлось каждый элемент массива прописывать в Modbus Slave во всех 16 битах (битовых каналах).
    Хотелось получить доступ к битам через массив. Забиваю этот массив в Channel 0[0] (2-й элемент в иерархии) - выдает ошибку "Типы канала и соотнесённой переменной Application.PLC_PRG.BoolArray не совпадают", забиваю в Channel 0 - компилится, но происходит следующее:
    bit1 меняю - не меняется, но устанавливается bit8 (256) и не сбрасывается, bit0 только меняется. Использую функцию Read Holding Registers (03) длина 1. Т.е. реально тип BOOL занимает 8 бит, а BIT - 1 бит, поэтому такое поведение. Массив из BIT объявить нельзя, как сказано в "Работа с памятью в CODESYS V3". Есть примеры как объединить BIT в WORD через структуру, а как это сделать в массив, чтобы программно можно было перебрать все биты через цикл и не прописывая каждый бит Modbus каналах?

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,062

    По умолчанию

    Цитата Сообщение от MichailG Посмотреть сообщение
    Здравствуйте, форумчане. Возник вопрос, как это сделать, но пока не получается, точнее получилось, но не очень удобно. Есть массив
    Код:
    BoolArray:ARRAY[0..15] OF BOOL;
    Пришлось каждый элемент массива прописывать в Modbus Slave во всех 16 битах (битовых каналах).
    Хотелось получить доступ к битам через массив. Забиваю этот массив в Channel 0[0] (2-й элемент в иерархии) - выдает ошибку "Типы канала и соотнесённой переменной Application.PLC_PRG.BoolArray не совпадают", забиваю в Channel 0 - компилится, но происходит следующее:
    bit1 меняю - не меняется, но устанавливается bit8 (256) и не сбрасывается, bit0 только меняется. Использую функцию Read Holding Registers (03) длина 1. Т.е. реально тип BOOL занимает 8 бит, а BIT - 1 бит, поэтому такое поведение. Массив из BIT объявить нельзя, как сказано в "Работа с памятью в CODESYS V3". Есть примеры как объединить BIT в WORD через структуру, а как это сделать в массив, чтобы программно можно было перебрать все биты через цикл и не прописывая каждый бит Modbus каналах?
    Добрый день.
    Если цель - работать с битами в цикле, то см. в библиотеке Util функции EXTRACT/PUTBIT.

  3. #3

    По умолчанию

    Спасибо огромное! Теперь я объявил вместо массива переменную X типа WORD и не пришлось расписывать битовые каналы, но теперь другое неудобство!? Я не могу имитировать нужный бит отдельно, только введя число. Это нужно заранее перевести двоичный код в число и потом это число.

  4. #4
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,062

    По умолчанию

    Я не могу имитировать нужный бит отдельно, только введя число. Это нужно заранее перевести двоичный код в число и потом это число.
    Поясните вашу проблему скриншотами - что вы делаете сейчас и как бы вам хотелось это делать.

  5. #5

    По умолчанию

    Вот скриншот, Подготовка значения.jpg, но когда был массив расписан по битам, то можно было менять бит по-отдельности. Скриншот: Подготовка значения bool.jpg. Пробовал объявлять BIT в структуре - пишет базовый тип недоступен.

  6. #6
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,062

    По умолчанию

    То есть в итоге:
    - не хочется "каждый элемент массива прописывать в Modbus Slave"
    - нужно "чтобы программно можно было перебрать все биты через цикл"
    - нужно "чтобы можно было менять бит по отдельности" (в режиме онлайн-отладки)

    Тогда можно сделать так - создать UNION, в котором разместить WORD и структуру с BIT (тут вы совершенно верно выбрали направление).
    См. п. 1.1.3 и 1.3 в этой статье:
    https://ftp.owen.ru/CoDeSys3/98_Book...nipulation.pdf

    WORD - для привязки к Modbus Slave и "программного перебора битов", структура с битами - "чтобы можно было менять бит по отдельности".

  7. #7

    По умолчанию

    Сделал как вы рекомендовали, но отдельно бит устанавливать у меня не получается.
    1) Пришлось объявить биты по-отдельности, массив не принимает, пишет "BIT недопустим в качестве базового типа массива". Тогда смысл объявлять структуру, масло масляное. Закомментировал массив.
    2) Перебрав всякие варианты привязки к Modbus Slave, подобрал вроде рабочий вариант, но при изменении бита в окне Подготовка значения выдает значение System.Object[], пробовал вводить true и 1 - выдает ошибку. И то сначала нужно значение WORD поменять, только потом разрешает менять бит!? Что я делаю не так? Исправьте пожалуйста ошибку на примере SHSHU_A. Использую Codesys 3.5 SP14 Patch 3. Выкладываю проект.
    Вложения Вложения

  8. #8
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,062

    По умолчанию

    Вы всё правильно сделали.
    Теперь надо нажать Вид - Просмотр - Watch 1.
    В панели просмотра внизу введите имя вашей переменной - PLC_PRG.SHSHU_A.
    А далее просто изменяйте значения отдельных бит - делать что-то с WORD вообще не потребуется.

    04-03-2023 13-15-36.png

  9. #9

    По умолчанию

    Работает! Правда я не сразу догадался, что нужно именно PLC_PRG.SHSHU_A, а не Device.Sim.Device.Application.PLC_PRG.SHSHU_A, как предлагает ассистент ввода, тогда все норм. Только жаль все-таки не обойти массив в структуре? Придется каждый бит объявлять...

  10. #10
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,062

    По умолчанию

    Цитата Сообщение от MichailG Посмотреть сообщение
    Работает! Правда я не сразу догадался, что нужно именно PLC_PRG.SHSHU_A, а не Device.Sim.Device.Application.PLC_PRG.SHSHU_A, как предлагает ассистент ввода, тогда все норм. Только жаль все-таки не обойти массив в структуре? Придется каждый бит объявлять...
    Чтобы "обойти биты" - у вас внутри UNION есть WORD и функции EXTRACT/PUTBIT из библиотеки Util.

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

Похожие темы

  1. массив(
    от Zerling в разделе Помощь Разработчикам
    Ответов: 6
    Последнее сообщение: 14.07.2020, 11:58
  2. Плк 110 массив из слейва
    от Medalbka в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 13.02.2018, 08:18
  3. Прямоугольный массив
    от Columbariy в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 12.02.2013, 13:36
  4. массив не помещается....
    от Дмитрий Артюховский в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 04.12.2010, 12:50
  5. массив
    от freak в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 01.07.2010, 03:14

Ваши права

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