Стартовая страница › Форумы › Rapid SCADA на Linux-контроллерах и Raspberry Pi › Опрос Scada по SNMP
- В этой теме 18 ответов, 3 участника, последнее обновление 1 год, 6 месяцев назад сделано Mikhail.
-
АвторСообщения
-
03.04.2023 в 17:56 #27933manjey73Участник
Собственно возможно даже без дополнительных компонентов со стороны Scada
Использовал штатный snmpd в Linux для создания расширенных OIDПрикольно получается, можно вытянуть какие-нибудь каналы например для мониторинга со стороны Zabbix 🙂
03.04.2023 в 18:00 #27934manjey73Участник04.04.2023 в 12:04 #27946RomirosУчастникЭто через запись данных каналов scada в текстовый файл?
04.04.2023 в 12:33 #27948manjey73УчастникТак полагаю, что драйвер SNMP не умеет определять точку и запятую при указании Double и вероятно требует точку. Хотя формула не занимается преобразованием значения канала и сохраняет с запятой, так как выставлен Русский язык и отображение у нас с запятой.
@romiros да, последним каналом сделал формулу сохранения в файл в папку /var/log/scada/ScadaServer/Log — которая в tmpfs — ну или на RAM диске.Ну и далее настройка snmpd
04.04.2023 в 12:54 #27950manjey73УчастникСделал в формуле преобразование значения словаря в строку и Raplace , на .
Теперь нормальный данные… значит связано с этим.
Имхо, лучше если драйвер SNMP самостоятельно будет воспринимать , или . в Double04.04.2023 в 14:28 #27969MikhailМодераторОтличное решение, которое обходится без разработки драйвера SNMP-сервера.
Если не ошибаюсь, в протоколе SNMP тоже имеются типы данных, но в используемой SharpSnmpLib не вижу типа float или double.04.04.2023 в 14:42 #27974manjey73УчастникМихаил, я не использовал 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)04.04.2023 в 14:44 #27975manjey73УчастникНу и еще один момент — управления тут нет и вероятно не будет… не уверен, что на ExtendedOID демон snmpd позволит что-то передать, разве что так же скриптом в какой-то файл, я даже не уверен что получится.
з.ы. кстати для Windows на счет скриптов не уверен, а вот библиотекой дополнительной можно реализовать.
Сложность для сервера это правильные OID которые должны пройти валидацию, как тут бороться я даже не представляю пока.
04.04.2023 в 14:48 #27978manjey73УчастникНапример я изменил название скрипта, название файла и получил уже другие 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 уже отличаются от варианта на скрине, когда тестировал.
04.04.2023 в 15:08 #2798404.04.2023 в 15:12 #27985manjey73УчастникМожно конечно изменить словарь на <int, string> но массив может быть набором double значений или чего угодно… не только для строк.
05.04.2023 в 15:02 #28022MikhailМодераторВы можете представить себе канал с длиной > 1, как несколько одинаковых каналов подряд (формула тоже одинаковая, соответственно). Формула в каждом из них вычисляется независимо.
То есть OID нельзя придумать самому такой, какой удобно?
05.04.2023 в 15:20 #28024MikhailМодераторdoubleValue.ToString(NumberFormatInfo.InvariantInfo)
05.04.2023 в 15:35 #28025manjey73Участник@mikhail с OID там что-то нечисто 🙂 они могут не пройти валидацию и соответственно система, которая будет читать переменные ее не распознает.
Пока не разбирался..
05.04.2023 в 16:02 #28027manjey73УчастникНа счет канала с длиной >1 как-то подробнее можно?
Вот пример из Симулятора канал 106 длина 3. Если я в ней пропишу формулу SnmpData(CnlNum) я получу в файле 3 значения каналов 106, 107 и 108 ?А речь то идет как сделать одно значение, а не три, если например массив представляет из себя строку?
(374,66): error CS0103: The name ‘NumberFormatInfo’ does not exist in the current context
Чего-то не хватает видимо
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.