Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 18 из 18

Тема: Как правильно объявить структуру?

  1. #11

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    А вот именно в КДС и необязательно с булями возится. Биту дал имя, и обращайся к нему как элементу структуры.
    Var
    Mask:word;
    Const
    Who:byte:=3
    Mask.Who:=FALSE;

    Хочется word'ы раскрыть в онлайне полями как структуру ? bitaccess в помощь.

    Ваш способ интересный, но возможны ситуации, когда константа (Who) ошибочно применена ( для индексации положения бита в слове) не к той структуре, для которой она предназначена.
    И таких констант в программе при упаковывании битов может быть несколько сотен...

    Компилятор такую смысловую ошибку не заметит, ведь синтаксис не нарушен, а константу можно использовать для любых целей

    const
    who:byte:=3; (*адрес бита в structrure_1 *)
    regime:byte:=5; (*адрес бита в structrure_2 *)

    strusture_1.who:= FALSE;

    structure_2.who:= FALSE;
    structure_2.regime:= FALSE; (* ошибка *)

    для автоматического выявления такой ошибки, нужно сделать ее синтаксической для компилятора, например объявить who или regime элементами своих структур, а чтобы не было вопросов с выравниванием при сетевом обмене, сделать из 16 битными.

    в итоге - за такое удобство придется заплатить тем, от чего пытались уйти.

  2. #12
    Пользователь
    Регистрация
    12.08.2008
    Адрес
    Белгород
    Сообщений
    63

    По умолчанию

    Цитата Сообщение от Thorn Посмотреть сообщение
    При тестировании выплыл ещё один косячок.

    Так размер структуры равен 8 байт:
    STRUCT
    bools :WORD;
    img :INT;
    temp :REAL;
    END_STRUCT

    А вот так 12 байт:
    STRUCT
    bools :WORD;
    temp :REAL;
    img :INT;
    END_STRUCT

    Данные при передаче понятно тоже сдвигаются. Помнится в Сях на этот случай был ключик #pragma pack. Здесь аналога похоже нет, так что надо иметь в виду...
    Цитата Сообщение от Валенок Посмотреть сообщение
    struct ровняется под кварту в отличие от ФБ. И sizeof офлайн/онлайн - из-за этого могут отличаться. Но лично я тоже предпочитаю явное указание пустышек.
    мда... и об этом можно узнать только с форума, а не из документации
    Изображения Изображения
    Последний раз редактировалось gtfox; 18.04.2014 в 12:31.
    Сколько у Овена хорошего, столько же и бардака.
    Шаг левой - нормально, шаг правой - грабли. Стабильно.

  3. #13
    Пользователь
    Регистрация
    12.08.2008
    Адрес
    Белгород
    Сообщений
    63

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    я выкладывал на просторах форума пример, где в конфигураторе объявлял только одну переменную, по ней находил адрес канала, остальные каналы брались по смещению. Мне кажется такой подход к программе Вашего случая будет портироваться на любой ПЛК ("тип CPU")
    работает, но панель читать/писать не может. а если слейв заполнить кучей переменных, то читается и пишется.

    ps
    благо Ctrl+V работает в конфигурации плк без лишних вопросов
    Последний раз редактировалось gtfox; 17.04.2014 в 20:09.
    Сколько у Овена хорошего, столько же и бардака.
    Шаг левой - нормально, шаг правой - грабли. Стабильно.

  4. #14
    Пользователь
    Регистрация
    12.08.2008
    Адрес
    Белгород
    Сообщений
    63

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    А по подробнее, что там с панелью, у меня такой подход применяется на производстве,где панель слейв и всё работает
    ага, ясно. У меня панель мастер. А если контроллер мастер то работает.
    видимо слейв овена так написан, что он обрабатывает запросы только к переменным, натыканным в конфигурации плк.
    Последний раз редактировалось gtfox; 18.04.2014 в 12:27.
    Сколько у Овена хорошего, столько же и бардака.
    Шаг левой - нормально, шаг правой - грабли. Стабильно.

  5. #15
    Пользователь
    Регистрация
    12.08.2008
    Адрес
    Белгород
    Сообщений
    63

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    А к каким переменным еще нужно обрабатывать ?
    точно не помню, стандарт это или ограничения модикона... от 400001 до 465536
    Сколько у Овена хорошего, столько же и бардака.
    Шаг левой - нормально, шаг правой - грабли. Стабильно.

  6. #16
    Пользователь Аватар для Ryzhij
    Регистрация
    15.04.2013
    Адрес
    Рязань
    Сообщений
    918

    По умолчанию

    Цитата Сообщение от gtfox Посмотреть сообщение
    точно не помню, стандарт это или ограничения модикона... от 400001 до 465536
    Объявите, и хоть об-обрабатывайтесь
    А пока Вы их в структуру не внесёте - их для системы просто не существует, ни самих переменных, ни, как следствие, их свойств.
    Что и как тут обрабатывать?
    "Нам бы схемку, аль чертёж - мы б затеяли вертёж. Ну, а так, как ни старайся..."

  7. #17
    Пользователь
    Регистрация
    12.08.2008
    Адрес
    Белгород
    Сообщений
    63

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    А их нету. Как обрабатывать-то ?
    Цитата Сообщение от Ryzhij Посмотреть сообщение
    Что и как тут обрабатывать?
    Благодарю, все понял.

    PS
    Ну я вообще вот из-за этого вопроса начал копаться в этих делах. у ваги не надо было ничего натыкивать.

    PPS
    Если надо обязательно объявлять в конфигурации все что будет использоваться то как вот это работает (я не проверял)
    Цитата Сообщение от capzap Посмотреть сообщение
    я выкладывал на просторах форума пример, где в конфигураторе объявлял только одну переменную, по ней находил адрес канала, остальные каналы брались по смещению. Мне кажется такой подход к программе Вашего случая будет портироваться на любой ПЛК ("тип CPU")
    Сколько у Овена хорошего, столько же и бардака.
    Шаг левой - нормально, шаг правой - грабли. Стабильно.

  8. #18
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    357

    По умолчанию

    Добавляете в конфигурации столько регистров, чтобы их общий размер был такой же, как у структуры. Размер структуры должен быть кратным 4 байтам для выравнивания. Имя даете только первому регистру. Далее в начале программы структуре через указатель присваиваете значения из конфигурации

    Ptr_slave:=ADR(first_config); (*адрес первого элемента конфигурации*)
    slv:=Ptr_slave^; (*переменная типа "структура" получает все значения из конфигурации*)

    ... (*далее в программе используем структуру вместо конфигурации*)

    в конце программы

    Ptr_slave^:=slv; (*копируем значения из структуры в конфигурацию*)

    P.S. прежде чем воспользоваться примером почитайте эту ссылку http://www.owen.ru/forum/showthread....l=1#post153876
    Последний раз редактировалось amn; 28.11.2014 в 16:21. Причина: дополнил предупреждением, о котором ранее не знал

Страница 2 из 2 ПерваяПервая 12

Ваши права

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