ProDispense MODBUS REGISTER MAP

(07/10/01)

Register Address /

Group

/ Name / Length (words) / Type / (struct size) / (struct sub type) / Values / Units / r/w / Description /
0 /

Cntrl

/ Command / 1 / ushort / 0..65535 / w / 1=Take Snapshot, 2=Reset totalizers, 3=Begin Download, 4=End Download, 5=Reset Diagnostic Counters, 101=PRINTKEY, 102=STARTKEY, 103=STOPKEY, 104=PROGKEY, 105=RUNKEY
1 / Cntrl / Data / 1 / short / -32768..+32767 / w / other command data
2 / Cntrl / Status / 1 / short / -32768..+32767 / r / command status (clears after read): 0=inactive, 1=success/done, 2=busy/processing, 3=Download Mode, 4=Ending Download, -1=failed
3
10 / Ver / MainMajor / 1 / ushort / r / ProDispense Firmware Major Version
11 / Ver / MainMinor / 1 / ushort / r / ProDispense Firmware Minor Version
12 / Ver / MainBuild / 1 / ushort / r / ProDispense Firmware Build Number
13 / Ver / DisplayMajor / 1 / ushort / r / Display Firmware Major Version
14 / Ver / DisplayMinor / 1 / ushort / r / Display Firmware Minor Version
15 / Ver / DisplayBuild / 1 / ushort / r / Display Firmware Build Number
16
50 / RtcClock / tm_yr / 1 / ushort / 2001..2999 / year / rw / real time clock
51 / RtcClock / tm_mon / 1 / ushort / 1..12 / month / rw
52 / RtcClock / tm_day / 1 / ushort / 1..31 / date / rw
53 / RtcClock / tm_hr / 1 / ushort / 0..23 / hour / rw
54 / RtcClock / tm_min / 1 / ushort / 0..59 / minute / rw
55 / RtcClock / tm_sec / 1 / ushort / 0..59 / second / rw
56
71 / ID / ProductID / 1 / ushort / 51 / r / Graco Product Identifier unique to ProDispense
72
100 / Run / CurRecipe / 1 / ushort / 1..250 / rw / Current Selected Recipe (==0 -> valve dispense)
101 / Run / IdNum / 1 / ushort / 0..9999 / rw / ID number displayed on UI
102 / Run / Mode[0..2] / 3 / array of ushort / 0..3 / r / 0=Idle, 1=Dispensing, 2=Alarm, 3=Calibrating
105 / Run / FluidTarget[0..2] / 6 / array of ulong / 0..99999 / 1/100 cc / rw / Target net amount of fluid of current recipe
111 / Run / FluidActual[0..2] / 6 / array of ulong / 0..99999 / 1/100 cc / r / Actual net amount of fluid of current recipe
117 / Run / FluidDev[0..2] / 3 / array of short / -99..+100 / % / r / (Actual[] - Target[]) / Target[]
120
1000 / Cnfig / StationNum / 1 / ushort / 1..246 / rw / Unique network address (MB addr = StationNum+1)
1001 / Cnfig / DispenseMode / 1 / ushort / 1 .. 2 / rw / 1=Fluid Station, 2=Recipe
1002 / Cnfig / Language / 1 / ushort / 0..4 / rw / 0=English, 1=Spanish, 2=German, 3=French, 4=Japanese
1003 / Cnfig / Units[0..2] / 3 / array of ushort / 0..4 / rw / 0=cc, 1=ounces, 2=quarts, 3=liters, 4=gallons
1006 / Cnfig / DispenseTol[0..2] / 3 / array of ushort / 0..99 / % / rw / Fluid dispense tolerance limit
1009 / Cnfig / TimeOut[0..2] / 3 / array of ushort / 0 .. 99 / min / rw
1012 / Cnfig / MeterFactor[0..2] / 3 / array of ushort / 0 .. 30000 / 1/1000 cc/pulse / rw / Meter K-Factor (format ##.###)
1015 / Cnfig / RecipeSelect / 1 / ushort / 1 .. 2 / rw / 1=User Interface, 2=Network
1016 / Cnfig / CnfigChecksum / 1 / ushort / 0..65535 / r / checksum of Cnfig structure
1017
2000 / Totals / DisResetTotal[0..2] / 6 / array of ulong / 0..4294967295 / cc / r / Resettable totalizers - updated at end of each step
2006 / Totals / DisGrandTotal[0..2] / 6 / array of ulong / 0..4294967295 / cc / r / Resettable totalizers - updated at end of each step
2012 / Totals / Year / 1 / ushort / 2000 .. 2999 / r / Date / Time last reset
2013 / Totals / Month / 1 / ushort / 1 .. 12 / r / Date / Time last reset
2014 / Totals / Day / 1 / ushort / 1 .. 31 / r / Date / Time last reset
2015 / Totals / Hour / 1 / ushort / 0 .. 23 / r / Date / Time last reset
2016 / Totals / Minute / 1 / ushort / 0 .. 59 / r / Date / Time last reset
2017
4000 / Alarm / Alarm[0..10] / 88 / array of struct / r / Alarm[0] is current alarm, Alarm[1..10] are historical, Alarm[10] is oldest
4088 / Alarm / Alarm[].month / 1 / ushort / r / time/date stamp
4088 / Alarm / Alarm[].day / 1 / ushort / r / time/date stamp
4088 / Alarm / Alarm[].hour / 1 / ushort / r / time/date stamp
4088 / Alarm / Alarm[].minute / 1 / ushort / r / time/date stamp
4088 / Alarm / Alarm[].recipe / 1 / ushort / 0..250 / r / recipe number (if applicable)
4088 / Alarm / Alarm[].fluid / 1 / ushort / 0..99 / r / fluid number (if applicable)
4088 / Alarm / Alarm[].id / 1 / ushort / 0..65535 / r / Alarm ID number
4088 / Alarm / Alarm[].data / 1 / short / -32768..+32767 / r / other alarm data
4088 / Alarm / AlarmCntr / 1 / ushort / 1..255 / r / counter increments after each write to Alarm
4089
5000 / Snapshot / id / 1 / ushort / 0..255 / r / Cause of Snapshot: 1=Ntwk Snap cmd, 2=Ntwk Reset cmd, 3=UI Reset cmd
5001 / Snapshot / count / 1 / ushort / 1..255 / r / counter increments after each write to Snapshot
5002 / Snapshot / totals.DisResetTotal[0..2] / 6 / array of ulong / r / current totalizer data
5008 / Snapshot / totals.DisGrandTotal[0..2] / 6 / array of ulong / r / current totalizer data
5014 / Snapshot / totals.Year / 1 / ushort / 2000 .. 2999 / r / Date / Time last reset
5015 / Snapshot / totals.Month / 1 / ushort / 1 .. 12 / r / Date / Time last reset
5016 / Snapshot / totals.Day / 1 / ushort / 1 .. 31 / r / Date / Time last reset
5017 / Snapshot / totals.Hour / 1 / ushort / 0 .. 23 / r / Date / Time last reset
5018 / Snapshot / totals.Minute / 1 / ushort / 0 .. 59 / r / Date / Time last reset
5019
6000 / Recipe / Recipe[0..250] / 1506 / array of struct
7506 / Recipe / Recipe[].FluidParts[0..2] / 6 / uslong / 0 .. 99999 / 1/100 units / rw / Target volume of fluid to be dispensed for Fluid (index of FluidParts) (format ###.##)
7506 / Recipe / RecipeChecksum / 1 / ushort / r / checksum of all recipe parameters
7507
64010 / Diag / CommStatus.CRCerrors / 1 / ushort / r / number of received CRC erors since reset
64011 / Diag / CommStatus.BufSzerrors / 1 / ushort / r / # of transmit buffer too small errors
64012 / Diag / CommStatus.RcvMsgTmOuts / 1 / ushort / r / # of received message timeouts
64013 / Diag / CommStatus.Cmd16Cnt / 1 / ushort / r / # of Mult Reg Write Commands received
64014 / Diag / CommStatus.Cmd6Cnt / 1 / ushort / r / # of Single Reg Write Commands received
64015 / Diag / CommStatus.Cmd03Cnt / 1 / ushort / r / # of Reg Read Commands received
64016 / Diag / CommStatus.RcvMsgCnt / 1 / ushort / r / # of messages successfully received
64017 / Diag / CommStatus.SntMsgCnt / 1 / ushort / r / # of messages successfully sent
64018 / Diag / CommStatus.InvalidRRegCnt / 1 / ushort / r / # of invalid read register addresses
64019 / Diag / CommStatus.InvalidWRegCnt / 1 / ushort / r / # of invalid write register addresses
64020 / Diag / CommStatus.IllFuncCnt / 1 / ushort / r / # of messages containing an illegal function number
64021 / Diag / DiagCounter12 / 1 / ushort / r / not used
64022 / Diag / DiagCounter13 / 1 / ushort / r / not used
64023 / Diag / DiagCounter14 / 1 / ushort / r / not used
64024 / Diag / DiagCounter15 / 1 / ushort / r / not used
64025 / Diag / DiagCounter16 / 1 / ushort / r / not used
64026 / Diag / DiagCounter17 / 1 / ushort / r / not used
64027 / Diag / DiagCounter18 / 1 / ushort / r / not used
64028 / Diag / DiagCounter19 / 1 / ushort / r / not used
64029 / Diag / DiagCounter20 / 1 / ushort / r / not used
64030
64500 / Diag / ScaleCmd / 1 / ushort / w / not used
64501 / Diag / ScaleCmdData / 2 / ulong / w / not used
64503 / Diag / ScaleCmdResp / 2 / ulong / r / not used
64505 / Diag / ScaleStatus / 2 / ulong / r / not used
64507


Notes:

·  All values returned are in big endian format (MSB .. LSB)

·  short = signed 16 bit value

·  ushort = unsigned 16 bit value

·  long = signed 32 bit value

·  ulong = unsigned 32 bit value

·  float = IEEE 754-1985 single precision (4 bytes)

·  When a register address is requested that doesn’t coincide with ProBatch data, a word (unsigned 16 bit value) containing all ones is returned.

·  When a register address is requested that starts not at the beginning of a multiple register value (e.g. long or float) , a word (unsigned 16 bit value) containing all ones is returned.

·  When a register address(es) is(are) requested that doesn’t include all the addresses of the complete multi-word data (but does start at the beginning) the complete multi-word data will be returned with possibly more than the expected number of data words and bytes.

·  A write to a multi-word register that doesn’t address all of the words of that register will result in unpredictable data written to the register.

·  A writes to registers will have the data values validated. If any of the values are out of range, the write operation will stop at the invalid data value and return an exception response of 3. The previous valid data values will be written to their corresponding registers.

·  A write to a register that doesn’t have write enabled is ignored.

The checksum for register address 1016 is calculated from data which uses the following data structure:

unsigned char Cnfig.StationNum

unsigned char Cnfig.DispenseMode

unsigned char Cnfig.Language

unsigned char Cnfig.Units[0..2]

unsigned char Cnfig.DispenseTol[0..2]

unsigned char Cnfig.TimeOut[0..2]

unsigned short Cnfig.MeterFactor[0..2]

unsigned char Cnfig.RecipeSelect

The checksum for register address 7506 is calculated from data which uses the following data structure:

typedef

{

unsigned long FluidParts[0..2];

}RECIPE;

RECIPE Recipe[0..250];

The following function written in C shows how the checksum is calculated for Register Addresses 1016 and 7506.

unsigned short crc(unsigned char *buffer, unsigned short size)

{

unsigned short CrcReg;

unsigned char Lsb;

unsigned char i;

unsigned char j;

CrcReg = 0xFFFF;

for (i=0; i<size; i++)

{

CrcReg ^= *buffer;

for (j=0; j<8; j++)

{

Lsb = CrcReg & 0x0001;

CrcReg >= 1;

if (Lsb != 0) CrcReg ^= 0xA001;

}

buffer++;

}

return(CrcReg);

}

08/13/01 3:40 PM 4 of 6