Revision: 8
- Added SecsSince1990() function.
- Added instructions TriggerSequence() and WaitTriggerSequence()
- Added AcceptDataRecords() instruction.
- Added Terminal command 'W' to snoop on a comport (ESC or 40 second timeout will terminate the command).
- Added FindSpa(SoughtLow,SoughtHigh,Step,Source) function.
- Added MessagesEnable.
- Added Conditional compilation with #if, #elseif, #else and #endif. All expressions must evaluate to constants, but can use constants already declared.
- Added Predefined Constants: CR1000, CR3000, CR800, CR5000, and CR9000X. Also added predefined constant LoggerType that will be set to the same value as the corresponding constant for the respective logger type. This allows the conditional compilation to work across logger types (one program can run in multiple logger types). Example: #if LoggerType = CR3000 const MYRANGE = MV20 #else const MYRANGE = MV25 #endif)
- Added FileList function.
- Added FileCopy function. Works like FileRename (when different drives are specified), but the source file is not removed.
- Fixed GetRecord() when there are no records stored in the Data Table source and when one or more of the fields in the Data Table are of type String and when the destination array is not of type String. In this case, GetRecord() writes beyond the bounds of the destination variable array.
- Changed RealTime(X) to allow X to be declared as type LONG.
- Changed Round() function to be perfectly symmetrical.
- Fix WindVector using aliases.
- Added checking in WindVector of NaN due to sqrt of very small numbers < 0.
- Changed GetDataRecord() to accept a large (>1000 bytes) record.
- Changed SerialOutBlock so that when using SDM-SIO1 it can run in the digital task sequence along with other SDM instructions.
- Changed NSEC data table field so that if the source is a float, it must be dimensioned >= 7 to avoid using incorrect values for the source.
- Changed SerialClose(comport) in the case that comport is a TCP socket, in which case it will close the socket instead of corrupt memory.
- Changed GetRecord to give out of bounds warning, and not proceed if destination array is not large enough to hold data.
- Added a method to access data via a time stamp instead of record number. In GetRecord(Dest,TableName,N) and TableName.FieldName(M,N), if N is negative, it references a timestamp of Secs Since 1990.
- Fixed Replace, Mid and other string functions when one of their parameters other than the first is an expression that includes a string function.
- Fixed the CHR so that it does not use excess memory.
- Fixed TimeIntoInterval() in the case when the clock was set backward the function returns true on the first instance of the time into the interval is TRUE.
- Changed SerialClose() so that if the comport is Com1..Com4 it will remain active for PakBus communication.
- Fixed comms instructions (PakBus and ModBus) to return a correct result code if the parameter included a variable index into an array.
- Change SendData, and SendTableDef to send the non-hidden id mapping if the special string ".secured" is found after the tablename. This allows users who want to allow some users to see tables and others to not see tables (via security) to still be able to use SendData. If the .secured is not present then sending a hidden table results in a compile error. The user is responsible to program the correct PakBus address so that the table definitions LoggerNet has match up with the mapping used (e.g. If using .secured then LoggerNet should have security enabled when it retrieves the table defs).
- Changed Network(ResultCode) instruction so that ResultCode can be of type LONG.
- Fixed Move() instruction to work when the destination array overlaps the source array.
- Fixed vibrating wire with reps > 1 and reps delay > 200mS. The task sequencer was using a loop to do the delay and the same loop counter for the reps.
- Changed EmailRecv filters to ignore leading spaces.
- Fixed SendData() when sending the Public Table to send the correct table id.
- Changed DNP3: 1) fixed the problem during server shutdown and restart 2) fixed a bug for drop application layer packet. 3) separated link layer and application layer to different tasks 4) fixed bugs for new 300 packet version. 5) fixed memory leak 6) fixed event callback 7)Fixed communication issue with keepserver 8) fixed write problem 9) prevented losing events sometimes 10) removed timeout for linktimer when application packet comes in. 11) fixed a bug for converting floating 0 to double 0.
- Changed PPP so that if the comport interface or the user name or pass word are changed via program control, do not recompile.
- Changed PPP IPCP so that if we have not obtained a peer IP address by the time we bring IPCP up, we set the peer address as the same as our own. This allows us to connect with a new network that was previously un-connected.
- Changed PPP connection initiation so it no longer waits until program compile is complete.
- Fixed PPPOpen() so that it allocates the right amount of memory for itself.
- Improved TCP/IP and PPP: limited the number of packets allocated for incoming data. If too much coming in, it throws it away. Previously, if all of the packets were used the internal function panic() forced a watchdog.
- Improved PPP connect negotiations by removing check for loop back on Magic Number NAK's.
- Improved TCP and PPP shutdown before OS recompile.
- Improved PPP dialing so when changing PPP dial and/or dial response via SetSettings(), if both the current and the new are not NULL, then do not force a recompile.
- Fixed using PPP on com1..com4 such that re-compiling will not disable the control ports being used as a comport.
- When changing PPP or IP settings via DevConfig, disconnect PPP before recompile.
- Changed PPP and DialCallback() dialing so that ';' in the DialString following a ';' adds a 1 second pause.
- Changed dial string in ModemDial(), ModemCallback, PPP such that if it is not prefaced with "AT", then preface with "ATDT" instead of "ATV0;ATS7=180;ATDT".
- Fixed measurement issue when running in sequential mode and making measurements outside of a Scan..NextScan in a slow sequence. Occasional NAN's showed up in the measurements because Analog Power was switched off. The problem only showed up in the CR3000 (because of the additional speed).
- Fixed PeriodAvg measurement to avoid conflict if timeout occurs at the same instant that the number of cycles are measured. If both occurred simultaneously there was a chance that the task sequencer could be called twice when it should only advance once. This could cause memory corruption or timestamps to advance incorrectly.
- Stopped slow processing when pausing program execution (stop without deleting data). If slow sequences were running in a loop and not in a scan..nextscan they were not stopped, only the scan was stopped.
- Fixed slow sequence skipped scans getting incremented when the main scan stops due to running its required number of scans.
- Fixed PipeLine mode background slow sequence not getting shut off when there was not enough time for the slices to be done. The warning message was correctly displayed at compile time, but when the scan started the slow sequence was not correctly getting disabled. In the case tested this resulted in the first measurements of the main scan returning erroneous values. This was only an issue if you received the warning about background calibration being disabled.
- Change AutoRange measurements to delay the user specified settling time prior to the range determining measurement and then again prior to the real measurement. The exception to this is when doing Reps on the same channel with auto-ranging. This case gives about 450uS between range determining measurement and the actual. The user settling time for reps on the same channel (channel < 0) determines the sampling interval. This functionality is maintained for auto-ranging.
- Fixed sampling interval (set with the settling time parameter) for reps on the same channel when doing 1/2 cycle integration (_50Hz/ 2500mv or 5000mv and _60Hz/ 2500mv or 5000mv). The delay between measurements was not correct. Also fixed reps on the same channel for reverse excitation and reverse differential measurements.
- Changed excitation shutoff after bridge measurements. The excitation is set to zero (while still selected) wait 10 uS then de-select the excitation. Previously, the excitation was de-selected then the DAC was set to 0. This allowed the external excitation to float (or be pulled if loaded) down. This change was made to avoid asymmetry of excitation for bridges.
- Fixed Pipeline mode slow slicing problem where measurements were still being sliced when the fast scan interval was due to start. This caused memory corruption.
- Removed AC excitation asymmetries which resulted in certain sensors being polarized.
- Fixed calling subroutines with a variable indexed string array.
- Fixed comms instructions when called from a subroutine running in a different sequence than where they are declared in the program.
- Fixed IfTime(), WorstCase(), and Timer() functions to use the correct timestamp when called from a subroutine.
- Improved wizard for FieldCal: if reps is a constant it must either be 1 or the size of the measurement array for wizard to work properly. Other size will now give compile error. Added checking to make sure valid options are used for FielCalStrain.
- Updated Custom menu: 1) don't leave '>' at end of line, if no sub menu, when scrolling. 2) Fixed mode -3 to not show the initial screen at startup. 3) Fixed to correctly show long strings in pick lists. 4) Improved to allow variable names to be string variables.
- Changed TableFile 1) make sure the card bytes free is correct before verifying that the files will fit. 2) initialization of the current file number when first starting up is fixed. 3) When time to output and no records have been stored,don't create empty file and return 0 in result param.
- Fixed ModBusMaster was using wrong baudrate when the comport is a variable. - Improved ModBusSlave: 1) Skips servicing any requests during program compilation else we could get Variable out of bounds errors. 2) Optional start register offset is initialized correctly at compile time if possible to initialize (for TCP). 3) Allowed to return an odd number of registers as 16 bit values.
- Fixed SDMSW8A when incrementing the multiplier pointer via the () syntax and not returning the state of the port the multiplier was not "repping". The increment was taking place outside of the reps loop rather than each time through the loop.
- Fixed Terminal TalkThru to SDM-SIO1 comport so that it does not corrupt memory.
- Fixed compiler crash caused by invalid source parameter in SDMCD16AC.
- Changed SDMSIO4 to remain at the same priority level when running the acquisition code.
- Change SDMGeneric to handle destination type string when numvalues > 1 and bytes per value = 1, to not give out of bounds error at compile.
- Changed SerialInRecord: 1) Fixed SDMSIO1 to set filled flag when buffer is filled, previously, would sometimes report erroneously "NO DATA". 2) Fix when both start and end sync words are 0 and when getting most recent record. 3) fixd when SyncChar and NBytes are both non-zero so that records are not missed. 4) When expected number of bytes (or size of SerialOpen buffer if bytes in = 0) is odd. Any SDM input instruction (or another SerialInRecord) that followed one with odd bytes would have a mismatch between where the data was stored and where processing thought it was.
- Changed SDI12Recorder(): (1) store NAN into a string variable correctly and (2) fixed a possible problem on the first measurement if the destination variable is referenced with a variable index into an array. 3) storing into an array of strings fixed to not skip by 4. 4) Storing into a single string changed to store the literal string returned by the Sensor in response to the D! command, excluding the cr, lf terminator. 5) If the command terminator '!' is not present in the command parameter, then a measurement command will not be issued, even though it will still pick up the data when it is due from a previously issued "C!" command. 6) when loading a value that is out of range or NaN load up 9999999 instead of 99999999 (one less digit). This is what the spec requires.
- Changed SDI12Sensor to handle retries of the 'D' commands. This was done by loading up the entire response in a buffer and then returning the appropriate string. Also, improved handling case where requested data is out of bounds of the source array.
- Added REST command support in FTP Server.
- Changed FTP Server to delete a file first before opening it for writing.
- Fixed multiple instances of FTPClient() to work correctly.
- Changed Status SlowScan fields so that"System" scan information is added and the numbering of the Slow Scan info follows the order of entry in the program.
- Changed Status such that if there are no DataTables and/or no Slow Sequences, their respective fields are eliminated.
- Changed Status.CommsMemFree such that the display is LargePktsFree * 1000000 + MiddlePktsFree * 1000 + LittlePktsFree.
- Changed Long &H80000000 (NAN) to be stored as FP2 -7999 instead of 0.
- Changed +INF float to be convert to string as "+INF" instead of "INF"
- Changed Float to Long +INF converts to most positive integer instead of most negative integer.
- Changed WaitDigTrig: 1) don't allow different edges to be used on same port. 2) fixed getting a false trigger when starting up a scan.
- Improved Sampling of TableName.TimeStamp into a field of type NSEC to give the full resolution of the timestamp instead of only second resolution.
- Changed Time of Maximum and Time of Minimum, to use the timestamp of the sequence that calls the table, not necessarily the main scan's timestamp.
- Improved so if out of memory errors occur when creating tables, stopped the task and let software get the error. Don't continue running or system may crash. This will occur if variables are too large to fit in memory.
- Reduced the amount of memory consumed by variable declarations.
- Changed retrieving the Directory via BMP5 such that when small fragments are requested, it only calculates the card bytes free on the first fragment and thus is much faster when a card is present.
- Fixed illegal units declaration from crashing the pre-compiler.
- Changed precompiler to write the tdf file to the same directory as the program file (if using the -z command line option).
- Changed precompiler -l and -z options to accept full path name with files as well as filename only. If only the filename is passed in, it is opened in the same directory that contains the CRBASIC program file.
- Changed UDPDataGram() to work between two dataloggers.
- Fixed PakBus routing to use a Static Route if necessary when forwarding a message.
- Fixed Case statement to work with functions that have string parameters.
- Fixed an erroneous "Variable out of bounds." message when strings are used inside expressions.
- Fixed expression that is Long + String or Long & String.
- Fixed RS-232 power always on setting so that it will, under all conditions, keep the main CPU awake to accept the first incoming characters. This requires more power, but ensures that no bytes will be dropped due to waking up hardware.
- Improved to not require space between If and '(' or ')' and Then. Also applies to While and Select.
- Fixed resolving the type of expressions using only table.field. This was found by DisplayValue when a type other than float was used.
- Fixed spatial instructions, Sample and MoveBytes to work correctly with an array of TableName.FieldName data.
- Fixed const strings. To conserve memory a change was made to release all constant expression memory after the constant was resolved. The problem with this was that string constants were using the expression memory space as the location for the string. A pointer to this location was later used to resolve references to the constant. With the memory freed the desired constant was no longer there. This was fixed by allocating new memory for the string alone, then the string is copied into the new memory and the expression memory released.
- Fixed asynchronous (RS-232, and CS I/O ME) communications locking up. This occurred at high baud rates when comms were disrupted and then reestablished. When processing of packets was disrupted several bytes were received and required processing. Since the packet start was not detected the bytes are processed such that all ASCII chars are sent to terminal mode and non-ASCII cause a new service to be requested. This processing required more time than the 10 mS tick. The fact that the flusher was held off too long caused the input DMA stream to count down to zero, which resulted in an interrupt. The interrupt shut off the incoming stream to allow the processing of bytes to catch up. This all worked fine, but after the error condition caused data to stop, the flusher did not get things going again. Changes were made to reduce the time processing the bytes, but this error condition is still possible. The recovery from the condition is now handled correctly by the flusher.
- Changed return code for file download when disk is full or root directory is full (no more files can be created). The error code will now be out of resources instead of inaccessible file.
- Changed formatting drives and deleting files to nullify the powerup and run file if they are set, but the files do not exist.
- Allowed expressions of length greater than 256 to compile correctly.
- Fixed possible packet leak in DHCP if it has an error condition.
- Changed receiving an OS file to detect wrong type or insufficient memory near the beginning of the download process.
- Fixed router so it does not shut off a comport through which it is routing out but there have not been any in coming packets due to PleaseWait messages.
- Changed Default Settings to restore ComME and ComRS232 to -115200 K baud.
- Improved TimerIO so any non-zero interval < scan interval is now set to a timeout of 1 scan. Previously the interval had to be at least 100uS before it was set to 1.
- Changed TDR100 cable length parameter to accept variables and also to allow "repping" through multiple cable lengths if the () syntax is used with an array.
- Improved checking so when adding a variable it is checked to see if it is already used as an alias.
- Added table definition output command line option to pre-compiler.
- Fixed code that allows for concurrent retrieval of table definitions by multiple clients.
Revision: 7
- Fixed a bug in Select Case which resulted in incorrect evaluation of the Case statements. The problem was dependent on the state of memory.(Significant!)
- Fixed possible source of skipped scans when using SDM instructions, SerialInRecord, or SerialOutBlock simultaneously in multiple sequences. The event used to synchronize measurement and processing in PipeLine Mode was being used in Sequential Mode and slow sequences. The synchronization is not needed in these cases because the acquisition code is called from processing. The problem was that the event was cleared prior to calling the acquisition code. If multiple threads (slow sequences) were using the event the possibility was present that the event could be cleared just after being set and prior to being recognized. This left a thread hanging until it timed out. This caused skipped scans. The fix was to only set and wait for the event if in PipeLine Mode in the fast scan. This added additional checking for the condition. This changed all SDM instructions, SerialInRecord, and SerialOutBlock. (Significant)
- Added AVW200() instruction.
- Added function FileTime(FileHandle). Returns file creation time as seconds since 1990. If the function fails it returns -2^31.
- Added function FileRename(old_fname,new_fname) where the file names are strings. Returns TRUE if successful and FALSE if not. If no drive is specified CPU: is assumed. If the drives are different the file is moved to the new location and the old file is removed. If the new_fname already exists then FALSE is returned.
- Added bit shift operators >> and <<.
- Added a new mode to DisplayMenu to not show the system menu at all. This is done with AddToSystem parameter code -3. Security level 2 is used (same as setting variables from other display menus).
- Added Range code MV2500C (MV5000C in the CR3000) which works like other open detect range codes but sets the excitation to full scale DAC (~2700mv for CR1000, and ~5200mV for CR3000) so that bridges will return a value > 1 if the bridge is open. Also added CR3000 range code MV1000C (sets excitation to ~1200 mV).
- Added a check for empty DisplayMenu ... EndMenu, and empty SubMenu ... EndSubMenu. These were crashing the pre-compiler.
- Added checking of security code before allowing variables to be changed in custom menus.
- Added checking all Table instructions to make sure they are not used in conditional statements. Also, added checking to catch DataInterval occurring multiple times in a DataTable..EndTable.
- Changed Security so that if it is set to -N, then it can be unlocked with 65536-N or with (-N AND 65535).
- Changed Keyboard/Display security so that the Settings can be viewed (not changed) at the same level of security as viewing data tables.
- Allow security parameter in communication instructions to be a variable or expression.
- Fixed http (WebPageBegin/WebPageEnd) set value command when security is active.
- Changed http security to be compatible with PakBus security.
- FTP access to program files is restricted if security is active. Appending Admin to the username and the highest level of security to the password will allow program file access.
- Mapped EX1..EX3 as predefined constants just like VX1..VX3. This matches the labeling on the datalogger wiring panel.
- Changed Timer function to use "system time" as its reference. This eliminates issues with being called outside Scan...NextScan, and being called from subroutines etc., and allows timing within scans (with 10mS resolution) without disabling low power standby.
- Fixed TimerIO edge setup. If setting for falling edge the adjacent channel in the pair shared by the internal register was setup instead of the desired one. The pairs are (1,2), (3,4), (5,6), and (7,8).
- Enhanced Constant Table editing to include Alias declarations.
- Changed Const to release the memory used for the expression after the constant is resolved.
- Changed Data and DataLong to allow expressions. Expressions must evaluate to a constant.
- Fixed passing constant strings in subroutines. The size of the string was not correctly evaluated if it was not a variable.
- When declaring aliases make sure they are not predefined (or user defined) constants.
- Don't increment Pipeline mode background calibration skipped scans while synchronizing the main scan to the scan interval.
- Fixed If statement uninitialized variable passed into expression evaluator. This caused possible varoutofbounds errors if using a variable string in the expression.
- Changed FileManage so if a variable is used in an expression to always evaluate the expression and check the operation. Also, changed checking of Run Now attribute to allow all drives (this fixed a problem where the logger could be left without a program to run).
- Fixed Median with reps > 0. When the end of the table was reached data was being written beyond the end pointer causing possible watchdog errors.
- Changed SendData, and SendTableDef to not be allowed with Hidden tables and to use the mapping of table ids that is sent to LoggerNet rather than the datalogger internal table id. This was required so that LoggerNet would only receive one way data from tables that it has in its table definitions and that map correctly to the id it associates with the tables.
- Fixed a rare memory corruption bug caused by calling memory allocation routine requesting 0 bytes. The memory is checked two ways and if memory lined up just right the allocation of zero bytes caused the two passes to give different results for the number of unallocated blocks. This resulted in a mem fail3 error.
- Fixed file download of OS to handle the case when there is not enough memory to store incoming OS. The memory was 1) being corrupted by the first packet that would not fit, and 2) was not being released after the failure was reported back to software.
- Changed OS shutdown code to make sure pulse width modulation (PWM)is disabled.
- Pulse width modulation (PWM) works with duty of 1.0 and 0.0.
- Removed the edge parameter from the pulse width modulation (PWM) instruction. Not needed because inverting the edge is the same as 1 - duty.
- Changed serial talk-through to not wait the full 100mS for characters from terminal mode. It now polls to see if a character is already present.
- Changed serial talk-through mode to exit after receiving 3 ESC characters instead of 3 characters.
- DNP3 implemented the object 40.4 (double precision), and fix a bug for variable slave address and master address. The addresses were being checked at compile time before they had valid values in them.
- Changed DNP3 to make slave address a variable.
- WebPageBegin/WebPageEnd: Added command=PakBusAddress. This command returns the next PakBus address, equal to or greater than 100, that is not contained in the datalogger?s routing table or neighbor list
- Changed web page functionality to not hard code the content type in the header. This allows other font types to be used.
- Fixed web page functionality to send out head and body tags, without which the Newest Records page will not refresh every 10 seconds.
- Changed SMTP EmailSend so that larger attachments can be sent.
- Fixed servicing multiple sockets using the same protocol (HTTP, TELNET, MODBUS, SMTP, POP3) concurrently.
- Changed FTP Server to be more efficient such that errors writing to slow media due to out of buffer space, e.g., the CPU FLASH memory, are minimized.
- Changed FTP so that it cannot read a hidden file.
- Expanded hidden file support by not allowing a file that is hidden to be open for reading. Previously, hidden files were simply hidden from the directory.
- If the routing table has been reset, then immediately try to find a neighbor on all PakBus TCP connections.
- If a neighbor has not been established on a PakBus TCP connection, then attempt to find one through a Hello Request every 10 seconds.
- Fixed DNS setting entry when attempting to delete existing entries.
- Fixed PPP when it needs to is there a better term than ?throttle down?? large file transfers. Throttle down is pretty descriptive of what is being done. You could say ?hold off rapid transfers? or ?slow down the transfer rate to avoid overrunning???
- If the PPP dial string is PPP, then act as a PPP client but bypass the AT command dialing operation, to be used when the Raven modem is setup for PPP.
- Changed response to FileUpload and FileDownload when the file cannot be opened to "file not currently accessible". Previously insufficient memory code was returned.
- Changed FileClose() to return EBADFP (17) if the file handle is not valid, instead of 0.
- Changed ComME and Com310 set up as PPP to not shut down after timeout when rung up.
- Changed the ^ operator to always return a float even when the operators are longs.
- Changed Ln(X) when X is NaN or X <= 0 to return NaN instead of 0.
- Fixed FileSend() so that it closes the file if the communication fails after a timeout.
- Fixed attempt to read a hidden file so that a file handle is not left open.
- Changed Delay to allow variable for interval if delaying processing.
- Changed removing a neighbor who advertised that a modem was attached to not remove all the other neighbors on the comport.
- Fixed GetDataRecord() to send the correct signature, used if the table id parameter is not or'd with &H8000.
- Changed the response to a one way data packet to ignore it instead of responding with a PakBus delivery error.
- Fixed niche stack domain name look up when the name is longer than 30 characters.
- Fixed SortSpa and Median to deal with NAN's, and +/- INF. NAN will be sorted to the top of the array (most minimum values).
- Fixed PortGet in Sequential Mode in slow sequence.
- Fixed PulseCount memory allocation when using all 10 Pulse channels (2 PC, and 8 control ports), with individual instructions for each.
- Added the CRBasic '&' operator that concatenates strings, which is compatible with Visual Basic.
- Fixed TGA to handle signature of zero with valid data. When good data resulted in a signature of zero the logic to detect the non-zero data was incorrect and resulted in NAN being stored for good data.
- Fixed custom collect of tables when some tables are hidden by returning the correct table ID.
- Don't truncate table names in the tablenames field of the status table.
- Changed Keyboard/Display Realtime Data display to deal with final storage read pointer not on a 4 byte boundary. CR1000/CR3000 can deal with reading and writing to 4 byte values that are not 4 byte address aligned, but the CR5000, and CR9000 crash (watchdog error) in this situation.
- Changed table to table sampling to accommodate the CR9000. The upper bits of a address (pointer variable) were being used to pass information. This will not work in the CR9000 because the upper bits are needed for the address.
- Fixed subroutine passing longs and floats to strings. The conversion to string was not correct.
- Fixed converting parameters of different data types when entering subroutines. Since the parameters are copied upon entering, if the declared parameters are different data types than what was being passed, the parameters must be converted to the new type. There were cases where this conversion was not correct.
- Translated NAN when converting from floats to integers and integers to floats.
- Fixed setting time before the first background slow sequence completes. This was causing background gains to be wrong which in turn caused measurements to be converted to mV incorrectly. This was only a problem if the time was set within 90 Sec (worst case) after starting a program.
- Fixed converting Long NaN to strings.
- Histogram4D - if all 4 dimensions are used then the output will be linearized. Since the OS only keeps 3 dimensions internally, the output must be linearized to successfully pass the tabledefs to LoggerNet.
Revision: 6
Signature: 9493
- Added Output instruction Moment. This instruction outputs the statistical moment of an array of data.
- Added the FileSize(FileHandle) function which returns the number of bytes in the file defined by the FileHandle parameter.
- Added TableHide instruction. This allows a table to be hidden from LoggerNet. If security is set in the datalogger when using TableHide, the highest level security password must be entered to see all tables.
- Removed SetSettings instruction.
- Added initial support for DNP3 protocol.
- Added new COM ports SDC10 & SDC11, which allow for communication with an addressed device via the datalogger's CS I/O port.
- Updated ModBusSlave to allow the user to specify a start register offset for all commands. The offset can be specified by entering Starting Register * 1000 + the address for the instruction's ModBusAddr parameter.
- Updated SerialInRecord: 1) Returns a negative number of bytes received into a float variable if the destination string variable is not sized large enough to accommodate the number of bytes received. 2) Allows a variable to be used for the ComPort parameter. The instruction will be managed by the datalogger's processing task if the ComPort is a variable or it will be managed by the measurement task if the ComPort is a constant. This allows the instruction to be better synchronized to measurement for improved sensor readings.
- Changed SerialOutBlock so if (1) the source parameter is a constant, (2) the COM port is COM1, COM2, COM3, or COM4, and (3) the NumBytes parameter is non-zero, the program will be managed by the measurement task, else the program will be managed by the processing task. This allows the instruction to be better synchronized to measurement for improved sensor readings.
- Updated DialModem Communications: 1) If a modem is attached, the datalogger removes a device from its neighbor list after communication, thus stopping the datalogger from sending neighbor verification packets to the modem that could put the modem into a non-responsive state. 2) Increased the wait time from 1 second to 2 seconds for echoes from AT commands. 3) The datalogger no longer sends ATZ to the modem.
- Fixed communication via the CS I/O port when the datalogger is communicating with SDC devices: 1) After communication with an SDC device (including a keyboard display), the port did not go into low power standby mode. This could significantly affect power consumption. 2) Improved the concurrent use of modem enabled devices and SDC devices.
- Added the capability to display the number of bytes free for the CPU drive. This allows software to display a value for the available memory.
- Implemented several significant changes that affect use of the COM310 modem: 1) Changed communication on the datalogger's CS I/O port to allow concurrent communication with any SDC device while COM310 data mode is active. 2) Fixed an issue where in certain instances when using a COM310 and compiling a program that used voice instructions, the complete voice.txt file would not be loaded. This resulted in words missing from the datalogger. 3) Fixed a problem where communication was being dropped after a program was compiled. 4) Updated the OS so that a voice sequence can abort when a subroutine is running.
- Increased the timeout for SDI12 terminal talk-through to 40 seconds.
- Added the terminal mode 'C' command to allow editing values in the constant table (defined in the datalogger program by using the ConstTable..EndConstTable declaration).
- Added functionality to WebPageBegin...WebPageEnd declaration: 1) Added the optional parameter units=TRUE to table commands. This will display the units for each field if defined by the Units instruction in the datalogger program. 2) Added the ability to apply a style sheet to the HTML page displayed by the datalogger (StyleSheet=filename.css).
- Made significant improvements to TCP/IP, FTP, and PPP communication.
- Fixed ComportIsActive instruction for non-TCP/IP communication ports.
- Increased the amount of time the EmailSend instruction will wait for a response back from the email server before returning an error from 1 minute to 10 minutes.
- Improved flushing the COM port buffer for COM1, COM2, COM3, and COM4. The potential existed for the end of the buffer to be overwritten if flushing the buffer was interrupted by another task.
- Fixed the FileOpen function. Some of the Write options (specified by the Mode parameter) were not working correctly.
- Improved subroutine calls to disallow concurrent execution of a subroutine by two different processing tasks.
- Fixed subroutines so that ExitSub or Exit Sub can be used to exit a subroutine.
- Changed TableName.Timestamp so that a timestamp returned as a string includes leading zeros.
- Fixed TableName.FieldName(n,m) when trying to access an element in a multi-dimensioned String variable.
- Changed the datalogger compiler to return an error when a string variable is not dimensioned large enough to hold the value returned.
- Fixed the Sample output instruction when a source variable formatted as a Float was stored as a Boolean value. Values were not being stored as True/False (now, all non-zero values are stored as True (-1)).
- Fixed Sample output instruction so usage of TableName.FieldName as the Source parameter will work correctly with FP2, NSEC, UINT2, and BOOL8 data types.
- Fixed the Replace function to correctly replace the string when the two strings are not the same size.
- Made changes to the CardOut instruction so that data tables on the datalogger's CPU will not be reset if a program storing data to a card is stopped, the CFM100 or NL115 card module is removed, and then the program is restarted.
- Improved the data output formatting for the SDI12Recorder instruction. There were cases where invalid numeric sequences (such as exponential notation or NAN) were being sent to the sensor. This change forces values greater than 9 characters to return as +/-99999999.
- Fixed SDMCD16AC instruction so that each array index represents a port on the SDM-CD16AC when the source variable is declared as LONG and >= reps*16.
- Changed the SDMCAN instruction's ID parameter so that any value < -2047 will set the ID to an 11 bit ID of 0.
- Fixed CRBasic compiler and datalogger OS so that they check string parameters for unmatched string delimiters (opening and closing quotes).
- Changed the compile process so it is faster.
- Fixed a problem where slow sequence scans were not synchronized with the datalogger's clock after the clock was set, which resulted in slow sequence scans not starting at the correct time.
- Improved the processing of slow sequence tasks when a program is compiled. In rare instances, the datalogger would be put into a non-responsive state.
- Fixed a problem where the datalogger was writing settings changes to flash on a timed interval. In some instances, a setting might be changed but not written immediately to flash. If the program was then recompiled, the setting would be set back to the previous value.
- Updated InstructionTimes instruction to detect a variable out of bounds error and determine which line the error occurred.
- Updated RealTime instruction to load the destination array with the current value of the datalogger's clock if the instruction is used outside of a Scan..NextScan (within a Scan, RealTime returns the time of the datalogger's clock that the scan began). The resolution of RealTime outside of a scan time is 10 ms.
- Changed the PWR function to accept a non-integer exponent.
- Fixed the MenuItem instruction when displaying and editing string variables.
- Fixed the handling of floating points numbers when two very small numbers approaching 0 were multiplied together. The result returned was INF instead of 0.
More Information
Have a Question?
Need a Document?
Need an Upgrade?
Need Training?