Данный CODESYS форум содержит архивную копию русской ветви только для чтения. Для создания сообщений пожалуйста используйте актуальную международную платформу CODESYS Forum. Close

Инициализация массива структур

drvlas
2010-11-27
2010-12-01
  • drvlas

    drvlas - 2010-11-27

    Здравствуйте!

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

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

    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];
    

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

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

     
  • Igor Petrov

    Igor Petrov - 2010-11-29

    Тут не простая иниц-я, номера возрастают... Я бы в программе сделал секцию инициализации, которая 1 раз при старте работает, и в ней бы написал цикл с иниц-ей.

     
  • drvlas

    drvlas - 2010-11-29

    Igor Petrov писал(а):
    Я бы в программе сделал секцию инициализации, которая 1 раз при старте работает, и в ней бы написал цикл с иниц-ей.

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

    Nu:=101, Po:=2, Md:=0, No:=0, Mi:=0, Ma:=9999, Na:='Text1'
    
    • не очень хочется. Можно, конечно можно, но не кашерно как-то

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

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

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

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

     
  • Avgur

    Avgur - 2010-11-30

    Если в лом набирать ручками, создайте текстовый файл с необходимыми значениями структур```

    101, 2, 0, 0, 0, 9999,'Text1'
    102, 2, 0, 0, 0, 9999,'Text2'
    ...
    200, 2, 0, 0, 0, 9999,'Text100'

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

     
  • drvlas

    drvlas - 2010-11-30

    Avgur писал(а):
    создайте текстовый файл с

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

     
  • Avgur

    Avgur - 2010-11-30

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

     
  • drvlas

    drvlas - 2010-11-30

    Спасибо огромное! А то начал рыться в КОДЕСИС и пока ничего не нашел.

     
  • drvlas

    drvlas - 2010-11-30

    Avgur писал(а):
    По ссылке (http://www.3s-software.com/index.shtml?sample_projects) лежат примеры проектов

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

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

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

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

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

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

     
  • Anonymous - 2010-11-30

    Originally created by: Mikhail Shvetsov

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

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

     
  • drvlas

    drvlas - 2010-11-30

    Mikhail Shvetsov писал(а):
    Докладую, починили:)

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

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

     
  • Avgur

    Avgur - 2010-11-30

    Еще примеры с Овен-форума 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.

     
  • drvlas

    drvlas - 2010-11-30

    Avgur писал(а):
    Еще примеры с Овен-форума

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

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

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

     
  • Avgur

    Avgur - 2010-12-01

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

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

     
  • drvlas

    drvlas - 2010-12-01

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

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

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

    С надеждой

     
  • Avgur

    Avgur - 2010-12-01

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

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

     
  • Igor Petrov

    Igor Petrov - 2010-12-01

    drvlas писал(а):
    Иначе говоря, (который потом можно открыть),

    Это вне CoDeSys и зависит от возможностей ПЛК. Это может быть поддержка ftp. Либо в CoDeSys есть ПЛК браузер и в нем будет команда загрузить файл. В Овен так.

    А еще, см в хелпе Создание списков глобальных переменных. Можно сделать объявления во внешнем файле и включить в проект. Например, в формируем в Excel и цепляем к проекту. Для начала, сделайте импорт списка глобальных, чтобы понять в каком виде их готовить.

     
  • Igor Petrov

    Igor Petrov - 2010-12-01

    Avgur писал(а):
    На этом даже "курилки" нет

    Докладываю: Партия сказала: надо! Комсомол ответил: есть!

     
  • drvlas

    drvlas - 2010-12-01

    Igor Petrov писал(а):
    Это вне CoDeSys и зависит от возможностей ПЛК. Это может быть поддержка ftp. Либо в CoDeSys есть ПЛК браузер и в нем будет команда загрузить файл. В Овен так.
    А еще, см в хелпе Создание списков глобальных переменных. Можно сделать объявления во внешнем файле и включить в проект. Например, в формируем в Excel и цепляем к проекту. Для начала, сделайте импорт списка глобальных, чтобы понять в каком виде их готовить.

    Ну, ясно теперь. Спасибо! Попробую.