PDA

Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)



Страницы : [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Serge_UA
11.05.2011, 14:17
Всем привет. Впервые столкнулся с программированием в CoDeSys. Есть несколько простых вопросов, на которые пока не нашел однозначных ответов в документации.

1) Я правильно понял, что в языках ST и FBD нет условных/безусловных переходов (JUMP'ов)?

2) Я правильно понял, что в языке LD нет возможности сравнить, например, два целых числа и нет возможности выполнить вычисление в несколько действий (например А*В+С) в одной цепочке (network)?

3) В документации как-то скудно описано использование скобок. В языке IL мне нужно проверить следующее "составное" условие:

(booleanVar == TRUE) ИЛИ (integerVar <> 333)

Какой из этих вариантов правильный:


LD booleanVar
EQ TRUE
OR ( integerVar
NE 333
)



LD booleanVar
EQ TRUE
OR (
LD integerVar
NE 333
)


Заранее спасибо за ответы. :)

Serge_UA
12.05.2011, 00:39
2.Неправильно.Можно.Но он не для этого.(за кулисами выстрел)

Для чего он, я знаю :). Поработав полчаса в редакторе LD CoDeSys'а, у меня сложилось впечатление, что он не приспособлен для написания сложных алгоритмов (например, как цепочка во вложении). Уж очень GUI не интуитивен. А про документацию я вообще молчу.


3.Хошь посмотреть правильно - напиши на fbd/st/cfc - и конвертируй в il
То, что надо. Спасибо!



Местные ресурсы позволяют положить на il.
С удовольствием положил бы, если бы ST поддерживал переходы. А можно поподробнее про "ход конем"? :rolleyes:

Николаев Андрей
12.05.2011, 10:52
У нас новый пиарщик Сименса :)

Ну зачем так... Человек наоборот пробует новое.

Serge_UA
12.05.2011, 11:01
У нас новый пиарщик Сименса :)
Не угадал. Я еще могу Allen Bradley в пример привести (который кстати мне нравится больше, чем сименс). ;)
LD из степ7 я привел для примера, чтобы не рисовать его в paint'е.


Ну зачем так... Человек наоборот пробует новое.
К сожалению, не я пробую, а заказчики требуют :D

С LD в CoDeSys я уже разобрался (не без помощи конвертации примеров из ST по совету Валенка). Сложности в его понимании вызваны немного нестандартным (не общепринятым) отображением LD в CoDeSys. Здесь LD это практически копия FBD плюс релейные контакты и катушки. По аналогии с релейными схемами, у меня в голове сложился образ LD цепочки, где "ток" течет из одной точки (от "источника питания"). В CoDeSys же "ток течет" из нескольких источников, что немного не привычно.
Вот такое вот вероломство образов :D

Игорь Петров
12.05.2011, 12:25
В FBD кликаем мышкой по верху цепи. Появляется строка ввода. Пишем имя метки. В нужном месте вставляем переход на метку (Ctrl-L).

ST погуглите статьи на тему ‘структурное программирование’ и там см. как жить без перехода goto.
Статья в Википедии (http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D 0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0 %B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%B D%D0%B8%D0%B5)

Serge_UA
12.05.2011, 13:14
В FBD кликаем мышкой по верху цепи. Появляется строка ввода. Пишем имя метки. В нужном месте вставляем переход на метку (Ctrl-L).
Спасибо. Получается переходов нет только в ST.



ST погуглите статьи на тему ‘структурное программирование’ и там см. как жить без перехода goto.

Есть случаи, когда без goto не обойтись, либо текст с goto читается проще, чем структурный эквивалент.

Игорь Петров
12.05.2011, 14:12
Есть случаи, когда без goto не обойтись, либо текст с goto читается проще, чем структурный эквивалент.
Нет. Таких случаев не существует. Это терема Дейкстры. Красивые способы решения описаны в огромном числе публикаций по языкам структурного программирования (Паскаль, Си и пр.).

kolyan
12.05.2011, 14:32
Я не программист, но от знакомых программистов (профессионалов своего дела) слышал, что:
"Количество GOTO в программе обратно пропорционально качеству программиста". )))

Serge_UA
12.05.2011, 14:41
Нет. Таких случаев не существует. Это терема Дейкстры. Красивые способы решения описаны в огромном числе публикаций по языкам структурного программирования (Паскаль, Си и пр.).

Я знал, что вы так ответите. :)
Лучше не буду озвучивать свои аргументы. Закончим холивар и не начав его. :)


П.С. Извиняюсь. Пропал интернет, отправил сообщение два раза.

Игорь Петров
12.05.2011, 15:41
Обычно ST программу бьем на куски и укладываем все в CASE. По 1 переменной прыгаем куда надо. Классическая машина состояний. Читабельность и удобство отладки на высшем уровне.

Serge_UA
12.05.2011, 16:34
Согласен. Читаемость машины состояний отличная. Но в моем случае она неприменима.

Раз уж разговор завязался, опишу свою задачу - это обработка последовательного протокола обмена данными, который, естественно, содержит обработку ошибок. Именно для обработки ошибок мне и нужны переходы. Решения без goto я пока не нашел и уже склоняюсь к прекращению поиска и использованию LD вместо ST.
Думаю, это очевидно, что для этой задачи одним из самых важных требований является быстродействие алгоритма. Читаемость кода - вторична. К тому же у меня есть дополнительное ограничение: алгоритм должен быть реализован в одном POU (а конкретно FB).

П.С. Даже ярые ненавистники goto (в том числе те, кто слепо твердит: "Количество GOTO в программе обратно пропорционально качеству программиста" ;))
оправдывают применение goto для обработки ошибок (например см. Википедию (http://ru.wikipedia.org/wiki/GOTO#.D0.9E.D0.BF.D1.80.D0.B0.D0.B2.D0.B4.D0.B0.D0 .BD.D0.BD.D0.BE.D0.B5_.D0.BF.D1.80.D0.B8.D0.BC.D0. B5.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5)). И я за них счастлив.

Serge_UA
12.05.2011, 20:08
Уж не связано ли это с привычкой ноу хау протект делать на блок. В КДС можно отдельно сделать библиотеку из блоков под паролем, чтом никто не читал Ваше творение, а только пользовался.

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


П.С. Перефразируя: "ноу-хау протект для честных людей".
Он легко вскрывается.

Serge_UA
13.05.2011, 00:11
Для конечного пользователя главное безаварийная работа, а как выглядит исходный код они вообще не должны знать. ФБ для них должен выглядить в виде прямоугольника с ножками входов/выходов.
Согласен. Вот поэтому я и написал, что читаемость кода - вторична. Пользователь должен видеть один прямоугольник с ножками.


А внутри программист должен использовать предоставленное ему разнообразие стандартных языков максимально эффективно, в моем понимании это включает и разбиение на подпрограммы (дополнительные ФБ и ФС) каждая из которых отвечает за свое событие, функцию и т.д.

Чтобы использовать внутри "дополнительные FB и FC", их сначала нужно добавить во вкладке POUs, что противоречит требованию "один POU". Использовать же несколько языков в теле одного POU CoDeSys не позволяет. Или я упустил что-то важное в идеологии CoDeSys'а?

Serge_UA
13.05.2011, 00:49
Спасибо за идею.

Николай Суриков
13.05.2011, 06:02
...Использовать же несколько языков в теле одного POU CoDeSys не позволяет. Или я упустил что-то важное в идеологии CoDeSys'а?

Правый клик на POU --> Add Action выбираем язык и описываем нужную задачу на другом языке. Получается, что в пределах одного POU мы используем несколько языков.

Игорь Петров
13.05.2011, 11:06
В CoDeSys есть уникальная штука. Функциональный блок может иметь Действия. Это свои встроенные подпрограммы блока. Удобно каждое состояние описывать своим действием и вызывать их из ‘голого’ case. Николай выше уже подсказал, что действия могут быть на разных языках.

Машина состояний с CASE меняет состояние между циклами. Для перехода в состояние ошибки это может быть медленно. Вызываем специальное действие 'Ошибки', приводящие выходы в безопасное состояние (если надо); меняем переменную состояния на ошибочное; вставим RETURN. POU мгновенно вылетает, отдает управление драйверам для реакции железа, вызывается снова уже в состоянии ошибки. Быстрее некуда.

Еще вариант: делаете отдельную задачу - обработчик ошибок, вызываемую по фронту логической переменной. В любом месте проекта, при обнаружении ошибки, взводим переменную и ставим RETURN.

Практически все стеки полевых сетей, даже такой сложный как CANopen, написаны в самом CoDeSys на ST с машиной состояний и иногда в несколько задач.

Serge_UA
13.05.2011, 11:55
Николай Суриков, Игорь Петров спасибо. Действия я упустил из вида. Почему-то был уверен, что они предназначены только для SFC. Нужно внимательней читать документацию :(.



Машина состояний с CASE меняет состояние между циклами. Для перехода в состояние ошибки это может быть медленно. Вызываем специальное действие 'Ошибки', приводящие выходы в безопасное состояние (если надо); меняем переменную состояния на ошибочное; вставим RETURN. POU мгновенно вылетает, отдает управление драйверам для реакции железа, вызывается снова уже в состоянии ошибки. Быстрее некуда.

Красивое решение. Обязательно его попробую. Но не в данном проекте.

Serge_UA
13.05.2011, 15:15
А чего так ?

Смущает необходимость ждать целый цикл ПЛК, чтобы выполнить операции которые я мог выполнить еще в прошлом цикле. Как-то так :)

А еще, открою военную тайну :), я уже реализовал этот проект для Siemens и Allen Bradley ПЛК (с использованием ненавистных всем goto). И кардинально менять структуру программы для CoDeSys смысла я не вижу.

Serge_UA
13.05.2011, 16:09
А что слабо перейти к другому шагу в этом же цикле ?

:confused:
Вы меня поставили в тупик.
...Тогда теряется смысл машины состояний.


и как это? goto во время цикла у Вас убегает в верх программы и снова начинает спускаться, если это конечно не SFC.

В данном проекте у меня все goto "убегают" только вниз. И в программе нет ни одного цикла. В них не было нужды. Goto использовались для решения двух задач: обработка ошибок и пропуск больших кусков кода. Ну а в языке IL, который пришлось активно использовать в сименсе, goto - это единственный способ выполнить цикл или ветвление.


А может лучше так CASE предварительно заключить в
WHILE TRUE DO
...
...
END_WHILE;

помоему это все можно делать и в КДС

В средах программирования указанных выше контроллеров язык ST является платным дополнением. А заказчики умеют считать деньги :)

Serge_UA
13.05.2011, 17:31
Для этого и иф подойдет.
Кейс позволяет избавиться от головозаворачиволок типа длинноветвящихся ифов, и разложить кусты в простые линейные цепи - где на порядок выше читаемость/понимаемость/ошибкозамечаемость/исправляемость
И убрать кучу лишних флажков и тп.

В языках, которые мне были доступны (IL, LD, FBD) нет конструкций IF и CASE, поэтому для реализации ветвлений использовались goto. :)

Serge_UA
13.05.2011, 18:09
Еще один вопрос по действиям.
Я создал FB (на языке LD) с десятком входных параметров и десятком выходных. Внутри этого FB создал действие. Далее в теле этого FB вызываю его собственное действие, а редактор предлагает мне в этом вызове опять передать те же входные и выходные параметры. Так и должно быть?
Как-то нелогично получается. Двойная передача параметров - сначала извне в FB, а потом еще при вызове каждого действия из тела FB в действие.

Serge_UA
13.05.2011, 18:11
В il - иф есть.
Как выглядит инструкция/конструкция IF в IL?

Игорь Петров
14.05.2011, 10:56
Двойная передача параметров - сначала извне в FB, а потом еще при вызове каждого действия из тела FB в действие.
Стирайте ему все вопросики и не берите в голову.

Логика такая: ФБ помнит значения своих входов между вызовами! Поэтому, при вызове экземпляра ФБ нужно давать нечто только на те входы, которые надо поменять. Так, константы на входы экземпляра ФБ вообще можно задать в разделе инициализации 1 раз. В программе входы везде будут болтаться пустыми. И пусть себе. Редактор не может предугадать какие входы вам понадобятся (в CoDeSys V2.3), поэтому рисует прямоугольник со всеми входами на всякий случай. С действиями все аналогично. Их можно вызывать не только из самого ФБ, но и извне. Тут входы может быть надо поменять.

Игорь Петров
14.05.2011, 11:06
Кейс позволяет избавиться от головозаворачиволок типа длинноветвящихся ифов, и разложить кусты в простые линейные цепи..
А затем спрятать все эти линейные кусочки в макросы, действия или функции. Получается красивейший код. Он легко (сравнительно) читается даже 1 января в 6 утра :D

Игорь Петров
14.05.2011, 11:08
В ...CFC - легко реализуется и иф и кейс.
Причем кейс - симпотяшка.
На селекторе?

