Стартовая страница › Форумы › Разработка и интеграция › Потоки(Thread) — Программы(class) — Переменные
- В этой теме 123 ответа, 4 участника, последнее обновление 2 года назад сделано
manjey73.
-
АвторЗаписи
-
02.08.2024 в 19:26 #33757
manjey73УчастникДа, при попытке вызова из кода какого-то модуля, а не из тех же формул.
03.08.2024 в 10:10 #33760
JurasskParkУчастникScada.Server.Modules.Название модуля.Название класса.Название динамического класса, что вызвали.
03.08.2024 в 10:25 #33762
manjey73УчастникБлин, я говорю о Скриптах Scada, которые формирует Calculator.
Свои я вызываю, которые в коде моего модуля.
Речь о другом. Я не знаю, как ещё поставить вопрос, чтобы я был понят. ?03.08.2024 в 10:27 #33763
manjey73УчастникМои классы, которые я создал в модуле, вызываются без проблем.
Я спрашиваю какой будет полный путь класса, написанного в скриптах Scada ?03.08.2024 в 11:01 #33764
JurasskParkУчастникsourceCode.AppendLine("namespace Scada.Server.Engine {"); // add scripts sourceCode.AppendLine("public class Scripts : CalcEngine {");Scada.Server.Engine.Scripts
Файл Calculator.cs — private string GenerateSourceCode(BaseTable<Cnl> cnlTable, BaseTable<Script> scriptTable, HashSet<int> enableFormulasObjNums, out Dictionary<int, string> cnlClassNames)
03.08.2024 в 11:21 #33765
manjey73УчастникСпасибо, сейчас попробую достучаться. Будет интересно, если взлетит.
03.08.2024 в 11:54 #33766
manjey73УчастникЧто-то сдается прямого доступа нет, или опять же, что-то не так делаю…
03.08.2024 в 12:10 #33767
JurasskParkУчастникИли проект со скадой полетел. 🙂
А может настройки. А может вирус… )03.08.2024 в 12:58 #33768
manjey73УчастникНу не совсем, я вижу Assembly Scada.Server.Engine
У него вижу
CalcEngine
CalculatorНо дальше пробиться не получается.
05.08.2024 в 12:51 #33793
MikhailМодераторкакой будет полный путь класса, написанного в скриптах Scada ?
Посмотрите файл SCADA\ScadaServer\Log\CalcEngine.cs
Это вспомогательный файл, в который сохраняется сгенерированный код. На работу этот файл не влияет.05.08.2024 в 20:41 #33823
manjey73УчастникВсе равно не понимаю, как из кода модуля добраться до скомпилированного в памяти Scada.Server.Engine.Scripts
хоть убейте. Либо пустышку загружаю, либо ничего
06.08.2024 в 14:41 #33850
MikhailМодераторИменно к объектам калькулятора не уверен, что можно добраться из модуля. Я привёл его в качестве примера кода, который компилируется на лету, а затем выполняется. Думаю, у Вас будет свой аналогичный код, к которому получите доступ по аналогии с кодом Сервера.
06.08.2024 в 14:45 #33852
manjey73УчастникДа я хотел бы получить доступ к Scipts, если это в принципе возможно.
Но судя по CalcEngine.cs получается что Scropts его наследник, да ещё в памяти, а CalcEngine как объект не загружаетсяМожете тыкнуть в участок кода, где ScadaServer вызывает например формулу GetBits? Ну или другой метод из Scripts.
Чую, что вытянуть наследника из памяти не так просто, тем более используя Reflection. Либо нужен иной подход.
07.08.2024 в 15:11 #33924
MikhailМодераторCnlTag.CalcCnlDataFunc — ссылка на метод калькулятора для расчёта формулы канала. Поищите по коду, где и как эта ссылка заполняется.
22.08.2024 в 20:04 #34151
manjey73УчастникЧудеса с потоками из модуля. Кода многабукафф, по этому на словах.
Создаю потоки, запускаю и закидываю это все в словарь, где ключом является Имя потока. А данные это класс с набором всякой служебной информацией, включая сам поток и т.д. типа того
// Добавление в словарь потоков ModThread modThread = new ModThread { thread = thr, // собственно запущенный поток nameThread = thr.Name, // имя запущенного потока fields = fi, // тут типа FieldsInfo - все поля класса, экземпляр которого запускаю в потоке obj = instance, type = type, allProgramm = program, // служебная инфа, связанная с нужным потоком threadCnl = dictCnl, // Добавления словаря привязанных каналов входных и выходных переменных }; PrgThread.Add(thr.Name, modThread);Потом внутри запущенного потока пишу при помощи ServerContext.WriteCurrentData записываю в Calculated/Output канал значение
В канале нет входной формулы, только выходная в виде SetVal(CnlNum, Cmd)
Так вот интересный момент, при запуске потока предположим у меня стартовое значение канала 1000. Когда поток отрабатывает до кода WriteCurrentData эта 1000 появляется в канале. Далее я меняю значение например на 2000 и канал начинает телепать между 1000 и 2000 по значению. Хотя это новое значение 2000 точно попадает в поток и принимается при помощи SetValue(объект инстанса потока)…
В чем может быть затык ?
Вообще в исходниках есть примеры запуска потоков из модулей, которые не должны прерываться? понять что я творю не так?
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.