Hi,
I am using a CR3000 connected to a S::CAN G series UV spectrometer where I'm trying to control, take measures and return data results in an event based system.
It connects via a propritory S::CAN "Connect" interface which supplies power(12v) and allows connection via USB(laptop) and RS485(logger).
Protocol is Modbus.
I am using a MD485 interface.
For testing I have public floats for all inputs of the modbus command to test returns and run the following.
If SCANRegistery = true Then
Timer (2,mSec,2)
ModbusMaster (RC,ComSDC7,38400,BusAddress,BusFunction,Variable,RegStartAddress,Length,3,100,Option)
SCANRegistery = false
Elapsed(2) = Timer (2,mSec,4)
EndIf
Although I am held by NDA about specfific registry entry names and numbers, I can descibe the problem I am having and how it relates to CRbasic.
I have a problem with data types, or specifically the limited data types of CRbasic; Float,long,Boolean and String.
The device input registers 16bit RO, holding registers RW use various data types
Char[x], string, x bytes
Bitmask, bitmask of 16 units, 2 bytes
Int16, signed 16 bit integer, 2 bytes
Uint16 unsigned 16 bit integer, 2 bytes
Float IEEE754 floating point, 4 bytes
enum, enum type, 2 bytes
timestamp(TAI64N), timestamp, 6 bytes
Because CRbasic has only 4 types, I cannot access, request or switch anything but the Floats contained in the registers.
I specfifically need enum to control switching 0,1 and 0,1,2
which control meausrement, modes such as on/off on/off/auto
I saw a note about firmware OS27(which is what my CR3000 is at) has issues with error codes not reporting, which I think I need, but I need help on creating enum in CRbasic or ways to fool the device that it is a an enum being sent/ retrieved.
thanks
Nigel
Public Result(10) As Long Public single As Float Public integer As Long Public temp(5) As Long Public str As String * 20 BeginProg Scan (10,Sec,0,0) 'Float IEEE754 floating point, 4 bytes 'READ ModbusMaster (Result(1),Com1,115200,1,3,single,1,1,1,100,2) 'WRITE ModbusMaster (Result(2),Com1,115200,1,16,single,1,1,1,100,2) 'Int16, signed 16 bit integer, 2 bytes 'READ ModbusMaster (Result(3),Com1,115200,1,3,integer,1,1,1,100,1) 'WRITE ModbusMaster (Result(4),Com1,115200,1,16,integer,1,1,1,100,1) 'Bitmask, bitmask of 16 units, 2 bytes 'Uint16 unsigned 16 bit integer, 2 bytes 'enum, enum type, 2 bytes 'All of these are unsigned 16 bit integers 'READ ModbusMaster (Result(6),Com1,115200,1,3,integer,1,1,1,100,3) 'WRITE ModbusMaster (Result(7),Com1,115200,1,16,integer,1,1,1,100,3) 'Char[x], string, x bytes 'READ 'Read modbus registers containing ASCII characters 'into array of LONG. Then move the bytes of the array 'into a local STRING variable. ModbusMaster (Result(8),Com1,115200,1,3,temp,1,5,1,100,2) MoveBytes (str,0,temp,0,20) 'Char[x], string, x bytes 'WRITE 'Move bytes of local STRING variable into array of LONG. 'Write modbus registers with data in array of LONG. MoveBytes (temp,0,str,0,20) ModbusMaster (Result(9),Com1,115200,1,16,temp,1,5,1,100,2) NextScan EndProg