Николай Суриков
14.05.2011, 11:50
...ФБ для них должен выглядить в виде прямоугольника с ножками входов/выходов.

...даже 1 января в 6 утра :D
:-)
десять символов.

Serge_UA
14.05.2011, 23:40
Игорь Петров, спасибо за развернутый ответ.
Я думал на этом форуме в выходные дни тишина, а тут жизнь бурлит :)

VADR
18.05.2011, 10:34
Здравствуйте.

В документации есть пример подключения ввода-вывода МВА8 по Modbus. Для этого, как я понимаю, в CoDeSys должны быть установлены какие-то файлы описания этих устройств (т.е. какой регистр и для чего нужен). Что это за файлы, где их брать и как устанавливать?

Второй вопрос на ту же тему. Есть частотник, подключаемый по Modbus. В CoDeSys его можно, конечно, подключить как Universal Modbus Device, однако это не столь удобно. Как можно сделать файл с описанием устройства? Документация от производителя с картой регистров есть.

Николаев Андрей
18.05.2011, 14:05
Немного путаете - рекомендую почитать документ по конфигурированию ПЛК...
Никаких файлов дополнительных не надо - регистры указаны в РЭ на соответствующие модули. Смотрите пошаговый пример на форуме.

С частотниками все так же - берете карту, и забиваете в PLC Configuration.

Ну, или если удобнее организовывать обмен самим - берете библиотеку ModBus.lib и сами, как Вам удобно, организуете обмен.

VADR
18.05.2011, 15:28
Немного путаете - рекомендую почитать документ по конфигурированию ПЛК...
Никаких файлов дополнительных не надо - регистры указаны в РЭ на соответствующие модули. Смотрите пошаговый пример на форуме.

С частотниками все так же - берете карту, и забиваете в PLC Configuration.
Я не о том. Есть пример подключения МВА8, в котором написано:

Нажмите правой кнопкой мыши на пункте ModBus (Master), в появившемся контекстном меню выберите пункт Append Subelement. Здесь вам предлагается выбрать либо модуль Universal Modbus device, либо уже настроенную конфигурацию МВА8
То есть тот самый МВА8 я могу подключить, как Universal Modbus device и прописать все данные из РЭ вручную, либо воспользоваться готовой конфигурацией OWEN_MVA8. Откуда берётся эта готовая конфигурация и как сделать аналогичную для частотника самому, чтобы в каждом новом проекте не заморачиваться с Universal Modbus device?

Ну, или если удобнее организовывать обмен самим - берете библиотеку ModBus.lib и сами, как Вам удобно, организуете обмен.
Это, если я правильно понял, вещь более низкоуровневая?

lyyr
18.05.2011, 17:52
Здравствуйте, есть контроллер ПЛК100, скачал программу EasyWorkPLC и СoDeSys v2.3. на контроллере уже стоит программа, этот контроллер уже использовался 2 года, все было нормально пока не поменяли тел. номера в модемах. Как я понимаю, нужно просто изменить номер телефона в контроллере, но как это сделать информации я найти не смог. Скажите пожалуйста как поменять номер так, чтобы не удалить настройки, загруженные в контроллер? Исходников этой программы нет. Пробовал подключиться к контроллеру по Ethernet интерфейсу через программу EasyWorkPLC, но вышла ошибка о недостающем target-файле. Пробовал подключиться к контроллеру через среду СoDeSys v2.3, онлайн - выбрал тип связи и указал iр адрес, нажал запись исходных текстов, но так ниего и не вышло. как в среде СoDeSys v2.3 ссчитать настройки, загруженные в ПЛК100 и изменить ТОЛЬКО телефонный номер в модуле Модем?

Николаев Андрей
18.05.2011, 19:46
Я не о том. Есть пример подключения МВА8, в котором написано:

То есть тот самый МВА8 я могу подключить, как Universal Modbus device и прописать все данные из РЭ вручную, либо воспользоваться готовой конфигурацией OWEN_MVA8. Откуда берётся эта готовая конфигурация и как сделать аналогичную для частотника самому, чтобы в каждом новом проекте не заморачиваться с Universal Modbus device?

Это, если я правильно понял, вещь более низкоуровневая?
1. Шаблон MVA был сделан нами, и интегрировать такие шаблоны могут только наши программисты - он как раз низкоуровневый и содержится в прошивке ПЛК. Опыт надо сказать не самый лучший, и если посмотрите форум - я сам рекомендую пользоваться не шаблонами, а Universal ModBus Device.
2. Работа с портом не чем не ниже уровнем, чем, не знаю, регулятор какой нибудь. Все делается в CoDeSys. Посмотрите пример работы с портом в разделе ПЛК\Примеры программ и полезности.


Здравствуйте, есть контроллер ПЛК100, скачал программу EasyWorkPLC и СoDeSys v2.3. на контроллере уже стоит программа, этот контроллер уже использовался 2 года, все было нормально пока не поменяли тел. номера в модемах. Как я понимаю, нужно просто изменить номер телефона в контроллере, но как это сделать информации я найти не смог. Скажите пожалуйста как поменять номер так, чтобы не удалить настройки, загруженные в контроллер? Исходников этой программы нет. Пробовал подключиться к контроллеру по Ethernet интерфейсу через программу EasyWorkPLC, но вышла ошибка о недостающем target-файле. Пробовал подключиться к контроллеру через среду СoDeSys v2.3, онлайн - выбрал тип связи и указал iр адрес, нажал запись исходных текстов, но так ниего и не вышло. как в среде СoDeSys v2.3 ссчитать настройки, загруженные в ПЛК100 и изменить ТОЛЬКО телефонный номер в модуле Модем?
Если специалист, который писал программу СПЕЦИАЛЬНО не предусмотрел возможность изменять значения переменных из под EasyWorkPLC - ничего у Вас не получится. Эта утилита позволяет изменять только значение переменных, специально открытых для изменения. Думаю программист вряд ли об этом подумал.
К сожалению без исходного кода у Вас ничего изменить не получится.
Чтобы записать что то в контроллер - надо с ним сначала связаться (установить связь). Но помните, что если Вы будете связываться с контроллером используя новую программу - Вы можете стереть из него старую... Не соглашайтесь на запись нового проекта, когда CoDeSys это предложит.

VADR
19.05.2011, 08:24
1. Шаблон MVA был сделан нами, и интегрировать такие шаблоны могут только наши программисты - он как раз низкоуровневый и содержится в прошивке ПЛК. Опыт надо сказать не самый лучший, и если посмотрите форум - я сам рекомендую пользоваться не шаблонами, а Universal ModBus Device.
2. Работа с портом не чем не ниже уровнем, чем, не знаю, регулятор какой нибудь. Все делается в CoDeSys. Посмотрите пример работы с портом в разделе ПЛК\Примеры программ и полезности.
Спасибо, примеры обязательно посмотрю. Что касается шаблонов Modbus-устройств - очень жаль, что CoDeSys не позволяет их создавать и использовать. Было бы удобно (на мой взгляд). Буду считать это недостатком :(

Николаев Андрей
19.05.2011, 09:42
Дело конечно Ваше, но я так не считаю. На все шаблонов не наделаешься, да и кому то шаблон подойдет, кому то нет... Так всегда бывает.
А Вы вполне себе можете сами шаблон создать, используя, к примеру библиотеку ModBus. Сохранить его и в дальнейшем использовать.

lyyr
19.05.2011, 09:57
Спасибо за ответ. Получается что если заблокировали сим-карту, то при желании заменить симку надо переписывать программу? Может есть готовые шаблоны прогамм, в которых можно заменить только переменные, ведь вся система работает на оборудовании ОВЕН? или же под каждый конкретный датчик перепрограммируются вводы\выводы? Как-то все запутанно...

VADR
19.05.2011, 13:54
Дело конечно Ваше, но я так не считаю. На все шаблонов не наделаешься, да и кому то шаблон подойдет, кому то нет... Так всегда бывает.
А Вы вполне себе можете сами шаблон создать, используя, к примеру библиотеку ModBus. Сохранить его и в дальнейшем использовать.
Насчёт создания шаблонов - где об этом можно почитать?

Николаев Андрей
19.05.2011, 16:41
Спасибо за ответ. Получается что если заблокировали сим-карту, то при желании заменить симку надо переписывать программу? Может есть готовые шаблоны прогамм, в которых можно заменить только переменные, ведь вся система работает на оборудовании ОВЕН? или же под каждый конкретный датчик перепрограммируются вводы\выводы? Как-то все запутанно...
Нет. Необходимо программисту ставить задание - реализовать возможность смены номера. Вариантов - куча. Все зависит от реализации. Но если программист этого не сделал... надо менять программу. Посудите сами - программа для ПЛК не может быть шаблонной - это не ТРМ200, где алгоритм работы и все переменные жестко заданы. Одна запятая изменилась - программа поменялась, не то, что номер телефона.


Насчёт создания шаблонов - где об этом можно почитать?
Нигде. Наверное не совсем корректно выразился. Вы можете создавать свои собственные библиотеки средствами CoDeSys. Называются библиотеки. Про создание пользовательских библиотек писано много.
То есть если Вы постоянно работаете с данным ПЧ Вы в CoDeSys пишите блок обмена с данным частотником, где все условия прописываете. И сохраняете этот блок в библиотеку пользовательскую. Это и будет шаблон. Дальше его можно сколько угодно в Ваших проектах использовать.

Dmitriy_Ekb
23.05.2011, 17:15
Доброго времени суток. Получил рекоммендацию снизить нагрузку кода на процессор ПЛК (слишком большая программа при малом времени цикла). Хотелось бы уточнить несколько моментов:
- Какова "комфортная" загрузка для процессора ПЛК?
- Какое колличество ресурсов процессора должно оставаться в запасе? До каких величин понижать загрузку?
- Сейчас значение "MinCycleLength" в конфигураторе ПЛК выставлено на 1 ms (1 миллисекунда). Как я понял, для увеличения цикла ПЛК, необходимо увеличить этот параметр?

Алексей Дмитриев
26.05.2011, 14:16
я уже реализовал этот проект для Siemens
Ну и что Вам мешает конвертить семеновский проект на КДС?
Кстати IL в КДС в точности такой же как и в семене, равно как и SСL.:D

Алексей Дмитриев
26.05.2011, 14:27
Доброго времени суток. Получил рекоммендацию снизить нагрузку кода на процессор ПЛК (слишком большая программа при малом времени цикла). Хотелось бы уточнить несколько моментов:
- Какова "комфортная" загрузка для процессора ПЛК?
- Какое колличество ресурсов процессора должно оставаться в запасе? До каких величин понижать загрузку?
- Сейчас значение "MinCycleLength" в конфигураторе ПЛК выставлено на 1 ms (1 миллисекунда). Как я понял, для увеличения цикла ПЛК, необходимо увеличить этот параметр?
Реально 1 мс на ПЛК (имеется в виду с нормальной программой и вводом/выводом) Вы не получите никогда, так что смело увеличивайте, скажем до 100 мс. Дольше чем надо процессор все равно обрабатывать не будет, только если время превысит установленное в "MinCycleLength", он вывалится с ошибкой превышение времени цикла. Этот параметр нужен для предотвращения зацикливания программы при ошибочном ее написании, только и всего.

Алексей Дмитриев
26.05.2011, 23:43
3 мс это миф.;) Как меряете?

Леонид
27.05.2011, 00:41
Если не разносить процессы - мифом и будет.
Померить цикл можно и таймером, а можно и тем флажком.
Повторюсь - с нормальным вводом-выводом :)
PS
Пока единственным существенным увеличеним цикла (до 10-12мс) было скидывание в файл 30кб буффера. Но данная операция - редкая.

Как разносите и какие процессы?
Каой ввод-вывод является нормальным?
Каким таймером меряете?

КОНТАКТ
06.06.2011, 11:41
Здравствуйте! Есть вот такой вопрос(наверное не самый гениальный, но тем не менее): Мне нужно в Codesys поставить пароль так, чтобы можно было только пользоваться визуализацией, но при этом саму прогу или визуализацию редактировать, удалять и т.д. нельзя было; в идеале вообще чтоб с окна визуализации никуда нельзя было перейти(иначе оператор может ни туда залезть-потом не найдет как визуализацию обратно открыть) Есть пароль для групп пользователей-с этим вроде ясно.На вкладке ресурсы ---> рабочая область--> пароли - можно установить: пароль и пароль защиты записи.
1. В окне где устанавливаются эти 2 пароля можно установить флажок "TODO: Projekt mit diesem kennwort....." а дальше не понятно что написано. Для чего он нужен???
2. Если установить пароль защиты записи будит ли кодесис соединятся с контролером?
3.Можно ли сделать отдельно кнопку прям в визуализации для установки связи с контроллером(онлайн)??? Если да-то как??

