This is topic Написание алгоритма счетчика Блок контакта in forum Языки программирования в TRACE MODE 6 / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.
Есть контроллер, на котором установлен блок контакт, котрый считает количество скипов на шахте, с контроллера приходит значение канала 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 by AdAstra Technical Support (Участник № / Member № 4) on :
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, возможно нарушение функции счета.
Posted by Сергей Кравчук (Участник № / Member № 5384) on :
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. Возможно я не правильно завел аргумент, и у меня не происходило изменения состояния канала ...
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. При использовании программы "с тенденцией" ее нельзя вызвать в процедуре трансляции канала K019_2_SP1. А вот в процедуре трансляции канала SCHETCHIK_SKIPOV - можно. Только тогда тип аргумента программы SCHETCHIK_SKIPOV надо сделать IN/OUT и привязать к РЕАЛЬНОМУ значению канала SCHETCHIK_SKIPOV. 2. Тип данных у обоих аргументов программы должен быть целочисленный. 3. Полный период обработки сигнала контакта (приема, программой, пересчет каналов) должен быть безусловно меньше, чем минимальный промежуток времени неизменности сигнала.
Posted by Сергей Кравчук (Участник № / Member № 5384) on :
Спасибо, вариант с трансляцией канала SCHETCHIK_SKIPOV подошел, только вот канал K019_2_SP1 пришлось перевести с класса HEX16 в класс FLOAT, т.к. тенденция в классе HEX16 почемуто не срабатывала у нас.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Мы проверяли предлагаемое решение на каналах HEX16. Готовы рассмотреть Ваш вариант "не работающего" решения в рабочем порядке. Пришлите Ваш проект на hotline@adastra.ru.