PDA

Просмотр полной версии : непонятки с типом Bool



freak
13.04.2010, 11:52
Доброго времени суток!

Я только начинаю знакомсво с CoDeSys и пишу программу, связанную с диагностикой электронного блока. Работа программы заключается в подаче управляющих сигналов с ПЛК и приеме большого количества дискретных сигналов с проверкой соответвия с таблицей истинности. Получается, что при различных значениях выходных сигналов ПЛК, надо принять и проверить различные комбинации входных сигналов. Причем проверка должна проходить последовательно. При не соответсвии она прекращается, а при устранении неполадки должна возобнавиться с того же места, на котором остановилась.
Проблема заключается в следующем:
Входные каналы связаны с перемнными типа BOOL. Формально в программе я прописываю нужные таблицы истинности для этих каналов. Но получается так, что одни и те же переменные в разных местах программы на разных этапах проверки принимают противоположные значения, т.е, например, в начале x1_44=false, а где-то в середине x1_44=true и т.д. Это зацикливает программу, т.е когда проверка доходит до совпадения с определенной переменной, то происходит возврат в самое начало и опять тоже самое до первого совпадения переменных.
Я пробовал обнулять переменные перед каждым шагом проверки, но это тоже не помогает. Подскажите плиииз как мне выкрутиться из такой ситуации.
Алгоритм и проект прилагаю 2220

rovki
13.04.2010, 12:22
а если в двух словах то сколько вы генерируите управляющих сигналов и сколько опрашиваете дискр.входов, и есть ли органичение на скорость диагностики.а остальное вам специ подскажут.

freak
13.04.2010, 12:40
входных сигналов где-то 75, а выходных - 25. ограничения на скорость диагностики нету.

magirus
13.04.2010, 14:55
и еще, какой плк используете?

freak
13.04.2010, 15:29
Буду использовать либо Овен ПЛК 110-60, либо другой контроллер с CoDeSys.
До конца ещё не определился. Но инструментальная среда по сути одинакова для обоих вариантов. Различия только в меню конфигурации, что на данный момент не особо важно.

Филоненко Владислав
13.04.2010, 23:57
машину состояний с состояниями для шагов и ошибок в каждом шаге (отдельные состояния ошибки).
на каждом шаге сравнение с массивом корректного состояния.
и никаких циклов не будет.

случайно не систему самодиагностики для чего-то летающе-стреляющего делаете?

freak
14.04.2010, 09:08
жуткая запись.поиск ошибок в ней просто пипец.
вы уверены на 100% что нет косяков ?
нельзя ли как-то на пальцах суть проверки пояснить ?
джипег плохо читаемый.

На первом шаге проверки косяков нет точно. Они начинаются со второго и последующих шагов :(

Суть проверки: на входы блока я подаю диагнотические сигналы, а с выходов снимаю ответные сигналы и сравниваю их с таблицей истинности, составленной согласно принципиальной схеме.

Суть проблемы:
На первом шаге используются практически сразу все выходные каналы блока (соответственно входные каналы ПЛК). Тут все нормально. Отладку делал ни один раз.
На последующих шагах используются те же каналы, только не все сразу, а часть. Их состояния соответственно должны измениться. И вот тут все сводится к тому, что возникает что-то типа "несоответствия состояния переменных", описывающих состояния входов ПЛК (выходов блока). Переменные одни и те же, а состояния у них разные на каждом шаге проверки в пределах одной программы. Вобщем как писал ранее: на первом шаге переменная типа bool x1_41=false. А вот на втором шаге эта же переменная x1_41=true, как только это условие выполнилось действие перескакивает на первый шаг и сообщение, что на первом шаге канал x1_41 неисправен, т.к он должен быть false... Вобщем замкнутый круг получается...:(
Было дело, писал что-то подобное на ассемблере для микроконтроллеров - там таких проблем не возникло. А в данной ситуации, честно говоря, как в тупике

Выкладываю оригинальный компасовский файл с частью алгоритма

freak
14.04.2010, 09:23
машину состояний с состояниями для шагов и ошибок в каждом шаге (отдельные состояния ошибки).
на каждом шаге сравнение с массивом корректного состояния.
и никаких циклов не будет.

случайно не систему самодиагностики для чего-то летающе-стреляющего делаете?

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

на счет летающе-стреляющего почти в точку :)

Малышев Олег
14.04.2010, 09:25
Уважаемый freak!

Предлагаю переделать программу чуть более чем полностью.

1) Ввести массив из 3х измерений - номер шага, входы (подаваемые на плату), выходы(получаемые при правильной работе с платы).
2) Создать ФБ получающий входы и № шага и выставляющий выходы в соответсивии с таблицей + индикация ошибок.
3) Создать тестовый ФБ производящий обратные действия
4) Создать программу для тестирования тестового блока.
5) Создать реальную программу с учетом задержек включения реальных контактов (т.е. проверка не сразу после изменения шага, а позже)

Писать как написана программа нельзя - это практически не отлаживаемый код и тем более не читаемый!

freak
14.04.2010, 10:15
Уважаемый freak!

Предлагаю переделать программу чуть более чем полностью.

1) Ввести массив из 3х измерений - номер шага, входы (подаваемые на плату), выходы(получаемые при правильной работе с платы).
2) Создать ФБ получающий входы и № шага и выставляющий выходы в соответсивии с таблицей + индикация ошибок.
3) Создать тестовый ФБ производящий обратные действия
4) Создать программу для тестирования тестового блока.
5) Создать реальную программу с учетом задержек включения реальных контактов (т.е. проверка не сразу после изменения шага, а позже)

Писать как написана программа нельзя - это практически не отлаживаемый код и тем более не читаемый!

Согласен с Вами, что код плохо отлаживаемый. Спасибо за идею.
Но вот как это реализовать - для меня на данный момент это "темный лес" :confused: Поэтому прошу, как-нибудь по подробнее пояснить реализацию 1 и 2 пунктов. Заранее благодарен