Тема / Topic: Написание алгоритма счетчика Блок контакта
Сергей Кравчук
Forum Member / Участник форума
Участник № / Member № 5384
отправлено / posted
День добрый!
Есть контроллер, на котором установлен блок контакт, котрый считает количество скипов на шахте, с контроллера приходит значение канала 0 или 1, т.е. смена значения канала ( канал: K019_2_SP1_D, канал класса HEX16) с 0 на 1 и наоборот 1 на 0 считается как 1 скип (канал: SCHETCHIK_SKIPOV, канал класса HEX16).
Задача состоит в следующем:
Необходимо написать программу, которая будет считать эти изменения в реальном времени. Также необходимо сделать возможность сброса значения счетчика.
Пробовал различные варианты алгоритмов, ни чего не помогает В предыддущей Скада системе, счетчик работал отлично. Но при переходе на Трасе Мод старый алгоритм счета скипов не работает.
Привожу рабочий алгоритм в предыдущей скада системе (VB script):
If Adroit.GetTag ("K19_2_SP1.value") <> Adroit.GetTag ("SC.value") Then Schetchik = Adroit.GetTag ("SKIP.value") If Adroit.GetTag ("K19_2_SP1.value") = "Истина" Then Adroit.SetTag "SKIP.value",Schetchik +1 End If Adroit.SetTag ("SC.value"),Adroit.GetTag ("K19_2_SP1.value") End If
,где K19_2_SP1.value - значение канала K019_2_SP1_D SC.value - временная переменная, которая хранит предыдущее состояние K19_2_SP1.value Schetchik - временная переменная, которая хранит предыдущее состояние SKIP.value SKIP.value - счетчик скипов SCHETCHIK_SKIPOV
Вот программа на языке ST:
if K019_2_SP1_D_R <> SC_TEMP then
if K019_2_SP1_D_R == true then SCHETCHIK_SKIPOV_In = SCHETCHIK_SKIPOV_In + 1; SC_TEMP = K019_2_SP1_D_R; end_if; End_if;
,где K019_2_SP1_D_R - аргумент привязанный к реальному значению канала K019_2_SP1_D SC_TEMP - глобальная переменная SCHETCHIK_SKIPOV_In - аргумент привязанный к входному значению канала SCHETCHIK_SKIPOV
Пробовал использовать атрибут 6 (Тенденция)
if K019_2_SP1_D_D == 1 then SCHETCHIK_SKIPOV_In = SCHETCHIK_SKIPOV_In + 1; End_if;
Сейчас пробоуем вариант с использованием внешней DLL, но есть загвоздка в том что, функция передает одно значение. А необходимо передавать 2, сам счетчик и временную переменную.
отправлено / posted
1. По первому и второму вариантам Ваших программ считаться могут только переходы из 0 в 1. Обратные переходы не будут считаться. По третьему варианту (через тенденцию) при правильной организации вызова программы, правильных типах данных и правильных привязках должны считаться оба перехода. 2. Какой тип имеет аргумент программы, связанный с входным значением канала SCHETCHIK_SKIPOV? Он должен быть IN/OUT. 3. Как вызывается программа? Каналом CALL или процедурой трансляции? Если программа вызывается в качестве процедуры трансляции числового канала, привязки должны быть иными. 4. Самый простой вариант программы - без условного оператора: SCHETCHIK_SKIPOV_In = SCHETCHIK_SKIPOV_In + K019_2_SP1_D_D; 5. Необходимо также учитывать соотношение периода отработки контроллируемого контакта, периодов обработки каналов K019_2_SP1, SCHETCHIK_SKIPOV и периода вызова программы. Если сигнал меняется чаще, чем он обрабатывается в K019_2_SP1, программе и канале SCHETCHIK_SKIPOV, возможно нарушение функции счета.
Сообщения / Posts 17336 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Сергей Кравчук
Forum Member / Участник форума
Участник № / Member № 5384
отправлено / posted
2. Тип in/out тип данных real 3. вызывается в цикле CALC, т.е. программа вызывается в том же цикле в котором опрашивается канал K019_2_SP1_D 5. Период обработки контакта, каналов K019_2_SP1, SCHETCHIK_SKIPOV и вызова программы один (т.е. цикл CALC). Сам блок-контакт считает все правильно, проверяли по базе данных, т.е. записи изменения состояния котатка соответствуют реальному изменению состояния скипа.
Хотелось бы отработать вариант с (6) тенденцией.
Как правильно вызывать программу? Возможно ее следует повесить на трансляцию канала K019_2_SP1_D?
K019_2_SP1_D - канал класса HEX16 Какие аргументы заводить?? я создавал аргумент K019_2_SP1_D_D тип IN тип данных Real, и привязывал его к атрибуту (6) Тенденция канала K019_2_SP1_D. Возможно я не правильно завел аргумент, и у меня не происходило изменения состояния канала ...
Сообщения / Posts 39 | Из / From: Украина
| IP / IP: IP адрес / IP address |
отправлено / posted
1. При использовании программы "с тенденцией" ее нельзя вызвать в процедуре трансляции канала K019_2_SP1. А вот в процедуре трансляции канала SCHETCHIK_SKIPOV - можно. Только тогда тип аргумента программы SCHETCHIK_SKIPOV надо сделать IN/OUT и привязать к РЕАЛЬНОМУ значению канала SCHETCHIK_SKIPOV. 2. Тип данных у обоих аргументов программы должен быть целочисленный. 3. Полный период обработки сигнала контакта (приема, программой, пересчет каналов) должен быть безусловно меньше, чем минимальный промежуток времени неизменности сигнала.
Сообщения / Posts 17336 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Сергей Кравчук
Forum Member / Участник форума
Участник № / Member № 5384
отправлено / posted
Спасибо, вариант с трансляцией канала SCHETCHIK_SKIPOV подошел, только вот канал K019_2_SP1 пришлось перевести с класса HEX16 в класс FLOAT, т.к. тенденция в классе HEX16 почемуто не срабатывала у нас.
Сообщения / Posts 39 | Из / From: Украина
| IP / IP: IP адрес / IP address |
отправлено / posted
Мы проверяли предлагаемое решение на каналах HEX16. Готовы рассмотреть Ваш вариант "не работающего" решения в рабочем порядке. Пришлите Ваш проект на hotline@adastra.ru.
Сообщения / Posts 17336 | Из / From: Россия
| IP / IP: IP адрес / IP address |