Jump to content

Recommended Posts

1) When editing IO Inputs or Outputs Alias Names directly (from the table view, without going into window for editing single tag) - cold not put a space symbol between words while writing (later when the whole "Input5AbracadabraOpenSesame" is written, you can, of course go back and put spaces in between words finally getting to the "Input 5 Abracadabra Open Sesame"). Problem is not observed while editing in single tag editor window.
This is new mis-behavior, which was not observed some versions earlier.

2) In Data Table view - String literals are center-aligned without any obvious reason, which detracts from readability of large tables. For Number literals it makes sense to have them centered within cells, which more likely adds readability rather than destroys it, but it's a different story  for the Strings.

2.1) In the same Data Table view - it is unable to directly edit anything without explicitly going into editor window for each cell with double click...  That's so tiresome and time consuming for large tables. Exception is direct Paste, which however helps little, if each cell is slightly different.

3) Alarms - ID's could not be freely changed...  I see no obvious reason for not allowing to do that because there are gaps still allowed (by deleting some alarms in the middle) and no automatic reordering of ID's is then happening. Of course it does not change much, but adds to the overall order and clarity of the project. Thus why not allow to change them freely, of course, with checking for duplicates.

3.1) Alarms could not be moved around (between groups for example). Took me few weeks to reorder entire system of 100+ Alarms...

4) Ladder function could not be duplicated, like almost anything other could.

5) The XY Plot is wrong type of thing, or at least I need a different flavor (see attached pictures):
a) XY_Beijer is the reference - a single clearly visible point of arbitrary size is drawn for each feed in data sampler; the lines referencing these point(s) to the X and Y axes are drawn (switchable on/off); the background where any arbitrary function could be drawn or at least a clear background where any arbitrary picture could be put into (switched during runtime, not statically linked);
b) there is always a cause - see the Weather_compensation;
c) and a workaround - see the Comfo_Uni which is far from ideal, but at least works, somehow...
Why all of this - I was asked to implement Comfomatic (Weather compensation for central heating) functionality as addition to primary functionality. Typically it is done in special hardware like Danfoss ECL series controllers, however the underlying mathematics is rather simple, so why not.... It worked out - making a usable user interface is a major pain on the Unistream platform....
d) of course in ideal world, I'd be asking the Unitronics team to implement the entire functionality in specialized function block, both for GUI as well as for Ladder, however I understand there are so many uses for these PLCs that implementing separate function block for each of them would lead to the same clutter which was seen in VisiLogic series software and which the Unitronics guys were presumably trying to avoid in Unistream. 
e) and there is always a workaround of the workaround - or better, I call it suggestion 2: The the simple Canvas control could be added to the GUI section - thus allowing users to draw whatever they need to solve such challenging tasks... (or if the screen is already a canvas itself, then at least allow to draw some primitives - dots, lines & rectangles from the Ladder (yes I know there is a Line element in GUI, but it is static, you can not even put a variable as its X1,Y1 and X2, Y2 points... thus it's unusable).

6) Each MODBUS target has the Modbus Remote Slave structure attached. This structure has very useful variable 'Fail' within it. It could be ideally suitable for checking for communication problems, and throwing Alarm to the user if any. But what's next - user cannot clear the alarm, because there is now way to drop it to the zero (I mean, there is no way to write 0 to this structure). Yes, of course there is again a workaround - copy the contents to another variable and then compare to it, not the 0, But why always a workaround? Why not do the things right the firsthand.

7) I'm still begging for ability to reorder members of the struct, like it's done in SMS Message composition with the List Of Text Variable - simple control to move members up and down. It has no meaning while the project is little and simple, but when it becomes large enough, when various functionality is added to different parts all the time, when structs determine what is written to different tables back and forth, then keeping various recent additions together with their primary counterparts rather than at the end of the struct, could be soooo meaningful. At present its a tremendous and very time consuming job to reorder the structs, by renaming and replacing every single appearance everywhere, when it could so easy be made to happen automatically. Not to mention, that is so easy in plain C, just cut one and paste above each other...

Many thanks for the product already that great (light years away from said Vision or Samba), but of course, any improvement would be warmly welcome.

P.S. Please double-check the communication with Cinterion BGS2T modem - it tends to drop from time to time (worse with USB-COM, better with UAC-01RS2, but still not ideal) and then it's unrepairable till the next complete reboot of the PLC... (re-initialisation has no effect).

XY_Beijer.png

Weather_compensation.png

Comfo_Uni.png

  • Like 1

Share this post


Link to post
Share on other sites

wow, that's a comprehensive list. I'm still petitioning for: alarm suppression per alarm instead of per group, MODBUS mixed R/W function compatibility with Vision, and I miss the drum sequencer found in Vision. I agree the Unistream line is amazing, just find it odd that it wouldn't/ couldn't replicate all the features found in Visilogic plus all the "not possible in Vision series features". Yes I know the Unistream platform is Linux based and I'm sure this presents some significant differences from how Vision does all it's stuff. Linux platform has a lot of modules preconstructed like VNC and MODBUSlib which I'm sure equated to developmental time savings. And yes: I know there is potential to self construct all types of custom functionality with UDFB's etc... but as a ladder programmer (no C+ code knowledge) I am looking for time savings with FB's (which Vision is loaded with). Now we find ourselves with wishlists. All in due time hopefully :-)

Just having our input reviewed directly by the R&D team is awesome. With most other brands these things aren't even open for disscussion. 

Share this post


Link to post
Share on other sites

1) We already aware of that, and it will be fixed on next version.

2) OK. Strings will be left aligned

2.1) The original behavior was editing with a single click, but since you can now select ranges, and then export / import to CSV and Copy paste it, then a single click would not work (Because it would prevent selecting a range)

4) You can export and import a function.

7) Might be added in the future.

Share this post


Link to post
Share on other sites
On 12/31/2017 at 7:04 AM, Saragani said:

2.1) The original behavior was editing with a single click, but since you can now select ranges, and then export / import to CSV and Copy paste it, then a single click would not work (Because it would prevent selecting a range)

Nice to know the reason behind it - so let's do it the way it was designed - external edit (in Excel for example) and group (range) paste, no problem for me.

On 12/31/2017 at 7:04 AM, Saragani said:

4) You can export and import a function.

Yes, I know. But it is a lot slower than simply duplicate. Actually, I assume, nothing should be checked by the internal logic at this simple yet powerful step (I mean duplication), because there is no reason to have two exactly similar functions - the duplicate function will be modified by user to some degree anyway (in turn eliminating anything that should not have exact duplicates).

Share this post


Link to post
Share on other sites

Btw, I have greatly improved the export import speed of functions / screens etc.

The export itself would now take about 3rd of the time it would normally take, so it is less slower. Please check on the next release and tell me if it improved it by much for you.


We will consider having a Duplicate Function in the future.

Share this post


Link to post
Share on other sites

I can relate to item #3. Things get a little wonky when you start deleting and inserting news alarms. I know, I know, you should have a list of every alarm in a logical order before programming... however sometimes things change/evolve or you have the inevitable programmer who just "free styles".  Another far out wish would be to see direct alarm to email generation. I've built out ladder to pair emails to alarms ENTERING and EXITING active states. It's not that it's difficult, just time consuming. Drive behind the majority of my feature suggestions is purely based on time savings for the programmer. The Unistream sales literature uses "50%" less development time" phrase. I really couldn't begin to personally quantify the time savings into a percent. Is it better than everything else I've used, YES, hands down. Kudos to UniT for that. The world will always want: bigger, better, faster, more.

Share this post


Link to post
Share on other sites

Each tag that you create in the Global tags, has an absolute address. Passing something by reference means that the function which gets it, gets the address of that tag.

Passing something by value means that not the address, but the actual value is being passed. 

In the "Increment" element, although the number is being passed at the left side, it is being passed by reference, since an increment is being done on the tag itself.

 

When you write your own UDFB, then numbers and bits that are being passed as Function-In, are being sent as values. Meaning, that if you pass a number as function-in, and then for example increment it inside the function, then after you exit that function, then you should see that the value was not changed.

Arrays and Structs that are sent through a Function-In, are being passed by reference, so if you increment a number inside a struct or array, then it will affect the global tag.

You can also pass a number or a bit as a function-out, and then it is being passed as reference.

 

Strings, as much as I remember, are being passed as reference. (You can check it)

Share this post


Link to post
Share on other sites
13 hours ago, hotwires said:

I can relate to item #3. Things get a little wonky when you start deleting and inserting news alarms. I know, I know, you should have a list of every alarm in a logical order before programming... however sometimes things change/evolve or you have the inevitable programmer who just "free styles".  Another far out wish would be to see direct alarm to email generation. I've built out ladder to pair emails to alarms ENTERING and EXITING active states. It's not that it's difficult, just time consuming. Drive behind the majority of my feature suggestions is purely based on time savings for the programmer. The Unistream sales literature uses "50%" less development time" phrase. I really couldn't begin to personally quantify the time savings into a percent. Is it better than everything else I've used, YES, hands down. Kudos to UniT for that. The world will always want: bigger, better, faster, more.

I agree so much to you, 'hotwires'! Having everything pre-planned is one thing, having to modify the project from one (mostly similar) site to another "just by little" is another story. 
Currently I'm that far from original now, that I was forced to write entire HAL (hardware abstraction layer) to separate ever changing IO from base functionality. I hope, at least some will understand what that means to Alarms base.

And, yes - having the Alarm system that sends e-mails or SMSs is another pain in the ... . I have currently written SMS system that has every alarm (>100) duplicated to it in all three languages (user configurable per recipient) with user configurable recipients base of up to 5 numbers.... "It's not that it's difficult, just time consuming". Thus having single place for configuring alarms both for on-screen display and distribution (via SMS & e-mail) would again improve productivity.

Share this post


Link to post
Share on other sites
On January 2, 2018 at 3:27 AM, Saragani said:

Each tag that you create in the Global tags, has an absolute address. Passing something by reference means that the function which gets it, gets the address of that tag.

Passing something by value means that not the address, but the actual value is being passed. 

In the "Increment" element, although the number is being passed at the left side, it is being passed by reference, since an increment is being done on the tag itself.

 

When you write your own UDFB, then numbers and bits that are being passed as Function-In, are being sent as values. Meaning, that if you pass a number as function-in, and then for example increment it inside the function, then after you exit that function, then you should see that the value was not changed.

Arrays and Structs that are sent through a Function-In, are being passed by reference, so if you increment a number inside a struct or array, then it will affect the global tag.

You can also pass a number or a bit as a function-out, and then it is being passed as reference.

 

Strings, as much as I remember, are being passed as reference. (You can check it)

I've got my head halfway around this. Guess you'd have to draw me a picture (joke). barrier is still in terminology. i have a fair grasp of hardware and the architecture of data processing. programming launguages not so much, to many dialects/flavors out there. Pyrhon and PBASIC are only ones I ever actually wrote anything in (and it was nothing vast). 

I recall Dan Logee explaining the UDFB (local, Function In, and Function out) tags were processed in RAM and never occupied EEPROM (non volitile) memory until outside of the UDFB's process. Is this in anyway analoguos to "passing" by reference versus value? To me passing rapid change in velocity to overtake another automobile on the roadway. or please pass the carrots, or passing a kidney stone. The English langauge is riddled with abiguity :( 

Share this post


Link to post
Share on other sites

OK, lets try explaining it differently.

A function is just a piece of code (instructions) in memory. Lets say that I have a function called Foo(int32 A, Int32 B);

When I call the Foo function with lets say A = 1, and B = 2, and the computer pushes to the stack the number A and the number B.

Then the function pops B and A from the stack (it knows that it has 2 parameters, which each of them is 4 bytes). In this case, the values 1 and 2 were placed in the stack. This is sending something by values.

Now if inside Foo, I change A or B, then it won't affect the Tag that was originally sent.

 

Now assuming that I pass something by reference...

Lets define A and B.

A has the value 1 and B has the value 2,

A is placed (for example) in absolute address in RAM at 0x1000000

B is placed (for example) in absolute address in RAM at 0x1000004

 

Now, lets define Foo differently. Foo(by ref int32 A, int32 B).

When I call Foo, the computer pushes to the stack 0x1000000 (address of A), and 2 (the value of B).

Then when the function starts, the computer (the code) pops the value of B, and then the address of A. The code knows (by the signature of the function), that 0x1000000 is not the value of A, but that is the address.

Now if I write A = A + B, then the computer would go to the address 0x1000000, take the value from there, take the value of B, add them, and then go to the address 0x1000000 and place the new value (in this case, 3) in that address.

Now, because we overwrite the value that sits on 0x1000000, then the value of A outside of the function was also changed.

 

The address of A is called a Pointer.... because it points to an address in memory.

Share this post


Link to post
Share on other sites

Dear Saragani,

I am reading this topic and I want to be sure that I understood what you mean (and I have a request); for example I have 2 global variables int A and int B and I create an UDFB that accept 2 function_in variables (inside the function the global variables don't be present) then the UDFB will work as:

void UDFB (int X, int Y){

X=X+Y;

Y = X+Y;

}

in this case the passed variables A and B will not change because they were passed by value and not by reference....right!?

That I know if I want change the value of a global variable, that still be not present inside an UDFB, I have to use a function_out variable...that will work as:

int UDFB (int X, int Y){

return  X+Y;

}

in this case if I use as function_in and function_out the same variable this will be affect by the UDFB operation...right!?...maybe not with the "return" instruction but with many pointers as the function_out are.

Otherwise...how I can pass a global variable by reference as:

void (int &X, int &Y){

X=X+Y;

}

Then without function_out but that will have affect for the passed global variables?...I hope that my explanation is clear.

Share this post


Link to post
Share on other sites
6 hours ago, ORSO2001 said:

Dear Saragani,

I am reading this topic and I want to be sure that I understood what you mean (and I have a request); for example I have 2 global variables int A and int B and I create an UDFB that accept 2 function_in variables (inside the function the global variables don't be present) then the UDFB will work as:

void UDFB (int X, int Y){

X=X+Y;

Y = X+Y;

}

in this case the passed variables A and B will not change because they were passed by value and not by reference....right!?

 

Yes, both X and Y will not be changed.

Strings, Arrays and structs are always passed by ref (with pointers).

 

And you are also correct that the function out parameters are passed as pointers (Functions are currently always returning void).

If you want to affect a numeric tag or bit tag in a UDFB, then pass it as function out (or pass it with a struct, it that makes sense in the UDFB. For example, a UDFB that handles PID, then there is some logic to pass the entire PID struct, and not 20 tags inputs and outputs of single tags inside the PID struct).

 

"in this case if I use as function_in and function_out the same variable this will be affect by the UDFB operation...right!?."

Well, when you define it as function-in and function-out, then you will have 2 different tags in the UDFB, for example: _a_IN, and _a_OUT.

If you only change the value of _a_IN, then it won't affect the global tag. The UDFB doesn't know that _a_IN and _a_OUT are the same tag, since one come from the stack, and the other one from the RAM by pointer. Furthermore, in one call I can call Foo(A, &A), and in other call (A, &B).

 

I've read your post, but I'm unsure that was the request. It is passing a numeric tag as function in, but choosing if they are passed by value or by reference?

 

Share this post


Link to post
Share on other sites

Dear Saragani,

Quote

If you want to affect a numeric tag or bit tag in a UDFB, then pass it as function out (or pass it with a struct, it that makes sense in the UDFB. For example, a UDFB that handles PID, then there is some logic to pass the entire PID struct, and not 20 tags inputs and outputs of single tags inside the PID struct).

Yes of course.

Quote

Well, when you define it as function-in and function-out, then you will have 2 different tags in the UDFB, for example: _a_IN, and _a_OUT.

If you only change the value of _a_IN, then it won't affect the global tag. The UDFB doesn't know that _a_IN and _a_OUT are the same tag, since one come from the stack, and the other one from the RAM by pointer. Furthermore, in one call I can call Foo(A, &A), and in other call (A, &B).

yes of course...and ok you answered at my question...if the function_out is managed by pointers is like passing the variable as reference:"Furthermore, in one call I can call Foo(A, &A), and in other call (A, &B).".

regards

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×