Logic Builder Troubleshooting

Logic Builder Troubleshooting

Below are common issues customers come across when it comes to Logic Builder programs. We recommend you take a look at the following issues and see if any of them resolve your issue. If you happen to see a different error/issue, go ahead and email us.

How to find error

First, the user has to know what kind of error they have in order to know how to resolve their issue.

To find routine errors

  1. Navigate to the target that the program is running on and that is having the issue
  2. Open Logic Builder programs (You'll see red "0" on the program, indicates program running on nothing when should be)
  3. You can also go inside the program to select "Tasks/Programs" to open the slider to select "Tasks"
  4. There you will see the task summary as faulted and main routine failing

  5. You can also see it if you go to the Show All Targets. Now you can look below on the issue regarding routine error to resolve this.

To find program errors

  1. Navigate to the target that the program is running on and that is having the issue
  2. Open Logic Builder programs (You'll see "Error" on the program, indicates program error)
  3. You can also go inside the program to select "Tasks/Programs" to open the slider to select "Programs"
  4. There you will see the program is faulted. You can then look below on the issue regarding program error to resolve this.

To find variable errors

  1. Navigate to the target that the program is running on and that is having the issue
  2. Then select Tasks/Programs to open the slider to select "Tasks"
  3. Once there, the user will see all the variables they have in the program and display a varErr. They can select it to see what the error is.
  4. Once the user has the error open, they basically want to look at the beginning part to see what the error is and find that below in the issues list.

Issue 1: Routine Error

When the user checks what the program is running on, they'll see the below error that says something like "1 routine err". This means the program is failing on a particular routine. The cause can be empty value fields like below, so make sure to check the program thoroughly for any empty value fields to resolve this. Another reason can be mismatched tag types. For example, in the DB Builder a tag/point can be a string, but was added/configured as a number in the program. Make sure the types match.

 

 

Issue 2: Program Error

If the user sees "Error" on their program and when opening up see a "Program has errors show details" message, then their program isn't running at all. This is due to misconfigured value field property on a block. For example below, we didn't specify frequency unit like sec/min/hr etc on the condDelay block. Basically to resolve this, look through each block and make sure all is set properly. Advanced users can look at the show details and try and see if they can figure out what the error is saying so that they know where to look.

  

Issue 3: Variable Error

This can mean multiple different things. We'll look into each one below.

  • controlExt::VarBindingErr

  • haystack::UnknownRecErr
  • folio::CommitErr: Cannot update persistent tag transiently
  • multipleBindingMatches

controlExt::VarBindingErr

If it is a "VarBindingErr" error, then it means that the point(s) binding in that particular target that is throwing the error does not match the point(s) in the database when the program was made. To resolve this, the user has to either 1) make sure the point in DB Builder matches the binding in the program or 2) modify the point binding in the program so that it matches what the point has in DB Builder. Keep in mind doing #2 will affect the rest of the equip targets the program is running on if it doesn't match there either. Basically resolve this, you just need the point binding to match what you have in the database. If you have multiple of these var errors, then you have multiple points you'll need to check the bindings on and cross reference what you have in DB Builder.

Example Vav-02 is throwing a var error. So we select it and look at the point variables we have in there. In this case there is only one (Room Temp), we select to edit it. Then look at the binding. It looks like it has "foo" tag in it as well when our points in DB don't have that. To resolve this, we can either remove "foo" from the binding or tag all of our points in the database with "foo" and it'll work.

   

haystack::UnknownRecErr

If it is a "UnknownRecErr" error, then it means that the point(s) in that particular target that is throwing the error does not have those points in the database. This particular case may or may not be an issue depending on what you're doing. There are some cases where you want want to run some logic that applies to multiple equipment, but not all have the same points, which is fine. However, if they all should have the same points, then you need to make sure you add those points in DB Builder to those equips throwing the error to resolve this. Then once the points are added, the program will just work, give it a minute to refresh itself or resave it.

folio::CommitErr: Cannot update persistent tag transiently

If it is a "Cannot update persistent tag transiently" error, then it means that the user has created some tags they wish to write to and added them to the program to use. In FIN 5.0, it is now recommended to let the program add the tags automatically instead of the user adding them manually through DB Builder/Folio. This all has to be done transiently now. To resolve this, the user would just delete the tags they added in DB Builder to use in the program and let the program create them. Once deleted, the program will create them automatically.

multipleBindingMatches

If it is a "multipleBindingMatches" warning, then it means that the variable(s) binding for that particular target is returning multiple points that match that filter. By default, system picks up the first available result out of the list of sorted matches. To resolve this, make sure to edit the binding for this variable if you wish to have a more accurate match.

Example The "random point" variable below has a binding of "equipRef == $id" which resolves to multiple points. In this case, this would return all the points on that target. We need to update that binding to return a specific point we want to reference. It can be something this to include the navName of that point so that it is specific: "equipRef == $id and navName=="Random Point"". We can also include tags instead that are found on that point such as: "equipRef == $id and air and discharge and damper". It can be anything you like, just need to make sure it resolves to one point not multiple.