Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > ПЛК и микроконтроллеры
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

WAGO 750-841 и OPC

 Ответить Ответить Страница  <1 23456>
Автор
Сообщение
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: WAGO 750-841 и OPC
    Опубликовано: 07 Сентябрь 2011 09:06

По моему скромному мнению городить обработку для переменного имиджа это извращение, причем довольно изысканное. Не совсем понятно, почему вы используете указатели вместо переменных. В приведенном вами коде нет такой необходимости.

 

Если предположить что будут использоваться модули с одинаковым количеством входов выходов (установленные и для расширения). То при избыточном объявлении и наличии четырех внешних переменных (1-количество аналоговых модулей AI, 2-количество аналоговых модулей AO, 3-количество дискретных модулей DI, 1-количество дискретных модулей DO). НЕ ИСПОЛЬЗОВАТЬ КОНФИГУРАТОР.

Объявить прямо адресуемые переменные WORD:

Максимальное проектное количество модулей * 1 для ввода %IW0 - %IWXX (максимум 64 модуля на контроллер * кол-во каналов 256 слов по моему)

Максимальное проектное количество модулей * 1 для ввода %IQ0 - %IQXX (максимум 64 модуля на контроллер * кол-во каналов 256 слов по моему)

Переменные сделать невидимыми в символьной конфигурации.

Определить массивы WORD для ввода/вывода (сделать их видимыми в символьной конфигурации). C элементами от 0 до 1-количество аналоговых модулей AI* кол-во каналов работать как с WORD (код АЦП) с оставшимися до последнего DI работать побитно (%IW0.Х, Переменная.Номер бита). Тогда можно будет работать с переменным имиджем.

Соответственно можно объявить массивы REAL для вычисленных значений входов выходов видимых в символьном файле, это позволит избежать замусоривания на OPC-сервере.

Наверх
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Сентябрь 2011 09:14
Ouch Насчет избежать замусоривания я пожалуй погорячился. Объявить массив в коде нельзя, переопределить вроде тоже нельзя. задать переменную в качестве аргумента функции инициализации массива тоже вроде нельзя...
Наверх
min Смотреть выпадающим
Новичок
Новичок


Присоединился: 03 Сентябрь 2011
Online Status: Offline
Публикации: 22
Свойства публикации Свойства публикации   Ответить, цитируя автора - min Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Сентябрь 2011 09:46
Использовать указатели действительно нет необходимости - перешёл уже на массивы.
Как можно не использовать конфигуратор - мне не понятно. Или не про тот конфигуратор речь?
Я для каждого модуля должен выбрать режим использования - fieldbus или PLC. Причём по умолчанию fieldbus, а мне нужно PLC для работы алгоритма в контроллере. Или это можно менять из программы?
REAL мне совсем ни к чему, поэтому один массив WORD в принципе годится.
Мне не совсем понятно, как в программе контроллера определить количество модулей каждого типа или количество отображаемой памяти от модулей каждого типа?
Там есть переменные CnfLen.AnalogOut ,CnfLen.AnalogInp ,CnfLen.DigitalOut ,CnfLen.DigitalInp , и их явно можно читать с modbus, но как к ним достучаться из программы контроллера - я не понял.
Наверх
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Сентябрь 2011 11:05
Первоначально опубликовано Dismay

Первоначально опубликовано Petrov

Первоначально опубликовано min

По умолчанию модули ввода вывода ведь отображаются в режиме fieldbus, а мне нужно PLC.
я не понял. как это?
По умолчанию приоритет по записи вообще всегда был PLC. Я даже не поленился это проверить. Так оно и есть. Если поставите любой fildbus то из программы не запишите.
По умолчанию приоритет по записи вообще всегда был PLC. Я даже не поленился это проверить. Так оно и есть. Если поставите любой fildbus то из программы не запишите.
Наверх
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Сентябрь 2011 11:33

Конфигуратор ПЛК с точки зрения программы это все го лишь способ организации переменных в нашем случае. Мы вправе его вообще не использовать и выполнить операции объявления вручную:

Ключевое слово AT

Если вы хотите поместить переменную по определенному адресу, то нужно объявить ее с ключевым словом AT. Преимущество такого объявления состоит в том, что можно дать значащее имя любому адресу и изменять значение по этому адресу где угодно (например, в разделе объявлений).

