• Recent
    • Tags
    • Popular
    • Register
    • Login

    Please Note This forum exists for community support for the Mango product family and the Radix IoT Platform. Although Radix IoT employees participate in this forum from time to time, there is no guarantee of a response to anything posted here, nor can Radix IoT, LLC guarantee the accuracy of any information expressed or conveyed. Specific project questions from customers with active support contracts are asked to send requests to support@radixiot.com.

    Radix IoT Website Mango 3 Documentation Website Mango 4 Documentation Website Mango 5 Documentation Website

    Scripting Data source not running or updating script points.

    Scripting general Discussion
    2
    11
    4.1k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • P
      Phillip Weeks
      last edited by Phillip Weeks

      I could really use some advice on this scripting issue...
      I have an es polling data once a minute and on these data calculating a few hundred metapoints every minute as well. This data is then published to a cloud server where I run a script datasource to calculate the aggregate of the piped in metapoints. Although the script tests fine in the edit window, the cron does not appear to be running the script or for some reason the point values are not being saved in the point variables? I do not know how to differentiate the problem, The point variable says "Active source point has no value". Why won't this calculate this on the minute as the script says.
      This is the script...

      var acc1 = 0 ;
      for (i=1;i<25;i++){
      eval('acc1 += (h1'+i+'.value)');
      }
      F1_Flow = acc1; //(where F1_Flow is the script's point variable.)

      Runtime Status shows its polling every minute but nothing is being saved in the variable history?

      2017/04/10 22:07:00.000 1ms
      2017/04/10 22:08:00.000 2ms
      2017/04/10 22:09:00.000 2ms
      2017/04/10 22:10:00.000 1ms
      2017/04/10 22:11:00.000 1ms
      2017/04/10 22:12:00.000 2ms
      2017/04/10 22:13:00.000 2ms
      2017/04/10 22:14:00.000 8ms
      2017/04/10 22:15:00.000 4ms
      2017/04/10 22:16:00.000 1ms

      Any help appreciated.

      1 Reply Last reply Reply Quote 0
      • phildunlapP
        phildunlap
        last edited by phildunlap

        Hi Phillip,

        Scripts have context points assigned to variable names in the script's context. So, F1_Flow = acc1; is assigning over the variable! What it sounds to me like you're looking for is the set() function. Something like,

        F1_Flow.set(h11.value + h12.value + h13.value + h14.value + h15.value + h16.value + 
                    h17.value + h18.value + h19.value + h110.value + h111.value + h112.value +
                    h113.value + h114.value + h115.value + h116.value + h117.value + h118.value +
                    h119.value + h120.value + h121.value + h122.value + h123.value + h124.value);
        P 1 Reply Last reply Reply Quote 0
        • P
          Phillip Weeks @phildunlap
          last edited by

          @phildunlap When I use
          F1_Flow.set(acc1); or
          F1_Flow.set(h11.value + h12.value + h13.value + h14.value +h15.value + h16.value + h17.value + h18.value + h19.value +h110.value + h111.value + h112.value + h113.value + h114.value +h115.value + h116.value + h117.value + h118.value + h119.value +h120.value + h121.value + h122.value + h123.value + h124.value);

          When I do this it generates a script error?

          1 Reply Last reply Reply Quote 0
          • phildunlapP
            phildunlap
            last edited by

            Odd. You can always try something like print(F1_Flow);

            1 Reply Last reply Reply Quote 0
            • P
              Phillip Weeks
              last edited by

              yes this is what I was saying the script seems to be working as I
              the print(F1_Flow) produces a value
              1.7963696000000002
              but does not seem to store it when the cron runs it.
              This is weird.

              1 Reply Last reply Reply Quote 0
              • phildunlapP
                phildunlap
                last edited by

                It should look more like:

                {
                value: 86.7805828398729,
                time: 1491923992866,
                millis: 866,
                second: 52,
                minute: 19,
                hour: 9,
                day: 11,
                dayOfWeek: 3,
                dayOfYear: 101,
                month: 4,
                year: 2017,
                last(count): PointValueTime[count],
                lastValue: PointValueTime(86.7805828398729@2017/04/11 09:19:52.866),
                lastValue(count): PointValueTime,
                set(value): ,
                set(value, timestamp): ,
                pointValuesBetween(timestamp, timestamp): PointValueTime[],
                pointValuesSince(timestamp): PointValueTime[],
                pointValuesBefore(timestamp): PointValueTime[],
                pointValuesAfter(timestamp): PointValueTime[],
                pointValueAt(timestamp): PointValueTime,
                ago(periodType): double,
                ago(periodType, periods): double,
                past(periodType): AnalogStatisticsWrapper,
                past(periodType, periods): AnalogStatisticsWrapper,
                prev(periodType): AnalogStatisticsWrapper,
                prev(periodType, periods): AnalogStatisticsWrapper,
                previous(periodType): AnalogStatisticsWrapper,
                previous(periodType, periods): AnalogStatisticsWrapper,
                stats(from, to): AnalogStatisticsWrapper,
                }
                

                So something is amiss. You are not still assigning a value to F1_Flow are you? F1_Flow should be either the "variable name" of the context point, or if it's a point on the scripting data source it should have its variable name field set to F1_Flow

                1 Reply Last reply Reply Quote 0
                • P
                  Phillip Weeks
                  last edited by

                  Yes I have 3 scripting data sources and each contain one scripting point and within each point the variables names are F1_Flow F2_Flow 3_Flow respectfully to the three sources.
                  when I use set function, verification complains of an error at that line containing this set function. Both
                  F1_Flow.set(1);
                  and
                  F1_Flow.set(acc);
                  generate error across all three scripting data sources.

                  1 Reply Last reply Reply Quote 0
                  • P
                    Phillip Weeks
                    last edited by

                    The only thing unusual from how I've used scripting variables before is that the context variables are metapoints from persistent TCP from the es and not actual modbus points.
                    please explain how the script below works.. RESETSLAVES_ON is a binary in the script context and ITERATION_COUNTER is a numeric with a value 2. My understanding was it was decrementing 2 before doing the reset I assume using a default method?. otherwise how can this script work and it does work.

                    if (RESETSLAVES_ON.value){
                    Hard_Reset_Slaves(RESETSLAVES_ON);
                    if (ITERATION_COUNTER<=0){
                    RESETSLAVES_ON.set(false);
                    Hard_Reset_Slaves(!RESETSLAVES_ON.value);
                    }else{
                    ITERATION_COUNTER -= 1;
                    }
                    }

                    1 Reply Last reply Reply Quote 0
                    • phildunlapP
                      phildunlap
                      last edited by phildunlap

                      To the scripting data source, all points in Mango are just points, their origin doesn't change the handling.

                      0_1491929790806_scripting-help.png

                      0_1491929799727_scripting-help2.png

                      The script you have posted has some issues, but let's go through it:

                      if (RESETSLAVES_ON.value){ //if this point is true or nonzero,
                        Hard_Reset_Slaves(RESETSLAVES_ON); //call this function with that point object, 
                        //fortunately for the control logic if( {"object":true} ) == if( true )
                        //ITERATION_COUNTER may be pointed at an object since it looks like a variable name, but after the first -= 1 it will become NaN
                        if (ITERATION_COUNTER<=0){ //NaN is never <= 0 nor is {"object":true} <= 0
                          RESETSLAVES_ON.set(false); //Doesn't happen, but would call set function on context point
                          Hard_Reset_Slaves(!RESETSLAVES_ON.value); //call this function with a value this time! a trivial true?
                        } else {
                          ITERATION_COUNTER -= 1; //Turn that context point into a NaN as: a = {"object":true}; a -= 1; print(a); shows ITERATION_COUNTER becomes NaN if it was an object
                        }
                      }
                      

                      Hard_Reset_Slaves is probably declared in a global script if it's not in this script body. It is not an included function provided by us.

                      My guess is Hard_Reset_Slaves takes a point instead of a boolean, and it sets RESETSLAVES_ON to false, and that's how the script works. Otherwise I would expect it to keep calling Hard_Reset_Slaves every time it runs, any time RESETSLAVES_ON is true.

                      1 Reply Last reply Reply Quote 0
                      • P
                        Phillip Weeks
                        last edited by Phillip Weeks

                        OK I will digest all that shortly however I have good news in that I now have the points setting properly. I added a new numeric point to each script context and set them to 0 sucessfully. so for some reason yet unclear the script is now setting the point values as it should have F1.set(acc); works yeah
                        As you pointed out there were inconsistencies in that code only because mistakenly thought an object would default the get and set. functions my mistake.
                        Thanks for your analysis and overall help.. I did not realize that NaN was being created.
                        I will correct the script and from now on differentiate between passing the objects vs. its variable value.

                        1 Reply Last reply Reply Quote 0
                        • phildunlapP
                          phildunlap
                          last edited by

                          Certainly! Glad you got it working!

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post