Созданные ответы форума
-
АвторСообщения
-
JurasskParkУчастник
Не сложно, я об этом думал вчера. Но времени не хватило. Сделаю, когда прийду с работы 🙂
JurasskParkУчастникJurasskPark пусть себе работает, Agent + Коммуникатор + открытый порт для Агента
Так вроде коммуникатор не умеет сам перезапускаться и конфиги по сети получать. Или что-то изменилось в 6ой версии?
JurasskParkУчастникJurasskParkУчастникНовое видео https://www.youtube.com/watch?v=YysMbwIxhwE
JurasskParkУчастникНамного проще поставить Коммуникатор локально и не думать о правах (и то бывают подводные камни). Но возможность удалённого подключения по OPC нужна в том случае, если заказчик не хочет ставить никакого нового ПО на компьютер с OPC-сервером.
Вот тут Михаил прям правильные слова говорит. 🙂
Но тут не только Заказчик, но и другие нюансы есть. Каждый раз когда нужно будет настроить или изменить коммуникатор на АРМ — не налазиешься. т.к. за ним работает оператор. )JurasskParkУчастникОшибка подключения, если введён логин и пароль подключения
JurasskParkУчастникПротестировал.
BrowseOPC — локально OPC- сервера нашёл, теги вытащил.
BrowseOPCClassic — удаленно подключился к OPC, если учетка, где клиент и OPC — server совпадают (Default), а вот если клиент был запущен под другой учеткой, прописал логин и пароль, то подключиться не смог.JurasskParkУчастникСпасибо большое за помощь и ответ! 🙂
JurasskParkУчастникВопрос закрыт. Надо код команды указывать. 🙂
JurasskParkУчастникУ OPCExpert есть хорошая штука, которая превращает OPC DA в OPC UA. В триал версии работает два часа, но планировщик windows с этим справляется :). Как бы тоже как один из вариантов выхода из положения. У нас вроде бы политика такая, что windows goodby.
Там всё проще… она при запуске ищет процесс, и если находит название процесса, то работает бесконечно. 🙂
Спасибо за проверку. Значит будем поддерживать опцию удалённого подключения к OPC DA серверу.
Ну вот. А то я уже морально готовился самому писать клиент OPC DA. 😀
JurasskParkУчастникМне нужна помощь! Ничего нового. 😀
Скажу честно, в v5, я команды не трогал и оставлял как есть.
Но т.к. в v6 я код переношу и правлю, то решил проверить работает отправка команд или нет.
И на любую отправку команд — система пишет неизвестная команда. Решил проверить на драйвере Simulator — тоже самое.Хотя у симулятора есть обработка команд
/// <summary> /// Sends the telecontrol command. /// </summary> public override void SendCommand(TeleCommand cmd) { base.SendCommand(cmd); if (cmd.CmdCode == TagCode.DO || cmd.CmdNum == 4) { double relayVal = cmd.CmdVal > 0 ? 1 : 0; Log.WriteLine(Locale.IsRussian ? "Установить состояние реле в {0}" : "Set the relay state to {0}", relayVal); DeviceData.Set(TagCode.DO, relayVal); } else if (cmd.CmdCode == TagCode.AO || cmd.CmdNum == 5) { Log.WriteLine(Locale.IsRussian ? "Установить аналоговый выход в {0}" : "Set the analog output to {0}", cmd.CmdVal); DeviceData.Set(TagCode.AO, cmd.CmdVal); } else if (cmd.CmdCode == "Hist") { // demonstrate how to create a historical data slice DateTime now = DateTime.UtcNow; DeviceSlice deviceSlice = new DeviceSlice( new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0, DateTimeKind.Utc), 1, 1); deviceSlice.DeviceTags[0] = DeviceTags[TagCode.Sin]; deviceSlice.CnlData[0] = new CnlData(cmd.CmdVal, CnlStatusID.Defined); deviceSlice.Descr = "Demo slice"; DeviceData.EnqueueSlice(deviceSlice); } else if (cmd.CmdCode == "Event") { // demonstrate how to create an event DeviceData.EnqueueEvent(new DeviceEvent(DeviceTags[TagCode.Sin]) { Timestamp = DateTime.UtcNow, CnlVal = cmd.CmdVal, CnlStat = CnlStatusID.Defined, Descr = "Demo event" }); } else { LastRequestOK = false; Log.WriteLine(CommPhrases.InvalidCommand); } FinishCommand(); }
Но почему он тоже пишет неизвестная команда??? При этом команды же логируются.
Вот видео: https://www.youtube.com/watch?v=U2YMGhvOUy0
Михаил, подскажите, пожалуйста, как и где глубоко копать. 🙂Код отправки команд, который я почти не трогал.
public override void SendCommand(TeleCommand cmd) { base.SendCommand(cmd); Log.WriteLine("cmd " + cmd.CmdCode); try { if (CanSendCommands) { LastRequestOK = false; if ((cmd.CmdCode == "SendStr" || cmd.CmdCode == "SendBin") && (dataSource.ExportCommands.TryGetValue(cmd.CmdNum, out DbCommand dbCommand) || dataSource.ExportCommands.TryGetValue(0, out dbCommand))) { if (ValidateDataSource() && ValidateCommand(dbCommand)) { dataSource.SetCmdParam(dbCommand, "cmdVal", cmd.CmdCode == "SendStr" ? (object)cmd.CmdVal : cmd.GetCmdDataString()); dataSource.SetCmdParam(dbCommand, "cmdNum", cmd.CmdNum); int tryNum = 0; while (RequestNeeded(ref tryNum)) { if (Connect() && SendDbCommand(dbCommand)) LastRequestOK = true; Disconnect(); FinishRequest(); tryNum++; } } } else { Log.WriteLine(CommPhrases.InvalidCommand); } } } catch (Exception ex) { Log.WriteLine(ex.ToString()); } FinishCommand(); } /// <summary> /// Sends the command to the database. /// </summary> private bool SendDbCommand(DbCommand dbCommand) { try { Log.WriteLine(Locale.IsRussian ? "Запрос на изменение данных" : "Data modification request"); dbCommand.ExecuteNonQuery(); return true; } catch (Exception ex) { Log.WriteLine(string.Format(Locale.IsRussian ? "Ошибка при отправке команды БД: {0}" : "Error sending command to the database: {0}", ex.Message)); return false; } }
JurasskParkУчастникВот очень плохо, что в Администраторе все убирали, так бы я видел сразу, что у меня пути не соответствуют, так как кроме запуска служб сразу же был и путь к диску исправлен в конфиге.
Надо чтобы Администратор как-то показывал пути запуска экземпляра, а то смотришь на значки Info внизу окошек или напротив разных свойств, но они как-то мало информативны оказываются…
Особенно учитывая, что на одном ПК можно запустить несколько экземпляров, вопрос очень актуальный по идентификации, иначе можно долго искать ошибку, особенно какую-нибудь мелкую…
Полностью поддерживаю! Мне тоже это не совсем понравилось, но я молчал. День где-то тратишь, чтобы понять, как и что в пути где-прописал, где каталог забыл указать. Вот еще вотс портами тоже надо прописать, где у какого экземпляра какой, а как агент обращается. Потому что по-умолчанию у конфигурации прописано localhost, а если на нескольких машинах установлено, то агент теперь обращается умеет к Серверу конфигурации по IP, или должен быть IP, где установлен и т.д. 🙂
JurasskParkУчастникАхаха 🙂
Я тоже убил полдня, чтобы понять почему у меня теги задваиваются, и только потом понял, public override void InitDeviceTags(), теперь самостоятельно вызывается, а раньше через OnCommLineStart(). 😀
Вот такие мы интересные зверьки :)))JurasskParkУчастникТак это уже не совсем службы — это консольное приложение, которое может работать как служба. 🙂
JurasskParkУчастникТак понимаю один надо удалить, но директорию оставить ????
Нет. Количество правильное. Ничего не нужно удалять, просто теперь стало универсальнее, и поэтому сложнее. 🙂
-
АвторСообщения