WAGO 750-841 и OPC |
Ответить | Страница <1 23456> |
Автор | ||||||||||||||||||||||||||
Действительный член Присоединился: 01 Июнь 2006 Категория: Russian Federation Online Status: Offline Публикации: 464 |
Опубликовано: 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-сервере. |
||||||||||||||||||||||||||
Действительный член Присоединился: 01 Июнь 2006 Категория: Russian Federation Online Status: Offline Публикации: 464 |
||||||||||||||||||||||||||
Насчет избежать замусоривания я пожалуй погорячился. Объявить массив в коде нельзя, переопределить вроде тоже нельзя. задать переменную в качестве аргумента функции инициализации массива тоже вроде нельзя...
|
||||||||||||||||||||||||||
Новичок Присоединился: 03 Сентябрь 2011 Online Status: Offline Публикации: 22 |
||||||||||||||||||||||||||
Использовать указатели действительно нет необходимости - перешёл уже на массивы.
Как можно не использовать конфигуратор - мне не понятно. Или не про тот конфигуратор речь? Я для каждого модуля должен выбрать режим использования - fieldbus или PLC. Причём по умолчанию fieldbus, а мне нужно PLC для работы алгоритма в контроллере. Или это можно менять из программы? REAL мне совсем ни к чему, поэтому один массив WORD в принципе годится. Мне не совсем понятно, как в программе контроллера определить количество модулей каждого типа или количество отображаемой памяти от модулей каждого типа? Там есть переменные CnfLen.AnalogOut ,CnfLen.AnalogInp ,CnfLen.DigitalOut ,CnfLen.DigitalInp , и их явно можно читать с modbus, но как к ним достучаться из программы контроллера - я не понял. |
||||||||||||||||||||||||||
Действительный член Присоединился: 01 Июнь 2006 Категория: Russian Federation Online Status: Offline Публикации: 464 |
||||||||||||||||||||||||||
По умолчанию приоритет по записи вообще всегда был PLC. Я даже не поленился это проверить. Так оно и есть. Если поставите любой fildbus то из программы не запишите.
|
||||||||||||||||||||||||||
Действительный член Присоединился: 01 Июнь 2006 Категория: Russian Federation Online Status: Offline Публикации: 464 |
||||||||||||||||||||||||||
Конфигуратор ПЛК с точки зрения программы это все го лишь способ организации переменных в нашем случае. Мы вправе его вообще не использовать и выполнить операции объявления вручную: Ключевое слово AT
Если вы хотите поместить переменную по определенному адресу, то нужно объявить ее с ключевым словом AT. Преимущество такого объявления состоит в том, что можно дать значащее имя любому адресу и изменять значение по этому адресу где угодно (например, в разделе объявлений). Заметьте, что переменная, описывающая вход, не доступна для записи. Кроме того, объявление AT допустимо лишь для глобальных и локальных переменных, но не для входных или выходных переменных POU. Пример: xCounterHeat7 AT %QX0.0: BOOL; wLightcabinetImpulse AT %IW2: WORD; download AT %MX2.2: BOOL; Адреса
Прямое указание адреса дает способ непосредственного обращения к конкретной области памяти. Прямой адрес образуется из префикса "%", префиксов области памяти и размера, одного или нескольких целых чисел, разделенных точкой. Префиксы области памяти:
Префиксы размера:
Примеры:
Является ли последний указанный адрес значимым, будет определяться конкретной конфигурацией PLC. При этом компилятор не может проверить выход за край имиджа. Это дает возможность объявить избыточное количество слов и просто не обращаться к несуществующем в текущем имидже. Для ограничений я предложил не заморачиваться а задать значение переменных выше описанных мной где должно храниться количество модулей всех типов. |
||||||||||||||||||||||||||
Действительный член Присоединился: 01 Июнь 2006 Категория: Russian Federation Online Status: Offline Публикации: 464 |
||||||||||||||||||||||||||
Тоесть в основе программы должно быть два блока объявления прямых адресов: 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; Что в этом роде...
|
||||||||||||||||||||||||||
Новичок Присоединился: 03 Сентябрь 2011 Online Status: Offline Публикации: 22 |
||||||||||||||||||||||||||
Мне хотелось отделить аналоговые от дискретных и это дело параметризовать как нибудь.
Сейчас оно выглядит так и работает нормально: 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), но это видимо невозможно? |
||||||||||||||||||||||||||
Действительный член Присоединился: 01 Июнь 2006 Категория: Russian Federation Online Status: Offline Публикации: 464 |
||||||||||||||||||||||||||
Как вы обходите ошибку верхней границы при задании переменной:
DOM AT %IW260:ARRAY[1..BinOutNum] OF WORD;
Почему имидж входных слов начинаете не с нуля? Входы %IW0-%IW255
|
||||||||||||||||||||||||||
Действительный член Присоединился: 01 Июнь 2006 Категория: Russian Federation Online Status: Offline Публикации: 464 |
||||||||||||||||||||||||||
VAR_GLOBAL Arr1: ARRAY [0..10] OF REAL; END_VAR 3750503750"Верхняя граница '<имя>' не задана" Не задана константа, определяющая верхнюю границу диапазона. |
||||||||||||||||||||||||||
Действительный член Присоединился: 01 Июнь 2006 Категория: Russian Federation Online Status: Offline Публикации: 464 |
||||||||||||||||||||||||||
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> |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |