CODESYS форум

Добро пожаловать на официальный форум CODESYS
Deutsche Version English version russian version 
Текущее время: Вс май 28, 2017 7:37 pm

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 18 сообщений ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: Инициализация массива структур
СообщениеДобавлено: Сб ноя 27, 2010 10:01 am 
Не в сети

Зарегистрирован: Пт окт 15, 2010 2:40 pm
Сообщения: 7
Здравствуйте!

Пытаюсь найти красивое решение для сабжа. Сейчас вот наковырял такое:

Определяю тип данных:

Код:
TYPE PARSCRIPT :
STRUCT
   Nu:      INT;
   Po:      INT;
   Md:      INT;
   No:      INT;
   Mi:      DINT;
   Ma:      DINT;
   Na:      STRING(10);
END_STRUCT
END_TYPE


В области глобальных (хотя это не принципиально) переменных пробую создать экземпляр и инициализировать его:

Код:
VAR_GLOBAL CONSTANT
a_psPar: ARRAY [0..1] OF PARSCRIPT :=
(Nu:=101, Po:=2, Md:=0, No:=0, Mi:=0, Ma:=9999, Na:='Text1'),
(102, 2, 0, 0, 0, 9999,'Text2');
END_VAR


Первая строка инициализации компилируется нормально. Но у меня в массиве будет до сотни таких структур! Ручки облом натруживать :)
Пробую выбросить присвоения и перечислить начальные значения просто в том порядке, что в объявлении (строка 2) - не компилирует. РУГАИЦЦА!

Вот и 2 вопроса:
Главный:
1) Можно ли все же инициализировать без явных присвоения (по типу второй строчки)

В случает невозможности - запасной:
2) Если нет, то придется использовать корявые отдельные массивы. Что-то вроде такого:

Код:
VAR_GLOBAL CONSTANT
   aiPar: ARRAY [0..3, 0..1] OF INT :=
101, 0, 0, 0,
102, 0, 0, 0;
   adiPar: ARRAY [0..1, 0..1] OF DINT :=
0, 99999,
0, 99999;
   astPar: ARRAY [0..1] OF STRING(10) :=
'Text1',
'Text2';
   NU:   INT := 0;
   PO:   INT := 1;
   MD:   INT := 2;
   NO:   INT := 3;
   MI:      INT := 0;
   MA:      INT := 1;
END_VAR


И потом при вызове использовать обращения к разным массивам:

Код:
PROGRAM PLC_PRG
VAR
   i:      INT;
   di:      DINT;
   st1:   STRING(10);
END_VAR

i    := aiPar[ NU, 0];
di   := adiPar[ MI, 1];
st1   := astPar[ 0];


Такой подход мне не нравится еще и потому, что при большом реальном массиве трудно будет без ошибок менять число параметров (размер массива), отслеживать изменения в их начальных значениях и прочее и прочее... Хотелось бы все же иметь дело с массивом структур.

Подскажите, плз, как же изящно инициализировать?
Спасибо!


Вернуться к началу
СообщениеДобавлено: Пн ноя 29, 2010 3:38 pm 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
Тут не простая иниц-я, номера возрастают... Я бы в программе сделал секцию инициализации, которая 1 раз при старте работает, и в ней бы написал цикл с иниц-ей.


Вернуться к началу
СообщениеДобавлено: Пн ноя 29, 2010 5:39 pm 
Не в сети

Зарегистрирован: Пт окт 15, 2010 2:40 pm
Сообщения: 7
Igor Petrov писал(а):
Я бы в программе сделал секцию инициализации, которая 1 раз при старте работает, и в ней бы написал цикл с иниц-ей.

Так присвоение значений - вроде как бы и не фокус. Но присваивать-то Вы будете из массива констант? Вот я и спрашиваю, как изящно задать этот массив констант - с учетом того, что массив, по сути, есть именно массив разнородных данных (структур) и, второе, инициализировать его прямо присвоениями, вроде таких

Код:
Nu:=101, Po:=2, Md:=0, No:=0, Mi:=0, Ma:=9999, Na:='Text1'


- не очень хочется. Можно, конечно можно, но не кашерно как-то :)

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

А массив самих параметров будет иной. Он вообще может быть не массивом, но это я еще проверю и с удовольствием доложу результаты. Кстати, и не все параметры будут RETAIN...

В общем, речь идеть о массиве констант, вот как получается.
Извините, если сразу я не очень внятно это пояснил.

Итак, еще раз. Нужно красивое объявление массива констант (можно и переменных, это не принципиально, но использоваться они будут как константы) - такое, чтобы было легко видно, к какой именно из массива структур относится какая строка и каждый столбец записи позволял визуально относить элемент структуры к "своему" месту...
Что же это я такое сказал?....


Вернуться к началу
СообщениеДобавлено: Вт ноя 30, 2010 9:32 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
Если в лом набирать ручками, создайте текстовый файл с необходимыми значениями структур
Код:
101, 2, 0, 0, 0, 9999,'Text1'
102, 2, 0, 0, 0, 9999,'Text2'
...
200, 2, 0, 0, 0, 9999,'Text100'
Разделитель столбцов на ваш вкус, при старте программы считываете файл и распихиваете в массив структур.
Даже RETAIN не обязательно будет, т.к. файл сам по себе хранится в контроллере и открывается только для чтения.


Вернуться к началу
СообщениеДобавлено: Вт ноя 30, 2010 10:07 am 
Не в сети

Зарегистрирован: Пт окт 15, 2010 2:40 pm
Сообщения: 7
Avgur писал(а):
создайте текстовый файл с

Ух ты, ух ты! Это же здорово!
Я что-то слышал о файлах в памяти ПЛК, но ни разу не использовал (я очень новенький здесь). А это будет очень нагло с моей стороны, попросить показать, как примерно это сделать? Если очень - ну, извините. Буду читать.


Вернуться к началу
СообщениеДобавлено: Вт ноя 30, 2010 10:26 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
1) эта тема http://forum-ru.3s-software.com/viewtopic.php?f=8&t=850
2) справка по библиотеке SysLibFile
3) немного терпения и времени
В теме есть пример правильной работы с файлами. Только ссылка дохлая :D Ждем представителей Пролога, может починят.
По ссылке (http://www.3s-software.com/index.shtml?sample_projects) лежат примеры проектов, среди них FileWriteExample.pro тоже можно скачать и глянуть.
Если не получится скачать, я могу выложить ранее скачанные оттуда же примеры.


Вернуться к началу
СообщениеДобавлено: Вт ноя 30, 2010 10:34 am 
Не в сети

Зарегистрирован: Пт окт 15, 2010 2:40 pm
Сообщения: 7
Спасибо огромное! А то начал рыться в КОДЕСИС и пока ничего не нашел.


Вернуться к началу
СообщениеДобавлено: Вт ноя 30, 2010 11:00 am 
Не в сети

Зарегистрирован: Пт окт 15, 2010 2:40 pm
Сообщения: 7
Avgur писал(а):
По ссылке (http://www.3s-software.com/index.shtml?sample_projects) лежат примеры проектов

не пойму, какой ему пароль нужен - я дал тот, что у меня есть в http://forum-ru.3s-software.com, но это не прокатило.

Но это не главное,в чем я торможу. Вот, допустим я в программе умею открыть файл в памяти ПЛК100, умею читать-писать, умею закрыть. По смыслу моей задачи я должен из этого "конфигурационного" файла при старте программы вычитать массив структур и пользоваться им в течение жизни программы. При выключении питания эти данные не пропадают, т.к. они во флеш-памяти. Так?
Хорошо. Но вот вопрос: а как именно мне эту информацию запихнуть в файл?

Вариант 1. Той же программой, через запись в файл. Дык, йо-майо, теперь опять сведется к инициализации массива констант. С этим же и боремся!

Вариант 2. Внешними редакторами создаю где-то в ПК файл. Такт как он не компилируется, то я пишу в свое удовольствие что угодно текстовое - главное, чтобы это потом из файла вычиталось в правильную структуру. Но как мне этот файл из ПК запиндюрить в память ПЛК?

Иначе говоря, как в память ПЛК загрузить файл (который потом можно открыть), не являющийся программным компоненотом КОДЕСИС?

Не понимаю...


Вернуться к началу
СообщениеДобавлено: Вт ноя 30, 2010 1:48 pm 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
Avgur писал(а):
1) эта тема http://forum-ru.3s-software.com/viewtopic.php?f=8&t=850
...
В теме есть пример правильной работы с файлами. Только ссылка дохлая :D Ждем представителей Пролога, может починят.
...


Докладую, починили:)


Вернуться к началу
СообщениеДобавлено: Вт ноя 30, 2010 2:01 pm 
Не в сети

Зарегистрирован: Пт окт 15, 2010 2:40 pm
Сообщения: 7
Mikhail Shvetsov писал(а):
Докладую, починили:)

Докладую: не понял :)

Ну не фокус из ПЛК открыть файл и записать-причитать! А я же интересуюсь, как запихнуть в ПЛК файл, созданный внешним редактором. Можете подсказать?


Вернуться к началу
СообщениеДобавлено: Вт ноя 30, 2010 2:31 pm 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
Еще примеры с Овен-форума http://www.owen.ru/forum/showthread.php?t=551 На этом форуме уважаемый drvlas уже не очень новенький.
Простое гугление ПЛК 100 выдает:
Программируемый логический контроллер ОВЕН ПЛК 100 — Поддерживаемые интерфейсы и протоколы
Поддерживаемые интерфейсы и протоколы
...
GateWay
(протокол CoDeSys)
RS-232
Ethernet 10/100 Mbps
USB-Device
Программирование контроллера, отладка пользовательской программы (в т.ч. высокоскоростная отладка в режиме Realtime по Ethernet).
Работа с файлами на встроенном Flash-диске. Связь с контроллерами других производителей, сделанных на базе CoDeSys.
Работа с OPC-сервером CoDeSys

