Созданные ответы форума
-
АвторСообщения
-
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
УчастникТак понимаю один надо удалить, но директорию оставить ????
Нет. Количество правильное. Ничего не нужно удалять, просто теперь стало универсальнее, и поэтому сложнее. 🙂
JurasskPark
УчастникНу я лично очень долго осознавал, что после изменение конфига, нужно перезапускать службу. И вот когда я понял, что лушче сначала остановить службу, изменить конфиг, запустить exe в папке, посмотреть что он без ошибок, то только потом запускать службу. Посмотрите нет ли проблем в консоли.
А то я пару раз попадал на то, что был процесс старого приложение запущен, поэтому новое приложение не запускалось.JurasskPark
УчастникИ куда черт возьми дели настройки путей, ведь были же ?
Config\ScadaInstanceConfig.xml — <LogDir>L:\Log</LogDir> — это логи
\ScadaAgent\Config\ScadaAgentConfig.xml —
<Instances>
<Instance active=»true» name=»Default»>
<ProxyMode>false</ProxyMode>
<Directory>C:\SCADA_6\</Directory>
Каталог с установленой папкой 🙂JurasskPark
УчастникПо поводу Firewall — не знаю как у всех, но после отключения и подключения сетевого кабеля, Windows включает Firewall т.к. считает что была нарушена сеть и её «взламывают» (шутка). В этом варианте мне нравится OPCExpert, что он не забывает в ошибках писать, что мол Firewall то включен и не забудь его отключить. А то часто по запарке об этом не помнишь, тебе звонят, что OPC-сервер сломался, а там опять уборщица кабель выдернула. ))))
JurasskPark
УчастникДобавлю к предыдущим ораторам следующее:
DCOM — добавить пользователя в DCOM, добавить пользователя на OPCEnum, и на OPC-сервер.
Если у OPC-сервера есть служба, то делаю, чтобы она запускалась под учетной записью (сервисной) как и клиент. И вообще, хороший тон, когда учетная запись сервисная есть 🙂 Чтобы на АРМ был порядок в плане везде одна учетка и пароль, и тогда с одного OPC-клиента можно подклюючаться к N машинам, а не как мне разработчики ИС предлагала делать N коммуникаторов под каждый АРМ, чтобы учетную запись на АРМ не создавать. 😀Из редких и старых проблем, когда ПО написано в лохматых годах, и поэтому OPC-сервер представляет собой exe файл без службы, тогда в DCOM компоненте, тоже помимо прав на этот компонент у учетной записи, еще выставляем права на запуск под конкретной учетной записью.
Еще помню, что старые OPC-сервера сохраняли настройки в ini или в реестре пользователя, под которой он настроен. То есть доступ через DCOM ты дал, а вот запустилось оно под этой учетной записью, а настроек то там нет. 🙂
JurasskPark
Участник@manjey73 Агент у меня установлен и на вебе, и на сервере и на коммуникаторе. 🙂
По логике я должен веб «деплоить» только с веба-сервера, а чтобы видеть актуальные теги и объекты, я должен сначала с сервера Server отдать конфиг через Админ, а на web сервере через Админ скачать конфиг, нарисовать интерфейс и только интерфейс публиковать.-
Этот ответ был изменен 2 года, 10 месяцев назад от
JurasskPark.
JurasskPark
Участник2. Windows Server 2008 R2 — WEB
Windows Server 2019 — Server (СУБД)
Windows Server 2019 — CommunicatorЯ вот пока не понимаю, мне Admin приложение для передачи проекта нужно запускать на Web, скачивать проект из веба, чтобы он был актуальный, делать изменение, обратно передавать, только отключить передачу Server и Communicator.
Если запускаю Admin на Server, тоже скачивать, только отключить передачу на Web…
JurasskPark
Участник1. Как и по какому признаку Профиль определяет статус службы Веб-сервера? А то веб работает, а статус — неизвестно.
2. Как перезапускать службу веб-сервера, если проект передаётся, а в логах передачи проекта пишет, что остановить и запустить службу не может.
3. Где хранится проект, после передачи проекта на веб? Если это не секрет 🙂JurasskPark
УчастникДело в библиотеке sni.dll, которая используется для x64.
https://jurasskpark.magicteam.net/tmp/042.pngJurasskPark
Участник2IP — проверяет порт из интернета. У вас же с долей вероятности — всё компоненты на одном ПК установлены. Или нет? 🙂
-
Этот ответ был изменен 2 года, 11 месяцев назад от
JurasskPark.
JurasskPark
УчастникПеренёс почти библиотеку на v6.
https://jurasskpark.magicteam.net/tmp/040.png
Начал проверять — и не пойму банальной вещи.
MS SQL библиотека добавляет в корень System.Data.SqlClient.dll на 261 Кб, рядом создает папку Runtime, где несколько папок для разных систем Unix, Windows и т.д., где уже лежит System.Data.SqlClient.dll на 1000 Кб для win и 933 Кб для Unix.
https://jurasskpark.magicteam.net/tmp/041.png
А мне какую подключать к проекту? Которая на 1000кб? Или я должен в папку ScadaComm в Runtimes их класть?-
Этот ответ был изменен 2 года, 11 месяцев назад от
JurasskPark.
-
Этот ответ был изменен 2 года, 10 месяцев назад от
-
АвторСообщения