Стартовая страница › Форумы › Разработка и интеграция › rapidScada Взаимодействие с системой из 1С
- В этой теме 2 ответа, 2 участника, последнее обновление 2 года, 2 месяца назад сделано
darau.
-
АвторСообщения
-
07.04.2024 в 15:38 #31948
darau
УчастникДобрый день!
ВОзможно кому-то будет полезна ниже изложенная информация о способе взаимодействия с rapid scada из 1С.
Будет описано два сопособа:
1 — получение данных из postgres sql (предварительно данные выгружаются из rapid scada в базу данных)
2 — получение данных и отправка команд через api rapid scadaоба способа реализованы и штатно работают.
==================Получение данных из postgres sql =======================
В rapid scada есть возможность выгружать данные в стороннюю базу данных с помощью модуля ModDbExport располагающимся в разделе Модули сервера rapid scada. Перед настройкой экпорта следует установить postgres и добавить в базу данных таблицы согласно инструкции — https://rapidscada.net/doc/content/latest/ru/modules/mod-db-export.html
Далее еследует настроить параметры соединения, указав параметры подлючения, а также логин и пароль.
После чего перейти в раздел запросы и создать для каждого нужного канала запрос на экспорт.
Следует указать тип данных (текущие, архивные), номер канала и sql запросINSERT INTO cnldata (datetime, cnlnum, val, stat)
VALUES (@timestamp, @cnlNum, @val, @stat) — для выгрузки текущих данных конкретного каналаWITH upsert AS (UPDATE cnldata SET val = @val, stat = @stat
WHERE datetime = @datetime AND cnlnum = @cnlNum RETURNING *)
INSERT INTO cnldata (datetime, cnlnum, val, stat)
SELECT @dateTime, @cnlNum, @val, @stat
WHERE NOT EXISTS (SELECT * FROM upsert) — исторические данные для конкретного каналапосле применения данные при их поступлении будут дублироваться во внешнюю базу данных откуда их можно забирать и использовать в 1С
//пример подключения к базе данных и чтение нужных каналов //Uid=postgres;Pwd=123456; - имя пользователя и пароль в базе данных //10.10.10.1 - адрес сервера на котором расположена база Connection = Новый COMОбъект("ADODB.CONNECTION"); Connection.ConnectionString = "Driver={PostgreSQL Unicode};Server=10.10.10.1;Port=5432;Database=postgres;Uid=postgres;Pwd=123456;Protocol=3;SSL=false;SslMode=Disable;"; Попытка Connection.open(); Исключение Сообщить("Не могу подключиться к базе PostgreSQL "); КонецПопытки; НаборЗаписей = Новый ComObject("ADODB.RecordSet"); Команда = Новый COMОбъект("ADODB.Command"); НачПер=Формат(ЭтотОбъект.НачалоПериода,"ДФ='гггг-ММ-дд ЧЧ:мм:сс.000000'"); КонПер=Формат(ЭтотОбъект.КонецПериода,"ДФ='гггг-ММ-дд ЧЧ:мм:сс.000000'"); //массив каналов МассивПрессов = новый массив; МассивПрессов.Добавить("1901"); МассивПрессов.Добавить("1902"); Для каждого ЭлМассиваПресс из МассивПрессов цикл Попытка Команда.ActiveConnection = Connection; Команда.CommandText = "SELECT * FROM public.cnldata WHERE cnlnum="+Формат(ЭлМассиваПресс,"ЧГ=")+" AND datetime >= '"+НачПер+"' AND datetime <= '"+КонПер+"' ORDER BY datetime ASC, cnlnum ASC"; НаборЗаписей = Команда.Execute(); //Состояние("Данные получены."); Исключение //Сообщить("Нет данных."); Возврат; КонецПопытки; ВременнаяТаблица = Новый ТаблицаЗначений; //Добавление колонок во временную таблицу Для НомерСтолбца = 0 По НаборЗаписей.Fields.Count - 1 Цикл ИмяСтолбца = НаборЗаписей.Fields.Item(НомерСтолбца).Name; ВременнаяТаблица.Колонки.Добавить(ИмяСтолбца); КонецЦикла; Пока НЕ НаборЗаписей.EOF Цикл // Заполнение временной таблицы таблицы НоваяСтрока = ВременнаяТаблица.Добавить(); Для НомерСтолбца = 0 По НаборЗаписей.Fields.Count-1 Цикл НоваяСтрока.Установить(НомерСтолбца, СокрЛП(НаборЗаписей.Fields(НомерСтолбца).Value)); КонецЦикла; НаборЗаписей.MoveNext(); КонецЦикла; }Нужные данные выгружаются в таблицу значений «ВременнаяТаблица»
========================= второй способ взаимодействия — работа с api rapid scada =========================
Этот способ удалось освоить очень не быстро ввиду неочевидности некоторых моментов
возможно они где-то есть в документации, но дойти до решения удалось не сразу.Первое, что требуется сделать — это изменить параметр в xml файле натроек web сервера rapid scada
C:\____путь к папке с проектом rapid scada ____\Instances\Default\ScadaWeb\config\ScadaWebConfig.xmlменяем AllowAuthApi и AllowAuthApi на true
<OptionGroup name=»Main»>
<Option name=»AllowAuthApi» value=»true» />
<Option name=»AllowCommandApi» value=»true» />после чего появляется возможность взаимодействовать с системой по api
в 1с процесс разделяется на 2 стадии: авторизация через api и получение куки POST запросом и далее получение данных нужного канала get запросом с указанием в заколовках полученных куки
// адрес rapid scada - 10.10.10.1 // прот - 108 ///Api/Auth/Login - путь до метода api авторизации на сервере //Username"":""user"",""Password"":""123456 - логин и пароль пользователя в rapid scada - желательно с правам администратор ///Api/Main/getCurData?cnlNums=2101 - адрес метода получения данных канала //создаем запрос для авторизации данных методом POST HTTPСоединение = Новый HTTPСоединение("10.10.10.1",108,"",""); запросPOST = Новый HTTPЗапрос("/Api/Auth/Login"); запросPOST.Заголовки.Вставить("Content-type","application/vnd.api+json"); СтрокаJS = "{""Username"":""user"",""Password"":""123456""}"; запросPOST.УстановитьТелоИзСтроки(СтрокаJS,"windows-1251",ИспользованиеByteOrderMark.НеИспользовать); Попытка Ответ=HTTPСоединение.ОтправитьДляОбработки(запросPOST, ФайлОтвета); Куки=Ответ.Заголовки.Получить("Set-Cookie"); Исключение #Если клиент Тогда Сообщить(ОписаниеОшибки()); #КонецЕсли КонецПопытки; //lполучаем данные нужного канала Если ЗначениеЗаполнено(Куки) тогда Соединение = Новый HTTPСоединение("10.10.10.1",108,,,,,); Заголовки = Новый Соответствие; Заголовки.Вставить("Cookie", Куки); ОтветЗначение = Соединение.Получить(Новый HTTPЗапрос("/Api/Main/getCurData?cnlNums=2101", Заголовки)).ПолучитьТелоКакСтроку(); читатьJSON = Новый ЧтениеJSON; читатьJSON.УстановитьСтроку(ОтветЗначение); ПрочитанныйJSON=ПрочитатьJSON(читатьJSON); ПрочитанныйJSONdata=ПрочитанныйJSON.data[0].val; ПолученноеЗначениеКанала=ПрочитанныйJSONdata; КонецЕсли;08.04.2024 в 15:15 #31981
MikhailМодераторДобрый день!
Спасибо.09.04.2024 в 16:08 #32022darau
УчастникВ дополнении к предыдущему посту:
отправлять команду из 1с можно таким образом:
HTTPСоединение = Новый HTTPСоединение("10.10.10.1",1008,"",""); запросPOST = Новый HTTPЗапрос("Api/Main/SendCommand"); запросPOST.Заголовки.Вставить("Cookie",Куки); запросPOST.Заголовки.Вставить("Content-Type","application/vnd.api+json"); запросPOST.УстановитьТелоИзСтроки("{""cnlNum"":""2102"",""cmdVal"":""1""}",КодировкаТекста.UTF8, ИспользованиеByteOrderMark.Авто); Попытка Ответ=HTTPСоединение.ОтправитьДляОбработки(запросPOST, ФайлОтвета); Исключение #Если клиент Тогда Сообщить(ОписаниеОшибки()); #КонецЕсли КонецПопытки;-
Ответ изменён 2 года, 2 месяца назад пользователем
darau.
-
Ответ изменён 2 года, 2 месяца назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.