OldManSpb

Ответы в темах

Просмотр 15 сообщений - с 16 по 30 (из 40 всего)
  • Автор
    Записи
  • 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 — регулятор, да, можно формулой, или я не прав и можно и интегральный регулятор сделать формулой? Мне возможно понадобится в будущем, когда понадобится буду разбираться.

    в ответ на: Считать массив строк из файла ? #6948
    OldManSpb
    Участник

    manjey73 вобщем то так и делает. Просто это немного не по феншую.

    в ответ на: Считать массив строк из файла ? #6930
    OldManSpb
    Участник

    Я точно не знаю, но подозреваю что вы просто блокируете всю программу на время опроса датчика температуры.

    в ответ на: Считать массив строк из файла ? #6928
    OldManSpb
    Участник

    Через ини файл. Если датчиков несколько, с++ вам в помощь, а конфиг на xml. Программу сделать так чтобы можно было неограниченное количкство датчиков подключить, и у каждого свой tcp порт либо адрес modbus.

    в ответ на: разложить чисто по битам #6926
    OldManSpb
    Участник

    После GetBit у меня теряется неопределенное состояние. То есть когда в представлении вместо данных — . Так должно быть?

    в ответ на: Считать массив строк из файла ? #6925
    OldManSpb
    Участник

    Поздно вклиниваюсь. Я работал с этим датчиком в линукс. Он опрвшиввется долго, и файл отдает только после опроса. Варианты вижу следующие
    1. Опрашивать в отдельном потоке, читать данные асинхронно. Это я так понял уже обсуждалось
    2. Простейший вариант — cat /sys/bus/——/— > temperature.txt и запихнуть это в цикл, потом читать этот файл. Это тоже получится асинхронно.
    3. Написать на чистом с приложение modbus tcp, и забирать данные коммуникатором. Это по моему самый правильный вариант, отвечающий концепции системы и опрос датчика будет происходить только тогда когда его запрашивает скада. Идатчики можно будет читать по сети.

Просмотр 15 сообщений - с 16 по 30 (из 40 всего)