WINNUM Community
Получение значений сигналов тега, если в теге больше одного сигнала - Версия для печати

+- WINNUM Community (https://community.winnum.io)
+-- Сообщество Все сообщества (https://community.winnum.io/forumdisplay.php?fid=1)
+--- Сообщество Динамические приложения в WINNUM Platform (https://community.winnum.io/forumdisplay.php?fid=2)
+--- Темы: Получение значений сигналов тега, если в теге больше одного сигнала (/showthread.php?tid=15)



Получение значений сигналов тега, если в теге больше одного сигнала - Сергей Соловьев - 03-15-2024

Если в теге больше одного сигнала, то функция WNApplicationTagHelper.getLastTagValue возвращает значение только того сигнала, у которого стоит галочка "Определяет значение тега".
Если в теге заполнено поле  "Значение при выполнении условий",  то функция WNApplicationTagHelper.getLastTagValue возвращает то, что заполнено в этом поле.

Если нужно получать значения всех сигналов, то нужно последовательно выполнить getLastTagValue, затем получить имена сигналов тега через WNModelingHelper.getSignals, затем для каждого сигнала получить значения WNConnectorHelper.getSignal.
Ниже пример функции, которая вернет и текущее состояние тега, и значение, и значения каждого сигнала тега.
Код:
thisGetLastTagValue( appid, pid, tid, startTime, endTime, timeout_mills, function ( result  ){
    console.log ( result );
});


function thisGetLastTagValue( appid, pid, tid, startTime, endTime, timeout_mills, callBackFunc){
    var result = {};
    result.data = [];
    baseSdkUtils.service.WNApplicationTagHelper.getLastTagValue(appid, pid, tid, endTime, timeout_mills, function( data ){
        if ( baseSdkUtils.isSuccess( data ) ){
            var item = data.getElementsByTagName('item')[ 0 ];
            var tag_status = baseSdkUtils.decode(item.getAttribute('success'));
            var tag_value = baseSdkUtils.decode(item.getAttribute('value'));
            result.tagStatus = tag_status;
            result.tagValue = tag_value;
            thisGetSignals( pid , tid, function ( signals ){
              if ( baseSdkUtils.isSuccess( signals ) ){
                  var index = 0;
                  for ( var i = 0; i < signals.getElementsByTagName('item').length; i++ ){
                      var item = signals.getElementsByTagName('item')[ i ];
                      var asciiPartNumber = baseSdkUtils.decode(item.getAttribute('asciiPartNumber'));
                       thisGetLastSignal( pid, asciiPartNumber, timeout_mills, function( signals_value ){
                           index++;
                           result.data.push( signals_value );
                           if ( index ==  signals.getElementsByTagName('item').length ){
                                if ( callBackFunc ){
                                    callBackFunc.call( this, result );
                                }
                           }
                       });
                  }
              }
             
            });
           
        }
    });
}

function thisGetSignals( pid, tid, callBackFunct){
    baseSdkUtils.service.WNModelingHelper.getSignals(
        pid,
        tid,
        function( data ){
            if ( callBackFunct ){
                callBackFunct.call( this, data);
            }
    });
}

function thisGetLastSignal( pid, ascii, timeout_mills, callBackFunct){
    var result = {};
    var nDate = new Date();
    baseSdkUtils.service.WNFactory.getPersistable( pid , function( product_data ){
        if ( baseSdkUtils.isSuccess( product_data ) ){
            var item = product_data.getElementsByTagName('item')[ 0 ];
            var ProductUUID = baseSdkUtils.decode(item.getAttribute('ProductUUID'));
            baseSdkUtils.service.WNConnectorHelper.getSignal(
                ProductUUID,
                ascii,
                true,
                true,
                '',
                '',
                1,
                function( data ){
                    if ( baseSdkUtils.isSuccess( data ) ){
                        var item = data.getElementsByTagName('item')[ 0 ];
                        result.value = baseSdkUtils.decode(item.getAttribute('value'));
                        result.event_time = baseSdkUtils.decode(item.getAttribute('event_time'));
                        result.signal_id = item.getAttribute('signal_id');
                        var event_time_date = Date.parse( result.event_time );
                        var diff = nDate.getTime() - event_time_date;
                        if ( diff > timeout_mills){
                            result.value = undefined;
                        }
                        if ( callBackFunct ){
                            callBackFunct.call( this, result);
                        }
                    }
                }
            );
        }
    });
}

Формат ответа функции  thisGetLastTagValue следующий:
Код:
{
    "data": [
        {
            "value": "35",
            "event_time": "2024-03-15 16:21:53.000",
            "signal_id": "A397"
        },
        {
            "value": "29",
            "event_time": "2024-03-15 16:21:53.000",
            "signal_id": "A398"
        }
    ],
    "tagStatus": "true",
    "tagValue": "2"
}