![]() | Паспорт ячейки подстанции |
Форма паспорта ячейки подстанции принимает в качестве параметра объект НСИ, описывающий ячейку. Поэтому в свойствах подготавливаемой формы требуется добавить ссылку на объект НСИ с типом "Ячейка ПС/ТП" и назначить ей идентификатор, например, cubicle. После этого можно приступать к подготовке графической подложки, содержащей изображение таблицы отображаемых в паспорте параметров.
Пример статической svg-подложки паспорта ячейки подстанции.
<svg xmlns="http://www.w3.org/2000/svg"> <g transform="translate(50, 50)"> <rect x="0" y="0" width="300" height="20" style="stroke:#000000;fill:#0072c6;fill-opacity:1"/> <text x="0" y="0"> <tspan x="150" y="15" text-anchor="middle">Паспорт ячейки</tspan> </text> <rect x="0" y="20" width="300" height="320" style="stroke:#000000;fill-opacity:0"/> <text x="0" y="0"> <tspan x="5" y="35">Наименование:</tspan> <tspan x="150" y="35" fill="blue">...</tspan> <tspan x="5" y="55">Модель ПУ:</tspan> <tspan x="150" y="55" fill="blue">...</tspan> <tspan x="5" y="75">Серийный номер:</tspan> <tspan x="150" y="75" fill="blue">...</tspan> <tspan x="5" y="95">Дата установки:</tspan> <tspan x="150" y="95" fill="blue">...</tspan> <tspan x="5" y="115">Дата поверки:</tspan> <tspan x="150" y="115" fill="blue">...</tspan> <tspan x="5" y="135">Ктт:</tspan> <tspan x="150" y="135" fill="blue">...</tspan> <tspan x="5" y="155">Ктн:</tspan> <tspan x="150" y="155" fill="blue">...</tspan> <tspan x="5" y="175">Итоговый к-т:</tspan> <tspan x="150" y="175" fill="blue">...</tspan> <tspan x="5" y="195">Маршрут:</tspan> <tspan x="150" y="195" fill="blue">...<title xmlns="http://www.w3.org/1999/xhtml">...</title></tspan> <tspan x="5" y="215">Тариф:</tspan> <tspan x="150" y="215" fill="blue"/> <tspan x="5" y="235">Абонент:</tspan> <tspan x="150" y="235" fill="blue"/> <tspan x="5" y="255">Фидер:</tspan> <tspan x="150" y="255" fill="blue">...</tspan> </text> <rect x="5" y="275" width="145" height="20" style="stroke:#000000;fill-opacity:0"/> <rect x="150" y="275" width="145" height="20" style="stroke:#000000;fill-opacity:0"/> <rect x="5" y="295" width="75" height="20" style="stroke:#000000;fill-opacity:0"/> <rect x="80" y="295" width="70" height="20" style="stroke:#000000;fill-opacity:0"/> <rect x="150" y="295" width="75" height="20" style="stroke:#000000;fill-opacity:0"/> <rect x="225" y="295" width="70" height="20" style="stroke:#000000;fill-opacity:0"/> <rect x="5" y="315" width="75" height="20" style="stroke:#000000;fill-opacity:0"/> <rect x="80" y="315" width="70" height="20" style="stroke:#000000;fill-opacity:0"/> <rect x="150" y="315" width="75" height="20" style="stroke:#000000;fill-opacity:0"/> <rect x="225" y="315" width="70" height="20" style="stroke:#000000;fill-opacity:0"/> <text id="fixedHintText" x="10" y="290">Показания на 01.01.01</text> <text x="165" y="290"> Энергия за сутки </text> <text x="10" y="310"> А+, кВт*ч </text> <text x="85" y="310"> А-, кВт*ч </text> <text x="155" y="310"> А+, кВт*ч </text> <text x="230" y="310"> А-, кВт*ч </text> </g> </svg>
Внешний вид графической подложки.
После подготовки фоновой подложки на форму добавляются стандартные элементы "Архивные данные по точке учета". После расстановки элементов и настройки их привязки к объектам НСИ итоговое содержимое шаблона дополнится содержимым, похожим на приведенное ниже.
... <meterpointarchivevalue xmlns="http://www.w3.org/1999/xhtml" scada-id="value1" x="56" y="365" height="19" width="73" meterpoint="{"id":3975986,"caption":"Владимирэнерго\\Собинский РЭС\\ТП 0,4 кВ\\ТП-2321 (д. Семёновское)\\РУ-0,4 кВ\\СШ-1\\яч. 2\\ТУ яч. 2"}" valuedt=""2021-04-06T21:00:00.000Z"" parameter="[{"measureType":{"id":-1892,"caption":"Активная энергия"},"measureUnit":"Вт*ч","tariff":null,"fixationRule":{"id":-2163,"caption":"Сутки, 1"},"discret":{"type":-1147,"value":1,"id":-2164,"caption":"Сутки, 1"},"resources":[{"id":-30154,"caption":"Электроэнергия"}],"isViewMeasureSettingsApplying":true,"id":-2161,"caption":"Энергия А+ на начало суток"}]" horalign=""По центру""></meterpointarchivevalue> <meterpointarchivevalue xmlns="http://www.w3.org/1999/xhtml" scada-id="value2" x="131" y="365" height="19" width="68" meterpoint="{"id":3975986,"caption":"Владимирэнерго\\Собинский РЭС\\ТП 0,4 кВ\\ТП-2321 (д. Семёновское)\\РУ-0,4 кВ\\СШ-1\\яч. 2\\ТУ яч. 2"}" valuedt=""2021-04-06T21:00:00.000Z"" parameter="[{"measureType":{"id":-1892,"caption":"Активная энергия"},"measureUnit":"Вт*ч","tariff":null,"fixationRule":{"id":-2167,"caption":"Сутки, 1"},"discret":{"type":-1147,"value":1,"id":-2168,"caption":"Сутки, 1"},"resources":[{"id":-30154,"caption":"Электроэнергия"}],"isViewMeasureSettingsApplying":true,"id":-2165,"caption":"Энергия А- на начало суток"}]" horalign=""По центру""></meterpointarchivevalue> <meterpointarchivevalue xmlns="http://www.w3.org/1999/xhtml" scada-id="value3" x="201" y="365" height="19" width="73" meterpoint="{"id":3975986,"caption":"Владимирэнерго\\Собинский РЭС\\ТП 0,4 кВ\\ТП-2321 (д. Семёновское)\\РУ-0,4 кВ\\СШ-1\\яч. 2\\ТУ яч. 2"}" valuedt=""2021-04-06T21:00:00.000Z"" parameter="[{"measureType":{"id":-1892,"caption":"Активная энергия"},"measureUnit":"Вт*ч","tariff":null,"fixationRule":null,"discret":{"type":-1147,"value":1,"id":-6600,"caption":"Сутки, 1"},"resources":[{"id":-30154,"caption":"Электроэнергия"}],"isViewMeasureSettingsApplying":true,"id":-6592,"caption":"Энергия А+ за сутки"}]" horalign=""По центру""></meterpointarchivevalue> <meterpointarchivevalue xmlns="http://www.w3.org/1999/xhtml" scada-id="value4" x="276" y="365" height="19" width="68" meterpoint="{"id":3975986,"caption":"Владимирэнерго\\Собинский РЭС\\ТП 0,4 кВ\\ТП-2321 (д. Семёновское)\\РУ-0,4 кВ\\СШ-1\\яч. 2\\ТУ яч. 2"}" valuedt=""2021-04-06T21:00:00.000Z"" parameter="[{"measureType":{"id":-1892,"caption":"Активная энергия"},"measureUnit":"Вт*ч","tariff":null,"fixationRule":null,"discret":{"type":-1147,"value":1,"id":-6601,"caption":"Сутки, 1"},"resources":[{"id":-30154,"caption":"Электроэнергия"}],"isViewMeasureSettingsApplying":true,"id":-6594,"caption":"Энергия А- за сутки"}]" horalign=""По центру""></meterpointarchivevalue> ...
Завершающим этапом является добавление серверного сценария, возвращающего всю необходимую информацию по переданной в качестве параметра ячейке, а также клиентский сценарий жизненного цикла scOnInit (при инициализации), реализующий визуализацию полученных от сервера данных.
Пример серверного сценария предоставления данных по ячейке (с наименованием getData).
// Получение ячейки из входных параметров var cubicle = Cubicle.Find((int)args["cubicle"]); // Подготовка массива данных по ячейке для отправки на сторону клиента var mp = cubicle?.AttributeMeterPoint; var meter = mp?.AttributeElectricityMeter; var installDt = meter?.AttributeInstallDate; var installDtStr = installDt?.ToString("dd.MM.yyyy") ; var calibrateDt = meter?.AttributeLastCalibrationDate; var calibrateDtStr = calibrateDt?.ToString("dd.MM.yyyy"); var scaleInfo = mp?.GetMeasureTransformersInfo(); var totalScale = scaleInfo == null ? 1 : scaleInfo.CurrentRatio.GetValueOrDefault(1) * scaleInfo.VoltageRatio.GetValueOrDefault(1); var route = meter?.AttributeRoutes.GetValues().FirstOrDefault(x => !x.AttributeDisabled.GetValueOrDefault()); var routeStr = route?.Caption; var routeStrCutted = routeStr == null ? null : CommonTools.StringHelpers.TruncateLongString(routeStr, 22); var tariffStr = mp?.AttributeTariff?.Caption; var consumerStr = mp?.AttributeConsumer?.Caption; var asCubiclePowerLine = cubicle as CubiclePowerLine; var powerLineStr = asCubiclePowerLine == null ? null : asCubiclePowerLine.AttributePowerLine?.Caption; if (string.IsNullOrEmpty(consumerStr)) { var line = asCubiclePowerLine.AttributePowerLine; var connections = line.RelationsIPowerLineConnectionAttributePowerLine.OfType<IPowerLineConnectionWithConsumerMeterPoints>().ToArray(); if (connections.Length == 1) { var con = connections[0]; var consumerPoints = con.GetMeterPoints().ToArray(); if (consumerPoints.Length == 1) { consumerStr = consumerPoints[0]?.AttributeConsumer?.Caption; } } } var stringValues = new [] { cubicle?.AttributeCaption, meter?.Class.Caption, meter?.AttributeSerialNumber, installDtStr, calibrateDtStr, mp?.AttributeCurrentScale, mp?.AttributeVoltageScale, ((int)totalScale).ToString(), routeStrCutted, tariffStr, consumerStr, powerLineStr }; return new { values = stringValues, fixesText = string.Format("Показания на {0:dd.MM.yy}", DateTime.Today), mp = new { id = mp == null ? 0 : mp.IntRefName, caption = mp?.Caption }, dt = DateTime.Today, routeFull = routeStrCutted == routeStr ? null : routeStr };
Пример сценария жизненного цикла scOnInit (при инициализации), выполняющего подготовку внешнего вида паспорта ячейки.
// Запрос данных о ячейке на сервер this.getData( { cubicle: this.cubicle ? this.cubicle.id : 0 }, rs => { // Перебор всех элементов tspan, в которые будут заноситься значения let textNodes = this._node.querySelectorAll('tspan[fill="blue"'); let index = 0; textNodes.forEach(x => { // Вставка значения из полученного со стороны сервера массива x.textContent = rs.values[index++]; // Для маршрутов отдельно добавляется подсказка if (index == 9 && rs.routeFull) // Маршрут { var routeTitleNode = x.ownerDocument.createElement('title'); x.appendChild(routeTitleNode); routeTitleNode.textContent = rs.routeFull; } }); // Настройка элементов отображения показаний this._node.querySelector('#fixedHintText').textContent = rs.fixesText; this.value1.meterPoint = rs.mp; this.value1.valueDt = rs.dt; this.value2.meterPoint = rs.mp; this.value2.valueDt = rs.dt; this.value3.meterPoint = rs.mp; this.value3.valueDt = rs.dt; this.value4.meterPoint = rs.mp; this.value4.valueDt = rs.dt; }, err => { console.error(err); });
Пример итогового внешнего вида формы паспорта ячейки подстанции.