nikpdg
06.06.2011, 14:50
Здравствуйте! Прошу Вас помочь начинающему. Вопрос такой: как наиболее правильно написать программу для ПЛК для более быстрой работы и какие приемы оптимизации использовать. Например:
1.использовать LIMITALARM или GT + LT
2.использовать для формирования тактовых интервалов общий генератор для всех макросов или в каждом макросе свой
3.использовать HYSTERESIS или GT/LT
4.имеет ли значение в большом проекте количество макросов
5.что быстрее FBD или CFC
Немного проясню. Мною написаны и работают на нескольких предприятиях различные проекты и ведется работа по совершенствованию, доводке, модернизации и как следствие усложнению программы. Стало заметно увеличение времени реакции на нажатия кнопок, на обработку данных, приходится значительно увеличивать время цикла (на основании STATISTIC ). Используются ПЛК100, ПЛК110-32, ПЛК110-60 и большое количество модулей.:(

abzal
09.06.2011, 20:53
Люди, я новичок. Помогите мне, как связать входы-выходы контроллера с переменными которые я создал?

Николаев Андрей
10.06.2011, 00:10
Посмотрите видеоролики с диска к ПЛК.

abzal
12.06.2011, 15:37
gde nahoditsa PLC_Configuration_OWEN.pdf??

abzal
12.06.2011, 15:39
a, spasibo, nawel))

abzal
13.06.2011, 09:57
Какого типа должен быть аналоговый вход? могу ли я использовать тип REAL?

bgn62
13.06.2011, 13:17
подскажит пж. новичку
в фб есть таймер TP
у него задается время
могу ли я вместо этого времени подставить глобальную переменную
взятую с адреса выделенного под модбус , предварительно преобразовав
WORD_TO_TIME
просто не уверен, что это заработает
и что там получится
или подкажите где посмотреть
спасибо

bgn62
13.06.2011, 13:29
КОМПИЛИРУЕТСЯ БЕЗ ПРОБЛЕМ
НО ЧЕГО ПОЛУЧУ НЕ ЗНАЮ
КАК БЫ ДЕ ЧЕГО ПОЧИТАТЬ?

bgn62
13.06.2011, 14:42
ВОТ НАШЕЛ ОТВЕТ
http://www.owen.ru/forum/showthread.php?t=7133

lara197a
13.06.2011, 18:13
T:=WORD*1s;

abzal
14.06.2011, 08:55
А как вообще связывать панель? Мне надо чтоб вводили с панели.

Николаев Андрей
14.06.2011, 09:04
Эта тема не замещает необходимость знакомится с документацией и уже сделанными специально для вас примерами. Пример записи данных с панели есть на форуме.

abzal
14.06.2011, 11:18
А именно где?

Малышев Олег
14.06.2011, 11:41
Да, получится. TIME=4 байта в mc. Т.е. если запишите в переменную 1000 то PT будет 1 сек.

Александр Приходько
14.06.2011, 12:59
День добрый. Написание программ под плк несколько отлично от написания программ для ПК. Если у вас в ПК программа проходит полностью алгоритм и останавливается, то в ПЛК программа должна успеть выполниться за время цикла контроллера, иначе контроллер считает, что программа зависла и перегрузится. Поэтому операторы While и GOTO использовать крайне не рекомендуется, т.к. они могут вызывать "перезагрузку". Если какое либо условие еще не выполнилось, контроллер не должен ждать его наступления, он должен дальше выполнять программу. Поэтому оператор If Then вам в помощь.

iman
15.06.2011, 12:30
Оператор GOTO в st отсутствует, а While можно применить в случаи обработки файла или массива.

abzal
15.06.2011, 16:44
Как сделать счетчик который будет идти в том случае когда насос вкючен. Когда выключается, счетчик останавливается, а когда включается обратно, продолжает свой счет.И что бы я мог значеие этого счетчика, Помогите, пожалуйста.

danko
16.06.2011, 12:43
Правильно ли я понял, что все функции, которые содержатся в файле PLC_PRG выполняются периодически?
Если да, то куда добавить отрезок кода инициализации, чтобы он выполнялся один раз при включении контроллера?

Николаев Андрей
16.06.2011, 13:00
Команды в PLC_PRG выполняются постоянно, циклически. Выполнились с верху в низ, и автоматически начинают с начала. И так постоянно. Это принцип работы контроллера. Это же отличие от языков на ПК.
Можно объявить переменную prom : Bool := true;
В программе:
if prom=true then
Ваш код
prom:=false;
end_if;

danko
16.06.2011, 14:20
А для чего в CodeSys:
Ресурсы -> Конфигурация задач -> Системные события -> start (Called when program starts)?
И почему при выделении этого события галочкой не работает кнопка "Создать POU"?
В POU я на всякий случай создал кроме PLC_PRG ещё одину программу Init и один функциональный блок Test, но ни то не другое с этим системным событием не связано.

danko
16.06.2011, 15:56
:) с Вами уже эта тема обсуждалась, на любом диске к плк есть два основных pdf-файла из документации, в которых освещены все основополагающие моменты, включая и использование тасков, событий и т.п. В общем случае программа должна быть одна, остальное блоки и функции

Сколько вы будете напоминать об документации?

В указанном вами документе 453 страницы.
На диске поставляется с контроллером 108 документов!

В работе используется 1 контроллер и 2 блока измерений и 1 панель. По каждому из этих устройств как минимум 5 документов, в каждом из них несчётное количество страниц.

Я вам ответил на ваш вопрос?
Только пожалуйста не рассказывайте, что всё для людей.
Роботов у нас на фирме нет.

danko
16.06.2011, 16:01
Я не против литературы, но только когда она не является камнем преткновения в разработке. )

danko
17.06.2011, 09:28
Вы настаиваете чтобы я изучил досконально 453 страницы? Интересно будет услышать ответ.

И всё же по непосредственно заданному вопросу: как добавить функцию-обработчик понятно, а вот системные события не расписаны в инструкции, авторы посчитали, что достаточно комментария справа от системного события в CodeSys? Или в инструкции где-то всё же они расписаны?

danko
17.06.2011, 10:28
авторы посчитали что новичкам лезть в такие дебри вообще не следует, поэтому о них только общая информация. Насколько я понял у вас не очень сильные познания в программировании контроллеров, так зачем братся за сложные для понимания вещи, такие как обработка событий, если у Вас еще и сама программа толком ненаписана

Да, программа не написана. Кто сказал что вещи сложные для понимания, вовсе нет. Сложность вызывает поиск информации по функциям.
Почему вы считаете что обработка событий сложная вещь?
По поводу порядка написания программы: возникла необходимость выполнить инициализацию при загрузке программы, это очевидно первое что нужно сделать при создании программы. Модератор ответил, что нужно воспользоваться нерациональным методом - созданием флага-переменной для проверки была ли загружена программа или нет. Так нельзя писать программы, это для начинающих программистов.
И конечно считая, что в компании Овен работают отвественные и опытные программисты я засомневался, что модератор правильно ответил. Спустя 5 минут оказалось, что есть системные события, очевидно для такого случая.
Поэтому отвечаю на ваш вопрос - системные события как оказалось необходимо изучить прежде всего.

danko
17.06.2011, 10:31
по поводу изучения страниц, скорее да, чем нет. Потому как Ваши вопросы вынуждают цитировать целые главы из документа, а это бессмысленное занятие, т.к. документ у Вас имеется в наличии, надо просто взять и внимательно прочитать, что помнится Вы настоятельно советовали другим

Это не реально, я вспоминаю когда-то делал прибор, сделал на него подробный паспорт и инструкцию всего 60 страниц с алфавитным указателем! И знаете что сказал первый пользователь в первый же день, когда я сказал, что изучение всего лишь 60 страниц считается обязательным новичку.
Он ответил - никто не будет разбираться с инструкцией! Не будет!

Единственное возможное решение - делать все пользовательские интерфейсы интуитивно понятными, или делать такую инструкцию, в которой не нужно будет читать оглавление.

Война закончится, а с инструкцией к танку так и будут разбираться.

danko
17.06.2011, 11:05
Ну конечно же эта методика как вариант, но как последний.
Дело не в длительности, хотя тоже это имеет значение. Дело в правильности оформления.
Ладно, спасибо. Разберёмся.

gladkiynikita
20.06.2011, 11:09
Вопрос: Надо сделать так - если значение переменной False то присвоить значение TRUE другой переменной. Есть ли какой-нибудь оператор инверсии для ST? Или писать:
IF X Then
Y:=FALSE;
ELSE
Y:=TRUE;
END_IF;

Спасибо.

Николаев Андрей
20.06.2011, 11:17
a:= not (b);

danko
20.06.2011, 12:50
Вопрос следующий.
Как преобразуются данные для отображения на цифровом индикаторе?
Я передаю панели число 28 dec, отображается 8 если unsigned и 0.8 если decimal 4 цифры 1 после запятой.
Открыл руководство по элементу цифровой индикатор и не нашёл там ссылки на пояснение.

danko
20.06.2011, 13:59
dword, ладно, наверно не надо было вопрос задавать, где то распределение регистров написано, поищу, где то видел, вспомнил только сейчас

danko
20.06.2011, 14:34
1) Я отправляю на панель, точно. Наверно не те регистры считываю.

2) Я не понял что вы не поняли? У меня панель, которая получает данные в формате DWORD!

http://s39.radikal.ru/i085/1106/18/f8f873d88e29.jpg

Не имеет значения какой формат у получателя и какие я хочу значения передавать. Важно чтобы эти данные отображались правильно.
Как это не поместится на экране? Вы что? Передам 1, отобразится 1. Вы что думаете, что если DWORD, то число обязательно должно быть не меньше 4 млрд 192 млн? Фомат данных в программировании подразумевает ограничение этим числом, а не обязательное его присутствие.

danko
20.06.2011, 14:47
Нашёл, PLC_Configuration_OWEN.pdf стр.52

danko
20.06.2011, 14:57
да, возможно так и будет. Просто сейчас нужно разобраться и изменить уже написанный триста лет назад проект, а потом уже делать свой с длиной данных как положено.

danko
20.06.2011, 15:10
старая программа, в которой 30 по DWORD не тормозит.

danko
20.06.2011, 15:18
А по поводу размерности данных. А как быть, если хочется, чтобы эти данные были красиво расположены в Конфигураторе ПЛК для удобства расчёта номера регистра.
Чтобы было
8бит
8бит
8бит
8бит
WORD
WORD
DWORD
DWORD

а не

8bit
WORD
8bit
DWORD
WORD

В CodeSys не предусмотрено выравнивание, если переменные уже добавил. Поэтому, в начале удобно добавить несколько по 8bit, а потом все переменные по DWORD, чтобы не запутаться в расчёте регистра

danko
20.06.2011, 15:53
Хорошо, буду все переменные делать WORD,
но всё же вдруг DWORD понадобится, незнаю что потом, ведь в конфигураторе панели нельзя вручную объединить WORD-WORD, ну ладно, может и не будет таких...

Dmitriy_Ekb
22.06.2011, 10:50
Доброго времени суток. При использовании контроллера ПЛК-100 столкнулись со следующей проблемой: контроллер апериодически перезагружается. Логику перезагрузок выявить не удалось. Грешили на перегрузку процессора, но по параметру "CPU is overloaded,..." модуля "Statistic" всё в порядке. После общения со службой поддержки ОВЕН посчитали, что проблемы с внутренними цепями питания контроллера, поменяли контроллер - эффекта 0. От внешних помех по цепям питания контроллер и периферийные блоки защищён блоком сетевого фильтра ОВЕН БСФ-Д2-0,6. Соединение между контроллером и периферией выполнено кабелем МКЭШ 2х0,5 без экрана, общая протяжённость кабеля ~6 м.
Использование "черных ящиков" контроллера затруднено, т.к. контроллер находится на объекте.
К посту прикладываю выдержки из файлов "log.txt" и "debug.txt" может хоть тут подскажут, где "корни" проблемы искать.

abzal
22.06.2011, 11:05
Где можно найти примеры записи данных с панели?

Serge_UA
22.06.2011, 21:02
Dmitriy_Ekb,

пользовательская программа использует косвенную адресацию? Может в программе пишите в системную область памяти?

Я так понимаю модифицировать программу возможности нет?
Было бы хорошо определить что является причиной перезагрузки программа или железо.
Попробуйте поотключать части программы и поработать. Может получиться выделить ошибочный кусок. Еще можно натыкать в программе "маркеров выполнения программы", чтобы найти место на котором происходит перезагрузка или определить, что ошибка асинхронна выполнению программы.
А сколько задач в проекте?

Николаев Андрей
22.06.2011, 22:12
А никаких черных ящиков - черным по белому - пропадало питание, когда раз в 5 минут, когда раз в пол часа.
Вероятность, что проблема в ПЛК маловероятна, тем более поменяли.

Serge_UA
22.06.2011, 22:59
А что питание не бесперебойное? :eek:

