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

Тема: Работа с памятью в макросах

  1. #1
    Пользователь
    Регистрация
    19.12.2006
    Адрес
    Нижний
    Сообщений
    146

    Question Работа с памятью в макросах

    Добрый день. Начинаю осваивать макросы, появилось несколько вопросов:
    1. Будет ли работать конструкция
      Код:
      Write (HMI_LOCAL_MCH, 0, TYPE_PFW, 260, 0, TYPE_WORD, PSW[1059]);
      Интересует именно регистр PSW запишется ли он напрямую в регистр PFW? компилятор при этом не ругается.Или лучше использовать промежуточную переменную?
      С PFW уже ругается
      Код:
      Write (HMI_LOCAL_MCH, 0, TYPE_PFW, 260, 0, TYPE_WORD, PFW[1059]);
      , т.е. напрямую из PFW в PFW уже не получится?
    2. В тоже время функцией Writes регистры PSW в PFW напрямую не записать ?
      Код:
      Writes (HMI_LOCAL_MCH, 0, TYPE_PFW, 500, 6, PSW[30]);

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

    По умолчанию

    1.1. Будет.
    1.2. Не получится.
    2. Получится, см. пост Petera ниже.

    Посмотрите вот этот пример:
    http://www.owen.ru/uploads/example_macromemory_v2.zip

    Там в глобальном макросе подготовлены функции, которые упрощают работу с памятью, а в пользовательском макросе - пример их применения.

  3. #3
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от Aleksandr Посмотреть сообщение
    Добрый день. Начинаю осваивать макросы, появилось несколько вопросов:
    1. Будет ли работать конструкция
      Код:
      Write (HMI_LOCAL_MCH, 0, TYPE_PFW, 260, 0, TYPE_WORD, PSW[1059]);
      Интересует именно регистр PSW запишется ли он напрямую в регистр PFW? компилятор при этом не ругается.Или лучше использовать промежуточную переменную?
      С PFW уже ругается
      Код:
      Write (HMI_LOCAL_MCH, 0, TYPE_PFW, 260, 0, TYPE_WORD, PFW[1059]);
      , т.е. напрямую из PFW в PFW уже не получится?
    2. В тоже время функцией Writes регистры PSW в PFW напрямую не записать ?
      Код:
      Writes (HMI_LOCAL_MCH, 0, TYPE_PFW, 500, 6, PSW[30]);

    По поводу п.2
    Достаточно использовать & перед адресом PSW (использовать указатель на адрес первого элемента массива из 6 регистров PSW)
    т.е. такая запись
    Writes(HMI_LOCAL_MCH, 0, TYPE_PFW, 500, 6, &PSW[30]);
    будет работать
    Последний раз редактировалось petera; 26.06.2018 в 07:28.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #4

  5. #5

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    1.1. Будет.
    1.2. Не получится.
    2. Получится, см. пост Petera ниже.

    Посмотрите вот этот пример:
    http://www.owen.ru/uploads/example_macromemory_v2.zip

    Там в глобальном макросе подготовлены функции, которые упрощают работу с памятью, а в пользовательском макросе - пример их применения.
    А почему в Copys не используете Reads/Writes? Это гораздо эффективнее должно быть
    Для PSB можно массив PSB использовать, тоже будет быстрее, но несколько сложнее реализовать

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

    По умолчанию

    Выигрыш в эффективности будет сложно заметить (в контексте задач панели). Даже копирование 10к регистров через цикл укладывается в 100-200 мс.
    Но, согласен, для PSW корректнее было бы сделать с Writes - так, по крайней мере, было бы компактнее и проще.

  7. #7
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Выигрыш в эффективности будет сложно заметить (в контексте задач панели). Даже копирование 10к регистров через цикл укладывается в 100-200 мс.
    Но, согласен, для PSW корректнее было бы сделать с Writes - так, по крайней мере, было бы компактнее и проще.
    Еще компактней и проще в Copys или вместо ее использовать стандартную сишную функцию memcpy()

    например скопировать тридцать пять PSB
    memcpy(&PSB[300], &PSB[500], 35); // PSB[300+i]=PSB[500+i], where i=0..34
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  8. #8

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Еще компактней и проще в Copys или вместо ее использовать стандартную сишную функцию memcpy()

    например скопировать тридцать пять PSB
    memcpy(&PSB[300], &PSB[500], 35); // PSB[300+i]=PSB[500+i], where i=0..34
    С PSB аккуратнее, это байтовый массив, в каждом элементе которого хранится состояние восьми PSB
    Код:
    // PSB
    #define 	BITS_PER_BYTE 8
    #define		GetPSBStatus( PSB_No )		( ( PSB[ (PSB_No) / BITS_PER_BYTE ] & ( 1 << ( (PSB_No) % BITS_PER_BYTE ) ) ) != 0 )
    #define		SetPSB( PSB_No )			PSB[ (PSB_No) / BITS_PER_BYTE ] |= ( 1 << ( (PSB_No) % BITS_PER_BYTE ) )
    #define		ResetPSB( PSB_No )			PSB[ (PSB_No) / BITS_PER_BYTE ] &= ( ~ ( 1 << ( (PSB_No) % BITS_PER_BYTE  ) ) )
    (из Lib.h)

Похожие темы

  1. иероглифы в макросах
    от evg3798 в разделе Панели оператора (HMI)
    Ответов: 1
    Последнее сообщение: 28.04.2017, 08:13
  2. Проблемы с памятью ПЛК110-30 V2
    от p_dima90 в разделе ПЛК1хх [М02]
    Ответов: 3
    Последнее сообщение: 20.02.2017, 14:35
  3. ВЕЩЕСТВЕННЫЕ ЭЛЕМЕНТЫ В МАКРОСАХ
    от rovki в разделе Среда программирования OWEN Logic
    Ответов: 6
    Последнее сообщение: 18.04.2016, 16:53
  4. Что то с памятью моею стало !!!
    от @ND в разделе СПК1хх
    Ответов: 3
    Последнее сообщение: 06.08.2015, 14:35
  5. Работа с внутренней памятью ПЛК
    от mp3moto в разделе Помощь Разработчикам
    Ответов: 2
    Последнее сообщение: 26.09.2008, 11:19

Ваши права

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