Заметьте, что переменная, описывающая вход, не доступна для записи. Кроме того, объявление AT допустимо лишь для глобальных и локальных переменных, но не для входных или выходных переменных POU.

Пример:

xCounterHeat7  AT %QX0.0: BOOL;

wLightcabinetImpulse AT %IW2: WORD;

download AT %MX2.2: BOOL;

Адреса

Прямое указание адреса дает способ непосредственного обращения к конкретной области памяти.  Прямой адрес образуется из префикса "%", префиксов области памяти и размера, одного или нескольких целых чисел, разделенных точкой.

Префиксы области памяти:

I

Входы

Q

Выходы

M

Память данных

Префиксы размера:

X

Один бит

None

Один бит

B

Байт (8 бит)

W

Слово (16 бит)

D

Двойное слово (32 бит)

Примеры:

%QX7.5 and %Q7.5

бит 7.5 в области выходов

%IW215

215е слово в области входов

%QB7

байт 7 в области выходов

%MD48

двойное слово в позиции памяти 48

%IW2.5.7.1

зависит от конфигурации PLC

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

При этом компилятор не может проверить выход за край имиджа. Это дает возможность объявить избыточное количество слов и просто не обращаться к несуществующем в текущем имидже.

Для ограничений я предложил не заморачиваться а задать значение переменных выше описанных мной где должно храниться количество модулей всех типов.

Наверх
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Сентябрь 2011 11:38

Тоесть в основе программы должно быть два блока объявления прямых адресов:

      IN1  AT %IW0: WORD;
      IN2  AT %IW1: WORD;
      IN3  AT %IW2: WORD;
      IN4  AT %IW3: WORD;
      INX  AT %IW4: WORD;
 
      OUT1  AT %QW0: WORD;
      OUT2  AT %QW1: WORD;
      OUT3  AT %QW2: WORD;
      OUT4  AT %QW3: WORD;
      OUTX  AT %QW4: WORD;
Что в этом роде...
Наверх
min Смотреть выпадающим
Новичок
Новичок


Присоединился: 03 Сентябрь 2011
Online Status: Offline
Публикации: 22
Свойства публикации Свойства публикации   Ответить, цитируя автора - min Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Сентябрь 2011 11:47
Мне хотелось отделить аналоговые от дискретных и это дело параметризовать как нибудь.
Сейчас оно выглядит так и работает нормально:
     AOM AT %IW256:ARRAY [1..AnaOutNum] OF INT;
    AOH AT %QW0:ARRAY [1..AnaOutNum] OF INT;
    DOM AT %IW260:ARRAY[1..BinOutNum] OF WORD;
    DIM AT %QW256:ARRAY[1..BinInNum] OF WORD;
    DOH AT %QB8:ARRAY [1..BinOutNum] OF BYTE;
    DIH AT %IB0:ARRAY [1..BinInNum] OF BYTE;   
Хотелось бы ещё параметризовать %IW260 типа %IW(AnaOutNum+ModbusBase), но это видимо невозможно?
Наверх
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Сентябрь 2011 11:58
Как вы обходите ошибку верхней границы при задании переменной:
DOM AT %IW260:ARRAY[1..BinOutNum] OF WORD;
Почему имидж входных слов начинаете не с нуля? Входы %IW0-%IW255
Наверх
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Сентябрь 2011 12:05

VAR_GLOBAL
 ArrBound:INT:=100;

 Arr1: ARRAY [0..10] OF REAL;
  Arr2:ARRAY[0..ArrBound] OF WORD;

END_VAR
=============================================

3750503750

"Верхняя граница '<имя>' не задана"

Не задана константа, определяющая верхнюю границу диапазона.

Наверх
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Сентябрь 2011 12:15
AOM AT %IW256:ARRAY [1..AnaOutNum] OF INT;
Такая запись вообще не особо понятна. Когда вы работаете с памятью имеет смысл использовать только типы применительные для организации памяти. Тем более с имеджем:
INT занимает два WORD и ложится на оба канала разом, так что у вас в принципе оно работать не должно.
 WIN AT %IW0:ARRAY [1..255] OF WORD;
 WOUT AT %QW0:ARRAY [1..255] OF WORD;
По моему больше ничего не нужно
Наверх
 Ответить Ответить Страница  <1 23456>

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz