Потоки(Thread) — Программы(class) — Переменные

Стартовая страница Форумы Разработка и интеграция Потоки(Thread) — Программы(class) — Переменные

  • В этой теме 123 ответа, 4 участника, последнее обновление 2 года назад сделано manjey73.
Просмотр 15 сообщений - с 61 по 75 (из 124 всего)
  • Автор
    Записи
  • #33757
    manjey73
    Участник

    Да, при попытке вызова из кода какого-то модуля, а не из тех же формул.

    #33760
    JurasskPark
    Участник

    Scada.Server.Modules.Название модуля.Название класса.Название динамического класса, что вызвали.

    #33762
    manjey73
    Участник

    Блин, я говорю о Скриптах Scada, которые формирует Calculator.
    Свои я вызываю, которые в коде моего модуля.
    Речь о другом. Я не знаю, как ещё поставить вопрос, чтобы я был понят. ?

    #33763
    manjey73
    Участник

    Мои классы, которые я создал в модуле, вызываются без проблем.
    Я спрашиваю какой будет полный путь класса, написанного в скриптах Scada ?

    #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)

    #33765
    manjey73
    Участник

    Спасибо, сейчас попробую достучаться. Будет интересно, если взлетит.

    #33766
    manjey73
    Участник

    Что-то сдается прямого доступа нет, или опять же, что-то не так делаю…

    #33767
    JurasskPark
    Участник

    Или проект со скадой полетел. 🙂
    А может настройки. А может вирус… )

    #33768
    manjey73
    Участник

    Ну не совсем, я вижу Assembly Scada.Server.Engine

    У него вижу
    CalcEngine
    Calculator

    Но дальше пробиться не получается.

    #33793
    Mikhail
    Модератор

    какой будет полный путь класса, написанного в скриптах Scada ?

    Посмотрите файл SCADA\ScadaServer\Log\CalcEngine.cs
    Это вспомогательный файл, в который сохраняется сгенерированный код. На работу этот файл не влияет.

    #33823
    manjey73
    Участник

    Все равно не понимаю, как из кода модуля добраться до скомпилированного в памяти Scada.Server.Engine.Scripts

    хоть убейте. Либо пустышку загружаю, либо ничего

    #33850
    Mikhail
    Модератор

    Именно к объектам калькулятора не уверен, что можно добраться из модуля. Я привёл его в качестве примера кода, который компилируется на лету, а затем выполняется. Думаю, у Вас будет свой аналогичный код, к которому получите доступ по аналогии с кодом Сервера.

    #33852
    manjey73
    Участник

    Да я хотел бы получить доступ к Scipts, если это в принципе возможно.
    Но судя по CalcEngine.cs получается что Scropts его наследник, да ещё в памяти, а CalcEngine как объект не загружается

    Можете тыкнуть в участок кода, где ScadaServer вызывает например формулу GetBits? Ну или другой метод из Scripts.

    Чую, что вытянуть наследника из памяти не так просто, тем более используя Reflection. Либо нужен иной подход.

    #33924
    Mikhail
    Модератор

    CnlTag.CalcCnlDataFunc — ссылка на метод калькулятора для расчёта формулы канала. Поищите по коду, где и как эта ссылка заполняется.

    #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(объект инстанса потока)…

    В чем может быть затык ?

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

Просмотр 15 сообщений - с 61 по 75 (из 124 всего)
  • Для ответа в этой теме необходимо авторизоваться.