Added the EncryptExempt() instruction which allows for encrypted communication with a set of predefined PakBus nodes.
Improved CardOut() and TableFile(64) immunity to unexpected power cycles. Previously, file pointers could become misaligned when resuming from a power cycle. This would occur when the power cycle occurred after a data table using DataInterval() and CardOut() had written a data sector to disk but had not written a full TOB3 frame. The resultant file cannot be converted without using the repair option in Card Convert. An improvement was made to move the read pointer back to the start of the CPU buffer so that the first data sector is written again.
Changed the behavior on program start when using existing files on a card. If a power cycle occurred during card initialization, it could result in a yellow light and data not being written to the card. The behavior was changed so that if at program starts up, initialization of an existing data file fails. The associated files are deleted and new files are created. The deleted files were deemed to be corrupt, so removing them and starting fresh is better than leaving the logger not writing to the files.
Fixed EmailRecv() to work with base64 encoded messages and attachments.
Revised SolarPosition() solar azimuth calculation to match INREL SolPos.c (2001).
Fixed web server so that the number of records requested are returned or displayed, including those residing only on the CRD drive.
Fixed http when displaying string variables that have a '%' embedded in them.
Fixed OS upload via program send so that memory is released when the upload is cancelled.
Fixed the BMP server task that hangs on occasion during operating system uploads.
Changed terminal W mode so that when a comport has been set up for PPP, we don't let any characters enter the terminal. This also includes those times when the logger's CRBasic programming has closed PPP on the comport.
Enhanced PPPClose() by sending the command “+++ and AT+CGATT=0” to get the modem to go offline if the hang up process is previously unsuccessful.
Enhanced modem dialing so that when there is a failure the commands “+++ ATH” or “AT+CGATT=0” is sent along with pulsing the hardware (DTR or ME) off then back on.
Changed PPPClose() by removing the 5 second delay.
Fixed PPPClose() so that it does not inadvertently close the CSIOIP session with the NL240.
Increased the buffer size for modem dialing.
Changed EmailSend() so that the drive prefix of filenames is not included in attachments. For example, make attachment File.dat instead of USR:File.dat.
Changed EmailSend() to trim whitespace in front of file names specified in the attachment parameter.
Improved Email streaming from data tables.
Enchanced FTPClient(), HTTPPut(), HTTPPost(), and EmailSend() so that they return -1 if successful, 0 if failed, or -2 if execution did not occur when the instruction was called.
Fixed data table streaming of JSON formatted files so that header is properly included.
Fixed data table streaming so that it is properly executed the first time it it called.
Fixed DNP3 communications when getting multiple application fragments. Now, when aborted, confirmed fragments are marked as retrieved.
Fixed DNP3 so that watchdog events and skipped scans do not occur prematurely when retrieving event data.
Changed DNP3 to not send ResetLinkState when unnecessary and to not request confirmation when the response is NULL.
Fixed DNP3 so that FIR bit is not set in single fragment responses.
Enhanced DNP3 so that object requests containing supported and unsupported objects are properly parsed and handled. Previously, when an unsupported object was encountered during parsing the transaction would fail.
Improved DNP3 to allow a read request to contain a mixture of class and non-class objects.
Improved DNP3 to support object 50, variation 1.
Fixed DNP3 over IP to handle incorrect start byte(s) or CRC.
Changed disable processing parameter of data table output instructions to allow a syntax of ArrayName(Index)(). For example, “Minimum (5,DataArray,IEEE4,DataArray(1)()=NAN,False)”.
Fixed the compiler to flag an error for illegal assignments via +=, -=, etc.
Fixed Select Case so that "Case NAN" works correctly when the test expression is NAN.
Changed SerialOpen() to delay 4*TXDelay before retrying a hello message when the format is PakBus Active, TXDelay is non-zero, and BufferSize is non-zero
Enhanced the W terminal mode to more precisely capture the time of TX when packets are broken up with preceding time gaps specified by SerialOpen() TXDelay and BufferSize parameters.
Improved the Files Manager setting for 3209 and 3212 so that (1) a drive can be formatted if the setting is actively writing to the drive, (2) if writing to a CRD (card), pushing the card button will temporarily halt writing to the file, and (3) deleting the setting will allow the file to be deleted.
Removed COM3 and COM4 options from W and P terminal modes of CR800
Changed SerialOpen() so that a ComPort value of 31 represents CS I/O with SDE enabled. Previously this mode was represented by a value of 16.
Improved P terminal mode by increasing the talk through buffer.
Fixed SendVariables() and GetVariables() to handle data received at the at the same time the transaction timed out. This was generally only a problem when the destination was variably indexed. The data could be put into the wrong index or generate a variable out of bounds warning.
Fixed FTPClient() to timeout correctly when an attempt to make a non-passive (Active) FTP data port connection for data transfer failed. Prior to this fix, FTPClient() would never timeout.