rapidScada Взаимодействие с системой из 1С

Стартовая страница Форумы Разработка и интеграция rapidScada Взаимодействие с системой из 1С

Помечено: ,

Просмотр 3 сообщений - с 1 по 3 (из 3 всего)
  • Автор
    Сообщения
  • #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;
    		
    КонецЕсли;
    #31981
    Mikhail
    Модератор

    Добрый день!
    Спасибо.

    #32022
    darau
    Участник

    В дополнении к предыдущему посту:

    отправлять команду из 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.
Просмотр 3 сообщений - с 1 по 3 (из 3 всего)
  • Для ответа в этой теме необходимо авторизоваться.