Стартовая страница › Форумы › Разработка и интеграция › создание модуля для создания двух командё
- В этой теме 19 ответов, 3 участника, последнее обновление 1 год, 3 месяца назад сделано
manjey73.
-
АвторСообщения
-
11.03.2025 в 10:09 #37186
ivan3012020
УчастникДобрый день!
Идея в чем у меня есть канал 101 (это пароль) и канал 102 (значение которое надо поменять) и канал 103 (канал который не к чему не привязан).
Мы делаем запись в канал 103, если эта запись не равно 102 каналу. То сначала отправляем значение на 101 канал а потом на 102.
Вот какой у меня код получаетсяpublic override void OnIteration() { CnlData curData = ServerContext.GetCurrentData(InputChannel); CnlData curData2 = ServerContext.GetCurrentData(OutputChannel); if (curData.IsDefined) { if (curData.Val != curData2.Val) { ServerContext.SendCommand(new TeleCommand(PassworChanel, password, UserID)); Thread.Sleep(1000); ServerContext.SendCommand(new TeleCommand(OutputChannel, curData.Val , UserID)); } } }-
Тема изменена 1 год, 3 месяца назад пользователем
Mikhail.
11.03.2025 в 12:07 #37192
MikhailМодераторДобрый день!
Какой у Вас вопрос?11.03.2025 в 13:06 #37196ivan3012020
Участниккак включить это модуль? я скомпилировал и вставил все в соответствующие папки как написано по инструкции на сайте, но ни чего не работает, даже в события не пишется что модуль включен.
11.03.2025 в 13:09 #37197ivan3012020
Участникнадо ли еще плагин закидывать на сам сервер ?
11.03.2025 в 13:10 #37198
manjey73УчастникНу в модуле будет куда больше кода, чем вы привели.
Смотрите в исходниках OpenModules.На сайте для разработчиков описаны только классы логики, которые необходимы для реализации вашего алгоритма.
А там еще есть открытия окон, взаимосвязи, чтобы ядро Scada увидела ваш модуль и т.д. и т.п.11.03.2025 в 13:12 #37199
manjey73УчастникМожете посмотреть код View части хотя бы моего модуля ModFarm. Поймете, что там программировать и программировать 🙂
Ну конечно можно обойтись минимумом необходимым.11.03.2025 в 13:44 #37201ivan3012020
Участника где найти исходник кода ModFarm?
11.03.2025 в 13:46 #37202ivan3012020
Участникя взял за основу код который идет в пример, заменил по сути разедел public override void OnIteration() и добавил переменные собственные
11.03.2025 в 13:47 #37203ivan3012020
Участникпросто как я понял это платный модуль и никто исходниками делится не будет …
11.03.2025 в 14:02 #37204
manjey73УчастникСамой логикой ModFarm делиться не буду, это точно 🙂
Но если вам для эксперимента, могу сделать ключ.
Скоро выпущу ModSoftPlc, который будет работать аналогично, не будет затачиваться под Ферму от слова никак, просто аналогичный запуск программ. И будет дешевле.OnIteration там работает несколько раз в секунду. Если нужно реже, то надо использовать таймер.
а, да. Можно будет использовать в Lite версии еще.
Кстати ModFarm вы тоже можете использовать по сути в Lite версии. В демо режиме там доступно одно устройство без инициализации и сохранения переменных., и без календарных программ насколько я помню. При чем количество программ на устройство не ограничено.-
Ответ изменён 1 год, 3 месяца назад пользователем
manjey73.
11.03.2025 в 14:20 #37206ivan3012020
Участника для совсем глупеньких… может где то есть объяснение как писать плагины… как связать плагин с ядром скады, что бы можно было перехватывать команды и отправлять их на устройство..
11.03.2025 в 14:25 #37207ivan3012020
Участникhttps://github.com/Ivan301202/Mod-ABC/tree/main
Вот что у меня сейчас получилось… но это и не принимает данные с нужного канала и не отправляет данные, как будто бы просто не включен11.03.2025 в 14:27 #37208
manjey73Участникpublic override void OnCommand(TeleCommand command, CommandResult commandResult)
Вы тут перехватываете команду и сравниваете с тем, она ваша или не ваша по номеру command.CnlNum
Я сохраняю словарь команд при запуске модуля, которые обслуживает модуль и соответственно проверяю команда должна обслуживаться модулем или нет
11.03.2025 в 14:29 #37209
manjey73УчастникВот видите, у вас нет OnCommand — вы не перехватите команду
11.03.2025 в 14:35 #37210
manjey73Участникpublic override void OnCommand(TeleCommand command, CommandResult commandResult) { if (CnlFromTask.ContainsKey(command.CnlNum)) { // KeyCnl.Key - Имя переменной с номером канала, KeyCnl.Value все данные Cnl по каналу KeyValuePair<string, Cnl> KeyCnl = cnlDict.Where(x => x.Value.CnlNum == command.CnlNum).FirstOrDefault(); // TEST string devName = ""; try { devName = ServerContext.ConfigDatabase.DeviceTable.Where(x => x.DeviceNum == command.DeviceNum).FirstOrDefault().Name; } catch { } string objName = ""; try { objName = ServerContext.ConfigDatabase.ObjTable.Where(x => x.ObjNum == command.ObjNum).FirstOrDefault().Name; } catch { } if (CnlTypeIdToString(KeyCnl.Value.CnlTypeID) == "CalculatedOutput") { moduleLog.WriteAction(Locale.IsRussian ? $"Получение команды: Канал:[{command.CnlNum}] {KeyCnl.Value.Name}, " + $"Устройство:[{command.DeviceNum}] {devName}, Объект:[{command.ObjNum}] {objName}, Значение: {command.CmdVal}" : $"GetCommand: {modTask.programm.program.Task} PrgID: PrgID: {modTask.programm.programIndex}, Channel:[{command.CnlNum}] {KeyCnl.Value.Name}, " + $"Device:[{command.DeviceNum}] {devName}, Object:[{command.ObjNum}] {objName}, Value: {command.CmdVal}"); } if (CnlTypeIdToString(KeyCnl.Value.CnlTypeID) == "InputOutput" || CnlTypeIdToString(KeyCnl.Value.CnlTypeID) == "Input") { // Входная часть должна попадать как команда или это в рамках Iteration ? moduleLog.WriteInfo(Locale.IsRussian ? $"Получение значения: Канал:[{command.CnlNum}] {KeyCnl.Value.Name}, " + $"Устройство:[{command.DeviceNum}] {devName}, Объект:[{command.ObjNum}] {objName}, Значение: {command.CmdVal}" : $"GetValue: Channel:[{command.CnlNum}] {KeyCnl.Value.Name}, " + $"Device:[{command.DeviceNum}] {devName}, Object:[{command.ObjNum}] {objName}, Value: {command.CmdVal}"); } } } }Убрал тут лишнее, возможно суть будет понятна +-
-
Тема изменена 1 год, 3 месяца назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.