Implemented support for CPI. Added instruction CPISpeed().
Added support for CDM-VW300 and CDM-VW305. Added instructions CDM_VWConfig(), CDM_VW300Dynamic(), CDM_VW300Rainflow(), and CDM_VW300Static().
Added PakBus communication encryption using AES-128. Added PakBus Encryption Key setting.
Enhanced ModBusMaster() and ModBusSlave() by adding support for ModBus ASCII.
Added ability to stream table data using FTPClient(), HTTPPost(), HTTPPut(), or EMailSend() based on number of records or time-into-interval.
Improved SerialOpen() by adding 76800 baud rate option for COM1-COM4.
Changed TDR100() so that all configuration parameters are variable except for SDMAddress, Option, Mux/ProbSelect, and Points.
Fixed IfTime() / TimeIntoInterval() to properly evaluate when a variable expression is used for time-into-interval or units and when the interval is > 1 hour and the time into is non-zero.
Changed IfTime() / TimeIntoInterval() so that parameters of type float create a compile warning; parameters will be rounded to nearest integer.
Changed default string size from 16 characters to 24 characters.
Fixed TableName.Timestamp()returning date/time string when from within another instruction.
Added new date/time formats to TableName.Timestamp() and SecsSince1990(). Option 5 excludes fraction of a second if zero and follows "YYYY-MM-DD_HH-MM-SS[.xx]". Option 6 always includes fractional seconds and follows "YYYY-MM-DD_HH-MM-SS.xx"
Improved TableName.FieldName when converting number to string.
Changed the numeric parameter behavior of CRBasic Functions so that if a String is passed in, a conversion to numeric is performed at run time. Previously a compile error was flagged.
Added format string 'b' to FormatLong(); returns base 2 (binary) representation.
Fixed string expressions when the concatenate operations are nested.
Improved the TCPOpen() when it specifies multiple connections so that the array of connection handles specified will indicate that the remote side has closed the connection by setting the handle to 0 without needing to execute the TCPOpen() instruction.
Changed TCPOpen() so that timeout parameter also applies to listening. Timeout parameter specifies amount of inactivity allowed before active connections are closed. 0 means no timeout.
Added ability to use TCPOpen() to create listening socket for ModbusSlave(). This allows one to use TCPOpen() to specify an inactivity timeout for the connection.
Changed IP handling so that all connections are closed when the datalogger goes to reset; this applies to all reset conditions expect unexpected events like loss of power.
Changed IP reassembly of fragmented IP packets so that its memory usage is limited to 2176 bytes instead of 384K and the timeout for reassembly is 3 seconds instead of 120 seconds. This change prevents large UDP data grams that needed fragmentation or other fragmented IP packets that are coming in fast over Ethernet from eating up communication memory and therefore stopping all communication.
Changed TLS to load user settings for certificate, key, and password.
Changed UDPDatagram() so that it can optionally receive a UDP message response after transmission during the time specified by the timeout parameter.
Enhanced FTPClient() so that local and remote filename parameters can be comma separated lists; e.g. "USR:file1.dat,USR:file2.dat"
Changed EmailRecv() so it will decode with messages that are Base64 encoded.
Changed EmailSend() to encode the message in base64. An '=' in the message would cause a problem.
Fixed http data query of html formatted data of a single field when the time of query is > .5 seconds. After .5 seconds, the entire record was output instead of just the single field.
Fixed HTTP server so that it properly handles the first IP packet received being less than 5 characters.
Changed HTTP service to require administrative authorization to retrieve datalogger program files.
Changed default HTTP home page to not display hidden files.
Changed the HTTP Client instruction to not require the heading to specify either the length of the web page or "chunked" transfer encoding. If neither is specified it will wait instead for either the server to close or the 75 second timeout before quitting.
Added a hold off delay of 200 milliseconds after a remote TCP Connection shuts down before its buffers that might hold incoming characters is closed. This change allows the last characters to be serviced from TCP clients or servers other than PakBus, e.g., HTTP, that close the connection immediately after sending their payload.
Improved communication with NL200/NL240 with bridge mode enabled. Servicing them was slowed when an Ethernet module (NL120, NL115) was not also attached. Additionally, packets from the NL200/NL240 are now immediately sent to the IP receive task instead of waiting 200ms; this improves performance and memory management.
Fixed DHCP so that it does not act on a network interface unless the device is present. Previously, if no NL240 or NL200 was connected there were still attempts to use DHCP.
Changed the Ethernet driver so that it is more efficient discarding IP packets that are not for it.
Fixed Serial I/O instructions to work with a TCP/IP handle of 255. 255 is the default terminal mode "talk through not active" com port, which caused a TCP/IP "com port" of 255 to not output or input to the serial buffer.
Improved POWERUP.INI: a) fixed the delete associated data operation; b) fixed format command (5); c) added support for formatting any drive (CPU:, CRD:, USR:, USB:); d) added copy command (7). Command 7, copies files to the destination drive but does not set the run now or run on power-up attributes.
Changed formatting a drive via the K/D and via File Control so that if a file is open for writing on the drive, formatting is disallowed.
Fixed SetStatus() when setting a string variable array element that is not the first one.
Changed ModbusMaster() and ModbusSlave() using SDM-SIO1 as interface to not over-ride settings specified for that interface by previously executed SerialOpen().
Changed ModBusSlave() so that if a register below the specified starting register offset is queried, an error code of 2 will be returned instead of simply not responding.
Changed ModBusSlave and DNP3 so that they can listen on multiple TCP ports.
Changed DNP to serve up to 3 Masters instead of 2.
Added support for the Delay Measurement and Record Current Time function codes used in time synchronization over DNP3.
Changed DNP() by adding 2 parameters: UTC Offset and Max Msec Difference that are used to control setting the clock via DNP3.
Implemented Object 11, Variation 1 and 2, in DNP3.
Fixed DNP3 so it keeps data tables thru powerup. Previous OS's would not keep data if type 1 variables were not active.
Changed DataGram()to allow a variable expression for the com port parameter and to allow the com port to be a TCP/IP socket handle returned by TCPOpen().
Added to CRBasic SetStatus() to change the FTP, HTTP, and PakBus/TCP Service Port settings.
Added action 21 to FileControl via HTTP and via BMP5 that is used for data recovery. It restarts the file specified, puts the data tables in a state so that the entire table can be collected, and stops the program from running before it can get started.
Removed IP Information from the status table if no IP is active.
Added indexing of disable variable arrays. Variable must be followed by empty parenthesis (). For example, Average (3,TempF(),IEEE4,TempF()=NAN)
Allowed CR1000KD DEL key held down at startup to disable default.cr1 from running just like other programs.
Changed CheckSum to add type 23. This returns the sum of all of the bytes with no masking. User can mask results as needed.
Improved IPNetPower() so that it can be used at the very beginning of a program to turn off power to NL200/NL240.
Fixed aliasing of variables within sub routines and functions
Fixed Status.StartTime where data type of NSEC can now be sampled correctly.
Fixed Sample() when the source is from another table with field type of UINT2.
Changed Include File Name setting to trim leading and trailing spaces in file name.
Fixed table definitions from hanging when updating after resetting status table.
Fixed TableFile(64) TOB3 mode so that the read pointer is properly synchronized after a power cycle. A new file is always created at startup and will contain any previously unwritten buffered data.
Fixed DataEvent() when using DataInterval() so that the correct number of records were written to final storage.
Fixed precompiler to work with SendTableDef().
Changed display of CommsMemFree array to be base 1. It will be displayed as CommsMemFree(1)...(3) instead of CommsMemFree(0)...(2).
Increased File Control's reset advertise to 50 seconds hold off instead of 35 if PPP is active to give PPP time to shut down and start up again after reset.
Changed File Control so that if we are already stopped when responding to the Stop Program command, we do not go through reset.
Changed Keyboard menu to include USB: when copying files. Also made a change to accommodate longer file names.
Improved auto allocation on cards. When auto allocating on the CF card and limiting the size of the file to not exceed 2G, include the size of the header in the check. Very large headers were causing attempts to create a file > 2G.
Fixed preprocessing output to not duplicate lines of compound statements. Alias var()=al_name : Units al_name = m/s resulted in two identical lines in the output when using the precompiler with -p command line option.
Changed COM320 Voice support so that garbage bytes handled to prevent premature hanging up.
Removed sending Hello message to a router when set up as a leaf node in the case of a failed Send/Get Variable instruction. This was causing unnecessary communications traffic.
Fixed Trim(), Left(), DisplayMenu() and other functions that return a string when their parameter is of type string and is Tablename.TimeStamp.
Fixed single line If...Then...Else statements so that EndIf is implied at the end of the line and not after the first statement following Then. Example - If A Then B+=1 : C+=1 Else B=0 : C=0
Changed ABS(Expression) to return as a LONG if Expression is of type LONG. This prevents loss of precision if the LONG Expression has more precision than Float. No longer need ABSLONG instruction; ABSLong() removed from CRBasic instruction pick list.
Fixed status table units on calibration volts variable from Volts to mVolts.
Fixed problem calling subroutine with a Scan...NextScan, when the main scan is set to run a fixed number of times.
Fixed GetDataRecord() and AcceptDataRecords() when a communication error or timeout happens sometime after the second fragment of a multi-fragment record is received.
Fixed terminal command SDI12 talk through to display exit message correctly when connected via TCP.
Fixed compiler so that it does not crash while parsing SDI12Recorder() instructions that contain a SDICommand that is a compound string expression.
Changed Terminal Mode 'P' talk through command so that it can handle a higher rate of incoming characters from the remote device being monitored.
Changed Terminal mode 'F' command to ensure there is a valid public table before dumping the binary contents of it.
Added to the Files Manager Setting node 3209 to specify logging communication traffic similar to that of the 'W' command. The "number of files" specifies the file size in bytes. The first character of the file name (after the drive) should specify 'W' for binary, 'w' for ASCII. The "com port" selection is specified by the number starting at the 2nd position. For example, "USR:W13Sniff.txt" would specify binary, 13 = TCP/IP communication.
Added IP Trace option to terminal mode 'W' command.
Added Ethernet misses to IP tracing.
Added Ethernet packet sniff options to terminal mode 'W' command; shows first 54 bytes of Ethernet packets
Fixed terminal mode 'D' command submenu when entering a task or command to not overwrite memory and therefore possibly cause a watch dog when 33 or more characters are input without a carriage return or space.
Changed terminal mode 'D' so that names of tasks can be entered and recognized. This has not worked since all characters coming in the terminal mode are upper case and the names of tasks have lower case letters.
Changed terminal mode to (1) allow the 'U' command only via PakBus, (2) provide a margin of 150 characters instead of 80 in print statements, and (3) display the maximum number of characters in a print statement at the top of the 'D' command.
Fixed CRBasic Move() when moving within the same array and the array is of type STRING and when the Move must be done from end to start to prevent the destination overwriting the original source.
Fixed sending PakBus messages over TCP/IP when the message including the low level quote characters are over 1500 bytes (about half of the characters in a 1000 byte packet are either 0xbc or 0xbd). The symptom is a watchdog with a watchdog text file indicating "Panic ptr underflow".
Changed the Hello Request broadcast to "expect more client" instead of "expect more neutral". This changes the timeout for a response from 1.5 seconds to 40 seconds. The 1.5 seconds is sometimes too short when going through a modem via ComME, causing ModemCallback to fail.
Fixed converting a long into a string to not convert to a float first which results in loss of resolution for numbers > 6 digits.
Fixed TCP/IP serial output issue where several back to back output instructions plugged up the output stream.
Fixed Slow Sequence scans sync'ing scan interval to new time when time is set multiple times between scan intervals.
Fixed PPP dialing in the event that a PPP session is terminated and before dialing is resumed characters from the modem enter the terminal mode causing PPP dialing to possibly not resume.
Fixed For...Next so that start, end, and step conditions are evaluated before the statement block executes to match behavior of other Basic languages. Examples of conditions in which a For block will not execute include "For I=1 to 0" and "For I=0 to 1 Step -1". Also fixed compiler crash when "For I=1 to 1".
Improved consistency of conversions from FP2 to String to eliminate reporting of false precision or and trailing zeros.
Fixed editing ConstTable contained in an encrypted file Include file.
Fixed DisplayValue() and MenuItem() so that the display is properly cleared after displaying long lines of text.