Страница 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

    По умолчанию

    Цитата Сообщение от 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

    По умолчанию

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

  5. #5

    По умолчанию

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

  6. #6

    По умолчанию

    То есть в итоге:
    - не хочется "каждый элемент массива прописывать в 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

    По умолчанию

    Вы всё правильно сделали.
    Теперь надо нажать Вид - Просмотр - 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

    По умолчанию

    Цитата Сообщение от 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, 12:36
  4. массив не помещается....
    от Дмитрий Артюховский в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 04.12.2010, 12:50
  5. массив
    от freak в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 01.07.2010, 02:14

Ваши права

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