PDA

Просмотр полной версии : СПК 107, глючит диалог с переменными в модбасе



gs_62
04.03.2017, 14:02
Для ручного управления клапанами и насосами прямо с мнемосхемы, я сделал простенький диалог, вызываемый по нажатию на элемент. Он всего лишь, в зависимости от текущего состояния, спрашивает включить или выключить, ну кнопки ОК и Отмена.
С переменными объявленными в GVL работает нормально - обновляет именно ту, которая сопоставлена со входным-выходным параметром диалога. А с переменными объявленными в модбасе - глючит.
Какой-бы элемент не вызвал диалог, обновляется на включение всегда только одна буль-переменная - которая прописана на первом бите, а при выключении любой - выключаются сразу все биты в этом модбасе.

Это глюк девайса Modbus Slave, COM Port ?, или я что-то делаю не правильно?

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

Евгений Кислов
04.03.2017, 14:11
Для ручного управления клапанами и насосами прямо с мнемосхемы, я сделал простенький диалог, вызываемый по нажатию на элемент. Он всего лишь, в зависимости от текущего состояния, спрашивает включить или выключить, ну кнопки ОК и Отмена.
С переменными объявленными в GVL работает нормально - обновляет именно ту, которая сопоставлена со входным-выходным параметром диалога. А с переменными объявленными в модбасе - глючит.
Какой-бы элемент не вызвал диалог, обновляется на включение всегда только одна буль-переменная - которая прописана на первом бите, а при выключении любой - выключаются сразу все биты в этом модбасе.

Это глюк девайса Modbus Slave, COM Port ?, или я что-то делаю не правильно?

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

Добрый день. Можете выложить (или отправить мне на почту) архивы проектов для обоих вариантов?

gs_62
04.03.2017, 15:52
Отправил на e-mail

gs_62
05.03.2017, 00:01
Проблему я решил. Но это всё называется "через ж..." (каждый вызывающий диалог элемент пишет в глобальную переменную свой идентификатор, все статусы закрытия отключены, а сам диалог по этому идентификатору пишет нужную переменную).

Всё более укрепляюсь в мысли что кодесис - тупиковая система. По всему видно (сравнивая вполне нормальную древнюю 2.3 и нынешнюю) - тех программистов, которые его задумывали и начинали делать, там уже нет. А новое поколение - кроме как рисовать кнопочки, вкладочки да финтиклюшки, ни на что не способны. Зря ОВЕН связался с ними. Солидные фирмы должны свою систему программирования иметь.

vniko
06.03.2017, 16:42
А с переменными объявленными в модбасе - глючит.
gs_62, объясните, пожалуйста, что по Вашему "переменные, объявленные в модбас"?

Какой-бы элемент не вызвал диалог, обновляется на включение всегда только одна буль-переменная - которая прописана на первом бите, а при выключении любой - выключаются сразу все биты в этом модбасе.
Может в этом ошибка: привязывать BOOL (8 бит) к биту (1 бит) - некорректно, либо надо учитывать этот факт.

gs_62
06.03.2017, 20:46
gs_62, объясните, пожалуйста, что по Вашему "переменные, объявленные в модбас"?
Когда в соотнесениях входов/выходов модбаса, для отдельных бит записываемого регистра прописаны имена и стоит значок с жёлтой звёздочкой, означающий "создать новую переменную" - это и есть переменные объявленные в модбасе.


Может в этом ошибка: привязывать BOOL (8 бит) к биту (1 бит) - некорректно, либо надо учитывать этот факт.
BOOL это и есть один бит.
И я его не привязывал, а просто проименовал бит. Тем самым создалась пременная типа BOOL, и никакой другой тип у бита невозможен.

Вообще, тут уже всё совершенно очевидно - это баг кодесиса. Один из бесчисленных. И это совсем не удивляет.

Rake Runner
06.03.2017, 20:51
Когда в соотнесениях входов/выходов модбаса, для отдельных бит записываемого регистра прописаны имена и стоит значок с жёлтой звёздочкой, означающий "создать новую переменную" - это и есть переменные объявленные в модбасе.

BOOL это и есть один бит.
И я его не привязывал, а просто проименовал бит. Тем самым создалась пременная типа BOOL, и никакой другой тип у бита невозможен.

Вообще, тут уже всё совершенно очевидно - это баг кодесиса. Один из бесчисленных. И это совсем не удивляет.

