Ответы в темах
-
АвторЗаписи
-
OldManSpbУчастникЯ сделал модуль для https://smsbliss.ru/. Михаил, мне его залить в ваш GitHub или в свой? Для вашего надо доступ.
OldManSpbУчастникПонятно, спасибо, разобрался. Все работает, Михаил спасибо огромное. Сейчас есть задача сделать СМС шлюз для https://smsbliss.ru/ я так понимаю готового ничего нет, надо писать? Если да, готов подключиться к github, так как это в отличие от предыдущего моего проекта может пригодиться всем. В принципе можно сделать универсальный модуль, который будет формировать POST запрос для любого шлюза.
-
Ответ изменён 8 лет, 11 месяцев назад пользователем
OldManSpb.
OldManSpbУчастникГлавное меню — конфигурация — веб приложение. И внизу выбрать графики про.
OldManSpbУчастникТо есть я правильно понимаю, что в первом аргументе OnCurDataProcessed и OnCurDataCalculated передаются каналы которые в данный момент обновились, а во втором просто ссылка на полный срез? То есть можно в своем модуле не хранить ничего в памяти?
OldManSpbУчастникЯ должен передать другому серверу раз в три минуты данные по каждому каналу и статус плюс единицы измерения, название КП, объекта и т п. Это делается в отдельном потоке, по таймеру. Список каналов я беру из соответствущей таблицы. Соответственно надо добавить в это сообщение текущие значения и статусы по каждому каналу. Внутри методов OnCurDataProcessed и OnCurDataCalculated устраивает, я могу работать и асинхронно. Просто могу в своем модуле хранить срез всех каналов и обновлять его при приходе новых данных, а когда надо передать то брать оттуда.
С отладкой еще не разбирался.
OldManSpbУчастникCпасибо.
Теперь возник еще вопрос. Мне надо получить список текущих данных и статусов по всем каналам. То есть нужен один срез, но по всем каналам имеющимся в таблице каналов одновременно. Насколько я понял в текущем срезе могут быть не все каналы?
OldManSpbУчастникМой модуль иногда подглючивает после перезапуска сервера, всвязи с этим вопрос: При перезапуске сервера каждый раз вызывается конструктор модуля, либо только дергаются методы OnServerStart и OnServerStop?
OldManSpbУчастник=Выкладываю класс для модуля сервера, который позволяет получать названия большинства полей события, а также получать номер события, который в текущей версии не передается в обработчики.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Scada.Data.Models; using Scada.Data.Tables; using Scada.Server.Modules; using Scada.Client; using System.Data; namespace Scada.Server.Modules { class DataTablesAccess { public DataTablesAccess(string PathToConfig) { string pathToconfig = PathToConfig;// "C:\\SCADA\\BaseDAT\\"; baseTables = new BaseTables(); baseAdapter = new BaseAdapter(); baseAdapter.FileName = pathToconfig + BaseTables.GetFileName(baseTables.KPTable); baseAdapter.Fill(baseTables.KPTable,true); baseAdapter.FileName = pathToconfig + BaseTables.GetFileName(baseTables.ObjTable); baseAdapter.Fill(baseTables.ObjTable, true); baseAdapter.FileName = pathToconfig + BaseTables.GetFileName(baseTables.InCnlTable); baseAdapter.Fill(baseTables.InCnlTable, true); baseAdapter.FileName = pathToconfig + BaseTables.GetFileName(baseTables.ParamTable); baseAdapter.Fill(baseTables.ParamTable, true); baseAdapter.FileName = pathToconfig + BaseTables.GetFileName(baseTables.EvTypeTable); baseAdapter.Fill(baseTables.EvTypeTable, true); baseAdapter.FileName = pathToconfig + BaseTables.GetFileName(baseTables.UserTable); baseAdapter.Fill(baseTables.UserTable, true); } public string GetKPNameByNubber (int KPNum) { DataRow[] dataRow; dataRow = baseTables.KPTable.Select("KPNum = " + KPNum); if (dataRow.Length > 0) return dataRow[0][1].ToString(); else return "No such KP"; } public string GetObjectNameByNumber(int ObjNum) { DataRow[] dataRow; dataRow = baseTables.ObjTable.Select("ObjNum = " + ObjNum); if (dataRow.Length > 0) return dataRow[0][1].ToString(); else return "No Such Object"; } public string GetChannelNameByNumber(int ChNum) { DataRow[] dataRow; dataRow = baseTables.InCnlTable.Select("CnlNum = " + ChNum); if (dataRow.Length > 0) return dataRow[0][2].ToString(); else return "No Such Channel"; } public string GetParametrName(int ParamNo) { DataRow[] dataRow; dataRow = baseTables.ParamTable.Select("ParamID = " + ParamNo); if (dataRow.Length > 0) return dataRow[0][1].ToString(); else return "No Such Param"; } public string GetEventTypeText(int ChStat) { DataRow[] dataRow; dataRow = baseTables.EvTypeTable.Select("CnlStatus = " + ChStat); if (dataRow.Length > 0) return dataRow[0][1].ToString(); else return "No Such Status"; } public string GetUserName(int userNo) { DataRow[] dataRow; dataRow = baseTables.UserTable.Select("UserID = " + userNo); if (dataRow.Length > 0) return dataRow[0][1].ToString(); else return "No Such User"; } public int GetLastEventNo() { string tableName = "C:\\SCADA\\ArchiveDAT\\Events\\" + "e" + DateTime.Now.ToString("yyMMdd") + ".dat"; EventTableLight eventTable = new EventTableLight(); EventAdapter eventAdapter = new EventAdapter(); eventAdapter.FileName = tableName; eventAdapter.Fill(eventTable); List<EventTableLight.Event> temp = new List<EventTableLight.Event>(); temp = eventTable.GetLastEvents(1); if (temp.Count > 0) return temp[0].Number; else return 0; } private BaseTables baseTables; private BaseAdapter baseAdapter; } }
OldManSpbУчастникХорошо, а ограничение выходного значения можно сделать? Или ограничение диапазона интегрирования в I компоненте?
OldManSpbУчастникP — регулятор, да, можно формулой, или я не прав и можно и интегральный регулятор сделать формулой? Мне возможно понадобится в будущем, когда понадобится буду разбираться.
OldManSpbУчастникmanjey73 вобщем то так и делает. Просто это немного не по феншую.
OldManSpbУчастникЯ точно не знаю, но подозреваю что вы просто блокируете всю программу на время опроса датчика температуры.
OldManSpbУчастникЧерез ини файл. Если датчиков несколько, с++ вам в помощь, а конфиг на xml. Программу сделать так чтобы можно было неограниченное количкство датчиков подключить, и у каждого свой tcp порт либо адрес modbus.
OldManSpbУчастникПосле GetBit у меня теряется неопределенное состояние. То есть когда в представлении вместо данных — . Так должно быть?
OldManSpbУчастникПоздно вклиниваюсь. Я работал с этим датчиком в линукс. Он опрвшиввется долго, и файл отдает только после опроса. Варианты вижу следующие
1. Опрашивать в отдельном потоке, читать данные асинхронно. Это я так понял уже обсуждалось
2. Простейший вариант — cat /sys/bus/——/— > temperature.txt и запихнуть это в цикл, потом читать этот файл. Это тоже получится асинхронно.
3. Написать на чистом с приложение modbus tcp, и забирать данные коммуникатором. Это по моему самый правильный вариант, отвечающий концепции системы и опрос датчика будет происходить только тогда когда его запрашивает скада. Идатчики можно будет читать по сети. -
Ответ изменён 8 лет, 11 месяцев назад пользователем
-
АвторЗаписи