Опрос Scada по SNMP

  • В этой теме 18 ответов, 3 участника, последнее обновление 1 год назад сделано Mikhail.
Просмотр 15 сообщений - с 1 по 15 (из 19 всего)
  • Автор
    Сообщения
  • #27933
    manjey73
    Участник

    Собственно возможно даже без дополнительных компонентов со стороны Scada
    Использовал штатный snmpd в Linux для создания расширенных OID

    Прикольно получается, можно вытянуть какие-нибудь каналы например для мониторинга со стороны Zabbix 🙂

    #27934
    manjey73
    Участник
    #27946
    Romiros
    Участник

    Это через запись данных каналов scada в текстовый файл?

    #27948
    manjey73
    Участник

    Данные в Octet

    Получаем —

    Так полагаю, что драйвер SNMP не умеет определять точку и запятую при указании Double и вероятно требует точку. Хотя формула не занимается преобразованием значения канала и сохраняет с запятой, так как выставлен Русский язык и отображение у нас с запятой.


    @romiros
    да, последним каналом сделал формулу сохранения в файл в папку /var/log/scada/ScadaServer/Log — которая в tmpfs — ну или на RAM диске.

    Ну и далее настройка snmpd

    #27950
    manjey73
    Участник

    Сделал в формуле преобразование значения словаря в строку и Raplace , на .

    Теперь нормальный данные… значит связано с этим.
    Имхо, лучше если драйвер SNMP самостоятельно будет воспринимать , или . в Double

    #27969
    Mikhail
    Модератор

    Отличное решение, которое обходится без разработки драйвера SNMP-сервера.
    Если не ошибаюсь, в протоколе SNMP тоже имеются типы данных, но в используемой SharpSnmpLib не вижу типа float или double.

    #27974
    manjey73
    Участник

    Михаил, я не использовал SharpSnmpLib 🙂 от слова совсем.
    Как и другую. К тому же последние версии находятся в NUGET.

    Речь о том, что я формулами записываю каналы в словарь и пишу в файл.
    А вот потом уже настраиваю штатный snmpd в Linux на работу с ExtendedOID

    Вот как раз штатные средства все переменные создают как OctetString

    Вот формулы

    // Список каналов создается формулой SnmpData(Cnl) для входных каналов
    //
    string pathSnmp = @"/var/log/scada/ScadaServer/Log/snmpdata.txt";
    protected Dictionary<int, double> snmpData = new Dictionary<int, double>();
    
    public double SnmpData (double res)
    {
    if (!snmpData.ContainsKey(CnlNum))
    {
    snmpData.Add(CnlNum, res);
    }
    else
    {
    snmpData[CnlNum] = res;
    }
    return res;
    }
    
    public double SnmpRead(int cnlNum)
    {
    return snmpData[cnlNum];
    }
    
    // Сохранить данные выбранных каналов в файл данных SNMP
    public double SaveSnmpData()
    {
    File.WriteAllLines(pathSnmp, snmpData
      .Select(pair => String.Join(" ", pair.Key, pair.Value.ToString().Replace(",","."))));
    return snmpData.Count;
    }
    

    B тут два момента
    1. pair.Value.ToString().Replace(«,»,».») это вот колхоз, так как указывая драйверу SNMP что у нас переменная double, так как словарь у меня по сути и есть <int, double> то вероятно в зависимости от культуры разделитель будет , или . а драйвер SNMP понимает только точку
    2. Как будет выглядеть формула добавления в словарь например для расчетного значения? или для вычислимого значения ?
    У меня сейчас на входных каналах Симулятора стоит такая формула SnmpData(Cnl)

    #27975
    manjey73
    Участник

    Ну и еще один момент — управления тут нет и вероятно не будет… не уверен, что на ExtendedOID демон snmpd позволит что-то передать, разве что так же скриптом в какой-то файл, я даже не уверен что получится.

    з.ы. кстати для Windows на счет скриптов не уверен, а вот библиотекой дополнительной можно реализовать.

    Сложность для сервера это правильные OID которые должны пройти валидацию, как тут бороться я даже не представляю пока.

    #27978
    manjey73
    Участник

    Например я изменил название скрипта, название файла и получил уже другие OID

    .1.3.6.1.4.1.8072.1.3.2.4.1.2.9.49.115.110.109.112.100.97.116.97.1	=	Sin
    .1.3.6.1.4.1.8072.1.3.2.4.1.2.9.49.115.110.109.112.100.97.116.97.2	=	Square 
    .1.3.6.1.4.1.8072.1.3.2.4.1.2.9.49.115.110.109.112.100.97.116.97.3	=	Triangle

    Номера OID уже отличаются от варианта на скрине, когда тестировал.

    #27984
    manjey73
    Участник

    Массивы

    И собственно какую формулу делать для массивов значений ?

    #27985
    manjey73
    Участник

    Можно конечно изменить словарь на <int, string> но массив может быть набором double значений или чего угодно… не только для строк.

    #28022
    Mikhail
    Модератор

    Вы можете представить себе канал с длиной > 1, как несколько одинаковых каналов подряд (формула тоже одинаковая, соответственно). Формула в каждом из них вычисляется независимо.

    То есть OID нельзя придумать самому такой, какой удобно?

    #28024
    Mikhail
    Модератор

    doubleValue.ToString(NumberFormatInfo.InvariantInfo)

    #28025
    manjey73
    Участник

    @mikhail с OID там что-то нечисто 🙂 они могут не пройти валидацию и соответственно система, которая будет читать переменные ее не распознает.

    Пока не разбирался..

    #28027
    manjey73
    Участник

    На счет канала с длиной >1 как-то подробнее можно?
    Вот пример из Симулятора канал 106 длина 3. Если я в ней пропишу формулу SnmpData(CnlNum) я получу в файле 3 значения каналов 106, 107 и 108 ?

    А речь то идет как сделать одно значение, а не три, если например массив представляет из себя строку?

    (374,66): error CS0103: The name ‘NumberFormatInfo’ does not exist in the current context

    Чего-то не хватает видимо

Просмотр 15 сообщений - с 1 по 15 (из 19 всего)
  • Вы должны авторизироваться для ответа в этой теме.