А можно цитату из хелпа, где написано, как это работает и в каких случаях это можно делать?
А то так-то да, защиту от дурака во всех ситуациях сложно предусмотреть даже хорошему программисту.

gs_62
06.03.2017, 21:06
А можно цитату из хелпа, где написано, как это работает и в каких случаях это можно делать?
А то так-то да, защиту от дурака во всех ситуациях сложно предусмотреть даже хорошему программисту.

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

gs_62
06.03.2017, 21:23
А можно цитату из хелпа, где написано, как это работает и в каких случаях это можно делать?

Ну, вот и цитата: "Для соотнесения с новой переменной просто введите нужное имя переменной, например: "bVar1". В столбце Соотнесение будет показана иконка , а переменная будет объявлена как глобальная. Поскольку теперь переменная будет доступна в приложении глобально, то данный диалог может считаться еще одним местом для объявления глобальной переменной."


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

Rake Runner
06.03.2017, 21:35
В посте #4 вы пишите, что решили свою проблему использованием глобальных переменных.
Т.е. я верно понял, вы страдаете из-за того, что вместо глобальных переменных, объявляемых в одном месте, вам приходится использовать глобальные переменные, объявляемые в другом месте? Все лучи добра в сторону CODESYS из-за этой вселенской проблемы?

gs_62
06.03.2017, 22:29
Вы поняли неверно. Проблема не решилась объявлением буль-переменных в GVL и соотнесением их к битам в модбасе. При этом на любую операцию с этими переменными - ошибка "переменная уже соотнесена и не может быть повторно использована". Это тоже что-то совершенно за гранью здравого смысла. Я её соотносил именно для того чтобы ей пользоваться и она, использованная, отправлялась через модбас в соответствующее устройство.

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

vniko
07.03.2017, 13:03
gs_62, спасибо за разъяснения по "переменные, объявленные в модбас".

BOOL это и есть один бит.
И я его не привязывал, а просто проименовал бит. Тем самым создалась пременная типа BOOL, и никакой другой тип у бита невозможен.
Особенность CoDeSys - это невозможность объявить в программе переменную в размере памяти 1 бит. Переменная BOOL занимает размер памяти 8 бит (п.7.4.2 SPK_First_start_v.1.0.pdf), хотя информационный размер 1 бит. В справке есть отдельная тема: "Доступ к битам переменных", указывается номер бита через точку после имени.
В соотнесениях входов/выходов модбаса для отдельных бит указан тип BOOL, но размер памяти у каждого битового канала - 1 бит. То есть в данном случае это "другой" BOOL.
Именно в этом "несоответствии" BOOL, как я предполагаю, заключена Ваша первоначальная проблема. Что это: либо недоработка 3S, либо необходима определенная особенность работы с данными типами? Хотелось бы по этому вопросу получить разъяснения от специалистов ОВЕН.

По Вашей Задаче (способ без лишнего кода в кнопках):
1. В соотнесениях входов/выходов модбаса привязать BYTE или WORD переменную, например out.
2. Объявляете переменные в GVL, например массивом структуры aGroup:ARRAY[1..n] OF group (в структуре group определяем булевы nasos и klapan).
3. Обращаетесь к объявленным переменным как aGroup[i].nasos и aGroup[i].klapan, в том числе и при открытии диалога, вызываемом по нажатию на элемент, указывая ему какую переменную надо изменить по какому статусу закрытия.
4. В конце программы привязываете к битам out, булевы переменные из программы, например out.1:=aGroup[1].nasos.

gs_62
07.03.2017, 16:30
Я не люблю сложных имён переменных. Мне надо чтоб было без точек. Чтоб в коде она выглядела так же как в схемах. Пусть уж у меня остаётся как есть. Работает - и ладно.

Кстати, страшно подумать сколько машинных инструкций будет делать такой код, как вы предлагаете. А если 32 дискретных выхода?

Вот так и сжираются любые гигагерцы, циклы раздуваются, из за невозможности соблюсти временные интервалы, связь обрывается...

Я когда-то, лет 20 назад, когда о промышленных контроллерах и не слышно было, делал распределённую систему. Всё сам - платы на однокристалках 80С31 16 МГц, прошивки писал на ассемблере, свой протокол, своя физика шины, скорость 9600, по абы каким (силовым) проводам работало на 200 м, общее число управляемых выходов - немеряно, и всё летало, реакция почти мгновенная, что такое потеря связи я не знал.
А теперь, все эти гигагерцы, мегабайты и прочее, помножены на 0.001 вот такими "системами программирования" как кодесис.