Интересно сработала служба поддержки. Они логи не видели?

Dmitriy_Ekb
24.06.2011, 12:46
Serge_UA

Программа использует косвенную адресацию памяти, в системную область залезть не должны были бы.
Модифицировать программу, в принципе можно, но не хотелось бы, т.к. объект в другом городе, модельного стенда нет, да и глюк какой-то неравномерный, ловить замучаемся. Хотелось бы это отложить на самый край.

Для определения откуда ноги растут, вчера удалось получить пару глюков и снять показания "черных ящиков". Они в приложенных файлах, временные отметки там нанесены. Может у кого из присутствующих получится сию "китайскю грамату" расшифровать. Эти же файлы, вместе с программой высланы на plc@owen.ru.

Николаев Андрей

Пропадание питания - это отладка оборудования. К тому же контроллер прбовали питать через UPC, вместе с блоком фильтрации, эффекта не дало.

Serge_UA
24.06.2011, 13:53
Пропадание питания - это отладка оборудования. К тому же контроллер прбовали питать через UPC, вместе с блоком фильтрации, эффекта не дало.
А UPS подключали до блока фильтрации или после? Может этот блок дефектный? Попробуйте убрать блок фильтрации из схемы питания.

abzal
12.07.2011, 13:10
Где можно найти примеры записи данных с панели для плк63???

Николаев Андрей
12.07.2011, 15:54
На диске к ПЛК63.

swerder
13.07.2011, 09:48
если в плк 100 опрос интерфейса rs485 реализован ручным методом с использованием библиотеки syslibcom, "общение" по интерфейсу rs232 также надо реализовывать вручную или можно использовать конфигурацию плк?

swerder
13.07.2011, 13:11
это хорошо.
если, связывая 2 плк через rs232, в слэйве в конфигурации добавить обменные переменные, то в мастере надо будет считывать начиная с 0 регистра? (на примере связи плк(слэйв) - сп270(мастер): в контроллере в конфигурации создается модуль модбас(слэйв), в панели считывание начиная с 0 регистра)

Николаев Андрей
13.07.2011, 14:54
Порты работают независимо друг от друга.
Все верно. Только не понятно Вы два ПЛК будете связывать или ПЛК и панель.
2 ПЛК легче по UDP (пример в соответствующем разделе) или ModBus TCP (принцип тот же, тока по Ethernet).

swerder
13.07.2011, 18:06
вот так
плк#1 <-- rs232 --> плк#2 <-- debug rs232 --> сп270
^ ........................ ^
| ......................... |
| ......................... |
rs485 ................. rs485
| ......................... |
v ......................... v
..................................
эзернеты будут свободными для ноутбука

Николаев Андрей
13.07.2011, 19:14
Ну да.
На ПЛК1 у Вас будет один мастер - один слэйв.
На ПЛК2 2 мастера и 1 слэйв.

swerder
14.07.2011, 10:20
еще вопрос "в догонку": на плк1 часть регистров будет для чтения, часть для записи мастером. соответственно на примере "ручного" использования библиотеки syslibcom надо будет инициировать 2 запроса - один с функцией 03h (чтение пачки регистров) и другой с функцией 10h (запись пачки регистров). все верно я понимаю? функции эти должны быть или другие?

Николаев Андрей
14.07.2011, 13:20
Вы через конфигурацию будете делать, или сами обмен программировать?

swerder
14.07.2011, 13:29
опрос мастером других модулей делаю библиотекой, а ответ слейва на запросы буду делать через конфигуратор. по другому не умею.

Николаев Андрей
14.07.2011, 14:56
Мастер точно так же в Конфигурации ПЛК настраивается. Не сложнее, чем Slave.

swerder
14.07.2011, 16:24
допустим настроенный слэйв будет выглядеть примерно так (на картинке только половина):
http://imageshack.us/photo/my-images/853/123ec.png/
каким образом тогда настроить мастер в конфигурации, чтоб считать всю эту радость одним махом?

Николаев Андрей
14.07.2011, 16:39
Согласен, пишите мастер с помощью библиотек :)

Игоррр
14.07.2011, 16:58
У меня такой вопрос. Я хочу подключить ПИД регулятор из библиотеки PID_regulators.lib. Как его можно вставить в программу например на языке SFC. у меня получилось вставить только на языке LD. Но там с ним работать не получится.
Заранее спасибо за помощь.

Игоррр
14.07.2011, 17:01
У меня такой вопрос. Я хочу подключить ПИД регулятор из библиотеки PID_regulators.lib. Как его можно вставить в программу например на языке SFC. у меня получилось вставить только на языке LD. Но там с ним работать не получится.
Заранее спасибо вам за помощь.

sasha0000
18.07.2011, 22:38
Куплен контроллер ПЛК100, АС4 и др. оборудование в целях обучения студентов. При организации простейших лабораторных схем возник вопрос: можно ли создать в КоДеСис проект для выполнения на самом ПК в КоДеСисХМИ для опроса через АС4 (РС485) одного (или нескольких связаных по РС485) ПЛК100 с залитой через КоДеСис программой (и как бы работающий автономно от среды програмирования).
(просмотрел все хелпы но ответа на простой вопрос как бы нет, очень прошу помочь, поскольку вопрос сильно тормозит прогресс создания стендов).

Николаев Андрей
18.07.2011, 23:24
Можно. И этому есть описание в документации и на сайте 3С.
Инструмент платный, но на какой то период времени (30 минут - 2 часа) есть демка. Ставится с самим CoDeSys.
При создании нового проекта выбирайте не ПЛК100, а PLC WinNT.
Подробнее - смотрите документацию.

Taburet
19.07.2011, 12:18
Только начал изучение LD, никак не пойму, я что не могу реализовать данную цепочку?

kolyan
19.07.2011, 12:24
Только начал изучение LD, никак не пойму, я что не могу реализовать данную цепочку?

А вопрос-то в чём состоит, собственно?

Taburet
19.07.2011, 12:28
Не получается X3 вставить в нужное место.

Вопрос отпал. Ответ найден на http://forum-ru.3s-software.com/viewtopic.php?f=2&t=1074