Mass Storage Device
USB-Device
(для ПЛК100)
Представление Flash-диска ПЛК как внешнего файлового накопителя.
Работа с файлами архивов данных и файлами проекта

Т.е. доступ к файловой системе контроллера имеется. RTFM.


Вернуться к началу
СообщениеДобавлено: Вт ноя 30, 2010 3:31 pm 
Не в сети

Зарегистрирован: Пт окт 15, 2010 2:40 pm
Сообщения: 7
Avgur писал(а):
Еще примеры с Овен-форума


Спасибо, буду разбираться.

Avgur писал(а):
Простое гугление ПЛК 100 выдает:
Программируемый логический контроллер ОВЕН ПЛК 100 — Поддерживаемые интерфейсы и протоколы
Поддерживаемые интерфейсы и протоколы
...
...
Т.е. доступ к файловой системе контроллера имеется. RTFM.

Уважаемый, я ни малейшего понятия не имею о способах работы ПК-ПЛК. Никогда этим не занимался. И мне, по большому счету, это не сейчас надо.
Вашу идею переварил (заметили? я не сразу въехал), понял, что нужно как-то это делать. Спросил как. Даже Ваш список "на восемь листов" - это уже помощь. За это спасибо.
Но вообще-то мне незачем перелопачивать такую гору информации - ведь задачка-то простая и имеется альтернативное решение, немного корявое, но все же есть. Вот я и подумал, что знающий чел не обязательно будет тыкать меня фейсом в мое незнание, а укажет простой способ, если ему не влом. А если влом - не напишет, кто ж его заставит?
Это что, очень странная позиция?


Вернуться к началу
СообщениеДобавлено: Ср дек 01, 2010 5:52 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
Я не тыкал никого и никуда. Прошу прощения, если обидел.
Я тоже не имею ни малейшего понятия по работе ПК с контроллером ПЛК 100. Я предложил направление поиска информации - документация на контроллер. Это далеко не гора информации, а 1-3 инструкции. Реально проще прочитать инструкцию, попробовать что-то сделать, и если не получается задать вопрос на форуме.
+ есть специализированный форум по вашему контроллеру, все вопросы связи с ПК и другие думаю там есть.

Офф.
Мой собственный пример: когда начинал работать с контроллером ThinkIO я заваливал суппорт РТСофта вопросами. В конце концов, моему начальнику пришло письмо от начальника суппорта: дескать у вас специалист, скорей всего новенький и молодой, отправьте его к нам на курсы по контроллеру дабы снизить объем писем. :D
Путь самостоятельного изучения тоже возможен, но требует терпения и кропотливой работы по поиску информации. Третьего варианта не вижу...


Вернуться к началу
СообщениеДобавлено: Ср дек 01, 2010 6:35 am 
Не в сети

Зарегистрирован: Пт окт 15, 2010 2:40 pm
Сообщения: 7
Да все нормально. Я действительно благодарен Вам за направление поиска. Но искать именно в данном случае не буду. Ведь есть цель - написать рабочую программу. Если расходы по поиску какого-то частного решения превышают ожидаемые выгоды, то решаем "по-сельски". Указанную инициализацию можно провести как минимум 2-мя способами, не считая Вашего, через файл. Пусть файловый способ останется на будущее. Ведь когда-нибудь я разберусь и с неясными сейчас вопросами по прямой записи из ПК в ПЛК.

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

Как Вы говорите, ОФФ:
А вот интересно, почему этот форум скучноват? Почему здесь народу мало, дискуссии вялые? Не одна ли из причин, что мы здесь создаем "башню из черного дерева"? Если новичок присматривается, как реагируют на простые (для кого-то - идиотские) вопросы и видит некоторый налет поучительства, он может так "зафильтровать базар", что и не высунется... Думаю, будет веселее. если мы постараемся не учить друг друга жить, а отвечать по сути.

С надеждой :)


Вернуться к началу
СообщениеДобавлено: Ср дек 01, 2010 7:08 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
drvlas писал(а):
А вот интересно, почему этот форум скучноват? Почему здесь народу мало, дискуссии вялые? Не одна ли из причин, что мы здесь создаем "башню из черного дерева"?
Как и любой другой технический форум. На этом даже "курилки" нет :P
Новичков нигде не любят, сразу посылают курить поиск, в гугл и иногда просто банят за нежелание сначала читать, а потом писать.
Ответ на вопрос всегда можно получить, главное уметь их задавать :wink:
ОффОфф: Спасибо за Фаулза, надо будет прочитать.

Upd:
Прочел название подфорума
Цитата:
Примеры
Примеры программ в CoDeSys для начинающих, примеры по сложным часто задаваемым вопросам, примеры работы с различными аппаратными устройствами.
Больше не буду RTFM'ить :?


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 18 сообщений ]  На страницу 1 2 След.

Часовой пояс: UTC+01:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB