• Content Count

  • Joined

  • Last visited

Community Reputation

0 Neutral

About burt4munger

  • Rank
  1. burt4munger

    MODBUS Address control?

    Ah, this will work great! Thank you!
  2. burt4munger

    MODBUS Address control?

    So i have read and understand the various permutations on modbus addressing, that is, 0 based, 30-40000, and 50000+ (i am ignoring the 400001 ones). My system has 5 or 6 modbus devices from different manufacturers, and I have had DAQFactory using some 42006 kinds of addresses, where I think it is subtracting stripping the 4 and subtracting 1 before it sends the address down the wire, and all was well. Now, I have a device that seems intent on wanting the 0 based addressing, and fails access to any any addresses until I use the "write to a modbus address over 50000" trick to force the scheme back to a 0 index approach...then the new device works fine, but all the other addresses are now off by one. I really don't want to have to go and find all the locations that specify modbus address constants and subtract one from them, because i will have to go back and test each and every different system to make sure it still works. Is there an explicit control of the scheme, so that I can specify which address mode to use for a given device access? What i see now is even for testing, if I read an address over 50000, the mode changes to 0 index, all the prior devices begin to fail, and the only way to change it back is to restart the program. this fails, until I read an address over 50000, then this works fine, but other addresses like 42006 start failing ?device.plc1.ReadHoldingFloat(17,28673,1) P-ModbusRTU 0002: Illegal Data Address
  3. A windows 10 computer I have running two large DAQFactory programs is crashing in about a week due to memory running out and windows crashing (the bluescreen says) The only real applications running are two very large DAQFactory programs (and SQL Server which is known to be a memory hog but i don't think it crashes windows). I suspect the issue is likely something I'm doing, like a db.open without a matching db.close in a fast loop somewhere so I'm already looking for those. Are there any hints where to look or tools built in that might help with this? Has anyone seen issues continuously writing large amounts of debug text to the command window? I looked elsewhere in the forum and there was only one pretty dated article dealing with memory issues.
  4. When DAQFactory is in development mode, the ctl file name is in the window title. Once DAQFactory is changed to runtime node, the title only says "Runtime", no file name anymore. I'm using the window title to change between instances to prevent one from getting "too much control", ie spread out single point failure. Is there a way to get the title bar to show the file name in runtime mode, or does someone know of a way to switch from one instance to another from within DAQFactory? (I'm trying not to expose the windows task bar to the user).
  5. While regular sequences will update both the Watch pane and the Command window with variable values and the result of debug statements like ?"message", if a class function contains one or more delay(n) statements and is called from the command line in the command window, no debug statements are written to the command window and the watch pane does not update until all of the delays have completed and the function has terminated, making it quite hard to debug certain sequences. The class function with delays will update the debug statements and command window if called from another sequence, but that makes it to directly test class functions. I've attached an example. Running init will update the command window and watch pane (you have to put ElapsedSecs and Test.ElapsedSecs in to watch), but if you then invoke test.testupdate() from the command line DAQFactory will freeze until the function completes, as if no other system display updates are being processed during the delay() call (like a tight loop with no delay would do), but then the results will be updated. Suggestions for a work around or can this be fixed? DisplayTest.ctl
  6. If you have a display component to which you've added a property "index", and the component strexpression is the value of an array at index: test[index], the displayed value works. If you add an quick sequence action that uses the property index, that works: system.messagebox('Your value: " + doubletostr(test[index])). However, if you try to use the set to action just before the messagebox and to set the value using: test[index], it doesn't work, but of course it does work if you make the set to action use a literal number: test[2]. This is a problem because I'm creating a large page full of similar components that act on arrays, and if each component does everything based on its index property, duplicating it and just setting the new index value makes it do everything without clicking through all the panels updating an index value. That said I worked around this by not using the set to action, and just putting a system.entrydialog in the quick sequence section. But it is a bug, even if a little one!
  7. There is a message box font control, and that worked. Trying an approach like SteveMyres suggested, I created a class of arrays with both a string message and a string to feed execute(), and a specific init() to set all the strings up, then the modal popup button called it with an index to put up the next message and then execute it's related code to set up the next step and/or test error conditions and that worked pretty well. It started getting too complicated once it needed to branch on the test result to different steps,etc, so I just went back to the system.messagebox with a huge font.
  8. I'm prompting a user to take multiple steps, with a message in between where he indicates "OK" that the step is complete. The system.messgebox works fine for this; the sequence waits until the operator clicks ok, then proceeds to the next step. The problem is, on a tablet interface, the messagebox font is too small to read more than about 6 inches away. I've tried using a modal popup page with much larger font to accomplish the same thing, but the underlying sequence will not wait on the modal popup to be closed. So, it looks like I would have to build a state machine or some special queuing mechanism to accomplish the same result, with flags to cause a sequence delays until the operator closes the window, which signals the mechanism, etc.. I'm hoping there is some easier way to do this. As I mentioned, if I could control the font in the messagebox, that would work. Are there any other (easy) ways to accomplish this?
  9. I understand, but the annoyance of an error message telling me to define a variable is very small compared to the annoyance of trying to track down a typo in thousands of lines of code by the operational failure symptom it causes. As a coding practice, I could avoid that error message by defining the variable before I write code using it, not a bad idea anyway. Back in the MS Access days, you could set "Option Explicit" to enable this behavior, which forced explicit definition of all variables. You could leave the default operation for DAQFactory as is, to make it easy for the new guys. I have spent many, many, many hours trying to track down a problem only to find it was a misspelled variable. I hope this function will percolate to the top of the new features list! Please!
  10. By far, the most time I spend debugging is tracking down variable names with typos, or if I risk changing the name of a variable later to something more useful, like changing Duration to DurationHrs, making sure that all the instances have been updated is a huge issue. I have to export all the sequences to a big text file, hunt for all the old name, find it, switch to the real sequence and update. If I miss one anywhere, the program will just run and not set it. why won't either the compiler or the run time be made to fail for this: global test1 = 0 global test2 = 0 try test1 = 1 ?"test1" test3 = 1 ?"test2" catch() system.errormessage(strLastError) endcatch this just runs with no indication that anything is wrong, and can be horribly hard to track down. Of course it is harder if you have something like Duration and type Duraton somewhere. really hard to see and no way to hunt it down. Why again can't the compiler compalin (sic) that an assignment is being made to a non-existant (sic) symbol?
  11. burt4munger

    Deleting Components

    I am running 5.90 2183, the list of components does expand under the page name, the duplicate name is not shown twice in the list. Using the compiler helper for component.item.property in the command line, I can see two of each property choice in the list. If I delete the item that is visible in the symbol tree (and that I can see on the page), I can still access the other mystery component.item.positionleft etc and set the coordinates to an area I can see, and set the visible property it does not appear. So it is somewhere in the system, but not in any of the page list symbol trees.
  12. I'm building a page with 24 cells, and have written a sequence that adjusts the spacing of cells 2-24 based on position of cell 1, since the components are all named with a cell number suffix and are created by duplicating the cell 1 component with the ctrl-D function. Mostly it works, but somewhere along the way some duplicate cell 1 components were created but they are not visible on the page, even after setting the coordinates to valid values and making sure the visible property is 1. Is there a programmatic way to delete a component? I think I remember that the answer has been no, but just wondering if there might now be some way to get rid of unwanted components that can't be picked.
  13. Please let me know what I'm doing wrong here. I want to have the equivalent of a 2d array, but with named dimensions so instead of having parent[3][2] references I would have parent.marklist[3].marks[2], where marklist and marks were their own classes: class cChecks local marks function init() private i for (i = 0, i < 10, i++) marks = 0 endfor endfunction endclass class cParent local marklist function init() private l for (l = 0, l < 10, l++) marklist[l] = new(cChecks) marklist[l].init() endfor endfunction endclass global Parent = new(cParent) Parent.init() private i private j for (i = 0, i < 10, i++) for(j=0, j< 10, j++) Parent.MarkList.marks[j] = j endfor endfor ?Parent.MarkList[3].Marks produces 9 not {0,1,2,3,4,5,6,7,8,9} as expected. If I manually assign values, like Parent.Marklist[3].Marks[5] = 32 it will work. It seems like using class references with two or more [] in a line is having a problem. This also seems to appear calling a class function with an array reference topclass[x].myfunction(something[index]). This is all with version 5.90 build 2151. What am I doing wrong?
  14. If you create a component, say a panel, then duplicate it 10 times, group it, duplicate that group a few times, then group the entire thing, and finally ungroup the whole thing, the workspace tree disappears. Moving around a lot of panels on a summary page is a likely use of this feature.
  15. burt4munger

    Labjack Ei1050 T7 Ljm Example Code Anywhere

    Survey sez: Pretty old firmware was it. I took it out of the box new a week ago, and firmware was as you said 1.0017. It upgraded quickly and easily to 1.0071, and immediately worked after that with device.LabjackM.eReadName("", "SBUS3_TEMP").