Не ожидал я от КДС такой подставы :(

S.A.D.
19.07.2011, 17:32
Люди добрые киньте в меня ссылкой на толковый учебник по языкам используемым в CoDeSys, ибо если LD ещё как-то понятен, то в нём нельзя работать с аналоговыми величинами (например мне надо отслеживать температуру и в зависимости от этого включать/выключать дискретные выхода). Как я понял в LD можно оперировать только булевыми данными. Как же быть если надо отслеживать состояние датчиков и в зависимости от этого включать/выключать что-либо. Какой язык для этого использовать? Прошу кинуть книгой.
Программирование у меня идёт очень туго да и не люблю я это дело, но разбираться приходится((((. LD поначалу вселил мысль что не всё так плохо, а теперь хз что делать даже(((

Логвиненко Андрей
19.07.2011, 17:46
Как я понял в LD можно оперировать только булевыми данными
В LD применяя функциональные блоки с EN можно использовать любые операторы CoDeSys.

sasha0000
19.07.2011, 23:22
Можно. И этому есть описание в документации и на сайте 3С.
Инструмент платный, но на какой то период времени (30 минут - 2 часа) есть демка. Ставится с самим CoDeSys.
При создании нового проекта выбирайте не ПЛК100, а PLC WinNT.
Подробнее - смотрите документацию.

Пребольшое спасибо! Теперь буду сушить голову как програмировать открытие порта, поскольку , так понимаю, реальных входов/выходов у виртуального контроллера нет. Значит надо использовать библиотеку МодБас на диске ОВЕН и тд. Неплохо бы пару ссылочек на полезные документы для этого случая: странный какой-то поиск на сайте 3С. Совсем не обижусь если ответа не будет. Пока попробую разобраться сам.

Николаев Андрей
20.07.2011, 08:28
В общем то COM порт на ПК есть (виртуальный COM порт). А значит нашу библиотеку ModBus.lib вполне можно использовать для WinNT. Да и примеры на диске к ПЛК по работе с библиотекой есть.
Принципы работы с WinNT те же самые, что и с ПЛК.

S.A.D.
20.07.2011, 09:59
блин ничерта не понятно в этом codesys(((( И блин ни одной книги. Вся литература написана с расчётом на нормальных программеров, которые уже умеют с этим всем работать((( Читаю руководство по кодесису - 450 страниц и никакого толку - ничего не понятно((( Конкретно интересует как работать с аналоговыми сигналами которые приходят в контроллер. Везде всё расписано для работы относительно дискретных величин. Про то как работать например со значениями датчиков температуры ни слова(((((((((( Ненавижу программирование:( :(

swerder
20.07.2011, 11:25
S.A.D. такое впечатление, что вы купили себе ПК впервые в жизни и спрашиваете как на нем работать. все зависит от задач. можно в игрушки поиграть, можно фракталы рисовать.
тоже самое и с аналоговыми. нужно контролировать - мониторьте, нужно производить вычисления, вычисляйте.

Игорь Петров
20.07.2011, 11:39
блин ничерта не понятно в этом codesys
Публикации (http://www.prolog-plc.ru/pb1)
Примеры (http://www.prolog-plc.ru/samples)
Еще примеры (http://forum-ru.3s-software.com/viewforum.php?f=8)
Курсы (http://www.3s-software.com/index.shtml?ru_ru_training)


Ненавижу программирование:( :(
Зря. Программирование реально освоить самостоятельно, даже не проходя обучения. Это редкое занятее, где все можно отменить и поправить! Летчики, водители и практически все, кроме программистов, такой возможности, не имеют :cool:

S.A.D.
20.07.2011, 11:40
S.A.D. такое впечатление, что вы купили себе ПК впервые в жизни и спрашиваете как на нем работать. все зависит от задач. можно в игрушки поиграть, можно фракталы рисовать.
тоже самое и с аналоговыми. нужно контролировать - мониторьте, нужно производить вычисления, вычисляйте.

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

S.A.D.
20.07.2011, 11:51
Игорь Петров
спасибо за ссылки.
Книгу Петрова сейчас пытаюсь читать. Мозг кипит из-за стиля написания аля сухой справочник(( Но деваться некуда - придётся как-то вдалбливать всё это в себя(

swerder
20.07.2011, 13:06
так вот как эти задачи выполнять? Как контролировать? Как производить вычисления??? КАК??? я понимаю что надо сделать, представляю алгоритм по которому оно должно работать, но не знаю как это реализовать в этих долбаных языках программирования.

в справке к КДС есть раздел "пишем простой пример", посмотрите.
хотя да, без базы знаний программирования вникнуть программирование ПЛК с 0 не очень просто.

S.A.D.
20.07.2011, 14:11
в справке к КДС есть раздел "пишем простой пример", посмотрите.
хотя да, без базы знаний программирования вникнуть программирование ПЛК с 0 не очень просто.

ну буду разбираться. Сижу делаю примеры из ссылки приведённой Игорем Петровым. Вроде ST смахивает на паскаль. О нём представления у меня есть. Буду разбираться, вспоминать.

ЗЫ: ещё раз убедился, что идти в учебное заведение надо сначала поработав, ибо совсем другое отношение. Учился в колледже и программирование "учил" по принципу лишь бы сдать (оно мне никогда не нравилось, причём по большей части из-за дурацких заданий никак не ориентированных на практическую направленность). А теперь локти кусаю что не учил, потому что щас оно мне понадобилось, причём для конкретной задачи, мне интересной.:D

Игорь Петров
20.07.2011, 14:56
Очень рекомендую пройти курсы в Пролог или Овен. За пару дней все помещается в стек мозга в правильном порядке. Потом плавно извлекается. Самостоятельно люди разбираются с нуля, но это месяца 2-3.

Новый материал для начинающих по SFC. (http://forum-ru.3s-software.com/viewtopic.php?f=8&t=1079)

S.A.D.
20.07.2011, 16:53
к сожалению никто мне курсы не оплатит(( так что буду разбираться сам))

S.A.D.
21.07.2011, 09:35
Что за ерунда?
В примере сказано написать вот это:

PROGRAM PLC_PRG
VAR
res, sw1, sw2, sw_main: BOOL;
END_VAR
res := Example2(sw1,sw2,sw_main);

жму F11 для проверки а он мне выдаёт что неправильно последняя строчка. В примере типа всё хорошо должно быть. Ничего не понимаю... Бред какой-то

swerder
21.07.2011, 09:41
первые 4 строки - в раздел объявлений, последнюю - в код программы

S.A.D.
21.07.2011, 10:15
первые 4 строки - в раздел объявлений, последнюю - в код программы

так я так и делаю - не работает(((

kolyan
21.07.2011, 19:31
Что за ерунда?
В примере сказано написать вот это:

PROGRAM PLC_PRG
VAR
res, sw1, sw2, sw_main: BOOL;
END_VAR
res := Example2(sw1,sw2,sw_main);

жму F11 для проверки а он мне выдаёт что неправильно последняя строчка. В примере типа всё хорошо должно быть. Ничего не понимаю... Бред какой-то

Всегда удивляли люди, которые, не прочитав толком документацию, не вникая - начинают ещё и называть нормально работающие программы "бредом".
Или, Вы надеетесь, что Вас на форуме будут учить "шаг за шагом", начиная с самых азов?
Сомневаюсь...

sasha0000
21.07.2011, 23:09
В общем то COM порт на ПК есть (виртуальный COM порт). А значит нашу библиотеку ModBus.lib вполне можно использовать для WinNT. Да и примеры на диске к ПЛК по работе с библиотекой есть.
Принципы работы с WinNT те же самые, что и с ПЛК.


Наверное если бы это было так, то зачем тогда покупать контроллеры, поставил на ПК WinNT или как альтернатива WinLX и управляй процессами

Тут каких-то два разных мнения? Возникают сомнения в правильном направлении мысли.
При задаче номера СОМ порта в программе: com_num: PORTS:=18; (Подключении АС4 автоматически выходит на СОМ18) выдается ошибка: *** INVALID: 18 ***.

sasha0000
21.07.2011, 23:27
Тут каких-то два разных мнения? Возникают сомнения в правильном направлении мысли.
При задаче номера СОМ порта в программе: com_num: PORTS:=18; (Подключении АС4 автоматически выходит на СОМ18) выдается ошибка: *** INVALID: 18 ***.
Поменяли принудительно в диспетчере: АС4 к СОМ1, и в программе com_num: PORTS:=1; ошибка не выдается, но порт так и не открывается.

Михаил@
22.07.2011, 09:42
Публикации (http://www.prolog-plc.ru/pb1)
Примеры (http://www.prolog-plc.ru/samples)
Еще примеры (http://forum-ru.3s-software.com/viewforum.php?f=8)
Курсы (http://www.3s-software.com/index.shtml?ru_ru_training)


Зря. Программирование реально освоить самостоятельно, даже не проходя обучения. Это редкое занятее, где все можно отменить и поправить! Летчики, водители и практически все, кроме программистов, такой возможности, не имеют :cool:

К сообщению от S.A.D

Но не все так просто...эпизодически пытаюсь это делать на протяжении 3-х лет, все больше убеждаюсь, что все-таки, для написания более-менее грамотного проекта нужно очччень! много знать и быть программистом (без базы в этой области ну очень тяжко),... Конечно если нужно включить две лампочки после того как нажата кнопка, можно и без этих знаний обойтись, только зачем тогда ПЛК приобретать и изучать КДС и многое многое другое? можно и обычными реле обойтись. Чтобы освоить программирование ПЛК, нужно, во всяком случае мне, работать над реальными проектами (теорией не обойтись, быстро навевает тоску), желательно без перерывов на другие текущие дела, хорошо бы связаться с лояльными корефеями в этой области которые смогут находить время и желание для разбора Ваших проектов и направления на путь истинный, читать и перечитывать форум!(возможно многое прояснится), вообщем нужно очень много потрудиться и иметь огромное желание ..., но есть один нюанс-стилю программирования( написания исходника в понятном самому и другим людям виде), все-таки кто-то должен учить, этому самостоятельно не натыкаешься, одним задором не обойтись.
Пишу вовсе не для того, чтобы отбить охоту, просто собственный жизненый опыт...

Николаев Андрей
22.07.2011, 12:08
Одна мысль у Вас совершенно правильная - нужна реальная задача.
Для того, чтобы научится программировать надо:
1. Конктретная задача. Первая - желательно не авральная, и не сильно ответственная.
2. Глубокое понимание тех. процесса. Без этого ничего хорошего не выйдет. Это даже важнее, чем классическое прорамерское образование, ИМХО.
3. Время и желание. Без этого все остальное бессмысленно.

Ну и не надо делать сразу монстра. Делайте автоматизацию этапами. Беру один узел, автоматизирую, добиваюсь результата, далее прибавляю второй узел.

Положительных примеров при таком подходе - уйма.

S.A.D.
22.07.2011, 15:15
kolyan
если он рабочий то почему переписав его с листа в компьютер он не работет? Зачем нужен такой пример который не объясняет, что мол вот вы всё написали но компилятор выдаёт ошибку, исправляем так-то...
А документацию читать не реально - свихнёшься от голых определений.

Михаил@
Николаев Андрей
реальная задача есть (если бы не было, то мне нафиг не надо это программирование), вот только при попытке её реализации наткнулся на проблему: непонятно как работать с данными аналоговых датчиков(pt100 например). Задал вопрос - люди отправили изучать буквари. В букварях ответа на свои вопросы найти не смог. Полез изучать с нуля простые примеры и прочее, думал может что пойму...
Кстати пример со светофором тоже не получился хотя делал всё как сказано, а компилятор что-то материться непонятное. Да и вообще со всего примера понятно что к чему только в блоке с FBD.(((

короче пошол я, а то только раздражаю походу вас своей тупостью...

S.A.D.
22.07.2011, 17:49
УРААААА! Я разобрался)) написал программу на ST(как же всё таки хорошо что он так похож на турбо паскаль)
алгоритм то простенький)) В эмуляторе всё работает как мне надо))
только пока не уверен что правильно состыковал переменные с физическими входами/выходами ПЛК. Как я понял надо в конфигурации ПЛК перед AT какого-либо входа/выхода приписать идентификатор переменной которую мы хотим видеть на этом канале?

Николаев Андрей
22.07.2011, 19:51
Все правильно.
Учтите только, что переменные, которые Вы прописали в конфигурации не должны быть объявлены в программе.

S.A.D.
22.07.2011, 23:08
а как же тогда программу писать? Ведь чтобы оперировать этими переменными надо их описать, иначе работать не будет... Не могли бы вы объяснить как так?

Николаев Андрей
23.07.2011, 15:33
а как же тогда программу писать? Ведь чтобы оперировать этими переменными надо их описать, иначе работать не будет... Не могли бы вы объяснить как так?

Конечно.
Есть 2 варианта работы с переменными:
1. Объявлять в конфигурации ПЛК.
2. Объявлять в программе через МЭК адрес (те самые AT %...). Есть такая строчка в автодеклараторе.

А дальше в программе нажимает е волшебную кнопку F2.
Если переменные объявили в Конфигурации ПЛК - они в глобальных.

S.A.D.
25.07.2011, 15:40
всем спасибо за ответы - для порядка объявил все переменные в глобальных, подцепил OPC, мастерскаду - сижу играюсь :D
Правда возник вопрос, как реализовать дистанционное включение/выключение исполнения программы в контроллере. Просто у оператора в скаде должна быть возможность переключаться между автоматическим и ручным (вкл исполнение и выкл соответственно) режимами. Я так понимаю это как-то надо прописать программно и так же посредством переменной типа BOOL включать/выключать программу) щас буду рыть литературу на предмет как это сделать)) Если подскажете буду очень рад))

Дело в том что оператор должен иметь возможность управления только частью обрудования. В то же время например обогрев шкафа управления(на улице будет стоять) должен включаться/выключаться автоматически, без ведома оператора.
есть мысль ввести переменную AUTO_MANUAL и в начале программы проверять в коком она состоянии, если TRUE то перейти на метку 1(и пошла выполняться программа) если FALSE то проскакивает момент исполнения основной части программы и переходит сразу к части обогрева шкафа.
а эту переменную AUTO_MANUAL и будет руками изменять оператор)) Если она FALSE, то можно спокойно вручную управлять оборудованием))
Метод может и тупой но это единственное что я придумал)

S.A.D.
25.07.2011, 16:31
Глубоко имхо.
При переходе в ручной режим постоянно слать в какой-нить регистр какое-нить необычное число типа 25904.

tof(in:=регистр=25904, pt:=аварийноевремядляпереходававторежим, q=>manual);
регистр:=0;

if manual then
..
else
..
end_if
не совсем понял:(


а кто знает как в ST сделать переход? А то в списке операторов для этого языка перехода не предусмотрено, хотя редактор на JMP реагирует выделив его синим, но вот сам синтаксис меток и как их объявлять не найду никак

S.A.D.
25.07.2011, 17:07
Несмотря на то, что лично я считаю отсутствие в st goto ошибкой,
тем не менее - а зачем он тут вам ?
IF - это и есть goto.


Ну я имею ввиду авторежим приоритетным. Чтоб небыло неопределенного режима при потере связи.
хм...очень правильная мысль про авторежим в приоритет...
не могли бы вы подробнее описать как работает ваша идея?

У меня получается такая идея:
IF AUTO_MANUAL=TRUE THEN GOTO <метка1>;
ELSE GOTO <метка2>;

<метка1>
IF SVET<50 THEN A:=TRUE;
ELSE A:=FALSE;
END_IF;

IF SVET<40 THEN B:=TRUE;
ELSE B:=FALSE;
END_IF;

IF SVET<=20 THEN C:=TRUE;
ELSE C:=FALSE;
END_IF;

<метка2>
IF T_SHKAF<3 THEN OBOGREV:=TRUE;
ELSIF T_SHKAF>5 THEN OBOGREV:=FALSE;
END_IF;


не понял как тоже самое сделать только через if без применения меток((

можно ещё сделать через while:

WHILE AUTO_MANUAL=FALSE DO (*выполяется только обогрев пока включён ручной режим*)
IF T_SHKAF<3 THEN OBOGREV:=TRUE;
ELSIF T_SHKAF>5 THEN OBOGREV:=FALSE;
END_IF;
END_WHILE;

IF SVET<50 THEN A:=TRUE; (*исполнение основной программы*)
ELSE A:=FALSE;
END_IF;

IF SVET<40 THEN B:=TRUE;
ELSE B:=FALSE;
END_IF;

IF SVET<=20 THEN C:=TRUE;
ELSE C:=FALSE;
END_IF;

S.A.D.
25.07.2011, 17:27
вот зараза))) не даёт специально зациклить через while(((

swerder
25.07.2011, 17:31
WHILE AUTO_MANUAL=FALSE DO (*выполяется только обогрев пока включён ручной режим*)
IF T_SHKAF<3 THEN OBOGREV:=TRUE;
ELSIF T_SHKAF>5 THEN OBOGREV:=FALSE;
END_IF;
END_WHILE;

у вас сдесь плк зациклится и будет перезагружаться
p.s. кейсом пробуйте)

S.A.D.
25.07.2011, 17:55
swerder
в кейсе надо чтоб переменная AUTO_MANUAL была целого типа, а у меня она получается BOOL.
Как сделать чтоб она была целого не могу сообразить, ведь мне этой переменной надо управлять с команды через MasterSCADA.

swerder
25.07.2011, 18:06
bool_to_byte пробовали?
пишите прям
case bool_to_byte(AUTO_MANUAL) of
0: ;
1: ;
end_case;
должно работать

S.A.D.
26.07.2011, 09:19
bool_to_byte пробовали?
пишите прям
case bool_to_byte(AUTO_MANUAL) of
0: ;
1: ;
end_case;
должно работать
большое спасибо)) Помогло)) Теперь буду знать что так можно))
Вот ещё бы разобраться теперь как сделать чтоб контроллер переключался в автоматический режим при обрыве связи с внешним миром))

Николаев Андрей
26.07.2011, 10:08
if "нет ответа от внешнего мира" or "ошибка обмена с внешним миром" then
делаете то, что Вам нужно...
end_if

swerder
26.07.2011, 11:04
Николаев Андрей, краткость - сестра таланта :)

S.A.D.
26.07.2011, 11:13
if "нет ответа от внешнего мира" or "ошибка обмена с внешним миром" then
делаете то, что Вам нужно...
end_if
это я понимаю) по видимому это делать через конфигуратор тревог.
Зашёл я туда, задал 2 класса тревог - обрыв связи и ошибка связи, задал действие при возникновении тревог (присвоить соответствующим переменным значение 1) но вот как контроллер то узнает что при обрыве связи надо среагировать по этим двум классам тревог, причём при обрыве на обрыв а при ошибке на ошибку:confused:

swerder
26.07.2011, 12:46
у вас же контроллер будет слэйвом?

S.A.D.
26.07.2011, 12:50
Получается наверное да. Он конечно будет управлять всем в автомате, но в то же время будет всю информацию передавать в MasterSCADA и если что диспетчер сможет перейти в ручной режим и включать/выключать всё из скады. Так что наверное слейв. ведь 2 мастера не может быть вроде

swerder
26.07.2011, 13:13
да, я имел ввиду по отношению к скаде. если организовывать связь со скадой через конфигурацию плк добавляя модуль модбас слейв, то мониторить связь штатными средствами кажется нельзя. надо со скады с некоторой периодичностью перезаписывать один регистр меняющимися значениями. если значения этого регистра в плк не меняются, то ошибка связи.

S.A.D.
26.07.2011, 14:08
у меня получается связь со скадой через codesys opc.
не могли бы вы кинуть в меня ссылкой в которой описано как это всё делать с записью регистра, или рассказать подробно? А то я не догоняю что к чему, как его и куда записывать:(

S.A.D.
26.07.2011, 14:31
ага... примерно понятно... теперь бы докопаться как это реализовать:D ничего, щас чё нить придумаю)

S.A.D.
26.07.2011, 16:34
так... сделал я переодическую запись из скады в переменную SVYAZ_ERROR значений 1 и 2, но вот не могу добиться чтоб при разрыве связи эта переменная стоновилась 0. При разрыве связи со скадой остаётся записаным последнее поступившее значение... Получается условие
IF SVYAZ_ERROR=0 THEN AUTO:=TRUE;
END_IF;

не работает((( если принудительно в начале каждого прогона программы ставить это значение в 0 то она будет всегда сбрасывать в автоматический режим. Что-то я уже незнаю как сделать(( Кто подскажет как при разрыве установить переменную в 0? Тип у неё INT

S.A.D.
26.07.2011, 16:39
так... сделал я переодическую запись из скады в переменную SVYAZ_ERROR значений 1 и 2, но вот не могу добиться чтоб при разрыве связи эта переменная стоновилась 0. При разрыве связи со скадой остаётся записаным последнее поступившее значение... Получается условие
IF SVYAZ_ERROR=0 THEN AUTO:=TRUE;
END_IF;
не работает(((

поидее надо сделать
if "svyaz_error не меняется в течение 20 секунд" then auto:=true
end_if

только вот как это записать?

PS: я случайно: хотел отредактировать а получилось почему-то новое

S.A.D.
27.07.2011, 12:06
через TOF получается при обрыве связи остаётся записаным последнее пришедшее значение и отсчёт не начинается. Что бы начался надо чтоб это значение сменилось на 0.

единственный выход с TOF на мой взгляд - пульсатор в котором 1 будет длиться скажем 0,01 секунду, а 0 длиться 10 секунд. А время сколько ждать ставим 15 секунд с запасом (в моём случае 15 секунд простоя не критично). В таком случае шанс что обрыв произойдёт на единице есть но мизерный по сравнению с шансом обрыва на нуле.

PS: огромное спасибо за помощь всем кто откликается!!!

swerder
27.07.2011, 12:35
см. пост #187

S.A.D.
27.07.2011, 13:01
TOFInst(IN := SVYAZ, PT:= T#5s);
MANUAL :=TOFInst.Q;

получается если связь есть то он преводит в ручной и в автомат переключиться вообще не даёт. ФБ так работает: "Если IN равен TRUE, то выход Q = TRUE и выход ET = 0. Как только IN переходит в FALSE, начинается отсчет времени (в миллисекундах) на выходе ET. При достижении заданной длительности отсчет останавливается. Выход Q равен FALSE, если IN равен FALSE и ET равен PT, иначе - TRUE."

Не понимаю как у вас получается через него

swerder
27.07.2011, 13:18
вам же написали - на вход in таймера TOF подать "значение_некоторого_регистра = какому-то значению"
tof1(in := значение_некоторого_регистра = какому-то значению", pt := t#10s);
а после таймера обнулять этот регистр
значение_некоторого_регистра := 0;

скадой же слать в этот регистр это самое значение.

S.A.D.
27.07.2011, 14:49
спасибо за объяснение, про обнуление дошло - не то обнулял, однако:

TOFInst(IN := BOOL_TO_INT(SVYAZ)=1, PT:= T#10s);
SVYAZ :=0;
на in значение приходит каждые 1,5 секунды, но если связь оборвать то в этом случае по прошествии 10 секунд MANUAL не переходит в состоянии FALSE потому что мы не берём в него значение с выхода Q

TOFInst(IN := BOOL_TO_INT(SVYAZ)=1, PT:= T#10s, Q=>MANUAL);
SVYAZ :=0;
в этом случае по прошествии 10 секунд MANUAL переходит в FALSE, НО каждый раз когда приходит на in со скады значение, Q переводится в TRUE и автомат становится в ручной режим, потому что ФБ так работает.
"Если IN равен TRUE, то выход Q = TRUE. Выход Q равен FALSE, если IN равен FALSE и ET равен PT."

swerder
27.07.2011, 16:08
у tof выход q гаснет через время pt после спада входа in

S.A.D.
27.07.2011, 17:04
да, но в то же время, q загорается когда приходит вновь значение на in, и тухнет только когда выполняется pt, то есть каждый раз когда приходит со скады значение загорается q а вместе с ним включается ручной режим.
В итоге перевести нашу переменную manual в false мы не можем

вот целиком код программы если поможет:
TOFInst(IN := BOOL_TO_INT(SVYAZ)=1, PT:= T#10s, Q=>MANUAL);
SVYAZ :=0;

CASE BOOL_TO_BYTE(MANUAL) OF
1: IF T_SHKAF<3 THEN OBOGREV:=TRUE; (*только обогрев шкафа если включен ручной режим*)
ELSIF T_SHKAF>5 THEN OBOGREV:=FALSE;
END_IF;
0: IF SVET<50 THEN A:=TRUE; (*исполнение всей программы в автоматическом режиме*)
ELSE A:=FALSE;
END_IF;

IF SVET<40 THEN B:=TRUE;
ELSE B:=FALSE;
END_IF;

IF SVET<=20 THEN C:=TRUE;
ELSE C:=FALSE;
END_IF;

IF T_SHKAF<3 THEN OBOGREV:=TRUE;
ELSIF T_SHKAF>5 THEN OBOGREV:=FALSE;
END_IF;
END_CASE;

Александр Ч.
28.07.2011, 08:58
CodeSys/PLC_Configuration/PLC... два раза ЛКМ по входу/выходу и прописываете переменную. Не забудьте удалить прописанные переменные из PLC_PRG раздел-объявление переменных

VanoKing
03.08.2011, 06:57
Объясните популярно пожалста, зачем в OPC-Сервере CodeSys вот это окно с именем проекта?
Если нужную программу с конфигом ПЛК и исполнительной частью уже загружена в контроллер и выдает нужные OPC-переменные...

Малышев Олег
03.08.2011, 07:34
Объясните популярно пожалста, зачем в OPC-Сервере CodeSys вот это окно с именем проекта?
Если нужную программу с конфигом ПЛК и исполнительной частью уже загружена в контроллер и выдает нужные OPC-переменные...
Если не хочется конфигурировать экспорт и загрузку символьного файла в ПЛК или это невозможно как в ПЛК63

VanoKing
03.08.2011, 15:21
Загруженная в ПЛК конфигурация сбрасывается при выключении питания на 5мин. Почему так? как сохранить нормально?

Малышев Олег
03.08.2011, 19:38
Загруженная в ПЛК конфигурация сбрасывается при выключении питания на 5мин. Почему так? как сохранить нормально?

Online ->Create boot project

VanoKing
04.08.2011, 09:54
Спасибо!! за оперативный ответ, с этим разобрался, это же в руководстве к плк есть, совсем замаялся.
Есть еще : 0х03, 0х04 – чтение регистров в ModBus? Они чем отличаются? какую использовать? Все перелопатил не нашел, одинаковые они чтоль?

swerder
04.08.2011, 12:24
03 Read Holding Registers
ОПИСАНИЕ
Чтение двоичного содержания регистров (ссылка 4Х) в подчиненном
04 Read Input Registers
СОДЕРЖАНИЕ
Чтение двоичного содержания входных регистров (ссылка 3Х) в подчиненном.
обычно используют третью

davyd
04.08.2011, 12:31
в пид регуляторе на выходе имеем out_val от -100 до 100.задвижка с аналоговым управлением и плк150-и-м. как связать выход пид регулятора с токовым выходом.выход пид присвоил адрес аналогового выхода но ничего не работает.когда использовал цифровое управление все было нормально

Малышев Олег
04.08.2011, 15:14
((y+100.0)/200.0)*16.0+4.0 - получаем из -100..100 => 4..20

davyd
04.08.2011, 17:22
спасибо это мои буквально первые шаги и с ПЛК и с codesys.за четыре дня много нового уже узнал

VanoKing
06.08.2011, 11:09
Связка:
MK110---RS485---ПЛК100RL---122var:bool---OPC Codesys2.0---Ethernet---masterSCADA---АРМ на Win7
Задача:
Выполнять архивирование состояний переменных на ПК, в случае потери связи или отключения ПК выполнять архивацию в ПЛК.
Вопрос:
1. С помощью каких средств мне лучше делать архив в ПЛК?
2. Как узнать о потери связи с АРМ?
3. Какую память ПЛК можно использовать под архив?
4. На сколько времени хватит памяти если каждые 5сек делать записи?
5. Возможно будет архивацию на ПЛК вести постоянно, не повлияет ли на ресурс службы ПЛК запись\перезапись?
6. Как синхронизировать часы на ПК с часами на ПЛК? Ведь несовпадение на 5 сек внесет разночтения в архив.:cool:

tip-trap
07.08.2011, 15:25
Уважаемые. Я новичек, но мне срочно надо написать счетчик наработки в часах. Я написал простую программу на CFC из генератора BLINK с часовыми импульсами и счетчика. Прблема в том что не знаю как сохранить насчитаное. При выключении питания счетчик обнуляется.
Подскажите как значение переменной счета хранить во флеш памяти. Пробовал объявлять переменную как RETAIN все равно сбрасывается.
Прошу помощи.

Gans
07.08.2011, 18:41
Я написал простую программу на CFC из генератора BLINK с часовыми импульсами и счетчика. Прблема в том что не знаю как сохранить насчитаное. При выключении питания счетчик обнуляется.
Подскажите как значение переменной счета хранить во флеш памяти. Пробовал объявлять переменную как RETAIN все равно сбрасывается.
Прошу помощи.
Выложите проект и укажите торгет - люди помогут подправить :-)

SBER
07.08.2011, 20:20
Возможно вы не сделали загрузочный проект и ретайн переменные сбрасываются у вас вместе с программой.

Николаев Андрей
08.08.2011, 06:41
Или просто переменную, отвечающую за сохранение наработки не внесли в Retain

tip-trap
08.08.2011, 09:46
Или просто переменную, отвечающую за сохранение наработки не внесли в Retain

Вот я и спрашиваю как это правильно сделать?

VanoKing
09.08.2011, 08:02
Подскажите пожалуйста. Архивирую файлы в память ПЛК с помощью Archiver. Никак не получаеться считать файлы. Сами файлы читает plc_io. А OPC-сервер CodeSys нет

Kirill
09.08.2011, 18:03
Подскажите пожалуйста. Архивирую файлы в память ПЛК с помощью Archiver. Никак не получаеться считать файлы. Сами файлы читает plc_io. А OPC-сервер CodeSys нет

opc сервер codesys не умеет читать архивы. Только текущие данные.
Здесь вам другой орс нужен. Lectus вроде такие вещи делать умеет.

Кстати, господа, пожалуйста, когда задаете вопрос, указывайте, о какой конкретно модификации ОВЕН ПЛК идет речь. От контроллера к контроллеру ответы могут существенно отличаться.

VanoKing
18.08.2011, 23:42
ПЛК100.С массивами OPC Codesys тоже не дружит?

Николаев Андрей
19.08.2011, 09:40
А что значит с массивами???
Как Вы эти данные будете в SCADA получать??? :)

VanoKing
19.08.2011, 10:03
Array(1..40) of string;

Николаев Андрей
19.08.2011, 11:27
Как Вы эти данные будете в SCADA получать???

S.A.D.
19.08.2011, 12:04
Сижу ковыряю ПЛК160.
Подключил к нему ТСМУ с выходом 0-5мА поставил на соответствующем входе 0-5мА. Пределы измерения датчика 0-100 град. цельсия - соответственно поставил Min FV - 0, Max FV - 100 (Если верить руководству по программированию, то теперь значение этого входа будет отображаться сразу в градусах.
Подключаюсь, загружаю программу и вижу что у меня значение на аналоговом входе скачет от -0.415 до -0.445. Причём при нагревании/охлаждении датчика ничего не меняется. Что за ерунда?

И ещё не могу понять почему при отключении его из сети стирается программа? Судя по тому что написано в руководстве она стираться не должна.

Николаев Андрей
19.08.2011, 13:31
1. Еще раз проверьте настройки аналогового входа.
2. В РЭ написано, чтобы программа записалась на ПЛК - необходимо сделать команду "создание загрузочного проекта" из меню онлайн.

S.A.D.
19.08.2011, 14:17
настройки перепроверял не единожды, уже и фильтра пробовал менять - всё одно бред какой-то((

2 - спасибо попробую))

Николаев Андрей
19.08.2011, 16:16
Странно.
Возможность подать 4-20 мА есть?

S.A.D.
19.08.2011, 17:18
странно... 4-20 и другой датчик (а то вдруг битый) буду искать в понедельник - отпишусь как что.
странно ещё и то что если не подключая ничего ставишь вход 4-20 то стоит стабильное значение билибердовое, но если ставишь 0-5 то тоже бредовое значение но оно меняется(скачет). Почему так?

Николаев Андрей
19.08.2011, 19:14
Специально сейчас поднял протокол тестирования - замечаний по 0-5 мА нет...

Архипов Игорь
31.08.2011, 08:58
Коллеги, добрый день. Делаю программу, заПускаю в онлайн, не могу понять, какова логика прописывания программы в память контроллера. Все работает. Делаю изменение, запускаю, работает. Отключаю от компьютера, вижу предыдущую версию программы на контроллере. Опять подключаю, запускаю программу в онлайн несколько раз, отключаю, все работает с новой версией. Отчего вопрос- каков правильный порядок смены программы в контроллере через CodeSys?

Николаев Андрей
31.08.2011, 09:17
1. Читайте сообщение, которое выдает CoDeSys. Например - программа изменена - записать, да, нет, изменить все.
2. Если программа не меняется, к примеру, а только значения переменных, то обновленный проект заливается без вопросов.

Пока проект отлаживаете - можно просто логин. Когда проект готов, и Вы записываете его в контроллер "на века":
0. Очистить все.
1. Компилировать все F11;
2. Логин. Ок
3. Сброс программы (можно сброс заводской) - все хвосты в контроллере будут стерты.
4. Логаут, Логин.
5. Создание загрузочного проекта.

VanoKing
31.08.2011, 13:38
Есть файл в ПЛК file.txt со множеством различных по длине строк, пользуюсь библиотекой SysLibFile для чтения файла. Как перейти в начало допустим 35-ой строки? считывать каждый символ первых 34 строк или есть другой вариант?

VanoKing
01.09.2011, 06:52
получается все равно считывать каждый символ пока не найду "0A" правильная мысль? если символ "0A" звкончить считывание первой строки.

S.A.D.
02.09.2011, 14:35
Столкнулся с такой проблемой: контроллер ПЛК160УМ, ОРС сервер Lectus Modbus подключем контроллер по RS485 через преобразователь 485 в 232 к компьютеру. Не понимаю откуда взять адреса modbus переменных для лектуса. Создал в конфигурации ПЛК элемент Modbus(slave). Слейв потому что предполагается использование скада системы. Вставил Подэлемент RS485. А дальше что? Как высчитать этот адрес modbus переменной который соответствует переменной в программе?. В руководстве по программированию как-то расплывчато это написано и толком не говорится как это сделать. Буду благодарен за любые подсказки и советы.

capzap
02.09.2011, 15:12
Столкнулся с такой проблемой: контроллер ПЛК160УМ, ОРС сервер Lectus Modbus подключем контроллер по RS485 через преобразователь 485 в 232 к компьютеру. Не понимаю откуда взять адреса modbus переменных для лектуса. Создал в конфигурации ПЛК элемент Modbus(slave). Слейв потому что предполагается использование скада системы. Вставил Подэлемент RS485. А дальше что? Как высчитать этот адрес modbus переменной который соответствует переменной в программе?. В руководстве по программированию как-то расплывчато это написано и толком не говорится как это сделать. Буду благодарен за любые подсказки и советы.

Наверное имелось ввиду адрес слейв устройства, а переменные расположены по номерам регистров
Выложите скрин Вашего слейва и можно будет попытаться подсказать какой переменной программы соответствует какой регистр модбаса

S.A.D.
02.09.2011, 15:23
http://i30.fastpic.ru/thumb/2011/0902/d2/1f7ba0696eefdf6dc98e181a463158d2.jpeg (http://fastpic.ru/view/30/2011/0902/1f7ba0696eefdf6dc98e181a463158d2.jpg.html)
адрес устройства само-собой, но ещё и адрес переменной надо в 16-ричной СС
http://i28.fastpic.ru/thumb/2011/0902/b2/c690af5689fc27189fb34958283a2db2.jpeg (http://fastpic.ru/view/28/2011/0902/c690af5689fc27189fb34958283a2db2.jpg.html)

VanoKing
05.09.2011, 09:05
Нужно в ПЛК100 при старте выполнять чтение фаила . Как понял из CoDeSys_V23_RU.pdf нужно отдельну программу и по системному событию start вызывать ее.
А возможно ли реализовать через условный оператор, вроде: "если start выполнить чтение из файла в буфер, иначе читать из буфера".
Сам код написал, все дело в условии, как его задать?

не хочу делить код на POU, единым файлом более читабелен.

оформил код в отдельной проге, туда же перекинул переменные.
codesys выдал предупреждение 2501: a callback function is not allowed to contain local variables

Николаев Андрей
05.09.2011, 10:34
1. Зря не хотите делить код - на самом деле он менее читабелен, но да дело вкуса... :)
2. Добавьте модуль статистика. Есть там модуль Power. Если тригер переднего фронта по power - считать...

VanoKing
05.09.2011, 12:30
..О! спасибо, модуль статистик то что доктор прописал.(в разн. ситуациях по разному удобно) )
..Нет каждый день не требуется выключать.

S.A.D.
06.09.2011, 09:49
:) все понятно, Вам помешало скорее всего описание конфигурирования модема. И так PLC_Configuration_OWEN.pdf стр.50 начиная с пункта 3.1.4 вплоть до конца 52 страницы. Кроме этого на странице 14 прочитать про именование канала, в виде наглядного пособия рисунок 1.6. В программе необходимо будет присвоить переменным слейв устройства однотипные переменные входов ПЛК а так же по необходимости переменным выходов присвоить соответствующие переменные слейва. Для начала думаю хватит :)
так мне пока модем конфигурировать не надо. У меня ведь прямое соединение по 485 с компьютером. Как я понял надо в подмодуль модбас добавлять подмодуль "8bit", в нём переменные, но назвать их теми же идентификаторами, что и входа/выхода контроллера не даёт:mad:

S.A.D.
06.09.2011, 11:59
то есть называть подругому а в программе писать что-то вроде Perem1:=Perem2 так?
если так то где в таком случае брать 16-тиричные адреса уже модбас переменных которым мы присвоили значение входов/выходов?

звездочка
06.09.2011, 17:02
Помогите пожалуйста, возникла проблема с управлением ПЧВ через Modbus. В CodeSys вытащили биты со слова состояния и с командного слова. а управлять не можем. Подскажите как это делается!

S.A.D.
06.09.2011, 17:12
интересно как вытащили...у меня вот ничерта вытащить не получается... хрен разберёшься в этих битах-регистрах(((((

S.A.D.
07.09.2011, 10:56
ну вроде с выравниванием и адресацией разобрался. Но где взять адрес переменной в 16-тиричной системе для лектуса не пойму. С регистрами и битами понятно, но лектус регистр не просит а просит адрес переменной.

S.A.D.
07.09.2011, 11:46
а где тогда взять десятичные, если есть только адреса регистров вида 0х00 и адреса бит?

S.A.D.
07.09.2011, 15:26
А как его тогда понимать?... я считал что шестнадцатиричное представление выглядит например так - 2F или 1A или 23...

swerder
07.09.2011, 15:40
удивительно, но до числа 10 представление в десятичной и шестнадцатеричной системах будут одинаковыми, а чтоб отличить 23 от 23 надо бы уже знать систему счисления. в области передачи по сети (в КДС) почему-то шестнадцатеричная система обозначается как 0x... а в областях объявления переменных как 16#...

S.A.D.
07.09.2011, 15:50
удивительно, но до числа 10 представление в десятичной и шестнадцатеричной системах будут одинаковыми

это я понимаю, но не работает ведь, вот и думаю может лыжи не едут или я е...? а представление в виде 0x00 вообще первый раз вижу и как это понимать?

swerder
07.09.2011, 16:03
понимать так, что это нулевой регистр на устройстве.

S.A.D.
07.09.2011, 16:04
я имел в виду как 0x04 (к примеру) представить в виде "1A"?

swerder
07.09.2011, 17:11
0x04 итак шестнадцатеричное представление, куда уж шестнадцатеричнее.
почитайте тут (http://www.owen.ru/forum/showpost.php?p=67456&postcount=248) про перевод систем счисления

S.A.D.
07.09.2011, 17:48
Взрослый прогамми.. человек должен понимать что нет стандарта. Есть общепринятые обозначения. Просто надо привыкнуть. И уточнять при необходимости. Интуиция должна работать.
А есть еще 1Аh.
Интересно, а вот 061 вас поставит в тупик ? :)


Это сложно даже представить. Очень интересная система исчисления. Основание - не целое (!!!) число. :)

А где надо представить ?
честно - поставит, потому что я всегда считал что у 16 сс одна разновидность, а оказывается целая куча(((
представить надо в лектус опц сервере.. Иначе не подключишь переменную к нему(((
ещё прочитал что в контроллере вроде адресное пространство единое, то есть по адресу 0 модбас переменной может и не быть, там скорее всего совершенно другое записано. Так как же найти адреса именно модбас переменных?

Дмитрий Громов
09.09.2011, 13:17
Здравствуйте, вопрос есть по включению модема пм01, никак не могу найти библиотеку, где будет функциональный блок, который работает на примём и передачу **** он в документации описан, а на деле его нет, где достать можно?

OSMODIUS
09.09.2011, 15:22
Здравствуйте! Столкнулся с проблемой пишу визуализацию в CoDeSys v2 и все бы ни чего вот только не получается из формы присвоить отрицательное значение в регистр размерностью word. Принимает только положительные числа! Я бы может быть сильно и не заморачивался , но панель 320 делает это без проблем и отображение на панели -20, на визуализации 65516. Может кто подскажет ? Ну не создаются регистры типа INT - только float!!!! А это несколько жирно и неудобно при условии , что на панели все ОК.Подскажите решение.! Пожалуйста....

swerder
09.09.2011, 16:12
может проще объявить эти переменные глобальными (не в конфигурации)?
var global
X1 at %qw8.7.0: int;
...
end var

OSMODIUS
09.09.2011, 16:24
Не приходило в голову, что можно использовать в программе функцию WORD_TO_INT

На рисунке именно это и сделано - вот только вводить отрицательные числа не хочет ,а отображает прекрасно.

Немного сказал не о том , я эту функцию вставил в визуализацию где ввод WORD_TO_INT(.X1) - просто не поняли друг друга.

OSMODIUS
09.09.2011, 16:26
может проще объявить эти переменные глобальными (не в конфигурации)?
var global
X1 at %qw8.7.0: int;
...
end var

А если можно поподробнее , я все таки чайник - я смогу обратиться к ним с панели потом(ИП320)?

Что то не выходит, или две переменных одинаковых или он этот регистр qw8.7.0 всеравно дублирует если я удаляю переменную - то есть сдвигает . При этом выдает интересное предупреждение , что word не соответствует int и поэтому будет использоваться int. Пока не понимаю.

OSMODIUS
09.09.2011, 17:03
:) Виноват, уж простите меня, не то скопировал, в Вашем случае имелось ввиду INT_TO_WORD. В программе должна быть переменная типа INT, в которую из вашей визуализауии будет поступать значение и отрицательное в том числе, далее с помощью функции присвоите полученный результат регистру модбаса

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

OSMODIUS
09.09.2011, 17:25
по протоколу модбас передаются только WORD, подругому ни чего не получиться, всеравно не Вы так программные средства переведут из INT в WORD, а на другом конце из WORD в INT. Я получил в визуализации отрицательное число из регистра и отправил отрицательное число в регистр и добавление одной строчки в программе а так же нагрузка на процессор целой операцией меня не сильно напрягают, в чем у Вас проблема мне не понятно

Я через регистр помещаю данные в программу , но регистр размером word не принимает значения с минусом - вот в это моя проблема. !!!!!

Посмотрел видео - так мне не подходит - недопустимо использовать внутреннюю програмную переменную !!!!!!!

swerder
09.09.2011, 17:59
А если можно поподробнее , я все таки чайник - я смогу обратиться к ним с панели потом(ИП320)?

Что то не выходит, или две переменных одинаковых или он этот регистр qw8.7.0 всеравно дублирует если я удаляю переменную - то есть сдвигает . При этом выдает интересное предупреждение , что word не соответствует int и поэтому будет использоваться int. Пока не понимаю.

задаете эту переменную в глобальных, в конфигурации плк ничего не присваиваете, сотрите если есть присвоение. ип320 не пользовался, но полагаю что если правильно настроить адресацию, то панель увидит переменную int и будет отображать отрицательные значения.

OSMODIUS
10.09.2011, 20:10
задаете эту переменную в глобальных, в конфигурации плк ничего не присваиваете, сотрите если есть присвоение. ип320 не пользовался, но полагаю что если правильно настроить адресацию, то панель увидит переменную int и будет отображать отрицательные значения.

Принимаю к действию поскольку этот вариант мне очень понравился - после выходных опробую связку с ИП320.

Всем спасибо!!!!

Пока вопрос закрыт.

Baxxter
15.09.2011, 06:41
Здравствуйте.

Возможно ли загрузить в ПЛК загрузочный проект НЕ из среды CoDeSys?
Как установить связь с ПЛК для загрузки в него загрузочного проекта .PRG?
Если загружать загрузочный проект из среды CoDeSys, то необходимо онлайн подключение. Как быть, если исходных текстов нет? Пункт Запись файла в ПЛК неактивен.

Николаев Андрей
15.09.2011, 18:19
Нет, не возможно.
Тот файл, который Вы создаете в CoDeSys в контроллер не записывается. CoDeSys при компиляции записывает нужный файл.

Sherlock
15.09.2011, 22:08
Добрый день. У меня не получилось указать элемент массива в конфигураторе ПЛК в качестве выходной переменной. Можно-ли это сделать???

Serban
16.09.2011, 13:25
Подскажите как вывести на экран ПЛК63 таймер, т.е. надо по событию Х запустить таймер TP и вывести его на экран ПЛК63, желательно в формате 00м:00с???????:confused:

Serban
19.09.2011, 13:40
Подскажите как вывести на экран ПЛК63 таймер, т.е. надо по событию Х запустить таймер TP и вывести его на экран ПЛК63, желательно в формате 00м:00с???????:confused:

Вопрос есть, ответа нет. Хотяб в кратце, куда копать?????????:confused:

Николаев Андрей
20.09.2011, 00:33
Там же есть описание шаблонов времени

Serban
20.09.2011, 12:27
re_plk63.67
8.4.1 Библиотека Work_Mode.lib (работа с ЖКИ в рабочем экранном режиме)
Чем Вам эта библиотека не подходит, часы и минуты вполне укладываются в определение: «ShowDint» – вывод числа типа DINT в указанной позиции

Не понял, можно подробней а еще лучше пример... как это Time преобразовать в Dint и вывести Dint на ЖК в формате 00мин:00сек если 61сек так и будет отображаться 61 сек а не 1 мин 1 сек????????:confused: мне надо так 01м:01с

Serban
20.09.2011, 12:28
Там же есть описание шаблонов времени

Не нашел описания

Vovaer
20.09.2011, 13:13
Serban, Eсли кратко, то можно так

1.Береш с выхода ET своего таймера, время ,оно будет в ms
2. делаешь из него часа и минуты (делим делим)
3. выводим данные на экран, примерно так
ShowDint(0, 9, 0, '%02u:', t_m); - минуты
ShowDint(0, 12, 0, '%02u', t_s); - секунды

Александр Приходько
20.09.2011, 13:22
Не нашел описания

Смотрите пример.
Выложил в вашей ветке
http://www.owen.ru/forum/showthread.php?p=68399#post68399

OSMODIUS
21.09.2011, 16:50
Уже не знаю , что делать , ну не хочет контроллер сохранять переменные в памяти после отключения электроэнергии. Системные часы не слетают!!!!!

Программа написана для ГВС и ИТП, после появления электричества должна помнить старое состояние обязательно!!!!
Пример переменных которые слетают - смысл можно понять из программы - прилогается.

AUTO_ON_OTOP AT %QW8.29.0: WORD;
TEMP_OTKL_OTOP AT %QW8.30.0: WORD;
SHUNT_P_OTOP AT %QW8.35.0: WORD;
SHUNT_S_OTOP AT %QW8.36.0: WORD;
AUTO_SMENA_DAY AT %QW8.37.0: WORD;
AUTO_SMENA_NAS_OTOP AT %QW8.42.0: WORD;
PRIORITET_NAS_OTOP AT %QW8.43.0: WORD;
REGIM_AUTO AT %QW8.45.0: WORD;

Может кто новым взглядом поможет чайнику - увидеть очевидное!

К сожалению до Овена дозвониться не получается......

Николаев Андрей
21.09.2011, 17:17
Тут есть 2 варианта.
Делаете ли Вы команду Создание загрузочного проекта?

OSMODIUS
21.09.2011, 17:45
Попробуйте сделать вместо Ваших записей как показано на рисунке 1.6 файла PLC_Configuration_OWEN.pdf

Не вижу связи - между этим рисунком и моим проектом.
Я специально даже загнал переменные в VAR_GLOBAL RETAIN. До этого они были в ModBus(slave)[Var]

OSMODIUS
21.09.2011, 17:45
Тут есть 2 варианта.
Делаете ли Вы команду Создание загрузочного проекта?

Да обязательно!!!! Программа остается.

Николаев Андрей
21.09.2011, 23:48
Тогда остается второй вариант. Менее приятный.
Записываются ли в Retain переменные, которые не относятся к обмену по ModBus?

Vladimir_tat
22.09.2011, 08:38
Здравствуйте! Имеется небольшой вопрос - в блоке получения риального времени, запиленного при помощи библиотеки SysLibTime, некий счетчик считает секунды с начала суток (т.е. каждый день заново), доходит до 65535 секунд (в это время на часах 18:12:15) и обнуляется, соответственно отваливается сам техпроцесс. Как можно с этим бороться?

Николаев Андрей
22.09.2011, 09:01
Использовать значение времени из других переменных данной библиотеки

Vladimir_tat
22.09.2011, 09:19
Это да, сейчас считаются минуты, а не секунды, но встает следующий вопрос - привязка времени старта/стопа сделана в секундах (т.е. в конфигурации забито время старта, например, 7:45:01, и оно переводится в секунды), соответственно получается что числовое значение текущего времени (465 минут с момента старта счетчика) не равно числовому значению времени старта (27901 секунда с момента стрта счетчика)

Vladimir_tat
22.09.2011, 09:43
есть хорошее слово OR,например min==465 OR sec==1
Это понятно, но я сколько ни сижу, нигде в проге не могу найти пункт, в котором происходит сравнение. Прогу писал не я, сам в программировании понимаю чуть более чем ничего.

OSMODIUS
22.09.2011, 09:59
Тогда остается второй вариант. Менее приятный.
Записываются ли в Retain переменные, которые не относятся к обмену по ModBus?

Ни одна переменная из VAR_GLOBAL RETAIN не сохраняется и не знаю соответственно почему.

Переменная vrema_zapuscov_dnem - массив ни какого отношения к ModBus не имеет - тоже слетает !

Но у меня есть какое то подспутное чувство , что это началось после того как я перенес туда данные из ModBus(slave)[Var]. Очень мне надо было вводить с визуализации в контроллер отрицательные числа в переменную word. Вот теперь незнаю в чем косяк , а самое главное , что ошибок нет!

пример программы был выложен в 284 сообщении там можно посмотреть все и вся!!!!

Vladimir_tat
22.09.2011, 10:17
Я имею ввиду что где-то в программе есть "некий пункт", который производит пересчет времени, заданного в конфигурации (7:45:01) в секунды (27901), вот этот "некий пункт" я никак не могу задетектить.

OSMODIUS
22.09.2011, 10:39
:) а еще можно раньше посмотреть и принять мое предложение про INT_TO_WORD в POU а из глобальных переменных убрать все что начинается на AT %...
Не все, что меньше в размерах облегчает жизнь

Спасибо за совет, но для меня это не вариант!

Переменные я указал в предыдущем сообщении только кусочек - для примера их там гораздо больше и все они слетают.

Еще раз повторюсь у меня проблема с RETAIN !!!!! Отказываться от красиво и логично написанной программы не хочу ! Ввод осуществляется с ИП320 и Визуализации - в перспективе перенос в МАСТЕРСКАДА.

Мой вопрос почему слетают данные.

Николаев Андрей
22.09.2011, 11:46
Скорее всего вопрос именно в обмене с ИП320.
Так получилось, что конфигурация, а значит и сетевой обмен начинаются раньше, чем загружается программа.
Соответственно в этот момент переменные, обменивающиеся с панелью могут получать с панели значение 0.

Как лечится:
Необходимо создать группу промежуточных переменных Retain.
Добавить модуль статистика, и сделать дополнительную подпрограмму:
Если подали питание - присвоить переменным для обмена с панелью значения специально созданных промежуточных переменных

if r_trig(power_iz_statistica) then
perem1_iz_ModBus_Slave:= prom1_for_retain;
...
perem_N_iz_ModBus_Slave:= prom_N_for_retain;
end_if;
Если пропадает питание - значение переменных обмена с панелью записать в промежуточные ретэйн..
if f_trig(power_iz_statistica) then
prom1_for_retain:=perem1_iz_ModBus_Slave;
...
prom_N_for_retain:=perem_N_iz_ModBus_Slave;
end_if;

Vladimir_tat
22.09.2011, 12:11
Всем спасибо, вопрос решился переводом временных значений из UNIT в DWORD

OSMODIUS
22.09.2011, 12:11
Скорее всего вопрос именно в обмене с ИП320.
Так получилось, что конфигурация, а значит и сетевой обмен начинаются раньше, чем загружается программа.
Соответственно в этот момент переменные, обменивающиеся с панелью могут получать с панели значение 0.

Как лечится:
Необходимо создать группу промежуточных переменных Retain.
Добавить модуль статистика, и сделать дополнительную подпрограмму:
Если подали питание - присвоить переменным для обмена с панелью значения специально созданных промежуточных переменных

if r_trig(power_iz_statistica) then
perem1_iz_ModBus_Slave:= prom1_for_retain;
...
perem_N_iz_ModBus_Slave:= prom_N_for_retain;
end_if;
Если пропадает питание - значение переменных обмена с панелью записать в промежуточные ретэйн..
if f_trig(power_iz_statistica) then
prom1_for_retain:=perem1_iz_ModBus_Slave;
...
prom_N_for_retain:=perem_N_iz_ModBus_Slave;
end_if;

Переменная vrema_zapuscov_dnem - массив ни какого отношения к ModBus не имеет и соответственно к ИП320 - тоже слетает !

OSMODIUS
22.09.2011, 12:15
Александр Вячеславович Приходько
Инженер Группы Технической поддержки
Телефон 221-60-64 (доб. 1121)
E-mail A.Prikhodko@owen.ru


Как вариант - короткие гудки , давно пытаюсь с ним связаться, наверное придется писать письма, что оставляет надежду!

OSMODIUS
22.09.2011, 12:41
Я изучал несколько иные контроллеры, спецвычислители с боевой программой, поэтому понесу отсебятину. Мне кажется, что работает по прерываниям, а при отключении питания, прерывания не работают, вызывают исключение и блок записи retain переменных в файл не выполняется, отсюда такие проблемы

Ну не знаю , я по жизни программист самоучка , по мне если сказано , что переменная должна сохраниться в энергонезависимой памяти - значит должна! Делаю вывод и пишу письмо в ТЕХПОМ - дозвонился! Может они на мышах проверят , а то на людях мне очень боязно! В любом случае всем спасибо - рассмотрю все варианты - в том числе и танец с бубном!

swerder
22.09.2011, 14:54
Мне кажется, что работает по прерываниям, а при отключении питания, прерывания не работают, вызывают исключение и блок записи retain переменных в файл не выполняется, отсюда такие проблемы

у меня в проектах переменные обмена с панелью, объявляемые так же в глобальных с адресом AT %...(в конфигурации плк ничего не объявлено), значения сохраняются. видимо дело не в прерываниях.
to OSMODIUS: вы пробовали вашу программу на другом заведомо исправном контроллере?

OSMODIUS
22.09.2011, 16:30
у меня в проектах переменные обмена с панелью, объявляемые так же в глобальных с адресом AT %...(в конфигурации плк ничего не объявлено), значения сохраняются. видимо дело не в прерываниях.
to OSMODIUS: вы пробовали вашу программу на другом заведомо исправном контроллере?

Конечно нет этот вариант для меня не доступен - я уже сам грешу на контроллер .

swerder
22.09.2011, 16:35
какие прерывания? программа после отключения питания продолжает выполняться... преобразования - даже не задумываюсь об этом - 2 байта в конф. ПЛК, at %... : int; в глобальных, и все работает.
про память - в настройках задано 4кБайта, думаю хватит для сотни другой переменных

swerder
22.09.2011, 16:41
OSMODIUS, чтоб грешить на плк надо сделать пустой проект с нуля, залить в плк загрузочный код, задать глобальной сохраняемой значение и выкл.

Vladimir_tat
22.09.2011, 17:18
Скажите, а есть ли возможность получать день года, не день месяца как в СисТаймЛиб, а именно года, т.е. 1 день, 2 день, 5 день, 50 день, 150 день...

OSMODIUS
22.09.2011, 17:29
OSMODIUS, чтоб грешить на плк надо сделать пустой проект с нуля, залить в плк загрузочный код, задать глобальной сохраняемой значение и выкл.

Контроллер работает на ГВС, попробую завтра состряпать и попробовать.
В любом случае все скинул в техпом.