Our full technical support staff does not monitor this forum. If you need assistance from a member of our staff, please submit your question from the Ask a Question page.


Log in or register to post/reply in the forum.

CS460 RS485 Example Program


JDavis Aug 31, 2018 06:33 PM

This is an example program for a CS460 connected directly to a CR6 via RS485, using the Keller protocol. The same code should work on a CR1000X, with just changing the comport. Some older CS460 have firmware that didn't include support for Modbus. This example should work with all versions, and some other Keller transducer models.

 

'CR6 Series Datalogger
'date: Aug 31, 2018
'program author: Jacob Davis, CSI

'Example program to read level and pressure from a Keller Acculevel (CS460)
' The connection is RS485. The analog measurement is redundant, but was included for testing.
' This program is using sensor address 250, which only works with one CS460 on the channel.
' Note that checksums are not being verified in this program.

'Wiring
'Acculevel      CR6
'  RED --------- U5
'  WHT --------- G
'  BLK --------- 12v
'  BLU --------- C2
'  YEL --------- C1

'Declare Public Variables
Public PTemp, Batt_Volt
Public Acculevel(3)
Public se_level_voltage

Alias Acculevel(1) = WaterPress
Alias Acculevel(2) = WaterTemp
Alias Acculevel(3) = KellerStatus

Units WaterPress = bar
Units WaterTemp = degC

'Define Data Tables.
DataTable (Test,1,-1) 'Set table size to # of records, or -1 to autoallocate.
  DataInterval (0,10,Min,10)
  Minimum (1,Batt_Volt,FP2,False,False)
  Sample (1,PTemp,FP2)
  Sample (3,Acculevel(),IEEE4)
EndTable

Sub ReadKellerAcculevel(KellerPort As Long, KellerValue(3) As Float) 'Poll Keller Acculevel using Keller Protocol
  'Return Values
  '  Water pressure in bars
  '  Water temperature in degrees C
  '  Status Code, expect a value of 0 for good measurements

  Dim K_OutString As String * 12
  Dim K_InputString As String * 12
  Dim K_BytesReturned As Long

  'Using address 250 for all commands. Address 250 works with any sensor, but can only have one connected.

  'Send poll command for water pressure
  K_OutString(1,1,1) = CHR(250)
  K_OutString(1,1,2) = CHR(73)
  K_OutString(1,1,3) = CHR(1)
  K_OutString(1,1,4) = CHR(161)
  K_OutString(1,1,5) = CHR(167)

  Erase(K_InputString)
  SerialFlush(KellerPort)
  SerialOutBlock (KellerPort,K_OutString,5)
  Delay(1,30,mSec) 'Delay to allow for response

  K_BytesReturned = SerialInChk(KellerPort)

  If K_BytesReturned < 9 Then
    'Need to initialize the sensor after a power cycle
    K_OutString(1,1,1) = CHR(250)
    K_OutString(1,1,2) = CHR(48)
    K_OutString(1,1,3) = CHR(4)
    K_OutString(1,1,4) = CHR(67)

    SerialOutBlock (KellerPort,K_OutString,4)
    '  May want to mark the readings as bad, otherwise the last values remain
    '      WaterPress = NAN
    '      WaterTemp = NAN
    KellerValue(3) = NAN
  Else
    SerialInBlock (KellerPort,K_InputString,9)
    KellerValue(3) = ASCII(K_InputString(1,1,7))
    MoveBytes (KellerValue(1),0,K_InputString,2,4)

    'Poll water temperature
    K_OutString(1,1,1) = CHR(250)
    K_OutString(1,1,2) = CHR(73)
    K_OutString(1,1,3) = CHR(4)
    K_OutString(1,1,4) = CHR(162)
    K_OutString(1,1,5) = CHR(103)

    Delay(1,500,mSec) 'delay between commands
    Erase(K_InputString)
    SerialFlush(KellerPort)
    SerialOutBlock (KellerPort,K_OutString,5)
    Delay(1,30,mSec) 'Delay to allow for response

    SerialInBlock (KellerPort,K_InputString,9)
    MoveBytes (KellerValue(2),0,K_InputString,2,4)
  EndIf


EndSub



'Main Program
BeginProg

  'default settings 8,N,1,9600  Address 1
  SerialOpen (ComC1,9600,19,0,20,4)

  Scan (5,Sec,0,0)
    PanelTemp (PTemp,15000)
    Battery (Batt_Volt)

    VoltSe (se_level_voltage,1,mV5000,U5,True,0,60,1.0,0) 'Regular analog measurement of level

    Call ReadKellerAcculevel(ComC1, Acculevel()) 'Poll Keller Acculevel using Keller Protocol


    'Call Output Tables
    CallTable Test
  NextScan

EndProg


 

 

Log in or register to post/reply in the forum.